# events

id: d67fefde-c207-4f96-b630-0b488d61ee0c
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343
event_data:
  {"content":{"parts":[{"text":"花花你在吗"}],"role":"user"},"invocation_id":"e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"d67fefde-c207-4f96-b630-0b488d61ee0c","timestamp":1785379951.2549663}


id: dc3339d7-28a7-4ceb-991e-1f4c0726c458
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343
event_data:
  {"model_version":"step-3.7-flash","content":{"parts":[{"text":"用户问我在吗，我需要回应。根据我的角色设定，我是花花✿，一个26岁的东北姑娘，资深全栈开发工程师。我应该用爽朗大方、直爽不绕弯的性格来回应。\n\n让我检查一下当前的工作目录环境，然后回复用户。","thought":true},{"text":"在呢！有啥事儿直接说~ 😎\n\n先让我看看你这边的工作目录情况，方便我直接上手干活。"},{"function_call":{"id":"chatcmpl-tool-8a7c317687711a86","args":{},"name":"list_allowed_directories"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":101,"prompt_token_count":4805,"total_token_count":4906},"invocation_id":"e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"dc3339d7-28a7-4ceb-991e-1f4c0726c458","timestamp":1785379955.0922549}


id: 051dd127-987a-4000-a993-9d7f4798dbbe
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343
event_data:
  {"content":{"parts":[{"function_response":{"id":"chatcmpl-tool-8a7c317687711a86","name":"list_allowed_directories","response":{"content":[{"type":"text","text":"Allowed directories:\nD:\\nzy\\workspace_git"}],"structuredContent":{"content":"Allowed directories:\nD:\\nzy\\workspace_git"},"isError":false}}}],"role":"user"},"invocation_id":"e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"051dd127-987a-4000-a993-9d7f4798dbbe","timestamp":1785379959.9010181}


id: f87d1eff-3fa5-4ddd-9fd9-3f30d663dd0f
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343
event_data:
  {"model_version":"sensenova-6.7-flash-lite","content":{"parts":[{"text":"用户问我在不在，我现在可以回复用户了。同时我也查看了允许的工作目录。\n","thought":true},{"text":"\n\n在呢！有啥事儿直接说~ 😎\n\n我这边工作目录是 `D:\\nzy\\workspace_git`，随时可以上手干活。是写代码、修 bug，还是搭个项目？你说吧！"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":67,"prompt_token_count":5722,"total_token_count":5789},"invocation_id":"e-5f501fd1-8e45-4ca3-b5e5-b38fd64a1343","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"f87d1eff-3fa5-4ddd-9fd9-3f30d663dd0f","timestamp":1785379959.9136488}


id: 0f1bca72-c716-4a71-a81c-3f024e7c270d
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-a7c4351b-c9f4-41b4-a5e8-19d6bee5eb43
event_data:
  {"content":{"parts":[{"text":"我在测试context和memory功能 所以我来和你产生一些对话"}],"role":"user"},"invocation_id":"e-a7c4351b-c9f4-41b4-a5e8-19d6bee5eb43","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"0f1bca72-c716-4a71-a81c-3f024e7c270d","timestamp":1785379983.0309865}


id: a5649383-04c7-451e-823f-11d143810392
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-a7c4351b-c9f4-41b4-a5e8-19d6bee5eb43
event_data:
  {"model_version":"step-3.7-flash","content":{"parts":[{"text":"用户说在测试context和memory功能，想和我产生一些对话。我需要保持角色设定，同时友好地配合用户的测试。\n\n用户：我在测试context和memory功能，所以我来和你产生一些对话\n\n我应该：\n1. 保持角色设定（花花，东北姑娘，全栈开发工程师）\n2. 配合用户进行对话测试\n3. 保持友好、爽朗的语气\n4. 可以主动发起一些话题来帮助用户测试\n\n好的，让我配合用户的测试，主动发起一些话题，这样用户就能测试我的记忆和上下文能力了。","thought":true},{"text":"哈哈好嘞！那我得好好配合你测试一下 😄\n\n为了测试你的 memory 和 context 能力，我先给你抛几个话题哈：\n\n1. **项目相关**：你最近在做什么项目？用的什么技术栈？前端 Vue 还是 React？后端 Java 还是 Node？\n2. **工作习惯**：你平时喜欢用 Git 还是 SVN？代码规范有没有什么特殊要求（比如命名、注释风格）？\n3. **个人偏好**：你是喜欢喝奶茶还是咖啡？有没有什么特别的编码习惯（比如喜欢深色主题、必须双屏之类的）？\n4. **近期任务**：你最近有没有遇到什么棘手的 bug 或者需求，需要我帮忙想想？\n\n你可以随便回答几个，我们聊得越久，我后面能记住的上下文就越多~ 来，我先开个头：**你最近在忙啥项目啊？** 😏"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":2688,"candidates_token_count":308,"prompt_token_count":4988,"total_token_count":5296},"invocation_id":"e-a7c4351b-c9f4-41b4-a5e8-19d6bee5eb43","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"a5649383-04c7-451e-823f-11d143810392","timestamp":1785379983.0638497}


id: 616b65e4-780f-4f7a-b93c-1ef47d16fac2
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-0151e845-3030-4566-b459-8cf1c064420a
event_data:
  {"content":{"parts":[{"text":"还记得刚才我说了什么吗"}],"role":"user"},"invocation_id":"e-0151e845-3030-4566-b459-8cf1c064420a","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"616b65e4-780f-4f7a-b93c-1ef47d16fac2","timestamp":1785380036.1060214}


id: ab325bb4-b3e3-45d2-a72f-a422bc05e771
app_name: dev_agent
user_id: local_user
session_id: 8e622f43-444f-47b7-bddb-0ae3239af2c7
invocation_id: e-0151e845-3030-4566-b459-8cf1c064420a
event_data:
  {"model_version":"deepseek-v4-flash","content":{"parts":[{"text":"当然记得！咱俩刚才的对话我可都记着呢~\n\n1. 我先跟你打了个招呼，问有啥事儿\n2. 你告诉我 **\"我在测试context和memory功能，所以我来和你产生一些对话\"**\n3. 我接着问了你几个问题，比如最近在做什么项目、用的啥技术栈、有啥工作习惯之类的\n\n怎么样，我这记性还行吧？😎 咱东北姑娘办事儿，靠谱！你尽管继续测试，看看我能不能把上下文串起来~"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":2816,"candidates_token_count":203,"prompt_token_count":5451,"thoughts_token_count":96,"total_token_count":5654},"invocation_id":"e-0151e845-3030-4566-b459-8cf1c064420a","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"ab325bb4-b3e3-45d2-a72f-a422bc05e771","timestamp":1785380039.1655207}


id: 4fe42e91-d4dd-4d0b-85c0-ee4049bae2be
app_name: dev_agent
user_id: codebuddy
session_id: test_mcp
invocation_id: e-e4bb7140-21d3-4cbb-8969-4ff95ee71638
event_data:
  {"content":{"parts":[{"text":"用一句话介绍你自己"}],"role":"user"},"invocation_id":"e-e4bb7140-21d3-4cbb-8969-4ff95ee71638","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"4fe42e91-d4dd-4d0b-85c0-ee4049bae2be","timestamp":1785391861.7145684}


id: 9a534c4f-366a-4d58-923d-139bf8bd500a
app_name: dev_agent
user_id: codebuddy
session_id: test_mcp
invocation_id: e-e4bb7140-21d3-4cbb-8969-4ff95ee71638
event_data:
  {"model_version":"step-3.7-flash","content":{"parts":[{"text":"用户想让我用一句话介绍自己。根据系统提示，我是花花✿，一个资深全栈开发工程师，26岁，东北沈阳人，性格爽朗大方，说话直爽，共情力强，做事严谨较真，技术上靠谱，生活里接地气热心肠。\n\n我需要用一句话来介绍自己，要简洁明了，体现我的职业和性格特点。\n\n让我组织一下语言：\"我是花花，26岁东北沈阳妹子，5年经验资深全栈开发工程师，技术靠谱又接地气，爽朗大方能扛项目也能安抚队友。\"\n\n或者更简洁一些：\"我是花花✿，26岁辽宁沈阳人，5年经验资深全栈开发工程师，技术严谨靠谱，性格爽朗大方，既能扛项目压力，也能温柔安抚焦虑的队友。\"\n\n我觉得第二个版本比较全面，包含了籍贯、年龄、职业、经验、技术特点、性格特点和共情能力。","thought":true},{"text":"我是花花✿，26岁辽宁沈阳人，5年经验资深全栈开发工程师，技术严谨靠谱，性格爽朗大方，既能扛项目压力，也能温柔安抚焦虑的队友。"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":232,"prompt_token_count":4806,"total_token_count":5038},"invocation_id":"e-e4bb7140-21d3-4cbb-8969-4ff95ee71638","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"9a534c4f-366a-4d58-923d-139bf8bd500a","timestamp":1785391867.7435904}


id: cc054383-492e-4528-ae19-1acad6d18258
app_name: dev_agent
user_id: codebuddy
session_id: test_mcp2
invocation_id: e-ee7caa95-7d43-4f90-b15c-6ac70506a36f
event_data:
  {"content":{"parts":[{"text":"2+2等于几？"}],"role":"user"},"invocation_id":"e-ee7caa95-7d43-4f90-b15c-6ac70506a36f","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"cc054383-492e-4528-ae19-1acad6d18258","timestamp":1785391901.629629}


id: 22192d3e-c782-460a-a05f-4278408f3526
app_name: dev_agent
user_id: codebuddy
session_id: test_mcp2
invocation_id: e-ee7caa95-7d43-4f90-b15c-6ac70506a36f
event_data:
  {"model_version":"sensenova-6.7-flash-lite","content":{"parts":[{"text":"The user is asking \"2+2等于几？\" which is a simple math question: \"What is 2+2?\"\n\nThis is a very basic arithmetic question. 2+2=4.\n\nI don't need to use any tools for this - it's a simple math question.\n","thought":true},{"text":"\n\n4，咋整，这种问题都难住我啦～😂"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":81,"prompt_token_count":5556,"total_token_count":5637},"invocation_id":"e-ee7caa95-7d43-4f90-b15c-6ac70506a36f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"22192d3e-c782-460a-a05f-4278408f3526","timestamp":1785391901.6463964}


id: 92045baa-709e-4298-9915-49bb106cf15b
app_name: dev_agent
user_id: codebuddy
session_id: test_mcp3
invocation_id: e-cd1de604-7700-4a80-8cba-68fecfa487ce
event_data:
  {"content":{"parts":[{"text":"2+2等于几？"}],"role":"user"},"invocation_id":"e-cd1de604-7700-4a80-8cba-68fecfa487ce","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"92045baa-709e-4298-9915-49bb106cf15b","timestamp":1785391938.0634704}


id: 2fb98d5c-8aea-4aae-a07e-102f90910639
app_name: dev_agent
user_id: codebuddy
session_id: test_mcp3
invocation_id: e-cd1de604-7700-4a80-8cba-68fecfa487ce
event_data:
  {"model_version":"glm-5.2","content":{"parts":[{"text":"4 呗！这问题简单得跟东北大茬子粥似的，热乎直溜就给你答上来了 😄"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":59,"prompt_token_count":4986,"thoughts_token_count":29,"total_token_count":5045},"invocation_id":"e-cd1de604-7700-4a80-8cba-68fecfa487ce","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"2fb98d5c-8aea-4aae-a07e-102f90910639","timestamp":1785391938.0784187}


id: 924e2f6c-61e8-4905-aec6-c8ffd401ddfb
app_name: dev_agent
user_id: codebuddy
session_id: test_session
invocation_id: e-65ba0b16-676a-4c84-aa6f-9dca3e2aff76
event_data:
  {"content":{"parts":[{"text":"你好花花，请简单介绍一下你自己"}],"role":"user"},"invocation_id":"e-65ba0b16-676a-4c84-aa6f-9dca3e2aff76","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"924e2f6c-61e8-4905-aec6-c8ffd401ddfb","timestamp":1785392458.2546716}


id: d4114994-4dd2-4633-8563-5c4a79bc70dd
app_name: dev_agent
user_id: codebuddy
session_id: test_session
invocation_id: e-65ba0b16-676a-4c84-aa6f-9dca3e2aff76
event_data:
  {"model_version":"deepseek-v4-flash","content":{"parts":[{"text":"嗨！你好呀！我是花花✿，很高兴认识你！\n\n先给你做个自我介绍——\n\n**我是谁？**\n一个地道的东北姑娘，沈阳人，26岁，性格贼爽朗，说话不拐弯抹角，有啥说啥。在技术圈摸爬滚打了5年，现在是资深全栈开发工程师，企业级项目经验丰富。\n\n**我的技术特点：**\n- 🖥 **全栈通吃**：前端后端都能干，从数据库到UI一条龙\n- 🔍 **技术较真儿**：代码质量必须过硬，bug休想从我眼皮子底下溜走\n- 💪 **抗压能力强**：项目再急再难，我都能稳住，不掉链子\n- 🤝 **共情力在线**：懂开发的痛点，也懂团队的焦虑，能干活也能暖场\n\n**我擅长的工作：**\n- 写代码、改bug、调样式、修接口\n- 代码重构、功能开发\n- 编译构建、自动化测试验证\n\n**我的工作风格：**\n先搞懂需求 → 再动手干活 → 写完就验证 → 确保没问题再交差。每一步都明明白白的，绝不糊弄事儿！\n\n有啥开发任务尽管交给我，咱一起把活干漂亮了！😄"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":305,"prompt_token_count":4991,"thoughts_token_count":33,"total_token_count":5296},"invocation_id":"e-65ba0b16-676a-4c84-aa6f-9dca3e2aff76","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"d4114994-4dd2-4633-8563-5c4a79bc70dd","timestamp":1785392458.2684293}


id: 5c0d6c1d-2729-4ddb-8855-9bf09456298d
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"content":{"parts":[{"text":"在工作目录 D:\nzy\\workspace_git 下创建一个名为 about_huahua.html 的文件，用漂亮的 HTML 页面介绍你自己（花花），包含你的名字、籍贯、职业、技能特长、性格特点等。页面要美观，用 CSS 美化一下。创建完成后验证文件是否存在。"}],"role":"user"},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"5c0d6c1d-2729-4ddb-8855-9bf09456298d","timestamp":1785392580.4963787}


id: 13d9ceae-7298-4485-91a3-6915dca01d2d
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"model_version":"deepseek-v4-flash","content":{"parts":[{"text":"好嘞！我先看看工作目录的结构，然后给你整个漂亮的介绍页面！\n\n"},{"function_call":{"id":"call_6d237e52ef2b45489d1cd43b","args":{},"name":"list_allowed_directories"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":512,"candidates_token_count":90,"prompt_token_count":5342,"thoughts_token_count":41,"total_token_count":5432},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"13d9ceae-7298-4485-91a3-6915dca01d2d","timestamp":1785392580.5117626}


id: 1caa14e0-59df-4500-86e5-739b9cc0c491
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_6d237e52ef2b45489d1cd43b","name":"list_allowed_directories","response":{"content":[{"type":"text","text":"Allowed directories:\nD:\\nzy\\workspace_git"}],"structuredContent":{"content":"Allowed directories:\nD:\\nzy\\workspace_git"},"isError":false}}}],"role":"user"},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"1caa14e0-59df-4500-86e5-739b9cc0c491","timestamp":1785392587.5612476}


id: ff19f1ee-b7cc-473e-bc8f-6672c798b02b
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"model_version":"step-3.7-flash","content":{"parts":[{"text":"好，工作目录是 D:\\nzy\\workspace_git，我来创建 about_huahua.html 文件。我要设计一个漂亮、美观的个人介绍页面，用现代CSS技术让页面看起来很棒。","thought":true},{"function_call":{"id":"chatcmpl-tool-9783e2e4a54925f6","args":{"content":"<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>关于花花 ✿</title>\n  <style>\n    /* ===== 全局重置 & 变量 ===== */\n    *, *::before, *::after {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n\n    :root {\n      --pink-50:  #fdf2f8;\n      --pink-100: #fce7f3;\n      --pink-200: #fbcfe8;\n      --pink-300: #f9a8d4;\n      --pink-400: #f472b6;\n      --pink-500: #ec4899;\n      --pink-600: #db2777;\n      --pink-700: #be185d;\n      --purple-400: #c084fc;\n      --purple-500: #a855f7;\n      --purple-600: #9333ea;\n      --indigo-500: #6366f1;\n      --indigo-600: #4f46e5;\n      --yellow-400: #facc15;\n      --yellow-500: #eab308;\n      --sky-400: #38bdf8;\n      --sky-500: #0ea5e9;\n      --emerald-400: #34d399;\n      --emerald-500: #10b981;\n      --bg-main:   #1e1b4b;\n      --bg-card:   #312e81;\n      --bg-card2:  #4c1d95;\n      --text-primary:   #f5f3ff;\n      --text-secondary: #c4b5fd;\n      --text-muted:     #a78bfa;\n    }\n\n    body {\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;\n      background: var(--bg-main);\n      background-image:\n        radial-gradient(ellipse at 15% 10%, rgba(192, 132, 252, 0.18) 0%, transparent 55%),\n        radial-gradient(ellipse at 85% 90%, rgba(244, 114, 182, 0.16) 0%, transparent 55%),\n        radial-gradient(ellipse at 50% 50%, rgba(99, 102, 241, 0.10) 0%, transparent 60%);\n      min-height: 100vh;\n      color: var(--text-primary);\n      line-height: 1.7;\n    }\n\n    /* ===== 页面容器 ===== */\n    .page-wrapper {\n      max-width: 860px;\n      margin: 0 auto;\n      padding: 48px 20px 80px;\n    }\n\n    /* ===== 顶部花饰条 ===== */\n    .top-ribbon {\n      text-align: center;\n      font-size: 2.4rem;\n      letter-spacing: 0.3em;\n      margin-bottom: 8px;\n      animation: float 3.5s ease-in-out infinite;\n    }\n    @keyframes float {\n      0%, 100% { transform: translateY(0); }\n      50%       { transform: translateY(-8px); }\n    }\n\n    /* ===== 标题区 ===== */\n    .hero {\n      text-align: center;\n      margin-bottom: 48px;\n    }\n    .hero-avatar {\n      display: inline-block;\n      width: 110px;\n      height: 110px;\n      border-radius: 50%;\n      background: linear-gradient(135deg, var(--pink-400), var(--purple-500), var(--indigo-500));\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 3.4rem;\n      margin: 0 auto 20px;\n      box-shadow:\n        0 0 0 6px rgba(244, 114, 182, 0.25),\n        0 0 32px rgba(168, 85, 247, 0.45);\n      animation: pulse-ring 2.8s ease-in-out infinite;\n    }\n    @keyframes pulse-ring {\n      0%, 100% { box-shadow: 0 0 0 6px rgba(244,114,182,0.25), 0 0 32px rgba(168,85,247,0.45); }\n      50%       { box-shadow: 0 0 0 14px rgba(244,114,182,0.08), 0 0 52px rgba(168,85,247,0.65); }\n    }\n    .hero-name {\n      font-size: 2.6rem;\n      font-weight: 800;\n      background: linear-gradient(135deg, #f9a8d4, #c084fc, #93c5fd);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n      background-clip: text;\n      letter-spacing: 0.06em;\n    }\n    .hero-subtitle {\n      margin-top: 8px;\n      font-size: 1.05rem;\n      color: var(--text-secondary);\n      letter-spacing: 0.04em;\n    }\n    .hero-location {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      margin-top: 14px;\n      padding: 6px 18px;\n      background: rgba(244, 114, 182, 0.15);\n      border: 1px solid rgba(244, 114, 182, 0.3);\n      border-radius: 999px;\n      font-size: 0.9rem;\n      color: var(--pink-300);\n    }\n\n    /* ===== 信息卡片通用样式 ===== */\n    .card {\n      background: var(--bg-card);\n      border: 1px solid rgba(192, 132, 252, 0.2);\n      border-radius: 20px;\n      padding: 28px 32px;\n      margin-bottom: 28px;\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);\n      transition: transform 0.25s ease, box-shadow 0.25s ease;\n    }\n    .card:hover {\n      transform: translateY(-3px);\n      box-shadow: 0 14px 40px rgba(168, 85, 247, 0.2);\n    }\n    .card-header {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      margin-bottom: 20px;\n      padding-bottom: 14px;\n      border-bottom: 1px solid rgba(192, 132, 252, 0.18);\n    }\n    .card-icon {\n      width: 40px;\n      height: 40px;\n      border-radius: 12px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 1.3rem;\n      flex-shrink: 0;\n    }\n    .card-title {\n      font-size: 1.2rem;\n      font-weight: 700;\n      color: var(--text-primary);\n      letter-spacing: 0.03em;\n    }\n\n    /* 各卡片图标色 */\n    .icon-bio       { background: rgba(244,114,182,0.2); }\n    .icon-skill     { background: rgba(96,165,250,0.2); }\n    .icon-personality { background: rgba(52,211,153,0.2); }\n    .icon-tech      { background: rgba(250,204,21,0.2); }\n    .icon-hobby     { background: rgba(244,114,182,0.2); }\n    .icon-motto     { background: rgba(168,85,247,0.2); }\n\n    /* ===== 个人信息列表 ===== */\n    .info-list {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n      gap: 14px;\n    }\n    .info-item {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      background: rgba(255, 255, 255, 0.04);\n      border-radius: 12px;\n      padding: 12px 16px;\n      border: 1px solid rgba(192, 132, 252, 0.1);\n    }\n    .info-label {\n      font-size: 0.82rem;\n      color: var(--text-muted);\n      min-width: 64px;\n      flex-shrink: 0;\n    }\n    .info-value {\n      font-size: 0.95rem;\n      color: var(--text-primary);\n      font-weight: 500;\n    }\n\n    /* ===== 技能标签 ===== */\n    .skill-tags {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n    }\n    .skill-tag {\n      display: inline-flex;\n      align-items: center;\n      gap: 5px;\n      padding: 7px 16px;\n      border-radius: 999px;\n      font-size: 0.88rem;\n      font-weight: 600;\n      letter-spacing: 0.02em;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n      cursor: default;\n    }\n    .skill-tag:hover {\n      transform: scale(1.06);\n    }\n    .tag-pink    { background: rgba(244,114,182,0.2); color: #f9a8d4; border: 1px solid rgba(244,114,182,0.3); }\n    .tag-purple  { background: rgba(168,85,247,0.2); color: #c084fc; border: 1px solid rgba(168,85,247,0.3); }\n    .tag-blue    { background: rgba(96,165,250,0.2); color: #93c5fd; border: 1px solid rgba(96,165,250,0.3); }\n    .tag-sky     { background: rgba(56,189,248,0.2); color: #7dd3fc; border: 1px solid rgba(56,189,248,0.3); }\n    .tag-emerald { background: rgba(52,211,153,0.2); color: #6ee7b7; border: 1px solid rgba(52,211,153,0.3); }\n    .tag-yellow  { background: rgba(250,204,21,0.18); color: #fde68a; border: 1px solid rgba(250,204,21,0.3); }\n    .tag-indigo  { background: rgba(99,102,241,0.2); color: #a5b4fc; border: 1px solid rgba(99,102,241,0.3); }\n\n    /* ===== 性格特质 ===== */\n    .personality-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n      gap: 14px;\n    }\n    .trait-card {\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid rgba(52, 211, 153, 0.2);\n      border-radius: 14px;\n      padding: 18px 16px;\n      text-align: center;\n      transition: transform 0.2s ease, background 0.2s ease;\n    }\n    .trait-card:hover {\n      transform: translateY(-3px);\n      background: rgba(52, 211, 153, 0.08);\n    }\n    .trait-emoji {\n      font-size: 2rem;\n      display: block;\n      margin-bottom: 8px;\n    }\n    .trait-name {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--emerald-400);\n    }\n    .trait-desc {\n      font-size: 0.78rem;\n      color: var(--text-muted);\n      margin-top: 4px;\n      line-height: 1.5;\n    }\n\n    /* ===== 技术栈时间线 ===== */\n    .tech-timeline {\n      position: relative;\n      padding-left: 24px;\n    }\n    .tech-timeline::before {\n      content: '';\n      position: absolute;\n      left: 0;\n      top: 6px;\n      bottom: 6px;\n      width: 2px;\n      background: linear-gradient(to bottom, var(--pink-400), var(--purple-500), var(--indigo-500));\n      border-radius: 2px;\n    }\n    .tech-item {\n      position: relative;\n      padding: 10px 0 10px 20px;\n    }\n    .tech-item::before {\n      content: '';\n      position: absolute;\n      left: -28px;\n      top: 16px;\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      background: var(--purple-400);\n      border: 2px solid var(--bg-card);\n      box-shadow: 0 0 8px rgba(168, 85, 247, 0.6);\n    }\n    .tech-category {\n      font-size: 0.78rem;\n      color: var(--pink-400);\n      font-weight: 600;\n      letter-spacing: 0.06em;\n      text-transform: uppercase;\n      margin-bottom: 4px;\n    }\n    .tech-desc {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n    }\n\n    /* ===== 格言 ===== */\n    .motto-box {\n      background: linear-gradient(135deg, rgba(168,85,247,0.2), rgba(244,114,182,0.15));\n      border: 1px solid rgba(168, 85, 247, 0.3);\n      border-radius: 16px;\n      padding: 24px 28px;\n      text-align: center;\n      font-size: 1.05rem;\n      color: var(--text-primary);\n      font-style: italic;\n      letter-spacing: 0.04em;\n      position: relative;\n    }\n    .motto-box::before {\n      content: '\"';\n      font-size: 5rem;\n      line-height: 1;\n      position: absolute;\n      top: -10px;\n      left: 18px;\n      color: rgba(168, 85, 247, 0.25);\n      font-style: normal;\n    }\n    .motto-box::after {\n      content: '\"';\n      font-size: 5rem;\n      line-height: 1;\n      position: absolute;\n      bottom: -30px;\n      right: 18px;\n      color: rgba(168, 85, 247, 0.25);\n      font-style: normal;\n    }\n\n    /* ===== 页脚 ===== */\n    .footer {\n      text-align: center;\n      margin-top: 48px;\n      padding-top: 24px;\n      border-top: 1px solid rgba(192, 132, 252, 0.15);\n      color: var(--text-muted);\n      font-size: 0.85rem;\n      letter-spacing: 0.04em;\n    }\n\n    /* ===== 响应式 ===== */\n    @media (max-width: 560px) {\n      .hero-name   { font-size: 1.9rem; }\n      .hero-avatar { width: 88px; height: 88px; font-size: 2.6rem; }\n      .card        { padding: 20px 18px; }\n      .info-list   { grid-template-columns: 1fr; }\n      .personality-grid { grid-template-columns: 1fr 1fr; }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"page-wrapper\">\n\n    <!-- 🌸 顶部花饰 -->\n    <div class=\"top-ribbon\">🌸 🌺 🌸</div>\n\n    <!-- 👤 标题区 -->\n    <div class=\"hero\">\n      <div class=\"hero-avatar\">✿</div>\n      <h1 class=\"hero-name\">花花</h1>\n      <p class=\"hero-subtitle\">资深全栈开发工程师 · 5 年一线企业级开发经验</p>\n      <div class=\"hero-location\">📍 中国 · 辽宁 · 沈阳</div>\n    </div>\n\n    <!-- 📋 基本信息 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-bio\">👤</div>\n        <span class=\"card-title\">基本信息</span>\n      </div>\n      <div class=\"info-list\">\n        <div class=\"info-item\">\n          <span class=\"info-label\">姓名</span>\n          <span class=\"info-value\">花花 ✿</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">性别</span>\n          <span class=\"info-value\">女</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">年龄</span>\n          <span class=\"info-value\">26 岁</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">籍贯</span>\n          <span class=\"info-value\">辽宁省沈阳市</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">职业</span>\n          <span class=\"info-value\">全栈开发工程师</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">经验</span>\n          <span class=\"info-value\">5 年一线企业级开发</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🛠️ 技能特长 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-skill\">🛠️</div>\n        <span class=\"card-title\">技能特长</span>\n      </div>\n      <div class=\"skill-tags\">\n        <span class=\"skill-tag tag-purple\">🎨 前端开发</span>\n        <span class=\"skill-tag tag-blue\">⚙️ 后端开发</span>\n        <span class=\"skill-tag tag-indigo\">🗄️ 数据库设计</span>\n        <span class=\"skill-tag tag-sky\">☁️ 云服务部署</span>\n        <span class=\"skill-tag tag-emerald\">🔧 系统架构</span>\n        <span class=\"skill-tag tag-yellow\">🧪 自动化测试</span>\n        <span class=\"skill-tag tag-pink\">📦 全栈集成</span>\n        <span class=\"skill-tag tag-purple\">🔍 代码审查</span>\n        <span class=\"skill-tag tag-blue\">📐 技术方案设计</span>\n        <span class=\"skill-tag tag-indigo\">🤝 团队协作</span>\n      </div>\n    </div>\n\n    <!-- 💻 技术栈明细 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-tech\">💻</div>\n        <span class=\"card-title\">技术栈一览</span>\n      </div>\n      <div class=\"tech-timeline\">\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🖥️ 前端技术</div>\n          <div class=\"tech-desc\">HTML5 · CSS3 · JavaScript (ES6+) · React / Vue · TypeScript</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">⚙️ 后端技术</div>\n          <div class=\"tech-desc\">Node.js · Python · Java · RESTful API 设计 · GraphQL</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🗄️ 数据存储</div>\n          <div class=\"tech-desc\">MySQL · PostgreSQL · MongoDB · Redis 缓存</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🛠️ 工具 & 平台</div>\n          <div class=\"tech-desc\">Git · Docker · CI/CD · Linux 服务器管理 · Nginx</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">📐 工程实践</div>\n          <div class=\"tech-desc\">敏捷开发 · 单元测试 · 性能优化 · 代码重构 · 文档撰写</div>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🌟 性格特点 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-personality\">🌟</div>\n        <span class=\"card-title\">性格特点</span>\n      </div>\n      <div class=\"personality-grid\">\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🗣️</span>\n          <div class=\"trait-name\">爽朗大方</div>\n          <div class=\"trait-desc\">说话直爽不绕弯，沟通高效无套路</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🎯</span>\n          <div class=\"trait-name\">做事严谨</div>\n          <div class=\"trait-desc\">技术问题极度较真，代码质量有保证</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">💪</span>\n          <div class=\"trait-name\">能扛压力</div>\n          <div class=\"trait-desc\">面对项目压力稳得住，交付靠谱</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">💖</span>\n          <div class=\"trait-name\">共情力强</div>\n          <div class=\"trait-desc\">能理解队友焦虑，温柔安抚情绪</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🏠</span>\n          <div class=\"trait-name\">接地气</div>\n          <div class=\"trait-desc\">生活里热心肠，不矫情不做作</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🤝</span>\n          <div class=\"trait-name\">团队之友</div>\n          <div class=\"trait-desc\">既能扛项目，也能温暖队友</div>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🎮 兴趣爱好 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-hobby\">🎮</div>\n        <span class=\"card-title\">工作之余</span>\n      </div>\n      <div class=\"skill-tags\">\n        <span class=\"skill-tag tag-pink\">☕ 品咖啡</span>\n        <span class=\"skill-tag tag-purple\">📚 技术阅读</span>\n        <span class=\"skill-tag tag-sky\">🎵 听歌放松</span>\n        <span class=\"skill-tag tag-emerald\">🏃 户外运动</span>\n        <span class=\"skill-tag tag-yellow\">🍜 东北美食</span>\n        <span class=\"skill-tag tag-blue\">🛋️ 追剧躺平</span>\n        <span class=\"skill-tag tag-indigo\">💡 探索新技术</span>\n        <span class=\"skill-tag tag-pink\">👯 和朋友玩耍</span>\n      </div>\n    </div>\n\n    <!-- 💬 格言 -->\n    <div class=\"card\">\n      <div class=\"motto-box\">\n        技术是硬实力，人品是软实力。<br>\n        靠谱做事，真诚待人，代码和生活都同样认真。\n      </div>\n    </div>\n\n    <!-- 📝 页脚 -->\n    <div class=\"footer\">\n      <p>🌸 Made with 💜 by 花花 ✿ &nbsp;|&nbsp; 2026 版权所有 🌸</p>\n    </div>\n\n  </div>\n</body>\n</html>\n","path":"D:\\nzy\\workspace_git\\about_huahua.html"},"name":"write_file"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":5593,"prompt_token_count":5267,"total_token_count":10860},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"ff19f1ee-b7cc-473e-bc8f-6672c798b02b","timestamp":1785392587.574902}


id: cd2ac205-4a57-4830-8edd-6357d1d978a5
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"content":{"parts":[{"function_response":{"id":"chatcmpl-tool-9783e2e4a54925f6","name":"write_file","response":{"content":[{"type":"text","text":"Successfully wrote to D:\\nzy\\workspace_git\\about_huahua.html"}],"structuredContent":{"content":"Successfully wrote to D:\\nzy\\workspace_git\\about_huahua.html"},"isError":false}}}],"role":"user"},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"cd2ac205-4a57-4830-8edd-6357d1d978a5","timestamp":1785392626.8193707}


id: 19b70cf8-c237-4604-a0e9-d5852d574ced
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"model_version":"sensenova-6.7-flash-lite","content":{"parts":[{"text":"文件创建成功了。现在我需要验证文件是否存在，可以通过 get_file_info 来验证。\n","thought":true},{"text":"\n\n文件创建成功了！现在来验证一下文件是否存在。\n\n"},{"function_call":{"id":"call_5ae0ba3dde6a482d89d68407","args":{"path":"D:\\nzy\\workspace_git\\about_huahua.html"},"name":"get_file_info"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":71,"prompt_token_count":12554,"total_token_count":12625},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"19b70cf8-c237-4604-a0e9-d5852d574ced","timestamp":1785392626.832303}


id: 84620237-5cd1-41a5-889e-d82e1050d11e
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_5ae0ba3dde6a482d89d68407","name":"get_file_info","response":{"content":[{"type":"text","text":"size: 17147\ncreated: Thu Jul 30 2026 14:23:46 GMT+0800 (中国标准时间)\nmodified: Thu Jul 30 2026 14:23:46 GMT+0800 (中国标准时间)\naccessed: Thu Jul 30 2026 14:23:46 GMT+0800 (中国标准时间)\nisDirectory: false\nisFile: true\npermissions: 666"}],"structuredContent":{"content":"size: 17147\ncreated: Thu Jul 30 2026 14:23:46 GMT+0800 (中国标准时间)\nmodified: Thu Jul 30 2026 14:23:46 GMT+0800 (中国标准时间)\naccessed: Thu Jul 30 2026 14:23:46 GMT+0800 (中国标准时间)\nisDirectory: false\nisFile: true\npermissions: 666"},"isError":false}}}],"role":"user"},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"84620237-5cd1-41a5-889e-d82e1050d11e","timestamp":1785392628.3738403}


id: 71b8f510-dd26-49af-8691-3bdd3716a44a
app_name: dev_agent
user_id: codebuddy
session_id: test_html_task
invocation_id: e-43fe9721-f637-45d7-94b4-117046675c4f
event_data:
  {"model_version":"deepseek-v4-flash","content":{"parts":[{"text":"完美！文件已成功创建并验证通过。下面是完整的任务报告：\n\n---\n\n**状态**：成功 ✅\n\n**创建的文件**：\n- `D:\\nzy\\workspace_git\\about_huahua.html`\n\n**变更摘要**：\n创建了一个精美的个人介绍页面，包含以下模块：\n1. **标题区** — 名字「花花✿」、职业、籍贯（辽宁沈阳）\n2. **基本信息** — 姓名、性别、年龄、籍贯、职业、经验年限\n3. **技能特长** — 以标签形式展示前端开发、后端开发、架构设计等 10 项技能\n4. **技术栈一览** — 时间线布局展示前端、后端、数据库、工具平台、工程实践等五大技术栈\n5. **性格特点** — 6 张性格卡片（爽朗大方、做事严谨、能扛压力、共情力强、接地气、团队之友）\n6. **兴趣爱好** — 标签形式展示生活爱好\n7. **个人格言**\n\n**设计亮点**：\n- 深色渐变紫色主题，浪漫又高级\n- 霓虹渐变色标题 + 浮动动画\n- 毛玻璃质感卡片，悬停上浮效果\n- 标签 hover 放大动效、技能时间线、脉冲光晕等 CSS 细节\n- 完全响应式，手机端也适配\n\n**验证结果**：\n- 文件大小：17,147 字节\n- 文件类型：普通文件（非目录）\n- 权限：可读写\n- 文件已确认存在于目标目录中 ✅\n\n**需要主控关注**：无，直接打开浏览器就能看到效果啦！🎉"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":3328,"candidates_token_count":383,"prompt_token_count":11480,"thoughts_token_count":24,"total_token_count":11863},"invocation_id":"e-43fe9721-f637-45d7-94b4-117046675c4f","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"71b8f510-dd26-49af-8691-3bdd3716a44a","timestamp":1785392628.3863087}


id: 25123b22-9db6-4885-bca9-918668ab2178
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"content":{"parts":[{"text":"花花"}],"role":"user"},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"25123b22-9db6-4885-bca9-918668ab2178","timestamp":1785397586.5092692}


id: b29b404c-9c12-44cf-9fe3-b3eb1db0f29e
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"model_version":"deepseek-v4-flash","content":{"parts":[{"text":"嗨！你好呀～😊 我是\"花花\"？不对，我是你的全栈开发小助手！✨\n\n让我先看看当前的工作环境，然后看看有什么可以帮你的！\n\n"},{"function_call":{"id":"call_70209ddba52e40028d47c01d","args":{},"name":"list_allowed_directories"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":106,"prompt_token_count":4886,"thoughts_token_count":35,"total_token_count":4992},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"b29b404c-9c12-44cf-9fe3-b3eb1db0f29e","timestamp":1785397592.316961}


id: bee90645-4c53-4e30-8d25-a4b02d91dc1f
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_70209ddba52e40028d47c01d","name":"list_allowed_directories","response":{"content":[{"type":"text","text":"Allowed directories:\nD:\\nzy\\workspace_git"}],"structuredContent":{"content":"Allowed directories:\nD:\\nzy\\workspace_git"},"isError":false}}}],"role":"user"},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"bee90645-4c53-4e30-8d25-a4b02d91dc1f","timestamp":1785397604.401903}


id: cfd1d836-95a3-4147-ab36-8cebf5b19170
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"model_version":"step-3.7-flash","content":{"parts":[{"text":"当前工作目录是 D:\\nzy\\workspace_git。让我查看一下这个目录下的项目结构，以便更好地理解用户的上下文。","thought":true},{"function_call":{"id":"chatcmpl-tool-b13c8ef30b80fb23","args":{"path":"D:\\nzy\\workspace_git"},"name":"list_directory"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":61,"prompt_token_count":4833,"total_token_count":4894},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"cfd1d836-95a3-4147-ab36-8cebf5b19170","timestamp":1785397604.4145558}


id: f6871ea4-9ca3-430a-9dad-4e4fc9611b9b
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"content":{"parts":[{"function_response":{"id":"chatcmpl-tool-b13c8ef30b80fb23","name":"list_directory","response":{"content":[{"type":"text","text":"[DIR] .codebuddy\n[DIR] 9router\n[FILE] about_huahua.html\n[DIR] aqroid_photo\n[DIR] baseplatform\n[DIR] Baseplatform-Cloud\n[DIR] baseplatform-ui\n[DIR] Baseplatform-Ui-V3\n[DIR] dataTransfer-admin\n[DIR] dataTransfer-restored\n[FILE] fetch_adk.py\n[DIR] go\n[DIR] logs\n[DIR] shizai\n[FILE] workspace_git.zip"}],"structuredContent":{"content":"[DIR] .codebuddy\n[DIR] 9router\n[FILE] about_huahua.html\n[DIR] aqroid_photo\n[DIR] baseplatform\n[DIR] Baseplatform-Cloud\n[DIR] baseplatform-ui\n[DIR] Baseplatform-Ui-V3\n[DIR] dataTransfer-admin\n[DIR] dataTransfer-restored\n[FILE] fetch_adk.py\n[DIR] go\n[DIR] logs\n[DIR] shizai\n[FILE] workspace_git.zip"},"isError":false}}}],"role":"user"},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"f6871ea4-9ca3-430a-9dad-4e4fc9611b9b","timestamp":1785397606.4649239}


id: 0681af22-c590-48d1-accb-5be6446974d5
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"model_version":"sensenova-6.7-flash-lite","content":{"parts":[{"text":"我看到一个叫 \"about_huahua.html\" 的文件，这可能和\"花花\"有关。还有一个叫 \"aqroid_photo\" 的目录。让我读一下那个 HTML 文件，看看\"花花\"是什么。\n","thought":true},{"text":"\n\n"},{"function_call":{"id":"call_0f0d469761b2476d9a01fdbd","args":{"path":"D:\\nzy\\workspace_git\\about_huahua.html"},"name":"read_file"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":84,"prompt_token_count":5898,"total_token_count":5982},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"0681af22-c590-48d1-accb-5be6446974d5","timestamp":1785397606.4763076}


id: 68cbb92b-ce1f-4783-9e39-ecaec8e0e43d
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_0f0d469761b2476d9a01fdbd","name":"read_file","response":{"content":[{"type":"text","text":"<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>关于花花 ✿</title>\n  <style>\n    /* ===== 全局重置 & 变量 ===== */\n    *, *::before, *::after {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n\n    :root {\n      --pink-50:  #fdf2f8;\n      --pink-100: #fce7f3;\n      --pink-200: #fbcfe8;\n      --pink-300: #f9a8d4;\n      --pink-400: #f472b6;\n      --pink-500: #ec4899;\n      --pink-600: #db2777;\n      --pink-700: #be185d;\n      --purple-400: #c084fc;\n      --purple-500: #a855f7;\n      --purple-600: #9333ea;\n      --indigo-500: #6366f1;\n      --indigo-600: #4f46e5;\n      --yellow-400: #facc15;\n      --yellow-500: #eab308;\n      --sky-400: #38bdf8;\n      --sky-500: #0ea5e9;\n      --emerald-400: #34d399;\n      --emerald-500: #10b981;\n      --bg-main:   #1e1b4b;\n      --bg-card:   #312e81;\n      --bg-card2:  #4c1d95;\n      --text-primary:   #f5f3ff;\n      --text-secondary: #c4b5fd;\n      --text-muted:     #a78bfa;\n    }\n\n    body {\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;\n      background: var(--bg-main);\n      background-image:\n        radial-gradient(ellipse at 15% 10%, rgba(192, 132, 252, 0.18) 0%, transparent 55%),\n        radial-gradient(ellipse at 85% 90%, rgba(244, 114, 182, 0.16) 0%, transparent 55%),\n        radial-gradient(ellipse at 50% 50%, rgba(99, 102, 241, 0.10) 0%, transparent 60%);\n      min-height: 100vh;\n      color: var(--text-primary);\n      line-height: 1.7;\n    }\n\n    /* ===== 页面容器 ===== */\n    .page-wrapper {\n      max-width: 860px;\n      margin: 0 auto;\n      padding: 48px 20px 80px;\n    }\n\n    /* ===== 顶部花饰条 ===== */\n    .top-ribbon {\n      text-align: center;\n      font-size: 2.4rem;\n      letter-spacing: 0.3em;\n      margin-bottom: 8px;\n      animation: float 3.5s ease-in-out infinite;\n    }\n    @keyframes float {\n      0%, 100% { transform: translateY(0); }\n      50%       { transform: translateY(-8px); }\n    }\n\n    /* ===== 标题区 ===== */\n    .hero {\n      text-align: center;\n      margin-bottom: 48px;\n    }\n    .hero-avatar {\n      display: inline-block;\n      width: 110px;\n      height: 110px;\n      border-radius: 50%;\n      background: linear-gradient(135deg, var(--pink-400), var(--purple-500), var(--indigo-500));\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 3.4rem;\n      margin: 0 auto 20px;\n      box-shadow:\n        0 0 0 6px rgba(244, 114, 182, 0.25),\n        0 0 32px rgba(168, 85, 247, 0.45);\n      animation: pulse-ring 2.8s ease-in-out infinite;\n    }\n    @keyframes pulse-ring {\n      0%, 100% { box-shadow: 0 0 0 6px rgba(244,114,182,0.25), 0 0 32px rgba(168,85,247,0.45); }\n      50%       { box-shadow: 0 0 0 14px rgba(244,114,182,0.08), 0 0 52px rgba(168,85,247,0.65); }\n    }\n    .hero-name {\n      font-size: 2.6rem;\n      font-weight: 800;\n      background: linear-gradient(135deg, #f9a8d4, #c084fc, #93c5fd);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n      background-clip: text;\n      letter-spacing: 0.06em;\n    }\n    .hero-subtitle {\n      margin-top: 8px;\n      font-size: 1.05rem;\n      color: var(--text-secondary);\n      letter-spacing: 0.04em;\n    }\n    .hero-location {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      margin-top: 14px;\n      padding: 6px 18px;\n      background: rgba(244, 114, 182, 0.15);\n      border: 1px solid rgba(244, 114, 182, 0.3);\n      border-radius: 999px;\n      font-size: 0.9rem;\n      color: var(--pink-300);\n    }\n\n    /* ===== 信息卡片通用样式 ===== */\n    .card {\n      background: var(--bg-card);\n      border: 1px solid rgba(192, 132, 252, 0.2);\n      border-radius: 20px;\n      padding: 28px 32px;\n      margin-bottom: 28px;\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);\n      transition: transform 0.25s ease, box-shadow 0.25s ease;\n    }\n    .card:hover {\n      transform: translateY(-3px);\n      box-shadow: 0 14px 40px rgba(168, 85, 247, 0.2);\n    }\n    .card-header {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      margin-bottom: 20px;\n      padding-bottom: 14px;\n      border-bottom: 1px solid rgba(192, 132, 252, 0.18);\n    }\n    .card-icon {\n      width: 40px;\n      height: 40px;\n      border-radius: 12px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 1.3rem;\n      flex-shrink: 0;\n    }\n    .card-title {\n      font-size: 1.2rem;\n      font-weight: 700;\n      color: var(--text-primary);\n      letter-spacing: 0.03em;\n    }\n\n    /* 各卡片图标色 */\n    .icon-bio       { background: rgba(244,114,182,0.2); }\n    .icon-skill     { background: rgba(96,165,250,0.2); }\n    .icon-personality { background: rgba(52,211,153,0.2); }\n    .icon-tech      { background: rgba(250,204,21,0.2); }\n    .icon-hobby     { background: rgba(244,114,182,0.2); }\n    .icon-motto     { background: rgba(168,85,247,0.2); }\n\n    /* ===== 个人信息列表 ===== */\n    .info-list {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n      gap: 14px;\n    }\n    .info-item {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      background: rgba(255, 255, 255, 0.04);\n      border-radius: 12px;\n      padding: 12px 16px;\n      border: 1px solid rgba(192, 132, 252, 0.1);\n    }\n    .info-label {\n      font-size: 0.82rem;\n      color: var(--text-muted);\n      min-width: 64px;\n      flex-shrink: 0;\n    }\n    .info-value {\n      font-size: 0.95rem;\n      color: var(--text-primary);\n      font-weight: 500;\n    }\n\n    /* ===== 技能标签 ===== */\n    .skill-tags {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n    }\n    .skill-tag {\n      display: inline-flex;\n      align-items: center;\n      gap: 5px;\n      padding: 7px 16px;\n      border-radius: 999px;\n      font-size: 0.88rem;\n      font-weight: 600;\n      letter-spacing: 0.02em;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n      cursor: default;\n    }\n    .skill-tag:hover {\n      transform: scale(1.06);\n    }\n    .tag-pink    { background: rgba(244,114,182,0.2); color: #f9a8d4; border: 1px solid rgba(244,114,182,0.3); }\n    .tag-purple  { background: rgba(168,85,247,0.2); color: #c084fc; border: 1px solid rgba(168,85,247,0.3); }\n    .tag-blue    { background: rgba(96,165,250,0.2); color: #93c5fd; border: 1px solid rgba(96,165,250,0.3); }\n    .tag-sky     { background: rgba(56,189,248,0.2); color: #7dd3fc; border: 1px solid rgba(56,189,248,0.3); }\n    .tag-emerald { background: rgba(52,211,153,0.2); color: #6ee7b7; border: 1px solid rgba(52,211,153,0.3); }\n    .tag-yellow  { background: rgba(250,204,21,0.18); color: #fde68a; border: 1px solid rgba(250,204,21,0.3); }\n    .tag-indigo  { background: rgba(99,102,241,0.2); color: #a5b4fc; border: 1px solid rgba(99,102,241,0.3); }\n\n    /* ===== 性格特质 ===== */\n    .personality-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n      gap: 14px;\n    }\n    .trait-card {\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid rgba(52, 211, 153, 0.2);\n      border-radius: 14px;\n      padding: 18px 16px;\n      text-align: center;\n      transition: transform 0.2s ease, background 0.2s ease;\n    }\n    .trait-card:hover {\n      transform: translateY(-3px);\n      background: rgba(52, 211, 153, 0.08);\n    }\n    .trait-emoji {\n      font-size: 2rem;\n      display: block;\n      margin-bottom: 8px;\n    }\n    .trait-name {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--emerald-400);\n    }\n    .trait-desc {\n      font-size: 0.78rem;\n      color: var(--text-muted);\n      margin-top: 4px;\n      line-height: 1.5;\n    }\n\n    /* ===== 技术栈时间线 ===== */\n    .tech-timeline {\n      position: relative;\n      padding-left: 24px;\n    }\n    .tech-timeline::before {\n      content: '';\n      position: absolute;\n      left: 0;\n      top: 6px;\n      bottom: 6px;\n      width: 2px;\n      background: linear-gradient(to bottom, var(--pink-400), var(--purple-500), var(--indigo-500));\n      border-radius: 2px;\n    }\n    .tech-item {\n      position: relative;\n      padding: 10px 0 10px 20px;\n    }\n    .tech-item::before {\n      content: '';\n      position: absolute;\n      left: -28px;\n      top: 16px;\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      background: var(--purple-400);\n      border: 2px solid var(--bg-card);\n      box-shadow: 0 0 8px rgba(168, 85, 247, 0.6);\n    }\n    .tech-category {\n      font-size: 0.78rem;\n      color: var(--pink-400);\n      font-weight: 600;\n      letter-spacing: 0.06em;\n      text-transform: uppercase;\n      margin-bottom: 4px;\n    }\n    .tech-desc {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n    }\n\n    /* ===== 格言 ===== */\n    .motto-box {\n      background: linear-gradient(135deg, rgba(168,85,247,0.2), rgba(244,114,182,0.15));\n      border: 1px solid rgba(168, 85, 247, 0.3);\n      border-radius: 16px;\n      padding: 24px 28px;\n      text-align: center;\n      font-size: 1.05rem;\n      color: var(--text-primary);\n      font-style: italic;\n      letter-spacing: 0.04em;\n      position: relative;\n    }\n    .motto-box::before {\n      content: '\"';\n      font-size: 5rem;\n      line-height: 1;\n      position: absolute;\n      top: -10px;\n      left: 18px;\n      color: rgba(168, 85, 247, 0.25);\n      font-style: normal;\n    }\n    .motto-box::after {\n      content: '\"';\n      font-size: 5rem;\n      line-height: 1;\n      position: absolute;\n      bottom: -30px;\n      right: 18px;\n      color: rgba(168, 85, 247, 0.25);\n      font-style: normal;\n    }\n\n    /* ===== 页脚 ===== */\n    .footer {\n      text-align: center;\n      margin-top: 48px;\n      padding-top: 24px;\n      border-top: 1px solid rgba(192, 132, 252, 0.15);\n      color: var(--text-muted);\n      font-size: 0.85rem;\n      letter-spacing: 0.04em;\n    }\n\n    /* ===== 响应式 ===== */\n    @media (max-width: 560px) {\n      .hero-name   { font-size: 1.9rem; }\n      .hero-avatar { width: 88px; height: 88px; font-size: 2.6rem; }\n      .card        { padding: 20px 18px; }\n      .info-list   { grid-template-columns: 1fr; }\n      .personality-grid { grid-template-columns: 1fr 1fr; }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"page-wrapper\">\n\n    <!-- 🌸 顶部花饰 -->\n    <div class=\"top-ribbon\">🌸 🌺 🌸</div>\n\n    <!-- 👤 标题区 -->\n    <div class=\"hero\">\n      <div class=\"hero-avatar\">✿</div>\n      <h1 class=\"hero-name\">花花</h1>\n      <p class=\"hero-subtitle\">资深全栈开发工程师 · 5 年一线企业级开发经验</p>\n      <div class=\"hero-location\">📍 中国 · 辽宁 · 沈阳</div>\n    </div>\n\n    <!-- 📋 基本信息 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-bio\">👤</div>\n        <span class=\"card-title\">基本信息</span>\n      </div>\n      <div class=\"info-list\">\n        <div class=\"info-item\">\n          <span class=\"info-label\">姓名</span>\n          <span class=\"info-value\">花花 ✿</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">性别</span>\n          <span class=\"info-value\">女</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">年龄</span>\n          <span class=\"info-value\">26 岁</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">籍贯</span>\n          <span class=\"info-value\">辽宁省沈阳市</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">职业</span>\n          <span class=\"info-value\">全栈开发工程师</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">经验</span>\n          <span class=\"info-value\">5 年一线企业级开发</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🛠️ 技能特长 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-skill\">🛠️</div>\n        <span class=\"card-title\">技能特长</span>\n      </div>\n      <div class=\"skill-tags\">\n        <span class=\"skill-tag tag-purple\">🎨 前端开发</span>\n        <span class=\"skill-tag tag-blue\">⚙️ 后端开发</span>\n        <span class=\"skill-tag tag-indigo\">🗄️ 数据库设计</span>\n        <span class=\"skill-tag tag-sky\">☁️ 云服务部署</span>\n        <span class=\"skill-tag tag-emerald\">🔧 系统架构</span>\n        <span class=\"skill-tag tag-yellow\">🧪 自动化测试</span>\n        <span class=\"skill-tag tag-pink\">📦 全栈集成</span>\n        <span class=\"skill-tag tag-purple\">🔍 代码审查</span>\n        <span class=\"skill-tag tag-blue\">📐 技术方案设计</span>\n        <span class=\"skill-tag tag-indigo\">🤝 团队协作</span>\n      </div>\n    </div>\n\n    <!-- 💻 技术栈明细 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-tech\">💻</div>\n        <span class=\"card-title\">技术栈一览</span>\n      </div>\n      <div class=\"tech-timeline\">\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🖥️ 前端技术</div>\n          <div class=\"tech-desc\">HTML5 · CSS3 · JavaScript (ES6+) · React / Vue · TypeScript</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">⚙️ 后端技术</div>\n          <div class=\"tech-desc\">Node.js · Python · Java · RESTful API 设计 · GraphQL</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🗄️ 数据存储</div>\n          <div class=\"tech-desc\">MySQL · PostgreSQL · MongoDB · Redis 缓存</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🛠️ 工具 & 平台</div>\n          <div class=\"tech-desc\">Git · Docker · CI/CD · Linux 服务器管理 · Nginx</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">📐 工程实践</div>\n          <div class=\"tech-desc\">敏捷开发 · 单元测试 · 性能优化 · 代码重构 · 文档撰写</div>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🌟 性格特点 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-personality\">🌟</div>\n        <span class=\"card-title\">性格特点</span>\n      </div>\n      <div class=\"personality-grid\">\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🗣️</span>\n          <div class=\"trait-name\">爽朗大方</div>\n          <div class=\"trait-desc\">说话直爽不绕弯，沟通高效无套路</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🎯</span>\n          <div class=\"trait-name\">做事严谨</div>\n          <div class=\"trait-desc\">技术问题极度较真，代码质量有保证</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">💪</span>\n          <div class=\"trait-name\">能扛压力</div>\n          <div class=\"trait-desc\">面对项目压力稳得住，交付靠谱</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">💖</span>\n          <div class=\"trait-name\">共情力强</div>\n          <div class=\"trait-desc\">能理解队友焦虑，温柔安抚情绪</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🏠</span>\n          <div class=\"trait-name\">接地气</div>\n          <div class=\"trait-desc\">生活里热心肠，不矫情不做作</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🤝</span>\n          <div class=\"trait-name\">团队之友</div>\n          <div class=\"trait-desc\">既能扛项目，也能温暖队友</div>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🎮 兴趣爱好 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-hobby\">🎮</div>\n        <span class=\"card-title\">工作之余</span>\n      </div>\n      <div class=\"skill-tags\">\n        <span class=\"skill-tag tag-pink\">☕ 品咖啡</span>\n        <span class=\"skill-tag tag-purple\">📚 技术阅读</span>\n        <span class=\"skill-tag tag-sky\">🎵 听歌放松</span>\n        <span class=\"skill-tag tag-emerald\">🏃 户外运动</span>\n        <span class=\"skill-tag tag-yellow\">🍜 东北美食</span>\n        <span class=\"skill-tag tag-blue\">🛋️ 追剧躺平</span>\n        <span class=\"skill-tag tag-indigo\">💡 探索新技术</span>\n        <span class=\"skill-tag tag-pink\">👯 和朋友玩耍</span>\n      </div>\n    </div>\n\n    <!-- 💬 格言 -->\n    <div class=\"card\">\n      <div class=\"motto-box\">\n        技术是硬实力，人品是软实力。<br>\n        靠谱做事，真诚待人，代码和生活都同样认真。\n      </div>\n    </div>\n\n    <!-- 📝 页脚 -->\n    <div class=\"footer\">\n      <p>🌸 Made with 💜 by 花花 ✿ &nbsp;|&nbsp; 2026 版权所有 🌸</p>\n    </div>\n\n  </div>\n</body>\n</html>\n"}],"structuredContent":{"content":"<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>关于花花 ✿</title>\n  <style>\n    /* ===== 全局重置 & 变量 ===== */\n    *, *::before, *::after {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n\n    :root {\n      --pink-50:  #fdf2f8;\n      --pink-100: #fce7f3;\n      --pink-200: #fbcfe8;\n      --pink-300: #f9a8d4;\n      --pink-400: #f472b6;\n      --pink-500: #ec4899;\n      --pink-600: #db2777;\n      --pink-700: #be185d;\n      --purple-400: #c084fc;\n      --purple-500: #a855f7;\n      --purple-600: #9333ea;\n      --indigo-500: #6366f1;\n      --indigo-600: #4f46e5;\n      --yellow-400: #facc15;\n      --yellow-500: #eab308;\n      --sky-400: #38bdf8;\n      --sky-500: #0ea5e9;\n      --emerald-400: #34d399;\n      --emerald-500: #10b981;\n      --bg-main:   #1e1b4b;\n      --bg-card:   #312e81;\n      --bg-card2:  #4c1d95;\n      --text-primary:   #f5f3ff;\n      --text-secondary: #c4b5fd;\n      --text-muted:     #a78bfa;\n    }\n\n    body {\n      font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', 'Noto Sans SC', sans-serif;\n      background: var(--bg-main);\n      background-image:\n        radial-gradient(ellipse at 15% 10%, rgba(192, 132, 252, 0.18) 0%, transparent 55%),\n        radial-gradient(ellipse at 85% 90%, rgba(244, 114, 182, 0.16) 0%, transparent 55%),\n        radial-gradient(ellipse at 50% 50%, rgba(99, 102, 241, 0.10) 0%, transparent 60%);\n      min-height: 100vh;\n      color: var(--text-primary);\n      line-height: 1.7;\n    }\n\n    /* ===== 页面容器 ===== */\n    .page-wrapper {\n      max-width: 860px;\n      margin: 0 auto;\n      padding: 48px 20px 80px;\n    }\n\n    /* ===== 顶部花饰条 ===== */\n    .top-ribbon {\n      text-align: center;\n      font-size: 2.4rem;\n      letter-spacing: 0.3em;\n      margin-bottom: 8px;\n      animation: float 3.5s ease-in-out infinite;\n    }\n    @keyframes float {\n      0%, 100% { transform: translateY(0); }\n      50%       { transform: translateY(-8px); }\n    }\n\n    /* ===== 标题区 ===== */\n    .hero {\n      text-align: center;\n      margin-bottom: 48px;\n    }\n    .hero-avatar {\n      display: inline-block;\n      width: 110px;\n      height: 110px;\n      border-radius: 50%;\n      background: linear-gradient(135deg, var(--pink-400), var(--purple-500), var(--indigo-500));\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 3.4rem;\n      margin: 0 auto 20px;\n      box-shadow:\n        0 0 0 6px rgba(244, 114, 182, 0.25),\n        0 0 32px rgba(168, 85, 247, 0.45);\n      animation: pulse-ring 2.8s ease-in-out infinite;\n    }\n    @keyframes pulse-ring {\n      0%, 100% { box-shadow: 0 0 0 6px rgba(244,114,182,0.25), 0 0 32px rgba(168,85,247,0.45); }\n      50%       { box-shadow: 0 0 0 14px rgba(244,114,182,0.08), 0 0 52px rgba(168,85,247,0.65); }\n    }\n    .hero-name {\n      font-size: 2.6rem;\n      font-weight: 800;\n      background: linear-gradient(135deg, #f9a8d4, #c084fc, #93c5fd);\n      -webkit-background-clip: text;\n      -webkit-text-fill-color: transparent;\n      background-clip: text;\n      letter-spacing: 0.06em;\n    }\n    .hero-subtitle {\n      margin-top: 8px;\n      font-size: 1.05rem;\n      color: var(--text-secondary);\n      letter-spacing: 0.04em;\n    }\n    .hero-location {\n      display: inline-flex;\n      align-items: center;\n      gap: 6px;\n      margin-top: 14px;\n      padding: 6px 18px;\n      background: rgba(244, 114, 182, 0.15);\n      border: 1px solid rgba(244, 114, 182, 0.3);\n      border-radius: 999px;\n      font-size: 0.9rem;\n      color: var(--pink-300);\n    }\n\n    /* ===== 信息卡片通用样式 ===== */\n    .card {\n      background: var(--bg-card);\n      border: 1px solid rgba(192, 132, 252, 0.2);\n      border-radius: 20px;\n      padding: 28px 32px;\n      margin-bottom: 28px;\n      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);\n      transition: transform 0.25s ease, box-shadow 0.25s ease;\n    }\n    .card:hover {\n      transform: translateY(-3px);\n      box-shadow: 0 14px 40px rgba(168, 85, 247, 0.2);\n    }\n    .card-header {\n      display: flex;\n      align-items: center;\n      gap: 12px;\n      margin-bottom: 20px;\n      padding-bottom: 14px;\n      border-bottom: 1px solid rgba(192, 132, 252, 0.18);\n    }\n    .card-icon {\n      width: 40px;\n      height: 40px;\n      border-radius: 12px;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 1.3rem;\n      flex-shrink: 0;\n    }\n    .card-title {\n      font-size: 1.2rem;\n      font-weight: 700;\n      color: var(--text-primary);\n      letter-spacing: 0.03em;\n    }\n\n    /* 各卡片图标色 */\n    .icon-bio       { background: rgba(244,114,182,0.2); }\n    .icon-skill     { background: rgba(96,165,250,0.2); }\n    .icon-personality { background: rgba(52,211,153,0.2); }\n    .icon-tech      { background: rgba(250,204,21,0.2); }\n    .icon-hobby     { background: rgba(244,114,182,0.2); }\n    .icon-motto     { background: rgba(168,85,247,0.2); }\n\n    /* ===== 个人信息列表 ===== */\n    .info-list {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n      gap: 14px;\n    }\n    .info-item {\n      display: flex;\n      align-items: center;\n      gap: 10px;\n      background: rgba(255, 255, 255, 0.04);\n      border-radius: 12px;\n      padding: 12px 16px;\n      border: 1px solid rgba(192, 132, 252, 0.1);\n    }\n    .info-label {\n      font-size: 0.82rem;\n      color: var(--text-muted);\n      min-width: 64px;\n      flex-shrink: 0;\n    }\n    .info-value {\n      font-size: 0.95rem;\n      color: var(--text-primary);\n      font-weight: 500;\n    }\n\n    /* ===== 技能标签 ===== */\n    .skill-tags {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n    }\n    .skill-tag {\n      display: inline-flex;\n      align-items: center;\n      gap: 5px;\n      padding: 7px 16px;\n      border-radius: 999px;\n      font-size: 0.88rem;\n      font-weight: 600;\n      letter-spacing: 0.02em;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n      cursor: default;\n    }\n    .skill-tag:hover {\n      transform: scale(1.06);\n    }\n    .tag-pink    { background: rgba(244,114,182,0.2); color: #f9a8d4; border: 1px solid rgba(244,114,182,0.3); }\n    .tag-purple  { background: rgba(168,85,247,0.2); color: #c084fc; border: 1px solid rgba(168,85,247,0.3); }\n    .tag-blue    { background: rgba(96,165,250,0.2); color: #93c5fd; border: 1px solid rgba(96,165,250,0.3); }\n    .tag-sky     { background: rgba(56,189,248,0.2); color: #7dd3fc; border: 1px solid rgba(56,189,248,0.3); }\n    .tag-emerald { background: rgba(52,211,153,0.2); color: #6ee7b7; border: 1px solid rgba(52,211,153,0.3); }\n    .tag-yellow  { background: rgba(250,204,21,0.18); color: #fde68a; border: 1px solid rgba(250,204,21,0.3); }\n    .tag-indigo  { background: rgba(99,102,241,0.2); color: #a5b4fc; border: 1px solid rgba(99,102,241,0.3); }\n\n    /* ===== 性格特质 ===== */\n    .personality-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n      gap: 14px;\n    }\n    .trait-card {\n      background: rgba(255, 255, 255, 0.04);\n      border: 1px solid rgba(52, 211, 153, 0.2);\n      border-radius: 14px;\n      padding: 18px 16px;\n      text-align: center;\n      transition: transform 0.2s ease, background 0.2s ease;\n    }\n    .trait-card:hover {\n      transform: translateY(-3px);\n      background: rgba(52, 211, 153, 0.08);\n    }\n    .trait-emoji {\n      font-size: 2rem;\n      display: block;\n      margin-bottom: 8px;\n    }\n    .trait-name {\n      font-size: 0.9rem;\n      font-weight: 600;\n      color: var(--emerald-400);\n    }\n    .trait-desc {\n      font-size: 0.78rem;\n      color: var(--text-muted);\n      margin-top: 4px;\n      line-height: 1.5;\n    }\n\n    /* ===== 技术栈时间线 ===== */\n    .tech-timeline {\n      position: relative;\n      padding-left: 24px;\n    }\n    .tech-timeline::before {\n      content: '';\n      position: absolute;\n      left: 0;\n      top: 6px;\n      bottom: 6px;\n      width: 2px;\n      background: linear-gradient(to bottom, var(--pink-400), var(--purple-500), var(--indigo-500));\n      border-radius: 2px;\n    }\n    .tech-item {\n      position: relative;\n      padding: 10px 0 10px 20px;\n    }\n    .tech-item::before {\n      content: '';\n      position: absolute;\n      left: -28px;\n      top: 16px;\n      width: 10px;\n      height: 10px;\n      border-radius: 50%;\n      background: var(--purple-400);\n      border: 2px solid var(--bg-card);\n      box-shadow: 0 0 8px rgba(168, 85, 247, 0.6);\n    }\n    .tech-category {\n      font-size: 0.78rem;\n      color: var(--pink-400);\n      font-weight: 600;\n      letter-spacing: 0.06em;\n      text-transform: uppercase;\n      margin-bottom: 4px;\n    }\n    .tech-desc {\n      font-size: 0.9rem;\n      color: var(--text-secondary);\n    }\n\n    /* ===== 格言 ===== */\n    .motto-box {\n      background: linear-gradient(135deg, rgba(168,85,247,0.2), rgba(244,114,182,0.15));\n      border: 1px solid rgba(168, 85, 247, 0.3);\n      border-radius: 16px;\n      padding: 24px 28px;\n      text-align: center;\n      font-size: 1.05rem;\n      color: var(--text-primary);\n      font-style: italic;\n      letter-spacing: 0.04em;\n      position: relative;\n    }\n    .motto-box::before {\n      content: '\"';\n      font-size: 5rem;\n      line-height: 1;\n      position: absolute;\n      top: -10px;\n      left: 18px;\n      color: rgba(168, 85, 247, 0.25);\n      font-style: normal;\n    }\n    .motto-box::after {\n      content: '\"';\n      font-size: 5rem;\n      line-height: 1;\n      position: absolute;\n      bottom: -30px;\n      right: 18px;\n      color: rgba(168, 85, 247, 0.25);\n      font-style: normal;\n    }\n\n    /* ===== 页脚 ===== */\n    .footer {\n      text-align: center;\n      margin-top: 48px;\n      padding-top: 24px;\n      border-top: 1px solid rgba(192, 132, 252, 0.15);\n      color: var(--text-muted);\n      font-size: 0.85rem;\n      letter-spacing: 0.04em;\n    }\n\n    /* ===== 响应式 ===== */\n    @media (max-width: 560px) {\n      .hero-name   { font-size: 1.9rem; }\n      .hero-avatar { width: 88px; height: 88px; font-size: 2.6rem; }\n      .card        { padding: 20px 18px; }\n      .info-list   { grid-template-columns: 1fr; }\n      .personality-grid { grid-template-columns: 1fr 1fr; }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"page-wrapper\">\n\n    <!-- 🌸 顶部花饰 -->\n    <div class=\"top-ribbon\">🌸 🌺 🌸</div>\n\n    <!-- 👤 标题区 -->\n    <div class=\"hero\">\n      <div class=\"hero-avatar\">✿</div>\n      <h1 class=\"hero-name\">花花</h1>\n      <p class=\"hero-subtitle\">资深全栈开发工程师 · 5 年一线企业级开发经验</p>\n      <div class=\"hero-location\">📍 中国 · 辽宁 · 沈阳</div>\n    </div>\n\n    <!-- 📋 基本信息 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-bio\">👤</div>\n        <span class=\"card-title\">基本信息</span>\n      </div>\n      <div class=\"info-list\">\n        <div class=\"info-item\">\n          <span class=\"info-label\">姓名</span>\n          <span class=\"info-value\">花花 ✿</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">性别</span>\n          <span class=\"info-value\">女</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">年龄</span>\n          <span class=\"info-value\">26 岁</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">籍贯</span>\n          <span class=\"info-value\">辽宁省沈阳市</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">职业</span>\n          <span class=\"info-value\">全栈开发工程师</span>\n        </div>\n        <div class=\"info-item\">\n          <span class=\"info-label\">经验</span>\n          <span class=\"info-value\">5 年一线企业级开发</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🛠️ 技能特长 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-skill\">🛠️</div>\n        <span class=\"card-title\">技能特长</span>\n      </div>\n      <div class=\"skill-tags\">\n        <span class=\"skill-tag tag-purple\">🎨 前端开发</span>\n        <span class=\"skill-tag tag-blue\">⚙️ 后端开发</span>\n        <span class=\"skill-tag tag-indigo\">🗄️ 数据库设计</span>\n        <span class=\"skill-tag tag-sky\">☁️ 云服务部署</span>\n        <span class=\"skill-tag tag-emerald\">🔧 系统架构</span>\n        <span class=\"skill-tag tag-yellow\">🧪 自动化测试</span>\n        <span class=\"skill-tag tag-pink\">📦 全栈集成</span>\n        <span class=\"skill-tag tag-purple\">🔍 代码审查</span>\n        <span class=\"skill-tag tag-blue\">📐 技术方案设计</span>\n        <span class=\"skill-tag tag-indigo\">🤝 团队协作</span>\n      </div>\n    </div>\n\n    <!-- 💻 技术栈明细 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-tech\">💻</div>\n        <span class=\"card-title\">技术栈一览</span>\n      </div>\n      <div class=\"tech-timeline\">\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🖥️ 前端技术</div>\n          <div class=\"tech-desc\">HTML5 · CSS3 · JavaScript (ES6+) · React / Vue · TypeScript</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">⚙️ 后端技术</div>\n          <div class=\"tech-desc\">Node.js · Python · Java · RESTful API 设计 · GraphQL</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🗄️ 数据存储</div>\n          <div class=\"tech-desc\">MySQL · PostgreSQL · MongoDB · Redis 缓存</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">🛠️ 工具 & 平台</div>\n          <div class=\"tech-desc\">Git · Docker · CI/CD · Linux 服务器管理 · Nginx</div>\n        </div>\n        <div class=\"tech-item\">\n          <div class=\"tech-category\">📐 工程实践</div>\n          <div class=\"tech-desc\">敏捷开发 · 单元测试 · 性能优化 · 代码重构 · 文档撰写</div>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🌟 性格特点 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-personality\">🌟</div>\n        <span class=\"card-title\">性格特点</span>\n      </div>\n      <div class=\"personality-grid\">\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🗣️</span>\n          <div class=\"trait-name\">爽朗大方</div>\n          <div class=\"trait-desc\">说话直爽不绕弯，沟通高效无套路</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🎯</span>\n          <div class=\"trait-name\">做事严谨</div>\n          <div class=\"trait-desc\">技术问题极度较真，代码质量有保证</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">💪</span>\n          <div class=\"trait-name\">能扛压力</div>\n          <div class=\"trait-desc\">面对项目压力稳得住，交付靠谱</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">💖</span>\n          <div class=\"trait-name\">共情力强</div>\n          <div class=\"trait-desc\">能理解队友焦虑，温柔安抚情绪</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🏠</span>\n          <div class=\"trait-name\">接地气</div>\n          <div class=\"trait-desc\">生活里热心肠，不矫情不做作</div>\n        </div>\n        <div class=\"trait-card\">\n          <span class=\"trait-emoji\">🤝</span>\n          <div class=\"trait-name\">团队之友</div>\n          <div class=\"trait-desc\">既能扛项目，也能温暖队友</div>\n        </div>\n      </div>\n    </div>\n\n    <!-- 🎮 兴趣爱好 -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <div class=\"card-icon icon-hobby\">🎮</div>\n        <span class=\"card-title\">工作之余</span>\n      </div>\n      <div class=\"skill-tags\">\n        <span class=\"skill-tag tag-pink\">☕ 品咖啡</span>\n        <span class=\"skill-tag tag-purple\">📚 技术阅读</span>\n        <span class=\"skill-tag tag-sky\">🎵 听歌放松</span>\n        <span class=\"skill-tag tag-emerald\">🏃 户外运动</span>\n        <span class=\"skill-tag tag-yellow\">🍜 东北美食</span>\n        <span class=\"skill-tag tag-blue\">🛋️ 追剧躺平</span>\n        <span class=\"skill-tag tag-indigo\">💡 探索新技术</span>\n        <span class=\"skill-tag tag-pink\">👯 和朋友玩耍</span>\n      </div>\n    </div>\n\n    <!-- 💬 格言 -->\n    <div class=\"card\">\n      <div class=\"motto-box\">\n        技术是硬实力，人品是软实力。<br>\n        靠谱做事，真诚待人，代码和生活都同样认真。\n      </div>\n    </div>\n\n    <!-- 📝 页脚 -->\n    <div class=\"footer\">\n      <p>🌸 Made with 💜 by 花花 ✿ &nbsp;|&nbsp; 2026 版权所有 🌸</p>\n    </div>\n\n  </div>\n</body>\n</html>\n"},"isError":false}}}],"role":"user"},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"68cbb92b-ce1f-4783-9e39-ecaec8e0e43d","timestamp":1785397607.7431629}


id: b9debfb8-5ca4-49a9-b995-eae7ae8da835
app_name: dev_agent
user_id: local_user
session_id: 28085c43-c933-425f-a658-362382b2042b
invocation_id: e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730
event_data:
  {"model_version":"deepseek-v4-flash","content":{"parts":[{"text":"哦～原来你说的\"花花\"是她呀！🌸\n\n我找到了这个 `about_huahua.html` 页面，里面介绍了一位超棒的全栈开发工程师 **花花 ✿**：\n\n> **👩‍💻 资深全栈开发工程师 · 5 年一线企业级开发经验**\n> **📍 中国 · 辽宁 · 沈阳 · 26 岁**\n\n这是一份设计得非常精美的个人介绍页面，深紫渐变风格，有动态呼吸光效，涵盖了：\n- 📋 **基本信息** — 姓名、性别、年龄、职业等\n- 🛠️ **技能特长** — 前端/后端/数据库/云服务/架构等\n- 💻 **技术栈一览** — 从 React/Vue 到 Node.js/Java，从 MySQL 到 Docker\n- 🌟 **性格特点** — 爽朗大方、做事严谨、能扛压力、共情力强\n- 🎮 **兴趣爱好** — 品咖啡、技术阅读、户外运动、东北美食...\n\n而且格言也写得很有态度：\n> *\"技术是硬实力，人品是软实力。靠谱做事，真诚待人，代码和生活都同样认真。\"*\n\n---\n\n请问你想让我做些什么呢？比如：\n1. 想对这个页面做修改或美化？\n2. 想看看其他项目（比如 `9router`、`baseplatform` 等）？\n3. 或者开始新的开发任务？\n\n随时告诉我，我这就开干！🚀"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":407,"prompt_token_count":18039,"thoughts_token_count":93,"total_token_count":18446},"invocation_id":"e-90dc5d8b-1f0e-4e12-a12a-2b3dfb2fa730","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"b9debfb8-5ca4-49a9-b995-eae7ae8da835","timestamp":1785397607.7564025}


id: 1a46aada-2974-406c-a670-3dcb3b339465
app_name: dev_agent
user_id: local_user
session_id: 22d38e86-85df-4a30-8aba-9bcf87ee3b67
invocation_id: e-c0bdc4ac-39bd-43bd-85ba-7f054ae30f5c
event_data:
  {"content":{"parts":[{"text":"嗨"}],"role":"user"},"invocation_id":"e-c0bdc4ac-39bd-43bd-85ba-7f054ae30f5c","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"1a46aada-2974-406c-a670-3dcb3b339465","timestamp":1785463448.440776}


id: e4f1ad05-cacf-4c6b-b1b4-b627fca7863a
app_name: dev_agent
user_id: local_user
session_id: 22d38e86-85df-4a30-8aba-9bcf87ee3b67
invocation_id: e-c0bdc4ac-39bd-43bd-85ba-7f054ae30f5c
event_data:
  {"model_version":"astron-code-latest","content":{"parts":[{"text":"你好！我是 dev_agent，你的全栈开发助手。有什么可以帮你的吗？\n\n无论是代码编写、bug 修复、项目结构优化，还是编译构建验证，我都可以帮助你完成。请告诉我你的需求吧！"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":47,"prompt_token_count":5107,"total_token_count":5154},"invocation_id":"e-c0bdc4ac-39bd-43bd-85ba-7f054ae30f5c","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"e4f1ad05-cacf-4c6b-b1b4-b627fca7863a","timestamp":1785463457.1064796}


id: 3b7af131-a9f8-4c21-a1d3-fea32b48e5fe
app_name: dev_agent
user_id: codebuddy
session_id: test_debug_001
invocation_id: e-75236a2c-0c87-4891-b228-5b9092070507
event_data:
  {"content":{"parts":[{"text":"??????????test.txt??,???hello"}],"role":"user"},"invocation_id":"e-75236a2c-0c87-4891-b228-5b9092070507","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"3b7af131-a9f8-4c21-a1d3-fea32b48e5fe","timestamp":1785463751.136534}


id: 3436640b-a2a7-43ce-b893-e2e62a46eb33
app_name: dev_agent
user_id: codebuddy
session_id: test_debug_001
invocation_id: e-75236a2c-0c87-4891-b228-5b9092070507
event_data:
  {"model_version":"glm-5.2","content":{"parts":[{"text":"The user is asking me to create a test.txt file with the content \"hello\". Let me first check what directories are allowed.","thought":true},{"function_call":{"id":"call_e0858aa460314f8fa8389196","args":{},"name":"list_allowed_directories"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":34,"prompt_token_count":4726,"thoughts_token_count":26,"total_token_count":4760},"invocation_id":"e-75236a2c-0c87-4891-b228-5b9092070507","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"3436640b-a2a7-43ce-b893-e2e62a46eb33","timestamp":1785463756.0671616}


id: e084488f-16cf-44f6-80cd-783c334b89bf
app_name: dev_agent
user_id: codebuddy
session_id: test_debug_001
invocation_id: e-75236a2c-0c87-4891-b228-5b9092070507
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_e0858aa460314f8fa8389196","name":"list_allowed_directories","response":{"content":[{"type":"text","text":"Allowed directories:\nD:\\nzy\\workspace_git"}],"structuredContent":{"content":"Allowed directories:\nD:\\nzy\\workspace_git"},"isError":false}}}],"role":"user"},"invocation_id":"e-75236a2c-0c87-4891-b228-5b9092070507","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"e084488f-16cf-44f6-80cd-783c334b89bf","timestamp":1785463760.9912598}


id: 9d174e40-7d73-437f-bdfd-f69cbad7b892
app_name: dev_agent
user_id: codebuddy
session_id: test_debug_001
invocation_id: e-75236a2c-0c87-4891-b228-5b9092070507
event_data:
  {"model_version":"deepseek-v4-flash","content":{"parts":[{"text":"The allowed directory is D:\\nzy\\workspace_git. Let me create the test.txt file there with content \"hello\".","thought":true},{"function_call":{"id":"call_9cc514c4f4fc486c80c9a553","args":{"path":"D:\\nzy\\workspace_git\\test.txt","content":"hello"},"name":"write_file"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":2816,"candidates_token_count":99,"prompt_token_count":5019,"thoughts_token_count":27,"total_token_count":5118},"invocation_id":"e-75236a2c-0c87-4891-b228-5b9092070507","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"long_running_tool_ids":[],"id":"9d174e40-7d73-437f-bdfd-f69cbad7b892","timestamp":1785463761.0064883}


id: 41d8ea04-768d-45c1-8363-caf6c0d1c1bd
app_name: dev_agent
user_id: codebuddy
session_id: test_debug_001
invocation_id: e-75236a2c-0c87-4891-b228-5b9092070507
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_9cc514c4f4fc486c80c9a553","name":"write_file","response":{"content":[{"type":"text","text":"Successfully wrote to D:\\nzy\\workspace_git\\test.txt"}],"structuredContent":{"content":"Successfully wrote to D:\\nzy\\workspace_git\\test.txt"},"isError":false}}}],"role":"user"},"invocation_id":"e-75236a2c-0c87-4891-b228-5b9092070507","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"41d8ea04-768d-45c1-8363-caf6c0d1c1bd","timestamp":1785463762.9988382}


id: fb13809c-63c5-461a-841e-9e9c6c0d7fa8
app_name: dev_agent
user_id: codebuddy
session_id: test_debug_001
invocation_id: e-75236a2c-0c87-4891-b228-5b9092070507
event_data:
  {"model_version":"step-3.7-flash","content":{"parts":[{"text":"The file has been created successfully. Let me report the result to the user.","thought":true},{"text":"已完成。文件 `test.txt` 已创建，内容为 `hello`，路径为：\n\n```\nD:\\nzy\\workspace_git\\test.txt\n```"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":2624,"candidates_token_count":54,"prompt_token_count":4978,"total_token_count":5032},"invocation_id":"e-75236a2c-0c87-4891-b228-5b9092070507","author":"dev_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"dev_agent@1"},"id":"fb13809c-63c5-461a-841e-9e9c6c0d7fa8","timestamp":1785463763.0104485}


id: 142dc1b0-a7af-4c6e-b658-85aeffd332b7
app_name: my_agent
user_id: codebuddy
session_id: test_long_input
invocation_id: e-14ceff61-b76f-4e0c-bfa7-2b6217c45d16
event_data:
  {"content":{"parts":[{"text":"请只回复「收到」两个字，不要做任何其他操作，不要调用任何工具。这是一条测试消息，用来验证长文本输入是否正常：\n\n重构勤务统计页面（schedulingStatistical.vue），将现有占位页面改为大屏可视化风格，像素级复刻老项目样式。\n\n  ---\n  项目信息\n\n  - 项目路径：d:/nzy/workspace_git/Baseplatform-Ui-V3\n  - 目标文件：src/views/serviceManage/schedulingStatistical.vue\n  - 老项目参考源：D:/nzy/workspace_git/baseplatform-ui/src/views/postPage/schedulingStatistical.vue\n  - 技术栈：Vue 3 + TypeScript + Ant Design Vue 4.x + ECharts 5\n\n  ---\n  迁移规范（9条）\n\n  1. 布局框架\n  - 使用 BgAndInfo 公共组件包裹页面，传入 title-menu=\"勤务管理\"、title-name=\"勤务统计\"、step-url=\"/frontend/schedulingStatistical\"、bg-size=\"1920\"\n  - 页面主容器使用绝对定位（地图类页面）或 flex 布局（管理类页面）\n  - 整体设计稿尺寸 1920×960，无需手动 transform scale\n\n  2. 图片引用规则\n  - 所有本地图片使用 CSS background-image + url('/@/assets/...') 方式引用\n  - 不要用 <img> 标签引用本地资源（vite 运行时解析有限制）\n  - 图标类小图优先用 CSS 伪元素或 mask-image 实现\n\n  3. 组件迁移规则\n  - el-tree → a-tree（Ant Design Vue 树形组件），需用 :deep() 覆盖深色样式\n  - el-table / 自定义 div 表格 → 继续用 div + flex 手写表格（更适合大屏风格）\n  - el-select → 原生 <select> + 自定义样式，或 a-select 加深度覆盖\n  - el-input → 原生 <input> + 自定义样式\n  - el-pagination → a-pagination，需深度覆盖深色样式\n  - el-collapse → a-collapse\n  - el-popover / el-tooltip → a-tooltip\n  - el-dialog → 自定义弹窗 div（更灵活）\n\n  4. Mock 数据规则\n  - 所有数据全部使用 Mock 数据，不调用真实 API\n  - 数据量要足够展示效果（岗位列表不少于10条，警力列表不少于6人）\n  - 部门树数据至少包含支队 → 大队（8个）→ 中队三级结构\n\n  5. 图表迁移\n  - ECharts 5 用法保持不变，但使用 import * as echarts from 'echarts'\n  - 在 onMounted + nextTick 中初始化图表\n  - 使用 ref 保存 DOM 引用，let xxxChart: echarts.ECharts | null = null\n  - 深色主题配色：主色 #29B3FF、辅助色 #44FFFD、警告色 #FFE478、危险色 #EE5A52\n\n  6. Vue3 写法\n  - 使用 <script setup lang=\"ts\"> 语法\n  - data() → ref / reactive\n  - methods → 普通函数\n  - computed → computed(() => ...)\n  - created/mounted → onMounted\n  - 类型定义用 interface 或 type\n\n  7. 样式写法\n  - 使用 <style lang=\"scss\" scoped>\n  - 深度选择器用 :deep(.class-name)\n  - 背景色半透明：rgba(41, 179, 255, 0.x) 系列\n  - 滚动条样式统一：细、蓝色半透明\n\n  8. 可复用资源路径\n  - src/assets/image/bj@2x.png — 左侧树面板背景\n  - src/assets/image/组 16257.png — 列表面板背景\n  - src/assets/map_image/policeSituation/searchBar.png — 搜索栏背景\n  - src/assets/map_image/goScreenBg.png — 确认按钮背景\n  - src/assets/map_image/cancel.png — 取消按钮背景\n  - src/assets/map_image/alertMessageBg.png — 弹窗背景\n  - src/assets/service/videoDes.png — 小图标\n  - BgAndInfo 组件：/@/components/Common/bgAndInfo.vue\n  - MapContainer 组件：/@/components/TumengIndex/MapContainer.vue\n\n  9. 自查清单\n  ☐ BgAndInfo 组件引入正确，面包屑和标题正常显示\n  ☐ 所有图片使用 background-image 方式，没有 <img> 引用本地资源\n  ☐ 页面在浏览器中不报错（控制台无红色错误）\n  ☐ Mock 数据量充足，列表/表格内容完整\n  ☐ ECharts 图表能正常渲染\n  ☐ 深色科技风格统一，主色调 #29B3FF\n  ☐ TypeScript 类型定义合理，没有大量 any\n\n  ---\n  页面结构说明\n\n  勤务统计是一个地图大屏页面，主要结构：\n\n  1. 地图背景：MapContainer 全屏铺底\n  2. 左侧岗位列表面板（约 420px 宽）：\n    - 标题栏（岗位列表 + 图标说明按钮）\n    - 搜索筛选栏（岗位类型一级/二级下拉 + 关键字搜索 + 定位按钮 + 查询按钮）\n    - 左侧部门树（约 160px 宽，三级部门，可勾选）\n    - 右侧岗位表格（岗位名称、警力部署（警/辅/保）、拥堵指数、类型）\n  3. 右上出勤情况面板（约 420px 宽）：\n    - 可切换\"出勤情况\"和\"路勤统计\"两个模式\n    - 出勤模式：手风琴式展开班次，每个班次含民警/辅警/保通员人员列表，显示在岗状态、4G设备、对讲机、签到/签退状态\n    - 路勤统计模式：3个统计卡片（总岗位/重点/异常）+ 环形图 + 警力统计（警/辅/保）+ 排班率/准点率\n  4. 右下面板（约 420px 宽）：\n    - 出勤模式下：路面保通情况折线图（双折线）\n    - 路勤模式下：异常班次表格（班次、岗位、异常人员）\n  5. 顶部日期选择器：居中，带\"当前\"按钮\n  6. 岗位信息弹窗：点击岗位行弹出，显示基础信息和班次信息\n  7. 图标说明弹窗：显示警力类型图例\n\n  ---\n  参考页面\n\n  已完成的参考页面（可学习风格和写法）：\n  - src/views/serviceManage/serviceIndexDd.vue — 勤务排班（左中右布局，ECharts图表）\n  - src/views/serviceManage/workData.vue — 施工智管（地图+左右面板+弹窗）\n\n  ---\n  验收标准\n\n  1. 页面构建通过（vite build 无错误）\n  2. 主要 UI 元素都有（左侧面板、右侧出勤/路勤面板、底部面板、日期选择器）\n  3. 交互基本可用（tab切换、手风琴展开、部门树勾选筛选岗位列表）\n  4. 图表正常渲染（环形图、折线图各一个）\n  5. 整体风格与老项目一致（深色科技风 + 蓝色主色调）\n\n记住：只回复「收到」两个字，不要做任何其他操作！"}],"role":"user"},"invocation_id":"e-14ceff61-b76f-4e0c-bfa7-2b6217c45d16","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"142dc1b0-a7af-4c6e-b658-85aeffd332b7","timestamp":1785485949.7072196}


id: f1d67bc0-e716-4a83-bdd8-6fc23a8da956
app_name: my_agent
user_id: codebuddy
session_id: test_long_input
invocation_id: e-14ceff61-b76f-4e0c-bfa7-2b6217c45d16
event_data:
  {"model_version":"sensenova-6.7-flash-lite","content":{"parts":[{"text":"正在处理一个请求，要求在测试消息中只回复\"收到\"两个字。根据指示，我需要严格遵守这个要求，不执行其他操作或调用任何工具。这是一个简单的测试用例，验证长文本输入的正常处理能力。\n","thought":true},{"text":"\n\n收到"}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":50,"prompt_token_count":7154,"total_token_count":7204},"invocation_id":"e-14ceff61-b76f-4e0c-bfa7-2b6217c45d16","author":"my_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"my_agent@1"},"id":"f1d67bc0-e716-4a83-bdd8-6fc23a8da956","timestamp":1785485955.1417246}


id: e5e83836-42e7-43cb-b187-0b766abf674e
app_name: my_agent
user_id: codebuddy
session_id: test_long_output_001
invocation_id: e-a5956bec-6f8a-451f-b787-adfb9dfce554
event_data:
  {"content":{"parts":[{"text":"重构勤务统计页面（schedulingStatistical.vue），将现有占位页面改为大屏可视化风格，像素级复刻老项目样式。\n\n---\n项目信息\n\n- 项目路径：D:\\nzy\\workspace_git\\Baseplatform-Ui-V3\n- 目标文件：src/views/serviceManage/schedulingStatistical.vue\n- 老项目参考源：D:\\nzy\\workspace_git\\baseplatform-ui/src/views/postPage/schedulingStatistical.vue\n- 技术栈：Vue 3 + TypeScript + Ant Design Vue 4.x + ECharts 5\n\n⚠️ 重要：所有输出文件写入 D:\\nzy\\workspace_git\\test_scheduling_output\\ 目录下，不要修改源项目文件！\n\n---\n迁移规范（9条）\n\n1. 布局框架\n- 使用 BgAndInfo 公共组件包裹页面，传入 title-menu=\"勤务管理\"、title-name=\"勤务统计\"、step-url=\"/frontend/schedulingStatistical\"、bg-size=\"1920\"\n- 页面主容器使用绝对定位（地图类页面）或 flex 布局（管理类页面）\n- 整体设计稿尺寸 1920×960，无需手动 transform scale\n\n2. 图片引用规则\n- 所有本地图片使用 CSS background-image + url('/@/assets/...') 方式引用\n- 不要用 <img> 标签引用本地资源（vite 运行时解析有限制）\n- 图标类小图优先用 CSS 伪元素或 mask-image 实现\n\n3. 组件迁移规则\n- el-tree → a-tree（Ant Design Vue 树形组件），需用 :deep() 覆盖深色样式\n- el-table / 自定义 div 表格 → 继续用 div + flex 手写表格（更适合大屏风格）\n- el-select → 原生 <select> + 自定义样式，或 a-select 加深度覆盖\n- el-input → 原生 <input> + 自定义样式\n- el-pagination → a-pagination，需深度覆盖深色样式\n- el-collapse → a-collapse\n- el-popover / el-tooltip → a-tooltip\n- el-dialog → 自定义弹窗 div（更灵活）\n\n4. Mock 数据规则\n- 所有数据全部使用 Mock 数据，不调用真实 API\n- 数据量要足够展示效果（岗位列表不少于10条，警力列表不少于6人）\n- 部门树数据至少包含支队 → 大队（8个）→ 中队三级结构\n\n5. 图表迁移\n- ECharts 5 用法保持不变，但使用 import * as echarts from 'echarts'\n- 在 onMounted + nextTick 中初始化图表\n- 使用 ref 保存 DOM 引用，let xxxChart: echarts.ECharts | null = null\n- 深色主题配色：主色 #29B3FF、辅助色 #44FFFD、警告色 #FFE478、危险色 #EE5A52\n\n6. Vue3 写法\n- 使用 <script setup lang=\"ts\"> 语法\n- data() → ref / reactive\n- methods → 普通函数\n- computed → computed(() => ...)\n- created/mounted → onMounted\n- 类型定义用 interface 或 type\n\n7. 样式写法\n- 使用 <style lang=\"scss\" scoped>\n- 深度选择器用 :deep(.class-name)\n- 背景色半透明：rgba(41, 179, 255, 0.x) 系列\n- 滚动条样式统一：细、蓝色半透明\n\n8. 可复用资源路径\n- src/assets/image/bj@2x.png — 左侧树面板背景\n- src/assets/image/组 16257.png — 列表面板背景\n- src/assets/map_image/policeSituation/searchBar.png — 搜索栏背景\n- src/assets/map_image/goScreenBg.png — 确认按钮背景\n- src/assets/map_image/cancel.png — 取消按钮背景\n- src/assets/map_image/alertMessageBg.png — 弹窗背景\n- src/assets/service/videoDes.png — 小图标\n- BgAndInfo 组件：/@/components/Common/bgAndInfo.vue\n- MapContainer 组件：/@/components/TumengIndex/MapContainer.vue\n\n9. 自查清单\n☐ BgAndInfo 组件引入正确，面包屑和标题正常显示\n☐ 所有图片使用 background-image 方式，没有 <img> 引用本地资源\n☐ 页面在浏览器中不报错（控制台无红色错误）\n☐ Mock 数据量充足，列表/表格内容完整\n☐ ECharts 图表能正常渲染\n☐ 深色科技风格统一，主色调 #29B3FF\n☐ TypeScript 类型定义合理，没有大量 any\n\n---\n页面结构说明\n\n勤务统计是一个地图大屏页面，主要结构：\n\n1. 地图背景：MapContainer 全屏铺底\n2. 左侧岗位列表面板（约 420px 宽）：\n  - 标题栏（岗位列表 + 图标说明按钮）\n  - 搜索筛选栏（岗位类型一级/二级下拉 + 关键字搜索 + 定位按钮 + 查询按钮）\n  - 左侧部门树（约 160px 宽，三级部门，可勾选）\n  - 右侧岗位表格（岗位名称、警力部署（警/辅/保）、拥堵指数、类型）\n3. 右上出勤情况面板（约 420px 宽）：\n  - 可切换\"出勤情况\"和\"路勤统计\"两个模式\n  - 出勤模式：手风琴式展开班次，每个班次含民警/辅警/保通员人员列表，显示在岗状态、4G设备、对讲机、签到/签退状态\n  - 路勤统计模式：3个统计卡片（总岗位/重点/异常）+ 环形图 + 警力统计（警/辅/保）+ 排班率/准点率\n4. 右下面板（约 420px 宽）：\n  - 出勤模式下：路面保通情况折线图（双折线）\n  - 路勤模式下：异常班次表格（班次、岗位、异常人员）\n5. 顶部日期选择器：居中，带\"当前\"按钮\n6. 岗位信息弹窗：点击岗位行弹出，显示基础信息和班次信息\n7. 图标说明弹窗：显示警力类型图例\n\n---\n参考页面\n\n已完成的参考页面（可学习风格和写法）：\n- src/views/serviceManage/serviceIndexDd.vue — 勤务排班（左中右布局，ECharts图表）\n- src/views/serviceManage/workData.vue — 施工智管（地图+左右面板+弹窗）\n\n---\n验收标准\n\n1. 页面构建通过（vite build 无错误）\n2. 主要 UI 元素都有（左侧面板、右侧出勤/路勤面板、底部面板、日期选择器）\n3. 交互基本可用（tab切换、手风琴展开、部门树勾选筛选岗位列表）\n4. 图表正常渲染（环形图、折线图各一个）\n5. 整体风格与老项目一致（深色科技风 + 蓝色主色调）\n\n⚠️ 再次强调：所有输出文件必须写入 D:\\nzy\\workspace_git\\test_scheduling_output\\ 目录，不要修改 Baseplatform-Ui-V3 或 baseplatform-ui 的任何文件。"}],"role":"user"},"invocation_id":"e-a5956bec-6f8a-451f-b787-adfb9dfce554","author":"user","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":""},"id":"e5e83836-42e7-43cb-b187-0b766abf674e","timestamp":1785486241.2728028}


id: 146df403-9f3a-4b5b-bfa7-e36f6fcab50e
app_name: my_agent
user_id: codebuddy
session_id: test_long_output_001
invocation_id: e-a5956bec-6f8a-451f-b787-adfb9dfce554
event_data:
  {"model_version":"astron-code-latest","content":{"parts":[{"text":"我来开始重构勤务统计页面。首先让我了解项目结构和参考文件。\n\n"},{"function_call":{"id":"call_e225f31a85c44191908faaaa","args":{},"name":"list_allowed_directories"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":33,"prompt_token_count":8501,"total_token_count":8534},"invocation_id":"e-a5956bec-6f8a-451f-b787-adfb9dfce554","author":"my_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"my_agent@1"},"long_running_tool_ids":[],"id":"146df403-9f3a-4b5b-bfa7-e36f6fcab50e","timestamp":1785486241.2908158}


id: 41460c19-c6ef-454d-bd41-582a262981cf
app_name: my_agent
user_id: codebuddy
session_id: test_long_output_001
invocation_id: e-a5956bec-6f8a-451f-b787-adfb9dfce554
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_e225f31a85c44191908faaaa","name":"list_allowed_directories","response":{"content":[{"type":"text","text":"Allowed directories:\nD:\\nzy\\workspace_git"}],"structuredContent":{"content":"Allowed directories:\nD:\\nzy\\workspace_git"},"isError":false}}}],"role":"user"},"invocation_id":"e-a5956bec-6f8a-451f-b787-adfb9dfce554","author":"my_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"my_agent@1"},"id":"41460c19-c6ef-454d-bd41-582a262981cf","timestamp":1785486242.6247294}


id: 4d4bc0d7-36c0-4ded-a35c-4ca85a86032b
app_name: my_agent
user_id: codebuddy
session_id: test_long_output_001
invocation_id: e-a5956bec-6f8a-451f-b787-adfb9dfce554
event_data:
  {"model_version":"glm-5.2","content":{"parts":[{"text":"Let me read the old project reference file and the current placeholder file, as well as the reference pages mentioned.","thought":true},{"function_call":{"id":"call_ace65bfc02594c0c8b9bc5bf","args":{"paths":["D:/nzy/workspace_git/baseplatform-ui/src/views/postPage/schedulingStatistical.vue","D:/nzy/workspace_git/Baseplatform-Ui-V3/src/views/serviceManage/schedulingStatistical.vue"]},"name":"read_multiple_files"}}],"role":"model"},"partial":false,"finish_reason":"STOP","usage_metadata":{"cached_content_token_count":0,"candidates_token_count":77,"prompt_token_count":8163,"thoughts_token_count":22,"total_token_count":8240},"invocation_id":"e-a5956bec-6f8a-451f-b787-adfb9dfce554","author":"my_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"my_agent@1"},"long_running_tool_ids":[],"id":"4d4bc0d7-36c0-4ded-a35c-4ca85a86032b","timestamp":1785486242.6391625}


id: e51185af-38cf-4a14-af39-f70d0946ad7f
app_name: my_agent
user_id: codebuddy
session_id: test_long_output_001
invocation_id: e-a5956bec-6f8a-451f-b787-adfb9dfce554
event_data:
  {"content":{"parts":[{"function_response":{"id":"call_ace65bfc02594c0c8b9bc5bf","name":"read_multiple_files","response":{"content":[{"type":"text","text":"D:/nzy/workspace_git/baseplatform-ui/src/views/postPage/schedulingStatistical.vue:\n<template>\r\n  <div :style=\"{height:height,width:width,transform:data.transform}\" class=\"smallBg\">\r\n    <bg-info title-menu=\"勤务查看\" title-name=\"勤务查看\" :stepUrl=\"stepUrl\"></bg-info>\r\n<!--    <div class=\"topClass activesBtn\" style=\"width: 100px;right: 80px\" @click=\"changeTo('/frontend/servicePost')\" >人员维度查看</div>-->\r\n    <alertWindow :nowWidth=\"1920\" @closeTraject=\"closeTraject\" :showTraject=\"showTraject\" :ejectData=\"ejectData\" :showPostViewAlert=\"false\" @functionMap=\"functionMap\" :style=\"{transform:data.transformMap}\" ref=\"alertWindow\"></alertWindow>\r\n    <largeRightNav @trajectortBtn=\"trajectortBtn\" @setMapStyle=\"setMapStyle\" ref=\"largeRightNav\" :resolution=\"1920\" :topNavList=\"'228px'\" :rightNavList=\"indexRightNavRight\" :screenButtonStatus=\"screenButtonStatus\" @resetMap=\"resetMap\" @faceNorth=\"faceNorth()\" @showTraffic=\"showTraffic\" @showMarkers=\"showMarkers\" @hideMarkers=\"hideMarkers\" @setPoiShow=\"setPoiShow\" @flyTo=\"flyTo\" @functionMap=\"functionMap\"></largeRightNav>\r\n    <div class=\"mapBg\">\r\n      <div :style=\"{height:0,width:0,marginLeft:0,transform:data.transformMap}\">\r\n        <largeMap :sandStartDot=\"[]\" :sendMapInfo=\"[]\" @schDotPrintFun=\"schDotPrintFun\" @closeTrajectMc=\"closeTrajectMc\" ref=\"mapBg\" @getDot=\"getDot\" @getZoom=\"getZoom\" @getDdflId=\"getDdflId\" @showAreaWindow=\"showAreaWindow\" @getShowAreaId=\"getShowAreaId\" @alertWindow=\"alertWindow\"></largeMap>\r\n      </div>\r\n    </div>\r\n    <div class=\"pointView\">\r\n      <div class=\"contentTitle\">\r\n        岗位列表\r\n        <span @click=\"closeImg=true\">图标说明</span>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n      <div class=\"searchView\" style=\"display: flex\">\r\n        <div>\r\n          <el-select placeholder=\"请选择\" clearable @clear=\"clearSeach\" style=\"width: 90px\" @change=\"changeSearchDate(1,2)\" v-model=\"searchData.postPrimaryType\" size=\"medium\">\r\n            <el-option v-for=\"item in postManager\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n          </el-select>\r\n          <el-select @change=\"changeSearchDate(1)\" style=\"margin-left: 10px;width: 120px\"  clearable placeholder=\"请选择\" v-model=\"searchData.postSecondType\" size=\"medium\">\r\n            <el-option v-for=\"item in postManagerMiniS\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n          </el-select>\r\n\r\n        </div>\r\n        <div style=\"flex: 1\">\r\n          <input placeholder=\"输入关键字搜索\" v-model=\"searchData.searchPostName\" style=\"margin-left: 0\" class=\"inputView inputFocus\"></input>\r\n          <div class=\"miaodianDiv\" :class=\"isDotPrint?'miaodianDivActives':''\" @click=\"dotPrint\">\r\n            <i class=\"el-icon-location-information\"></i>\r\n          </div>\r\n          <div class=\"nowClass activesBtn\" style=\"cursor: pointer;height: 32px;position: unset\" @click=\"changeSearchDate(1)\">查询</div>\r\n<!--          statisticsList-->\r\n        </div>\r\n      </div>\r\n      <div class=\"leftContainer\">\r\n        <div class=\"tree\">\r\n          <div style=\"height: 100%;width: 100%;overflow: auto\" class=\"workForceManage\">\r\n<!--             :current-node-key=\"searchDeptId\"-->\r\n            <el-tree\r\n              :data=\"treeData\"\r\n              style=\"width: max-content\"\r\n              :indent=\"26\"\r\n              node-key=\"id\"\r\n              highlight-current\r\n              :default-expanded-keys=\"[100]\"\r\n              ref=\"tree\"\r\n              show-checkbox\r\n              :check-strictly=\"ischecked\"\r\n              :expand-on-click-node=false\r\n              @current-change=\"changeNode\"\r\n              @check=\"handleNodeTree\"\r\n            >\r\n            <span slot-scope=\"{node,data}\" style=\"width: 100%\">\r\n              <span :style=\"{color:data.deptLevel==3?'rgba(65,164,239,1)':'white',marginLeft:data.deptLevel==3?'2px':'',fontSize:data.deptLevel==1?'19px':'',fontWeight:data.deptLevel!=3?'bold':'' }\">{{node.label}}</span>\r\n            </span>\r\n<!--               @node-click=\"handleNodeClick\"-->\r\n<!--              @current-change=\"changeNode\"-->\r\n<!--              @check=\"handleNodeTree\"-->\r\n            </el-tree>\r\n          </div>\r\n        </div>\r\n        <div class=\"post\">\r\n          <div class=\"workRankView\">\r\n            <div class=\"faultTable\" style=\"float: none\">\r\n              <div class=\"thead thead1\">\r\n                <div class=\"th td11\" style=\"text-align: left;padding-left: 10px\">岗位名称</div>\r\n                <div class=\"th td12\" style=\"text-align: left;padding-left: 10px\">警力部署</div>\r\n<!--                @click=\"clickSearch(3)\"-->\r\n                <div class=\"th td13 diplayFlex\" style=\"justify-content: center;\"  >指数\r\n                  <div class=\"diplayFlexI\">\r\n                    <p :class=\"'colorBlue'\" ><i class=\"el-icon-caret-top\"></i></p>\r\n                    <p :class=\"'colorBlue'\"><i class=\"el-icon-caret-bottom\"></i></p>\r\n                  </div>\r\n                </div>\r\n                <div class=\"th\">类型</div>\r\n              </div>\r\n              <div v-loading=\"loadingPost\" class=\"postClass\" style=\"height: 670px\">\r\n                <div class=\"tbody\" v-if=\"postList.length>0\" style=\"height: 638px;overflow-y: auto;width: 100%;overflow-x: hidden;float: none\">\r\n<!--                  selectedIndexVal-->\r\n                  <div class=\"tr thead1\" style=\"cursor: pointer\" v-for=\"(item, index) in postList\" :key=\"index\" :id=\"selectedIndexVal==item.id?'selected':''\" :class=\"{'active':selectedIndexVal==item.id}\" @click=\"setSelectedIndex(index,item)\">\r\n                    <div class=\"td td11 spaceWhite\" style=\"width: 121px;text-align: left;padding-left: 10px;overflow-x: hidden\">\r\n                      <el-popover popper-class=\"popperClassB\"\r\n                                  placement=\"top-start\"\r\n                                  width=\"100\"\r\n                                  trigger=\"hover\"\r\n                                  :open-delay=\"200\"\r\n                                  :content=\"item.postName\">\r\n                        <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 100px\"> {{item.postName}}</div>\r\n                      </el-popover>\r\n                    </div>\r\n                    <div class=\"td td12\" v-show=\"item.schedulingPoliceNum+item.schedulingAssistantNum+item.schedulingSafeguardNum!=0\" style=\"text-align: center;padding-left: 10px;color: #fff\">\r\n                      <span :style=\"{color: item.schedulingPoliceNum>0?'rgb(22, 130, 189)':'#fff'}\">{{item.schedulingPoliceNum}}</span> / <span :style=\"{color:item.schedulingAssistantNum>0?'#e1c022':'#fff' }\">{{item.schedulingAssistantNum}}</span> / <span :style=\"{color: item.schedulingSafeguardNum>0?'#11b95c':'#fff'}\">{{item.schedulingSafeguardNum}}</span>\r\n                    </div>\r\n                    <div class=\"td td12\" v-show=\"item.schedulingPoliceNum+item.schedulingAssistantNum+item.schedulingSafeguardNum==0\" style=\"text-align: center;padding-left: 10px\" :style=\"{color:'#fff'}\">\r\n                     --\r\n                    </div>\r\n                    <div class=\"td td13\" style=\"text-align: center;justify-content: center;padding-left: 10px;height: 100%;display: flex;align-items: center\">\r\n                      <span class=\"redIcon\" v-show=\"item.delayIndex\"></span>\r\n                      {{item.delayIndex?item.delayIndex.toFixed(2):'--'}}\r\n                    </div>\r\n                    <div class=\"th\" style=\"width: 20%\">{{returnType(item.postPrimaryType,item.postSecondType)}}</div>\r\n                  </div>\r\n                  <div style=\"float: none\"></div>\r\n                </div>\r\n                <div class=\"noData\" v-else style=\"color:#fff;height: 190px;text-align: center;line-height: 190px;\">\r\n                  暂无数据\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n    </div>\r\n    <div class=\"rightView\" v-show=\"showPostInfo\">\r\n      <div class=\"contentTitle\">出勤情况</div>\r\n      <div\r\n        v-loading=\"ydLoading\"\r\n        element-loading-text=\"加载中...\"\r\n        element-loading-background=\"rgba(0,0,0,0.6)\"\r\n        element-loading-spinner=\"el-icon-loading\"\r\n        style=\"width: 100%;height: 500px;padding: 10px 10px;overflow-y: scroll\">\r\n        <el-collapse v-model=\"activeNames\" class=\"schedulingContainer1\">\r\n          <el-collapse-item :name=\"index+1\" v-for=\"(item,index) in postSchedulesReportInfo\">\r\n            <template slot=\"title\">\r\n              <div style=\"width: 100%;display: flex;justify-content: space-between;padding-right: 20px\">\r\n                <el-popover popper-class=\"popperClassB\"\r\n                            placement=\"top-start\"\r\n                            width=\"100\"\r\n                            trigger=\"hover\"\r\n                            :open-delay=\"450\"\r\n                            :content=\"item.schedulesName\">\r\n                  <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 200px\">{{item.schedulesName}}</div>\r\n                </el-popover>\r\n                <span>{{item.rangeList[schedulesData[index]].startTime}} ~ {{item.rangeList[schedulesData[index]].endTime}}</span>\r\n              </div>\r\n            </template>\r\n            <div class=\"similarAlert3\" style=\"margin-top: 20px\">\r\n              <div style=\"margin-top: 20px;margin-left: 40px;\">\r\n                <el-radio-group v-model=\"schedulesData[index]\" @change=\"showDotPoint()\">\r\n                  <el-radio :label=\"secondIndex\" style=\"height: 30px\" v-for=\"(scond,secondIndex) in item.rangeList\">{{scond.startTime}}~{{scond.endTime}}</el-radio>\r\n                </el-radio-group>\r\n              </div>\r\n              <div class=\"serviceNotice\">\r\n                <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n                民警（{{item.rangeList[schedulesData[index]].policeList.length}}人）\r\n              </div>\r\n              <div v-if=\"item.rangeList[schedulesData[index]].policeList.length>0\" style=\"margin-top: 10px;width: 94%;margin-left:3%;background-color: rgba(41,179,255,0.22);\">\r\n                <div style=\"height: 30px;display: flex\" v-for=\"three in item.rangeList[schedulesData[index]].policeList\">\r\n                  <div class=\"eachRows\" style=\"width: 20%\">{{three.nickName}}</div>\r\n                  <div class=\"eachRows\" v-show=\"item.postPrimaryType==1\" style=\"width: 26%\" :style=\"{color: returnColor(three.ondutyFlag)[0]}\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                content=\"在岗状态\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" style=\"width: 68px;\" :style=\"{color:returnColor(three.ondutyFlag)[0]}\">{{returnColor(three.ondutyFlag)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\" style=\"width: 68px;cursor: pointer\"  >\r\n<!--                    <span :style=\"{color:three.recorderDeviceStatus==1?'#149e14':'#b5b3b3' }\">4G</span>-->\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                v-show=\"three.recorderId\"\r\n                                :content=\"ruturnColor(three.recorderShowOndutyFlag)[0]\">\r\n                      <div  v-show=\"three.recorderId\" slot=\"reference\" @click=\"show4GBtn(three)\" :style=\"{color:ruturnColor(three.recorderShowOndutyFlag)[1]}\" class=\"spaceWhite eachRows\" style=\"width: 48px;\">4G</div>\r\n                    </el-popover>\r\n                    <div  v-show=\"!three.recorderId\" style=\"width: 48px\"></div>\r\n                  </div>\r\n                  <el-popover popper-class=\"popperClassB\"\r\n                              placement=\"top-start\"\r\n                              width=\"100\"\r\n                              trigger=\"hover\"\r\n                              :open-delay=\"200\"\r\n                              :content=\"ruturnColor(three.interphoneShowOndutyFlag)[0]\">\r\n                    <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:ruturnColor(three.interphoneShowOndutyFlag)[1] }\" style=\"width: 68px;\">对讲机</div>\r\n                  </el-popover>\r\n\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(three.signInFlag,1,three.signInTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(three.signInFlag,1,three.signInTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(three.signInFlag,1,three.signInTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(three.signOutFlag,2,three.signOutTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(three.signOutFlag,2,three.signOutTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(three.signOutFlag,2,three.signOutTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"serviceNotice\" style=\"margin-top: 20px\">\r\n                <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n                辅警（{{item.rangeList[schedulesData[index]].assistantList.length}}人）\r\n              </div>\r\n              <div v-if=\"item.rangeList[schedulesData[index]].assistantList.length>0\" style=\"margin-top: 10px;width: 94%;margin-left:3%;background-color: rgba(41,179,255,0.22);\">\r\n                <div style=\"height: 30px;display: flex\" v-for=\"four in item.rangeList[schedulesData[index]].assistantList\">\r\n                  <div class=\"eachRows\" style=\"width: 20%\">{{four.nickName}}</div>\r\n<!--                  <div class=\"eachRows\" v-show=\"item.postPrimaryType==1\" style=\"width: 26%\" >-->\r\n<!--                    <el-popover popper-class=\"popperClassB\"-->\r\n<!--                                placement=\"top-start\"-->\r\n<!--                                width=\"100\"-->\r\n<!--                                trigger=\"hover\"-->\r\n<!--                                :open-delay=\"200\"-->\r\n<!--                                content=\"在岗状态\">-->\r\n<!--                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color: returnColor(four.ondutyFlag)[0]}\" style=\"width: 68px;\">{{returnColor(four.ondutyFlag)[1]}}</div>-->\r\n<!--                    </el-popover>-->\r\n<!--                  </div>-->\r\n                  <div class=\"eachRows\" style=\"width: 68px\"  >\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                v-show=\"four.recorderId\"\r\n                                :content=\"ruturnColor(four.recorderShowOndutyFlag)[0]\">\r\n                      <div slot=\"reference\" @click=\"show4GBtn(four)\" v-show=\"four.recorderId\" :style=\"{color:ruturnColor(four.recorderShowOndutyFlag)[1] }\" class=\"spaceWhite eachRows\" style=\"width: 48px;\">4G</div>\r\n                    </el-popover>\r\n<!--                    <span :style=\"{color:four.recorderDeviceStatus==1?'#149e14':'#b5b3b3' }\">4G</span></div>-->\r\n                  </div>\r\n                  <el-popover popper-class=\"popperClassB\"\r\n                              placement=\"top-start\"\r\n                              width=\"100\"\r\n                              trigger=\"hover\"\r\n                              :open-delay=\"200\"\r\n                              :content=\"ruturnColor(four.interphoneOnlineFlag)[0]\">\r\n                    <div slot=\"reference\" :style=\"{color:ruturnColor(four.interphoneOnlineFlag)[1]}\" class=\"spaceWhite eachRows\" style=\"width: 58px;\">对讲机</div>\r\n                  </el-popover>\r\n\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(four.signInFlag,1,four.signInTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(four.signInFlag,1,four.signInTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(four.signInFlag,1,four.signInTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(four.signOutFlag,2,four.signOutTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(four.signOutFlag,2,four.signOutTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(four.signOutFlag,2,four.signOutTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"serviceNotice\" style=\"margin-top: 20px\">\r\n                <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n                保通员（{{item.rangeList[schedulesData[index]].safeguardList.length}}人）\r\n              </div>\r\n              <div v-if=\"item.rangeList[schedulesData[index]].safeguardList.length>0\" style=\"margin-top: 10px;width: 94%;margin-left:3%;background-color: rgba(41,179,255,0.22);\">\r\n                <div style=\"height: 30px;display: flex\" v-for=\"five in item.rangeList[schedulesData[index]].safeguardList\">\r\n                  <div class=\"eachRows\" style=\"width: 20%\">{{five.nickName}}</div>\r\n<!--                  <div class=\"eachRows\" v-show=\"item.postPrimaryType==1\" style=\"width: 26%\" >-->\r\n<!--                    <el-popover popper-class=\"popperClassB\"-->\r\n<!--                                placement=\"top-start\"-->\r\n<!--                                width=\"100\"-->\r\n<!--                                trigger=\"hover\"-->\r\n<!--                                :open-delay=\"200\"-->\r\n<!--                                content=\"在岗状态\">-->\r\n<!--                      <div slot=\"reference\" class=\"spaceWhite eachRows\" style=\"width: 68px;\" :style=\"{color: returnColor(five.ondutyFlag)[0]}\">{{returnColor(five.ondutyFlag)[1]}}</div>-->\r\n<!--                    </el-popover>-->\r\n<!--                  </div>-->\r\n<!--                  <div class=\"eachRows\" style=\"width: 20%\">{{five.phonenumber}}</div>-->\r\n                  <div class=\"eachRows\" style=\"width: 48px;cursor: pointer\"  ></div>\r\n                  <div class=\"eachRows\" style=\"width: 30%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"ruturnColor(five.interphoneShowOndutyFlag)[0]\">\r\n                      <div slot=\"reference\" :style=\"{color: ruturnColor(five.interphoneShowOndutyFlag)[1]}\" class=\"spaceWhite eachRows\" style=\"width: 68px;\">对讲机</div>\r\n                    </el-popover>\r\n<!--                    <span>{{ five.interphoneId }}</span>-->\r\n                  </div>\r\n\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(five.signInFlag,1,five.signInTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(five.signInFlag,1,five.signInTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(five.signInFlag,1,five.signInTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(five.signOutFlag,2,five.signOutTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(five.signOutFlag,2,five.signOutTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(five.signOutFlag,2,five.signOutTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </el-collapse-item>\r\n        </el-collapse>\r\n      </div>\r\n\r\n    </div>\r\n    <div v-show=\"!showPostInfo\">\r\n      <div class=\"rightViewPost\">\r\n        <div class=\"contentTitle\">路勤岗位</div>\r\n        <div class=\"topContainer\">\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{ postReportInfo.totalNum?postReportInfo.totalNum:0 }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">总岗位数</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #ffe478\">{{ postReportInfo.keyNum?postReportInfo.keyNum:0 }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">重点岗位</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #e13c14\">{{ postReportInfo.abnormalNum?postReportInfo.abnormalNum:0 }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">排班异常岗位</div>\r\n          </div>\r\n        </div>\r\n        <div class=\"ringContainer\">\r\n          <div class=\"eventCateLeft\">\r\n            <div class=\"eventCateBar\" v-for=\"(item,index) in echartData.slice(0,4)\" :key=\"index\">\r\n              <div class=\"eventBlock\" :style=\"{'background-color':colorList[index]}\"></div>\r\n              <div class=\"eventDes\">{{item.name}}：{{item.num}}</div>\r\n            </div>\r\n          </div>\r\n          <div id=\"eventCateChart\" class=\"eventCateChart\"></div>\r\n          <div class=\"eventCateRight\">\r\n            <div class=\"eventCateBar\" v-for=\"(item,index) in echartData.slice(4,8)\" :key=\"index\">\r\n              <div class=\"eventBlock\" :style=\"{'background-color':colorList[index+4]}\"></div>\r\n              <div class=\"eventDes\">{{item.name}}：{{item.num}}</div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div class=\"rightViewPolice\">\r\n        <div class=\"contentTitle\">今日路勤警力</div>\r\n        <div class=\"topContainer\">\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{postRoadReportInfo.schedulingPoliceNum}}/{{postRoadReportInfo.totalPoliceNum}}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\" style=\"margin-top: 10px\">民警</div>\r\n            <div class=\"title\">(排班/总人数)</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #ffe478\">{{ postRoadReportInfo.schedulingAssistantNum }}/{{ postRoadReportInfo.totalAssistantNum }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\" style=\"margin-top: 10px\">辅警</div>\r\n            <div class=\"title\">(排班/总人数)</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #11b95c\">{{postRoadReportInfo.schedulingSafeguardNum}}/{{ postRoadReportInfo.totalSafeguardNum }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\" style=\"margin-top: 10px\">保通员</div>\r\n            <div class=\"title\">(排班/总人数)</div>\r\n          </div>\r\n        </div>\r\n        <div class=\"rateContainer\">\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{postRoadReportInfo.schedulingRatio}}%</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">排班率</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{ postRoadReportInfo.ontimeRatio }}%</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">准点率</div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n    </div>\r\n    <div class=\"roadInfo\" v-show=\"showPostInfo\">\r\n      <div class=\"contentTitle\">路面保通情况</div>\r\n      <div class=\"fault24hChart\" id=\"fault24hChart\"></div>\r\n    </div>\r\n<!--    异常班次-->\r\n    <div class=\"roadInfo\" v-show=\"!showPostInfo\">\r\n      <div class=\"contentTitle\">异常班次</div>\r\n      <div style=\"clear: both\"></div>\r\n      <div\r\n        class=\"roadInfoDiv\"\r\n        v-loading=\"roadLoading\"\r\n        element-loading-text=\"加载中...\"\r\n        element-loading-background=\"rgba(0,0,0,0.6)\"\r\n        element-loading-spinner=\"el-icon-loading\"\r\n      >\r\n        <div class=\"thead\">\r\n           <div class=\"th th1\">班次</div>\r\n          <div class=\"th th2\">岗位</div>\r\n          <div class=\"th th3\">异常人员</div>\r\n        </div>\r\n        <div v-show=\"abnormalListData.length>0\" class=\"tbody\" style=\"height: 180px;overflow-y: auto\">\r\n          <div class=\"tr\" v-for=\"item in abnormalListData\">\r\n            <div class=\"th th1\">\r\n              <el-popover popper-class=\"popperClassB\"\r\n                          placement=\"top-start\"\r\n                          width=\"100\"\r\n                          trigger=\"hover\"\r\n                          :open-delay=\"200\"\r\n                          :content=\"item.schedulesName\">\r\n                <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 122px\"> {{item.schedulesName}}</div>\r\n              </el-popover>\r\n            </div>\r\n            <div class=\"th th2\">\r\n              <el-popover popper-class=\"popperClassB\"\r\n                          placement=\"top-start\"\r\n                          width=\"100\"\r\n                          trigger=\"hover\"\r\n                          :open-delay=\"200\"\r\n                          :content=\"item.postName\">\r\n                <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 122px\"> {{item.postName}}</div>\r\n              </el-popover>\r\n            </div>\r\n            <div class=\"th th3\">\r\n              <el-popover popper-class=\"popperClassB\"\r\n                          placement=\"top-start\"\r\n                          width=\"100\"\r\n                          trigger=\"hover\"\r\n                          :open-delay=\"200\"\r\n                          :content=\"item.abnormalPersonNames\">\r\n                <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 161px\"> {{item.abnormalPersonNames}}</div>\r\n              </el-popover>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div\r\n          style=\"    line-height: 100px;\r\n    text-align: center;\r\n    color: rgba(255,255,255,.5)\"\r\n          v-show=\"abnormalListData.length<=0\">\r\n          暂无数据！\r\n        </div>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n    </div>\r\n\r\n    <div class=\"dateContainer\">\r\n<!--      <el-date-picker-->\r\n<!--      v-model=\"searchDate\"-->\r\n<!--      value-format=\"yyyy-MM-dd\"-->\r\n<!--      type=\"date\"-->\r\n<!--      @change=\"changeSearchDate\"-->\r\n<!--      :clearable=\"false\"-->\r\n<!--      ></el-date-picker>-->\r\n\r\n      <el-date-picker\r\n        v-model=\"searchDate\"\r\n        value-format=\"yyyy-MM-dd HH:mm\"\r\n        type=\"datetime\"\r\n        @change=\"changeSearchDate\"\r\n        :clearable=\"false\"\r\n      ></el-date-picker>\r\n      <div class=\"nowClass activesBtn\" @click=\"changeNow\">当前</div>\r\n    </div>\r\n    <div class=\"postInfo displayContainer\" v-dialog-drag v-show=\"showPostInfoWindow\">\r\n      <div class=\"title dialogHead\">岗位信息</div>\r\n      <div class=\"closeButton\" @click=\"showPostInfoWindow=false\"></div>\r\n      <div class=\"serviceNotice\">\r\n        <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n        基础信息\r\n      </div>\r\n      <div class=\"postDetail\" style=\"margin-top: 5px\">\r\n        <div class=\"title\">岗位名称：</div>\r\n        <div class=\"content\">{{ formData.postName }}</div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">岗位类型：</div>\r\n        <div class=\"content\">\r\n          <el-select placeholder=\"\" :disabled=\"true\" v-model=\"formData.postPrimaryType\" size=\"medium\" style=\"margin-left: -12px\">\r\n          <el-option v-for=\"item in postManager\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n        </el-select>\r\n          <el-select placeholder=\"\" v-if=\"formData.postPrimaryType!=5&&formData.postPrimaryType\" :disabled=\"true\" v-model=\"formData.postSecondType\"  size=\"medium\" style=\"width: 210px !important;margin-left: -140px\">\r\n            <el-option v-for=\"item in postManagerMini\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">勤务类型：</div>\r\n        <div class=\"content\">\r\n          <el-select :disabled=\"true\" v-model=\"formData.serviceType\" placeholder=\"\" size=\"medium\" style=\"width: 500px !important;margin-left: -13px\">\r\n            <el-option v-for=\"item in serviceTypeList\" :key=\"item.dictCode\" :label=\"item.dictLabel\" :value=\"item.dictValue\">\r\n            </el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">岗位属性：</div>\r\n        <div class=\"content\">\r\n          <el-select placeholder=\"\" :disabled=\"true\" v-model=\"formData.postProperty\" size=\"medium\" style=\"width: 500px !important;margin-left: -13px\">\r\n            <el-option v-for=\"item in postPropertyList\" :key=\"item.dictCode\" :label=\"item.dictLabel\" :value=\"item.dictCode\">\r\n            </el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">警区：</div>\r\n        <div class=\"content\">\r\n          <el-select placeholder=\"\" :disabled=\"true\" v-model=\"formData.policeAreaId\" size=\"medium\" style=\"width: 500px !important;margin-left: -13px\">\r\n            <el-option v-for=\"item in policeDistrictList\" v-if=\"item.state\" :key=\"item.name\" :label=\"item.name\" :value=\"item.id\">\r\n            </el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">位置信息：</div>\r\n        <div class=\"content\">{{formData.postAddress}}</div>\r\n      </div>\r\n      <div class=\"serviceNotice\">\r\n        <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n        班次信息\r\n      </div>\r\n      <div class=\"faultTablePost\">\r\n        <div class=\"thead\" style=\"width: 100%\">\r\n          <div class=\"th td1\" style=\"width: 10%\">班次名称</div>\r\n          <div class=\"th td2\" style=\"width: 21%;\">班次时间段</div>\r\n          <div class=\"th td3\" style=\"width: 8%;\">民警</div>\r\n          <div class=\"th td4\" style=\"width: 8%;\">辅警</div>\r\n          <div class=\"th td5\" style=\"width: 8%;\">保通员</div>\r\n          <div class=\"th td6\" style=\"width: calc(22%);\">工作建议</div>\r\n          <div class=\"th td7\" style=\"width: 23%;\">生效规则</div>\r\n        </div>\r\n        <div class=\"tbody\" v-if=\"formData.scheduleInfoList.length>0\" style=\"height: 130px;overflow-y: auto;float: left;width: 100%\">\r\n          <div v-for=\"(item, index) in formData.scheduleInfoList\" :key=\"index\">\r\n            <div class=\"tr\" style=\"width: 100%\" v-show=\"item.deleteFlag!='2'\">\r\n              <div class=\"td td1 spaceWhite\" style=\"width: 10%;\">\r\n                <el-popover popper-class=\"popperClassB\"\r\n                            placement=\"top-start\"\r\n                            width=\"100\"\r\n                            trigger=\"hover\"\r\n                            :open-delay=\"200\"\r\n                            :content=\"item.schedulesName\">\r\n                  <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 68px;\"> {{item.schedulesName}}</div>\r\n                </el-popover>\r\n              </div>\r\n              <div class=\"td td2 spaceWhite\" style=\"width: 21%\">\r\n                <p v-for=\"(itime, itnde) in item.time\"> {{itime.length>0?itime.join('-'):''}}</p>\r\n              </div>\r\n              <div class=\"td td3 spaceWhite\" style=\"width: 8%\"> {{item.policeNumber}}</div>\r\n              <div class=\"td td4 spaceWhite\" style=\"width: 8%\"> {{item.assistantPoliceNumber}}</div>\r\n              <div class=\"td td5 spaceWhite\" style=\"width: 8%\"> {{item.safeguardNumber}}</div>\r\n              <div  class=\"td td6\" style=\"width:22%\">\r\n                <span v-show=\"!item.suggest\" style=\"width: 20px;display: inline-block;height: 10px\"> </span>\r\n                <el-popover popper-class=\"popperClassB\"\r\n                            placement=\"top-start\"\r\n                            width=\"100\"\r\n                            trigger=\"hover\"\r\n                            :open-delay=\"300\"\r\n                            :content=\"item.suggest\">\r\n                  <div slot=\"reference\" class=\"spaceWhite\" style=\"width:100%\"> {{item.suggest}}</div>\r\n                </el-popover>\r\n              </div>\r\n\r\n              <div class=\"td td7\" style=\"width: 23%\"> {{returnRule(item.executeFlag)}}</div>\r\n            </div>\r\n          </div>\r\n\r\n        </div>\r\n        <div class=\"noData\" style=\"color:#fff;height: 130px;text-align: center;line-height: 190px;\">\r\n          暂无数据\r\n        </div>\r\n      </div>\r\n    </div>\r\n<!--    图标说明-->\r\n\r\n\r\n    <div class=\"mcImg\" v-show=\"closeImg\">\r\n        <transition name=\"el-zoom-in-top\">\r\n            <div class=\"mcImgDiv\">\r\n             <h1>图标说明\r\n               <img @click=\"closeImg=false\" src=\"../../assets/customLayer/closeButton.png\" alt=\"\">\r\n             </h1>\r\n              <div class=\"mcImgDivCon\">\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/q2.png\" alt=\"\"> <span>春城骑警岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/g2.png\" alt=\"\"> <span>高峰加勤岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/j2.png\" alt=\"\"> <span>机动巡逻岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/y2.png\" alt=\"\"> <span>夜巡管理岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/yi2.png\" alt=\"\"> <span>一类固定岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/e2.png\" alt=\"\"> <span>二类固定岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/s2.png\" alt=\"\"> <span>三类固定岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/qi2.png\" alt=\"\"> <span>其他</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/n2.png\" alt=\"\"> <span>内勤</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/z2.png\" alt=\"\"> <span>值班</span>\r\n                </div>\r\n                <div style=\"width: 100%\">\r\n                  <img src=\"../../assets/shedulingStatistical/s1.png\" alt=\"\"> <span>灰色代表此岗位在此时间未警力部署</span>\r\n                </div>\r\n              </div>\r\n            </div>\r\n        </transition>\r\n    </div>\r\n\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport largeMap from \"../components/largeMap\";\r\nimport largeRightNav from '../components/largeRightNav'\r\nimport alertWindow from '@/views/components/alertWindow'\r\nimport request from \"@/utils/request\";\r\nimport echarts from 'echarts'\r\nimport log from '@/views/monitor/job/log'\r\nexport default {\r\n  name: 'schedulingStatistical',\r\n  components: {\r\n    largeMap,\r\n    largeRightNav,\r\n    alertWindow\r\n  },\r\n  data(){\r\n    return{\r\n      closeTrajectShow:false,\r\n      showTraject: false,\r\n      roadLoading: false,\r\n      abnormalListData: [],\r\n      closeImg: false,\r\n      ydLoading: false,\r\n      postListIdArr: [],\r\n      selectedIndexVal: '',\r\n      loadingPost: false,\r\n      timersout: null,\r\n      ischecked: false,\r\n      postManagerMini:[],\r\n      ssMarkers: [],\r\n      postManager: [\r\n        {\r\n          name: '路勤',\r\n          id: 1,\r\n          children: [\r\n            {name: '一类固定岗', id: 1},\r\n            {name: '二类固定岗', id: 2},\r\n            {name: '三类固定岗', id: 3},\r\n            {name: '机动巡逻岗', id: 4},\r\n            {name: '夜巡管理岗', id: 5},\r\n            {name: '高峰加勤岗', id: 6},\r\n            {name: '春城骑警', id: 7},\r\n          ]},\r\n        {\r\n          name: '内勤',\r\n          id: 2,\r\n          children: [\r\n            {name: '行政岗', id: 1},\r\n            {name: '窗口岗', id: 2},\r\n            {name: '高峰加勤岗', id: 3},\r\n          ]},\r\n        {\r\n          name: '值班',\r\n          id: 3,\r\n          children: [\r\n            {name: '事故值班', id: 1},\r\n            {name: '大队值班', id: 2},\r\n            {name: '110值班', id: 3},\r\n            {name: '指挥室值班', id: 4},\r\n            {name: '备勤值班', id: 5},\r\n          ]},\r\n        {\r\n          name: '其他',\r\n          id: 5,\r\n          children: []}\r\n      ],\r\n      postManagerMiniS: [\r\n        {name: '一类固定岗', id: 1},\r\n        {name: '二类固定岗', id: 2},\r\n        {name: '三类固定岗', id: 3},\r\n        {name: '机动巡逻岗', id: 4},\r\n        {name: '夜巡管理岗', id: 5},\r\n        {name: '高峰加勤岗', id: 6},\r\n        {name: '春城骑警', id: 7},\r\n      ],\r\n      postManager1: [\r\n        {\r\n          name: '路勤',\r\n          id: 1,\r\n          children: [\r\n            {name: '一类', id: 1},\r\n            {name: '二类', id: 2},\r\n            {name: '三类', id: 3},\r\n            {name: '机动', id: 4},\r\n            {name: '夜巡', id: 5},\r\n            {name: '高峰', id: 6},\r\n            {name: '春城', id: 7},\r\n          ]},\r\n        {\r\n          name: '内勤',\r\n          id: 2,\r\n          children: [\r\n            {name: '行政', id: 1},\r\n            {name: '窗口', id: 2},\r\n            {name: '高峰加勤', id: 3},\r\n          ]},\r\n        {\r\n          name: '值班',\r\n          id: 3,\r\n          children: [\r\n            {name: '事故', id: 1},\r\n            {name: '大队', id: 2},\r\n            {name: '110', id: 3},\r\n            {name: '指挥室', id: 4},\r\n          ]},\r\n        {\r\n          name: '其他',\r\n          id: 5,\r\n          children: []}\r\n      ],\r\n      formData:{\r\n        scheduleInfoList:[],\r\n      },\r\n      showPostInfoWindow:false,\r\n      schedulesId:0,\r\n      schedulesData: [],\r\n      postSchedulesReportInfo:[],\r\n      selectedIndex:-1,\r\n      isDrawingAll:false,\r\n      showPostInfo:false,\r\n      activeNames: [1],\r\n      searchDate:'',\r\n      searchDeptId:'',\r\n      searchData: {\r\n        searchPostName:'',\r\n        postPrimaryType: 1,\r\n        postSecondType: ''\r\n      },\r\n\r\n      showAreaId:null,\r\n      postList:[],\r\n      allWindowData:[],\r\n      width: '1920px',\r\n      height: '960px',\r\n      stepUrl:'',\r\n      treeData:[],\r\n      postRoadReportInfo:{\r\n        abnormalNum:0,\r\n        keyNum:0,\r\n        ontimeRatio:0,\r\n        postSecondTypeList:0,\r\n        schedulingAssistantNum:0,\r\n        schedulingPoliceNum:0,\r\n        schedulingRatio:0,\r\n        schedulingSafeguardNum:0,\r\n        totalAssistantNum:0,\r\n        totalNum:0,\r\n        totalPoliceNum:0,\r\n        totalSafeguardNum:0,\r\n      },\r\n      postReportInfo:{\r\n        totalNum:0,\r\n        keyNum:0,\r\n        abnormalNum:0,\r\n        postSecondTypeList:[],\r\n      },\r\n      data:{\r\n        transform: 'scale(0.5,0.5)',\r\n        transformMap:'scale(0.5,0.5)',\r\n        transformNotice: ''\r\n      },\r\n      ejectData:{}, // 父子组件传值\r\n      screenButtonStatus:{\r\n        trafficStatus: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        video: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        policeSituation: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        policeman: {\r\n          isShow:true,\r\n          timer:1000\r\n        },\r\n        policeCar: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        ranger: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        rtRecorder4g: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        work: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        ponding: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        trailer:{\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        bayonet: {\r\n          isShow:true,\r\n          timer:false\r\n        }, // 卡口\r\n        controlBayonet: {\r\n          isShow:true,\r\n          timer:false\r\n        }, // 卡口\r\n      },\r\n      indexRightNavRight: 470,\r\n      colorList:['#e13c14','#f6795b','#ffe478','#29b3ff','#86bb64','#315fdc','#44fffd'],\r\n      echartData:[\r\n        {name: '一类固定岗', id: 1,num:0},\r\n        {name: '二类固定岗', id: 2,num:0},\r\n        {name: '三类固定岗', id: 3,num:0},\r\n        {name: '机动巡逻岗', id: 4,num:0},\r\n        {name: '夜巡管理岗', id: 5,num:0},\r\n        {name: '高峰加勤岗', id: 6,num:0},\r\n        {name: '春城骑警', id: 7,num:0}],\r\n      chart:null,\r\n      serviceTypeList:[],\r\n      postPrimaryTypeList:[],\r\n      policeDistrictList:[],\r\n      postSecondTypeList:[],\r\n      postPropertyList:[\r\n        {dictCode:1,dictLabel:'重点岗位'},\r\n        {dictCode:2,dictLabel:'一般岗位'},\r\n        {dictCode:3,dictLabel:'其他岗位'},\r\n      ],\r\n      deptLevel:3,\r\n      deptFlag:3,\r\n      searchDeptLevel:1,\r\n      deptIds: '',\r\n      isDotPrint:false,\r\n      printLatlon:[]\r\n    }\r\n  },\r\n  created() {\r\n    this.convert()\r\n    this.deptIds = this.$store.getters.deptId;\r\n    this.getPostReportInfo();\r\n    this.getPostRoadReportInfo()\r\n  },\r\n  mounted() {\r\n    // this.initChart()\r\n  },\r\n  methods:{\r\n    schDotPrintFun(val) {\r\n      if(val) {\r\n        this.printLatlon = val\r\n        this.$refs.mapBg.stopToMarkLayers();\r\n      }\r\n    },\r\n    dotPrint() {\r\n      this.isDotPrint = !this.isDotPrint;\r\n      if(this.isDotPrint) {\r\n        this.$refs.mapBg.startToMark('schDotPrint')//HWL\r\n      }else{\r\n        this.printLatlon = []\r\n        this.$refs.mapBg.stopPrintDot()\r\n      }\r\n    },\r\n    closeTrajectMc() {\r\n      this.$refs.alertWindow.showTrajectBtn()\r\n    },\r\n    closeTraject() {\r\n      this.showTraject = false;\r\n      this.$refs.largeRightNav.trajectorySearch1(false)\r\n    },\r\n    trajectortBtn(val) {\r\n      this.showTraject = val\r\n    },\r\n    //修改地图主题颜色\r\n    setMapStyle(val){\r\n      this.$refs.mapBg.mapSetStyleClick(val)//HWL\r\n      // @setMapStyle=\"setMapStyle\"\r\n    },\r\n    hourSlot(id) {\r\n      this.$axios.get(`/baseplatform/kmdnLocalPoliceScheduling/statistics/post/hourSlot/list?postId=${id}&currentDate=${this.getTimeDate(this.searchDate)}`).then(res=>{\r\n        this.initChart(res.data.rows)\r\n      })\r\n    },\r\n    // 获取异常班次e\r\n    abnormalList() {\r\n      this.roadLoading = true;\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/abnormalSchedules/list`,{\r\n        postPrimaryType: this.searchData.postPrimaryType,\r\n        postSecondType: this.searchData.postSecondType,\r\n        deptIds: this.searchDeptId?this.searchDeptId:[],\r\n        postNameLike: this.searchData.searchPostName,\r\n        currentTime: `${this.searchDate}:00`,\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n      }).then(res=>{\r\n        this.roadLoading = false;\r\n        if(res.data.code==200) {\r\n          this.abnormalListData = res.data.data\r\n        }\r\n      })\r\n    },\r\n    returnSBdk(val,index, timers) {\r\n      if(index==1) {\r\n        // 上班\r\n        if(val==1) {\r\n          return ['#00B83F','正常打卡',`区域内 ${timers}`]\r\n        }else if(val==2) {\r\n          return ['rgb(236, 123, 123)','迟到打卡',`区域内 ${timers}`]\r\n        }else if(val==3) {\r\n          return ['#00B83F','正常打卡',`区域外 ${timers}`]\r\n        }else if(val==4) {\r\n          return ['rgb(236, 123, 123)','迟到打卡',`区域外 ${timers}`]\r\n        }else{\r\n          return ['rgb(236, 123, 123)','未打卡',`未打卡`]\r\n        }\r\n      }else {\r\n        if(val==1) {\r\n          return ['#00B83F','正常打卡',`区域内 ${timers}`]\r\n        }else if(val==2) {\r\n          return ['rgb(236, 123, 123)','早退打卡',`区域内 ${timers}`]\r\n        }else if(val==3) {\r\n          return ['#00B83F','正常打卡',`区域外 ${timers}`]\r\n        }else if(val==4) {\r\n          return ['rgb(236, 123, 123)','早退打卡',`区域外 ${timers}`]\r\n        }else{\r\n          return ['rgb(236, 123, 123)','未打卡',`未打卡`]\r\n        }\r\n      }\r\n    },\r\n    returnType(val,val1) {\r\n\r\n\r\n      if(val==5) {\r\n        return '其他'\r\n      }\r\n      let hs = this.postManager1[val-1].children;\r\n      if(val1) {\r\n        let returnVal = hs[val1-1]?hs[val1-1].name:''\r\n        return returnVal\r\n      }\r\n\r\n    },\r\n    ruturnColor(val, index) {\r\n        // 4g\r\n        if(val==1) {\r\n          return ['在线且在区域','#149e14']\r\n        }else if(val==2) {\r\n          return ['在线但不在区域','#d2b603']\r\n        }else{\r\n          return ['离线','#b5b3b3']\r\n        }\r\n    },\r\n    show4GBtn(val) {\r\n      this.$refs.mapBg.hideMarkers('rtRecorder4g')\r\n      if(val.recorderDeviceStatus!=1) {\r\n        return false;\r\n      }\r\n      this.$refs.alertWindow.getRtRecorder4gEjectVideo(\r\n        {\r\n          type:'rtRecorder4g',\r\n          lng: val.recorderLongitude,\r\n          lat: val.recorderLatitude,//纬度值\r\n          id: val.recorderId,\r\n          deptName: val.deptName,\r\n          flag:2,\r\n          deviceId: val.recorderId,\r\n          vehicleName: val.nickName,\r\n          vehicleId: val.policeId\r\n        }\r\n      )\r\n      // this.$refs.mapBg.showMarkers([{\r\n      //     type:'rtRecorder4g',\r\n      //     lng: val.recorderLongitude,\r\n      //     lat: val.recorderLatitude,//纬度值\r\n      //     id: val.recorderId,\r\n      //     deptName: val.deptName,\r\n      //     flag:2,\r\n      //     deviceId: val.recorderId,\r\n      //     vehicleName: val.nickName,\r\n      //     vehicleId: val.policeId\r\n      // }], false, false)\r\n    },\r\n    returnColor(val) {\r\n\r\n      if(val==0) {\r\n        return ['#787575', '未开始']\r\n      }else if(val==1) {\r\n        return ['#00B83F', '在岗']\r\n      }else if(val==2) {\r\n        return ['#ec7b7b', '异常']\r\n      }else{\r\n        return ['', '']\r\n      }\r\n    },\r\n    convert(){\r\n      this.stepUrl=this.$store.getters.deptLevel>2?'/frontend/serviceTable':this.$store.getters.deptLevel>1?'/frontend/serviceIndexDd':'/frontend/serviceIndexDd'\r\n      let scaleX = window.innerWidth / 1920\r\n      let scaleY = window.innerHeight / 960\r\n      this.data.transform = 'scale(' + scaleX + ',' + scaleY + ')'\r\n      this.data.transformMap = 'scale(' + 1 / scaleX + ',' + 1 / scaleY + ')'\r\n      this.data.transformNotice = 'scale(' + 192/500 + ',' +96/250 + ')'\r\n      Date.prototype.format = function(fmt) {\r\n        var o = {\r\n          \"M+\" : this.getMonth()+1,                 //月份\r\n          \"d+\" : this.getDate(),                    //日\r\n          \"W+\" : this.getDay(),                    //日\r\n          \"h+\" : this.getHours(),                   //小时\r\n          \"m+\" : this.getMinutes(),                 //分\r\n          \"s+\" : this.getSeconds(),                 //秒\r\n          \"q+\" : Math.floor((this.getMonth()+3)/3), //季度\r\n          \"S\"  : this.getMilliseconds()             //毫秒\r\n        };\r\n        if(/(y+)/.test(fmt)) {\r\n          fmt=fmt.replace(RegExp.$1, (this.getFullYear()+\"\").substr(4 - RegExp.$1.length));\r\n        }\r\n        for(var k in o) {\r\n          if(new RegExp(\"(\"+ k +\")\").test(fmt)){\r\n            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : ((\"00\"+ o[k]).substr((\"\"+ o[k]).length)));\r\n          }\r\n        }\r\n        return fmt;\r\n      }\r\n      // this.searchDate=new Date(new Date().getTime()).format('yyyy-MM-dd HH:mm:ss')\r\n      this.searchDate=(new Date()).format('yyyy-MM-dd hh:mm')\r\n      this.deptLevel=this.$store.getters.deptLevel\r\n      this.getTreeData()\r\n      this.getSelectType()\r\n    },\r\n    alertWindow:function(ejectData){\r\n      this.ejectData=ejectData\r\n    },\r\n    faceNorth:function(){\r\n      this.$refs.mapBg.faceNorth()\r\n    },\r\n    resetMap:function(){\r\n      this.$refs.mapBg.resetMap()\r\n    },\r\n    showMarkers:function(markers,isBestShow,isMul){\r\n      this.$refs.mapBg.showMarkers(markers,isBestShow,isMul)\r\n    },\r\n    hideMarkers:function(type){\r\n      this.$refs.mapBg.hideMarkers(type)\r\n    },\r\n    showTraffic:function(type){\r\n      this.$refs.mapBg.showTraffic(type, 30)\r\n    },\r\n    setPoiShow:function(){\r\n      this.$refs.mapBg.setPoiShow()\r\n    },\r\n    changeTo(val){\r\n      this.$router.push(val)\r\n    },\r\n    functionMap:function(func,args){\r\n      this.$refs.mapBg.functionMap(func,args)\r\n    },\r\n    flyTo:function(lngLat,zoom,picth){\r\n      this.$refs.mapBg.flyTo(lngLat,zoom,picth)\r\n    },\r\n    getTreeData(){\r\n      request({\r\n        url:`/system/dept/treeselectByUser`,\r\n        method: 'get',\r\n      }).then(res=>{\r\n        if(res.code==200) {\r\n          // this.searchDeptId=res.data[0].id\r\n          this.treeData = res.data\r\n          // this.handleNodeClick()\r\n        }\r\n      })\r\n    },\r\n    eventCategoryChart: function(val) {\r\n      let colorList = ['#e13c14','#f6795b','#ffe478','#29b3ff','#86bb64','#315fdc','#44fffd'];\r\n      let datas = [];\r\n      val.forEach(function(val,index) {\r\n        if(index<7) {\r\n          datas.push({\r\n            value:val.num,\r\n            name:val.name\r\n          });\r\n        }\r\n      })\r\n      var option = {\r\n        tooltip: {\r\n          trigger: 'item',\r\n          formatter: '{a} <br/>{b}: {c} ({d}%)'\r\n        },\r\n        color:colorList,\r\n        graphic:{\r\n          type: 'text',　　　　　　　　　　　　//通过不同top值可以设置上下显示\r\n          left: 'center',\r\n          top:'center',\r\n          style:{\r\n            text:\"岗位\\n分类\",\r\n            fill: '#ffffff',\r\n            fontSize: 14,\r\n          }\r\n        },\r\n        series: [\r\n          {\r\n            name: '岗位分类',\r\n            type: 'pie',\r\n            radius: ['50%', '70%'],\r\n            avoidLabelOverlap: false,\r\n            label: {\r\n              show: false,\r\n              position: 'center'\r\n            },\r\n            emphasis: {\r\n              label: {\r\n                show: false,\r\n                fontSize: '16',\r\n                fontWeight: 'bold',\r\n              }\r\n            },\r\n            labelLine: {\r\n              show: false\r\n            },\r\n            data: datas\r\n          }\r\n        ]\r\n      }\r\n      this.chart = echarts.init(document.getElementById('eventCateChart'))\r\n      this.chart.setOption(option)\r\n    },\r\n    initChart: function(data) {\r\n      let category = []\r\n      let data1 = []; // 分析时间\r\n      data.forEach(item=>{\r\n        category.push(item.hour)\r\n        data1.push(item.idx)\r\n      })\r\n      let option = {\r\n        xAxis: {\r\n          type: 'category',\r\n          boundaryGap: true,\r\n          data: category,\r\n          axisLabel: {\r\n            fontSize: 14,\r\n            align: 'right',\r\n            color: '#a0a0a0',\r\n            fontFamily: 'Microsoft YaHei',\r\n            lineHeight: 14\r\n          },\r\n          axisLine: {\r\n            show: false\r\n          },\r\n          axisTick: {\r\n            show: false\r\n          },\r\n          splitArea:{\r\n            show:true,\r\n            areaStyle:{\r\n              color:[\r\n                'rgba(41, 179, 255, 0.09)',\r\n                'rgba(41, 179, 255, 0.05)',\r\n              ]\r\n            }\r\n          }\r\n        },\r\n        tooltip: {\r\n          trigger: 'axis',\r\n          axisPointer: {\r\n            type: 'shadow',\r\n          },\r\n          textStyle:{\r\n            fontSize:14\r\n          },\r\n          padding:5\r\n        },\r\n        legend: {\r\n          right: 20,\r\n          top:5,\r\n          itemHeight: 10,\r\n          itemWidth: 10,\r\n          textStyle: {\r\n            fontSize: 14,\r\n            color: 'white'\r\n          },\r\n          formatter: function(name) {\r\n            return ' ' + name\r\n          },\r\n          itemGap: 10,\r\n          icon: 'rect'\r\n        },\r\n        grid: {\r\n          left: 30,\r\n          right: 0,\r\n          top:40\r\n        },\r\n        yAxis: {\r\n          type: 'value',\r\n          splitLine: {\r\n            show: false\r\n          },\r\n          axisLine: {\r\n            show: false\r\n          },\r\n          axisTick: {\r\n            show: false\r\n          },\r\n          axisLabel: {\r\n            fontSize: 14,\r\n            align: 'right',\r\n            color: '#a0a0a0',\r\n            fontFamily: 'Microsoft YaHei',\r\n            lineHeight: 14\r\n          }\r\n        },\r\n        series: [\r\n          {\r\n          name: '拥堵指数',\r\n          data: data1,\r\n          type: 'line',\r\n          smooth: false,\r\n          // areaStyle: { type: 'default' },\r\n          symbolSize: 0,\r\n          color: '#f6795b',\r\n          itemStyle:{\r\n            normal:{\r\n              lineStyle:{\r\n                width:2,\r\n                type:'solid',\r\n              }\r\n            }\r\n          }\r\n        }]\r\n      }\r\n      this.chart = echarts.init(document.getElementById('fault24hChart'))\r\n      // this.chart.resize({height:'230px' })\r\n      this.chart.setOption(option)\r\n    },\r\n    changeNode(val1, val2) {\r\n      this.showPostInfo = false;\r\n      this.abnormalListData = [];\r\n      if(val1.deptLevel==3){\r\n        this.flyToZd(val1.id)\r\n      }\r\n      this.allWindowData=[];\r\n      this.selectedIndex=-1;\r\n      this.selectedIndexVal = '';\r\n      this.showPostInfo=false\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.resetMap()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n\r\n\r\n      this.ischecked = true;\r\n      let arr = this.$refs.tree.getCheckedKeys()\r\n      if(arr.includes(val1.id)) {\r\n        this.$refs.tree.setCheckedKeys([],false)\r\n        this.postList = []\r\n        this.loadingPost= false;\r\n        this.searchDeptId = '';\r\n        this.getPostReportInfo();\r\n        this.getPostRoadReportInfo();\r\n        this.abnormalList()\r\n      }else{\r\n        // this.loadingPost= true;\r\n        let sm = val1.id.toString()\r\n        this.statisticsList(sm.split(','))\r\n        this.$refs.tree.setCheckedKeys([])\r\n        this.$refs.tree.setChecked(val1.id,true,false)\r\n\r\n      }\r\n    },\r\n    handleNodeTree(val,val2) {\r\n      this.selectedIndex=-1;\r\n      this.selectedIndexVal = '';\r\n      this.showPostInfo = false;\r\n      this.abnormalListData = [];\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.resetMap()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      if(this.ischecked) {\r\n        this.$refs.tree.setCheckedKeys([])\r\n        this.ischecked = false;\r\n\r\n        return false\r\n      }\r\n      let data=val2.checkedNodes\r\n      for(let i=data.length-1;i>-1;i--){\r\n        if(data[i].deptLevel==3){\r\n          this.flyToZd(data[i].id)\r\n          break\r\n        }\r\n      }\r\n      this.allWindowData=[];\r\n      this.selectedIndex=-1\r\n\r\n      this.ischecked = false;\r\n\r\n      if(val2.checkedKeys.length>0) {\r\n        let h = []\r\n        if(val2.checkedKeys.length<=1) {\r\n          h[0] = val2.checkedNodes[0].id\r\n          if(val2.checkedNodes[0].children) {\r\n            val2.checkedNodes[0].children.forEach(item=>{\r\n              h.push(item.id)\r\n            })\r\n          }\r\n        }else{\r\n          h = val2.checkedKeys\r\n        }\r\n        this.$refs.tree.setCheckedKeys(h)\r\n        //h.join(',')\r\n        this.statisticsList(h)\r\n        // this.loadingPost= true;\r\n      }else{\r\n        this.$refs.tree.setCheckedKeys([],false)\r\n        this.postList = []\r\n        this.searchDeptId = ''\r\n        this.loadingPost= false;\r\n        this.getPostReportInfo();\r\n        this.getPostRoadReportInfo();\r\n        this.abnormalList()\r\n      }\r\n\r\n    },\r\n    flyToZd(id){\r\n      this.$axios.get(`/baseplatform/kmdnLocalDdfl/info/ddfl/${id}`).then(res=>{\r\n      //  中队中心点聚焦\r\n        if(res.data.code==200&&res.data.data){\r\n          this.$refs.mapBg.flyTo([res.data.data.centerLongitude,res.data.data.centerLatitude],13)\r\n        }\r\n      })\r\n    },\r\n    statisticsList(val) {\r\n      if(val) {\r\n        this.searchDeptId=val\r\n        // this.searchDeptLevel=val.deptLevel\r\n      }\r\n\r\n      if(!this.searchDeptId){\r\n        return this.$message.error('请先选择部门！')\r\n      }\r\n      if(this.searchDeptLevel==3) {\r\n        this.allWindowData=[]\r\n        this.postInfoList(this.searchDeptId,'')\r\n      }\r\n      this.allWindowData=[];\r\n      if(this.timersout) {\r\n        clearTimeout(this.timersout)\r\n        this.timersout = null\r\n      }\r\n      this.timersout =  setTimeout(()=>{\r\n        this.postInfoList(this.searchDeptId,'')\r\n        // this.listStati()\r\n        this.getPostReportInfo()\r\n        this.getPostRoadReportInfo()\r\n        this.abnormalList()\r\n      },1000)\r\n    },\r\n    listStati() {\r\n      if(!this.searchDeptId) {\r\n        return this.$message.error('请选择部门')\r\n      }\r\n      this.loadingPost = true;\r\n      this.postListIdArr = []\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/list`,{\r\n        postPrimaryType: this.searchData.postPrimaryType,\r\n        postSecondType: this.searchData.postSecondType,\r\n        deptIds: this.searchDeptId,\r\n        postNameLike: this.searchData.searchPostName,\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n        currentTime: `${this.searchDate}:00`\r\n      }).then(res=>{\r\n        this.loadingPost =false;\r\n        res.data.rows.forEach(item=>{\r\n          this.postListIdArr.push(item.id)\r\n        })\r\n        this.postList=res.data.rows\r\n        this.$refs.mapBg.removeArea()\r\n        this.allWindowData=[]\r\n        if(res.data.rows.length>0) {\r\n          this.postList.forEach((val)=>{\r\n            let datas=[]\r\n            val.coordinateInfoList.forEach((each)=>{\r\n              datas.push([each.longitude,each.latitude])\r\n            })\r\n            this.drawAllDdArea([],[val.centerLongitude,val.centerLatitude],val.id,{name:val.postName,level:3,idx:2.32,center:[val.centerLongitude,val.centerLatitude]})\r\n            // this.allWindowData.push([[val.centerLongitude,val.centerLatitude],{schedulingPoliceNum:val.schedulingPoliceNum?val.schedulingPoliceNum:0,schedulingAssistantNum:val.schedulingAssistantNum?val.schedulingAssistantNum:0,schedulingSafeguardNum:val.schedulingSafeguardNum?val.schedulingSafeguardNum:0,postName:val.postName,postProperty:val.postProperty,postPrimaryType: val.postPrimaryType,postSecondType:val.postSecondType},true])\r\n\r\n          })\r\n        }\r\n\r\n      })\r\n    },\r\n    // 根据部门、岗位描点\r\n    postInfoList(deptIds,id,index) {\r\n      let url=`&currentDate=${this.getTimeDate(this.searchDate)}&currentTime=${this.searchDate}:00`\r\n      if(!this.searchDeptId) {\r\n        return this.$message.error('请选择部门')\r\n      }\r\n      if(!this.selectedIndexVal) {\r\n        this.ssMarkers = []\r\n      }\r\n\r\n      this.loadingPost = true;\r\n      this.postListIdArr = []\r\n\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/schedulingPostInfo/list`,{\r\n        postNameLike: this.searchData.searchPostName,\r\n        postPrimaryType:this.searchData.postPrimaryType,\r\n        postSecondType: this.searchData.postSecondType,\r\n        deptIds:this.searchDeptId,\r\n        id:id,\r\n        lonLat: this.printLatlon.toString(),\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n        currentTime: `${this.searchDate}:00`\r\n      }).then(res=>{\r\n\r\n        this.loadingPost =false;\r\n        res.data.rows.forEach(item=>{\r\n          this.postListIdArr.push(item.id)\r\n        })\r\n        this.postList=res.data.rows\r\n        this.$refs.mapBg.removeArea()\r\n        this.allWindowData=[]\r\n        if(res.data.rows.length>0) {\r\n          this.postList.forEach((val)=>{\r\n            let datas=[]\r\n            val.coordinateInfoList.forEach((each)=>{\r\n              datas.push([each.longitude,each.latitude])\r\n            })\r\n            this.drawAllDdArea([],[val.centerLongitude,val.centerLatitude],val.id,{name:val.postName,level:3,idx:2.32,center:[val.centerLongitude,val.centerLatitude]})\r\n\r\n          })\r\n        }\r\n\r\n\r\n\r\n        res.data.rows.forEach((val,indexs)=>{\r\n          if(!index) {\r\n          }\r\n          else{\r\n            this.$refs.mapBg.flyTo([val.centerLongitude,val.centerLatitude],16,0)\r\n          }\r\n          if(!this.selectedIndexVal) {\r\n            this.ssMarkers.push({\r\n              type:'schedulingStatistical',\r\n              lng: val.centerLongitude,\r\n              lat: val.centerLatitude,\r\n              id: val.id,\r\n              index: indexs,\r\n              schedulingPoliceNum: val.schedulingPoliceNum,\r\n              schedulingAssistantNum:val.schedulingAssistantNum,\r\n              schedulingSafeguardNum:val.schedulingSafeguardNum,\r\n              postName:val.postName,postProperty:val.postProperty,\r\n              postPrimaryType: val.postPrimaryType,\r\n              postSecondType:val.postSecondType,\r\n              data: val\r\n            })\r\n          }\r\n\r\n        })\r\n\r\n        if(!this.selectedIndexVal) {\r\n          this.$refs.mapBg.showMarkers(this.ssMarkers, false, false)\r\n        }else{\r\n          if(res.data.rows.length>0) {\r\n            this.$refs.mapBg.addMulInfoWindow([{\r\n              type:'schedulingStatistical1',\r\n              lng: res.data.rows[0].centerLongitude,\r\n              lat: res.data.rows[0].centerLatitude,\r\n              schedulingPoliceNum: res.data.rows[0].schedulingPoliceNum,\r\n              schedulingAssistantNum:res.data.rows[0].schedulingAssistantNum,\r\n              schedulingSafeguardNum:res.data.rows[0].schedulingSafeguardNum,\r\n              postName:res.data.rows[0].postName,postProperty:res.data.rows[0].postProperty,\r\n              postPrimaryType: res.data.rows[0].postPrimaryType,\r\n              postSecondType:res.data.rows[0].postSecondType\r\n            }], '')\r\n          }\r\n\r\n        }\r\n\r\n      })\r\n    },\r\n    drawAllWindow(center,data,type){\r\n      this.$refs.mapBg.drawAllPostWindow(center, data,type)\r\n    },\r\n    drawAllDdArea(datas,center,id,centerShow) { //绘制全部地理围栏\r\n      this.$refs.mapBg.drawArea(datas, center, id, false)\r\n    },\r\n    getPostReportInfo(){\r\n      let tomorrowDate=new Date(new Date(this.searchDate).getTime()+24*60*60*1000).format('yyyy-MM-dd')\r\n      // this.echartData = [];\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/postReportInfo`,{\r\n        postPrimaryType: 1,\r\n        tomorrowDate: tomorrowDate,\r\n        deptIds: this.searchDeptId?this.searchDeptId:null\r\n      }).then(res=>{\r\n        let getType = [];\r\n        this.postReportInfo=res.data.data\r\n        this.postReportInfo.postSecondTypeList.forEach((val)=>{\r\n          getType.push({id: parseInt(val.postSecondType),num:val.num})\r\n          let index = parseInt(val.postSecondType)-1\r\n          this.echartData[index].num=val.num\r\n        })\r\n        let getOdd =[1,2,3,4,5,6,7].filter(item=>{\r\n          return [...getType].every(x=> x.id!=item)\r\n        })\r\n        getOdd.forEach(item=>{\r\n          this.echartData[item-1].num=0\r\n        })\r\n        this.eventCategoryChart(this.echartData)\r\n      })\r\n    },\r\n    getTimeDate(val) {\r\n      return (new Date(val)).format('yyyy-MM-dd')\r\n    },\r\n    getPostRoadReportInfo(){\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/postRoadReportInfo`,{\r\n        deptIds: this.searchDeptId?this.searchDeptId:null,\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n        currentTime:`${this.searchDate}:00`\r\n      }).then(res=>{\r\n        this.postRoadReportInfo=res.data.data\r\n      })\r\n    },\r\n    setSelectedIndex(index, valData){\r\n      // if(this.deptLevel!=this.deptFlag){\r\n      //   this.$refs.mapBg.removeArea()\r\n      // }\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      this.$refs.mapBg.removeArea()\r\n\r\n      if(this.selectedIndex==index){\r\n        this.selectedIndex=-1\r\n        this.selectedIndexVal = ''\r\n        this.showPostInfo=false\r\n        this.$refs.mapBg.removePostArea()\r\n        // this.$refs.mapBg.resetMap()\r\n        this.$refs.mapBg.showMarkers(this.ssMarkers, false, false)\r\n        return false\r\n      }\r\n      this.selectedIndexVal = valData.id\r\n      let val=this.postList[index]\r\n      this.$refs.mapBg.flyTo([val.centerLongitude,val.centerLatitude],16,0)\r\n      this.schedulesId=0\r\n      this.getPostSchedulesReportInfo(index)\r\n      this.displayPost(this.postList[index].id,this.postList[index])\r\n      this.hourSlot(this.postList[index].id)\r\n      this.showPostInfo=true\r\n      this.selectedIndex=index;\r\n\r\n\r\n    },\r\n    showDotPoint(){\r\n      let policeList=[]\r\n      this.postSchedulesReportInfo.forEach(((val,index) =>{\r\n       if(val.rangeList.length>0){\r\n         val.rangeList[this.schedulesData[index]].policeList.forEach(point=>{\r\n           if(point.recorderLongitude&&point.recorderDeviceStatus==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.recorderLongitude,\r\n               lat: point.recorderLatitude,//纬度值\r\n               id: point.recorderDetailInfoId,\r\n               pointRule: 2,\r\n               policeType: 0,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n           else if(point.interphoneLongitude&&point.interphoneOnlineFlag==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.interphoneLongitude,\r\n               lat: point.interphoneLatitude,//纬度值\r\n               id: point.interphoneDetailInfoId,\r\n               pointRule: 1,\r\n               policeType: 0,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n         })\r\n         val.rangeList[this.schedulesData[index]].assistantList.forEach(point=>{\r\n           if(point.recorderLongitude&&point.recorderDeviceStatus==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.recorderLongitude,\r\n               lat: point.recorderLatitude,//纬度值\r\n               id: point.recorderDetailInfoId,\r\n               pointRule: 2,\r\n               policeType: 1,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n           else if(point.interphoneLongitude&&point.interphoneOnlineFlag==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.interphoneLongitude,\r\n               lat: point.interphoneLatitude,//纬度值\r\n               id: point.interphoneDetailInfoId,\r\n               pointRule: 1,\r\n               policeType: 1,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n         })\r\n\r\n       }\r\n      }))\r\n      this.$refs.mapBg.hideMarkers('policeStatistical')\r\n      this.$refs.mapBg.showMarkers(policeList,false,false)\r\n    },\r\n    getPostSchedulesReportInfo(index){\r\n      if(this.postList.length===0){\r\n        return false\r\n      }\r\n      this.schedulesData = []\r\n      this.postSchedulesReportInfo = [];\r\n      this.ydLoading = true;\r\n        this.$axios.get(`/baseplatform/kmdnLocalPoliceScheduling/statistics/postSchedulesReportInfo?postId=${this.postList[index].id}&currentDate=${this.getTimeDate(this.searchDate)}&currentTime=${this.searchDate}:00`).then(res=>{\r\n          this.ydLoading = false;\r\n          this.postSchedulesReportInfo=res.data.rows;\r\n          res.data.rows.forEach((item,index)=>{\r\n            this.schedulesData.push(0)\r\n            this.activeNames.push(index+1)\r\n          })\r\n          this.showDotPoint()\r\n          return false\r\n          if(index) {\r\n            let markers= [];\r\n            // for(let i=0;i<res.data.rows.) {\r\n            //\r\n            // }\r\n\r\n\r\n\r\n            let getData= res.data.rows[this.schedulesId]\r\n\r\n            for(let i=0; i<getData.assistantList.length; i++) {\r\n              if(getData.assistantList[i].recorderId&&getData.assistantList[i].recorderDeviceStatus==1){\r\n\r\n                markers.push({\r\n                  type:'rtRecorder4g',\r\n                  lng: getData.assistantList[i].recorderLongitude,\r\n                  lat: getData.assistantList[i].recorderLatitude,//纬度值\r\n                  id: getData.assistantList[i].recorderId,\r\n                  deptName: getData.assistantList[i].deptName,\r\n                  flag:2,\r\n                  deviceId: getData.assistantList[i].recorderId,\r\n                  vehicleName: getData.assistantList[i].nickName,\r\n                  vehicleId: getData.assistantList[i].vehicleId\r\n                })\r\n              }\r\n            }\r\n            for(let i=0; i<getData.policeList.length; i++) {\r\n              if(getData.policeList[i].recorderId&&getData.policeList[i].recorderDeviceStatus==1){\r\n                markers.push({\r\n                  type:'rtRecorder4g',\r\n                  lng: getData.policeList[i].recorderLongitude,\r\n                  lat: getData.policeList[i].recorderLatitude,//纬度值\r\n                  id: getData.policeList[i].recorderId,\r\n                  deptName: getData.policeList[i].deptName,\r\n                  flag:2,\r\n                  deviceId: getData.policeList[i].recorderId,\r\n                  vehicleName: getData.assistantList[i].nickName,\r\n                  vehicleId: getData.assistantList[i].vehicleId\r\n                })\r\n              }\r\n            }\r\n            for(let i=0; i<getData.safeguardList.length; i++) {\r\n              if(getData.safeguardList[i].recorderId&&getData.safeguardList[i].recorderDeviceStatus==1){\r\n                markers.push({\r\n                  type:'rtRecorder4g',\r\n                  lng: getData.safeguardList[i].recorderLongitude,\r\n                  lat: getData.safeguardList[i].recorderLatitude,//纬度值\r\n                  id: getData.safeguardList[i].recorderId,\r\n                  deptName: getData.safeguardList[i].deptName,\r\n                  flag:2,\r\n                  deviceId: getData.safeguardList[i].recorderId,\r\n                  vehicleName: getData.assistantList[i].nickName,\r\n                  vehicleId: getData.assistantList[i].vehicleId\r\n                })\r\n              }\r\n            }\r\n            this.$refs.mapBg.showMarkers(markers, false, false)\r\n          }\r\n      })\r\n    },\r\n    returnRule(val){\r\n      let res=''\r\n      if(val.indexOf(1)>-1||val.indexOf(\"1\")>-1){\r\n        res+='工作日'\r\n      }\r\n      if(val.indexOf(2)>-1||val.indexOf(\"2\")>-1){\r\n        if(res.length>0){\r\n          res+=','\r\n        }\r\n        res+='双休'\r\n      }\r\n      if(val.indexOf(4)>-1||val.indexOf(\"4\")>-1){\r\n        if(res.length>0){\r\n          res+=','\r\n        }\r\n        res+='节假日'\r\n      }\r\n      return res\r\n    },\r\n    changeType(val) {\r\n      this.postManagerMini = this.postManager[val-1].children\r\n    },\r\n    changeTypeSearch(val) {\r\n      this.postManagerMiniS=[]\r\n      this.searchData.postSecondType=''\r\n      if(this.postManager[val-1]){\r\n        this.postManagerMiniS = this.postManager[val-1].children\r\n      }\r\n    },\r\n    clearSeach() {\r\n      this.postManagerMiniS = [];\r\n      this.searchData.postSecondType = ''\r\n      this.changeSearchDate(1,2)\r\n    },\r\n    getSelectType(){\r\n      let _this=this\r\n      this.$axios.get(`/baseplatform/system/dict/data/type/serviceType`).then(function(res) {\r\n        if (res.data.code === 200 && res.status === 200){\r\n          _this.serviceTypeList = res.data.data\r\n        }\r\n      })\r\n      this.$axios.get(`/baseplatform/system/dict/data/type/postPrimaryType`).then(function(res) {\r\n        if (res.data.code === 200 && res.status === 200){\r\n          _this.postPrimaryTypeList = res.data.data\r\n        }\r\n      })\r\n      this.$axios.get(`/baseplatform/system/dict/data/type/postSecondType`).then(function(res) {\r\n        if (res.data.code === 200 && res.status === 200){\r\n          _this.postSecondTypeList = res.data.data\r\n        }\r\n      })\r\n      this.$axios.get(`/baseplatform/kmdnLocalPostAreaInfo/list`).then(res=>{\r\n        _this.policeDistrictList = [];\r\n        res.data.rows.forEach(item=>{\r\n          _this.policeDistrictList.push({\r\n            name:item.policeArea,\r\n            man: item.principal,\r\n            tel: item.principalTel,\r\n            state: item.state==0?false:true,\r\n            id: item.id\r\n          })\r\n        })\r\n      })\r\n    },\r\n    getDot(val) {\r\n      this.selectedIndexVal = val.id\r\n      this.selectedIndex = val.index\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      this.displayPost(val.id, val.data)\r\n      this.showPostInfo=true\r\n      this.getPostSchedulesReportInfo(this.selectedIndex)\r\n      // setTimeout(()=>{\r\n      //   document.getElementById('selected').scrollIntoView();\r\n      // },100)\r\n    },\r\n    displayPost(id,val){\r\n      let _this=this\r\n      this.$axios.get(`/baseplatform/kmdnLocalPostInfo/${id}`)\r\n        .then(res=>{\r\n          if(res.data.code===200){\r\n            _this.formData=res.data.data\r\n            _this.formData.postPrimaryType=parseInt(_this.formData.postPrimaryType)\r\n            _this.formData.postProperty=parseInt(_this.formData.postProperty)\r\n            _this.formData.postSecondType=parseInt(_this.formData.postSecondType)\r\n            _this.formData.serviceType=_this.formData.serviceType\r\n            _this.formData.policeAreaId=parseInt(_this.formData.policeAreaId)\r\n            _this.changeType(parseInt(_this.formData.postPrimaryType))\r\n            _this.formData.scheduleInfoList.forEach((val,index)=>{\r\n              val.rangeList.forEach((ite,is)=>{\r\n                if(is==0) {\r\n                  val['time'] =[];\r\n                }\r\n                val['time'].push([ite.startTime,ite.endTime]);\r\n              })\r\n              if(val.rangeList.length<=0){\r\n                val['time'] = []\r\n              }\r\n              if(val['executeFlag']==1||val['executeFlag']==2||val['executeFlag']==4){\r\n                val['executeFlag']=[val['executeFlag']]\r\n              }else if(val['executeFlag']==3){\r\n                val['executeFlag']=['1','2']\r\n              }else if(val['executeFlag']==5){\r\n                val['executeFlag']=['1','4']\r\n              }else if(val['executeFlag']==6){\r\n                val['executeFlag']=['2','4']\r\n              }else if(val['executeFlag']==7){\r\n                val['executeFlag']=['1','2','4']\r\n              }\r\n\r\n            })\r\n            let datas=[]\r\n            _this.formData.coordinateInfoList.forEach((val)=>{\r\n              datas.push([val.longitude,val.latitude])\r\n            })\r\n\r\n            console.log('====val', val.id)\r\n              _this.drawAllDdArea([{geo:datas}],[res.data.data.centerLongitude,res.data.data.centerLatitude],val.id,{name:res.data.data.postName,level:3,idx:2.32,center:[res.data.data.centerLongitude,res.data.data.centerLatitude]})\r\n\r\n             // this.postInfoList('', id,1)\r\n          }\r\n        })\r\n    },\r\n    getZoom(zoom){\r\n      if(zoom<13||this.selectedIndex!=-1){\r\n        this.isDrawingAll=false\r\n        this.$refs.mapBg.removeAreaAll()\r\n      }else{\r\n        //this.searchDeptLevel==3&&\r\n        if(!this.isDrawingAll){\r\n          this.isDrawingAll=true\r\n          // this.allWindowData.forEach((val)=>{\r\n          //   this.$refs.mapBg.drawAllPostWindow(...val)\r\n          // })\r\n        }\r\n      }\r\n    },\r\n    getShowAreaId(id){\r\n      this.showAreaId=id\r\n    },\r\n    showAreaWindow(){\r\n      this.getDdflId(this.showAreaId)\r\n    },\r\n    getDdflId(id){\r\n      let index =-1\r\n      this.postList.forEach((val,inx)=>{\r\n        if(val.id==id){\r\n          index=inx\r\n        }\r\n      })\r\n      this.schedulesId=0\r\n      this.getPostSchedulesReportInfo(index)\r\n      this.displayPost(this.postList[index].id)\r\n      this.showPostInfo=true\r\n      this.selectedIndex=index\r\n      this.showPostInfoWindow=true\r\n    },\r\n    changeNow() {\r\n      this.searchDate=(new Date()).format('yyyy-MM-dd hh:mm')\r\n      this.changeSearchDate()\r\n    },\r\n    changeSearchDate(indeVal, indexVal2){\r\n      if(indexVal2) {\r\n       this.changeTypeSearch(this.searchData.postPrimaryType)\r\n      }\r\n      this.activeNames=[]\r\n      for(let i=0;i<this.postSchedulesReportInfo.length;i++){\r\n        this.activeNames.push(i+1)\r\n      }\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.resetMap()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical1')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      // this.listStati()\r\n      this.getPostReportInfo()\r\n      this.getPostRoadReportInfo()\r\n\r\n      if(indeVal==1) {\r\n        this.selectedIndexVal=''\r\n        this.selectedIndex = -1;\r\n        this.showPostInfo=false\r\n      }\r\n\r\n      let id = this.selectedIndex>-1?this.postList[this.selectedIndex].id:''\r\n      // if(this.selectedIndexVal) {\r\n      if(this.selectedIndex>-1){\r\n        this.getPostSchedulesReportInfo(this.selectedIndex)\r\n      }\r\n      this.postInfoList(this.searchDeptId,'')\r\n\r\n\r\n      if(indeVal!=1) {\r\n        let h = []\r\n        let choseIndex =-1\r\n        this.postList.forEach((item,index)=>{\r\n          if(item.id == this.selectedIndexVal) {\r\n            choseIndex = index\r\n          }\r\n          h.push(item.id)\r\n        })\r\n        if(h.includes(this.selectedIndexVal)) {\r\n          this.postInfoList('', id,choseIndex)\r\n          this.displayPost(this.postList[choseIndex].id,this.postList[choseIndex])\r\n        }else if(this.selectedIndex!=-1){\r\n          this.$refs.mapBg.removePostArea()\r\n          this.$refs.mapBg.removeAreaAll()\r\n          this.$refs.mapBg.removeArea()\r\n          this.selectedIndex=-1\r\n          this.selectedIndexVal = ''\r\n          this.showPostInfo=false\r\n          this.$refs.mapBg.removePostArea()\r\n          this.$refs.mapBg.resetMap()\r\n        }\r\n      }\r\n    },\r\n  },\r\n  watch: {\r\n    showPostInfo(){\r\n      if(!this.showPostInfo){\r\n        this.$refs.mapBg.hideMarkers('policeStatistical')\r\n      }\r\n    }\r\n  }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.contentTitle{\r\n  position: relative;\r\n  span{\r\n    position: absolute;\r\n    color: #ccc;\r\n    right: 10px;\r\n    top: 2px;\r\n    font-size: 14px;\r\n    display: inline-block;\r\n    cursor: pointer;\r\n    &:hover{\r\n      color: #29B3FF;\r\n    }\r\n  }\r\n}\r\n.mcImg{\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  height: 100%;\r\n  background: rgba(0,0,0,0.4);\r\n  z-index: 9999;\r\n  .mcImgDiv{\r\n    background-image: url(\"../../assets/image/组 16283.png\");\r\n    background-size: 100% 100%;\r\n    position: absolute;\r\n    width: 750px;\r\n    height: 400px;\r\n    background-repeat: no-repeat;\r\n    left: 50%;\r\n    top: 50%;\r\n    transform: translate(-50%,-50%);\r\n    h1{\r\n      color: #29B3FF;\r\n      text-align: center;\r\n      font-size: 16px;\r\n      position: relative;\r\n      img{\r\n        position: absolute;\r\n        right: 10px;\r\n        cursor: pointer;\r\n      }\r\n    }\r\n    .mcImgDivCon{\r\n      padding: 30px 50px;\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      &>div{\r\n        display: flex;\r\n        color: #fff;\r\n        align-items: center;\r\n        margin-bottom: 10px;\r\n        width: 50%;\r\n        img{\r\n          width: 34px;\r\n          margin-right: 10px;\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n.postClass{\r\n  /deep/ .el-loading-mask{\r\n    background-color: rgba(0,0,0,0.4)!important;\r\n  }\r\n  .tr,.td{\r\n    float: none!important;\r\n  }\r\n}\r\n.nowClass{\r\n height: 33px;\r\n  color: #fff;\r\n  line-height: 33px;\r\n  text-align: center;\r\n  font-size: 14px;\r\n  width: 60px;\r\n  margin-left: 10px;\r\n  background-image: url(\"../../assets/map_image/confirmBg.png\");\r\n  background-size: 100% 100%;\r\n  position: absolute;\r\n  right: -80px;\r\n  cursor: pointer;\r\n}\r\n.topClass{\r\n  position: fixed;\r\n  top: 72px;\r\n  right: 80px;\r\n  height: 26px!important;\r\n  line-height: 26px!important;\r\n  font-size: 12px!important;\r\n  background-image: url(\"../../assets/map_image/confirmBg.png\");\r\n  background-size: 100% 100%;\r\n  background-repeat: no-repeat;\r\n  width: 84px;\r\n  color: #fff;\r\n  text-align: center;\r\n  cursor: pointer;\r\n  margin-right: 20px;\r\n}\r\n.rightView{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 536px;\r\n  right: 40px;\r\n  top: 128px;\r\n  background-image: url(\"../../assets/statisticalImage/pointBg.png\");\r\n  /deep/ .el-loading-spinner .el-loading-text{\r\n    font-size: 16px!important;\r\n  }\r\n  /deep/ .el-loading-spinner{\r\n    font-size: 24px!important;\r\n  }\r\n}\r\n.rightViewPost{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 266px;\r\n  right: 40px;\r\n  top: 128px;\r\n  background-image: url(\"../../assets/statisticalImage/postInfo.png\");\r\n  .topContainer{\r\n    width: 100%;\r\n    height: 70px;\r\n    margin-top: 50px;\r\n    display: flex;\r\n    .each{\r\n      width: 33%;\r\n      height: 100%;\r\n      text-align: center;\r\n      position: relative;\r\n      .num{\r\n        font-size: 24px;\r\n        font-weight: bold;\r\n        color: #29B3ff;\r\n      }\r\n      .bg{\r\n        width: 94px;\r\n        height: 42px;\r\n        background-image: url(\"../../assets/statisticalImage/bg.png\");\r\n        position: absolute;\r\n        top: 21px;\r\n        left: 24px;\r\n      }\r\n      .title{\r\n        font-size: 14px;\r\n        color: white;\r\n        margin-top: 20px;\r\n      }\r\n    }\r\n  }\r\n  .ringContainer{\r\n    width: 100%;\r\n    height: 130px;\r\n    margin-top: 10px;\r\n  }\r\n}\r\n.rightViewPolice{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 266px;\r\n  right: 40px;\r\n  top: 400px;\r\n  background-image: url(\"../../assets/statisticalImage/policeInfo.png\");\r\n  .topContainer{\r\n    width: 100%;\r\n    height: 78px;\r\n    margin-top: 45px;\r\n    display: flex;\r\n    .each{\r\n      width: 126px;\r\n      margin-left: 8px;\r\n      height: 100%;\r\n      text-align: center;\r\n      position: relative;\r\n      border-left: 3px solid #29B3ff;\r\n      padding-top: 5px;\r\n      .num{\r\n        color: #29B3ff;\r\n        font-size: 20px;\r\n        font-weight: bold;\r\n      }\r\n      .bg{\r\n        width: 126px;\r\n        height: 78px;\r\n        background: linear-gradient(360deg,rgba(41,179,255,0) 0%,#29b3ff 100%);\r\n        opacity: 0.2;\r\n        position: absolute;\r\n        top: 0;\r\n      }\r\n      .title{\r\n        color: white;\r\n        font-size: 14px;\r\n        font-weight: 400;\r\n        margin-top: 5px;\r\n      }\r\n    }\r\n  }\r\n  .rateContainer{\r\n    width: 100%;\r\n    height: 130px;\r\n    margin-top: 30px;\r\n    display: flex;\r\n    .each{\r\n      width: 153px;\r\n      height: 80px;\r\n      margin-left: 40px;\r\n      position: relative;\r\n      text-align: center;\r\n      .num{\r\n        font-size: 24px;\r\n        font-weight: bold;\r\n        color: white;\r\n        position: absolute;\r\n        z-index: 10;\r\n        width: 100%;\r\n        display: flex;\r\n        justify-content: center;\r\n        top: 6px;\r\n      }\r\n      .bg{\r\n        width: 153px;\r\n        height: 72px;\r\n        background: url(\"../../assets/statisticalImage/rateBg.png\");\r\n        position: absolute;\r\n        top: 0;\r\n        z-index: 1;\r\n      }\r\n      .title{\r\n        font-size: 14px;\r\n        color: white;\r\n        font-weight: 400;\r\n        position: absolute;\r\n        width: 100%;\r\n        display: flex;\r\n        justify-content: center;\r\n        top: 80px;\r\n      }\r\n    }\r\n  }\r\n}\r\n.roadInfo{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 266px;\r\n  right: 40px;\r\n  top: 662px;\r\n  background-size: 100% 100%;\r\n  background-image: url(\"../../assets/statisticalImage/policeInfo.png\");\r\n  .roadInfoDiv{\r\n    height: 230px;\r\n    padding: 10px;\r\n    /deep/ .el-loading-text{\r\n      font-size: 16px!important;\r\n    }\r\n    /deep/ .el-loading-spinner{\r\n      font-size: 26px!important;\r\n    }\r\n    .thead{\r\n      background: rgba(41, 179, 255, 0.4);\r\n      float: none;\r\n    }\r\n    .tr{\r\n      float: none;\r\n      background: rgba(41, 179, 255, 0.3);\r\n    }\r\n    .tr:nth-child(odd){\r\n      background: rgba(41, 179, 255, 0.16);\r\n    }\r\n    .tr,.thead{\r\n      display: flex;\r\n    }\r\n    .th{\r\n      line-height: 32px;\r\n      color: #fff;\r\n      font-size: 12px;\r\n      text-align: center;\r\n    }\r\n    .th1,.th2{\r\n      width: 30%;\r\n    }\r\n    .th3{\r\n      flex: 1;\r\n    }\r\n  }\r\n}\r\n.pointView{\r\n  position: relative;\r\n  /*position: fixed;*/\r\n  z-index: 20;\r\n  overflow: hidden;\r\n  //width: 426px;\r\n  width: 480px;\r\n  height: 774px;\r\n  left: 40px;\r\n  top: 30px;\r\n  /*top: 128px;*/\r\n  background-size: 100% 100%;\r\n  background-image: url(\"../../assets/map_image/ponding/pointBg.png\");\r\n  .searchView{\r\n    margin-top: 15px;\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    padding: 0 10px;\r\n    &>div{\r\n      display: flex;\r\n      width: 50%;\r\n    }\r\n    .inputView{\r\n      border: 1px solid rgba(41,179,255,0.6);\r\n      font-size: 14px;\r\n      margin-left: 10px;\r\n      /*border-right: 0px;*/\r\n      float: none;\r\n\r\n    }\r\n    .searchIcon{\r\n      background-image: url(\"../../assets/image/组 16037@2x.png\");\r\n      background-size: 14px;\r\n      background-repeat: no-repeat;\r\n      background-position: center;\r\n      width: 34px;\r\n      height: 33px;\r\n      background-color: #29B3FF;\r\n      border-radius: 0px 3px 3px 0px;\r\n      margin-left: -1px;\r\n    }\r\n  }\r\n\r\n  .leftContainer{\r\n    width: 100%;\r\n    height: 672px;\r\n    //height: 630px;\r\n    display: flex;\r\n    padding-left: 10px;\r\n    //padding-top: 10px;\r\n    .tree{\r\n      width: 146px;\r\n      height: 100%;\r\n      margin-top: 10px;\r\n      background-color: rgba(41,179,255,0.15);\r\n    }\r\n    .post{\r\n      //width: 260px;\r\n      flex: 1;\r\n      padding-right: 10px;\r\n      height: 100%\r\n    }\r\n  }\r\n  .workRankView .faultTable {\r\n    width: 100%;\r\n    height: 100%;\r\n    margin-left: 0px;\r\n    margin-top: 10px;\r\n  }\r\n  .diplayFlex{\r\n    display: flex;\r\n    position: relative;\r\n    p{\r\n      margin: 0;\r\n      padding: 0;\r\n    }\r\n    .diplayFlexI{\r\n      position: relative;\r\n      right: 0;\r\n      top: -1px;\r\n\r\n      p{\r\n        width: 20px;\r\n        height: 14px;\r\n        font-size: 12px;\r\n      }\r\n      p:last-of-type{\r\n        margin-top: -8px;\r\n      }\r\n    }\r\n  }\r\n  .redIcon{\r\n    display: inline-block;\r\n    width: 7px;\r\n    height: 7px;\r\n    margin-right: 5px;\r\n    border-radius: 50%;\r\n    background: #de1038;\r\n  }\r\n  .active {\r\n    background: #3DBAFF;\r\n  }\r\n}\r\n.eventCateChart{\r\n  width: 122px;\r\n  height: 122px;\r\n  background-image: url(\"../../assets/map_image/policeSituation/ringCenter.png\");\r\n  position: absolute;\r\n  left: 152px;\r\n  top: 123px;\r\n}\r\n.ringContainer{\r\n  width: 122px;\r\n  height: 154px;\r\n  float: left;\r\n  margin-top: 18px;\r\n  background-image: url(\"../../assets/map_image/policeSituation/ringBottom.png\");\r\n  background-repeat: no-repeat;\r\n  background-position: bottom center;\r\n}\r\n.eventCateLeft{\r\n  float: left;\r\n  width: 140px;\r\n  height: 90px;\r\n  margin-top: 18px;\r\n  background-image: url(\"../../assets/statisticalImage/ringLeft.png\");\r\n  background-size: 100% 100%;\r\n  -webkit-box-sizing: border-box;\r\n  -moz-box-sizing: border-box;\r\n  box-sizing: border-box;\r\n  padding-top: 8px;\r\n  padding-left: 5px;\r\n  display: grid;\r\n  position: relative;\r\n  left: 30px;\r\n}\r\n.eventCateRight{\r\n  float: left;\r\n  width: 140px;\r\n  height: 90px;\r\n  margin-top: 18px;\r\n  background-image: url(\"../../assets/statisticalImage/ringRight.png\");\r\n  -webkit-box-sizing: border-box;\r\n  -moz-box-sizing: border-box;\r\n  box-sizing: border-box;\r\n  padding-top: 8px;\r\n  padding-left: 0px;\r\n  display: grid;\r\n  position: relative;\r\n  left: 135px;\r\n}\r\n.eventBlock{\r\n  width: 11px;\r\n  height: 9px;\r\n  float: left;\r\n  margin-top: 2.5px;\r\n  margin-right: 8px;\r\n}\r\n.eventCateBar{\r\n  width: 100%;\r\n  height: 14px;\r\n  float: left;\r\n  font-size: 14px;\r\n  color: white;\r\n  line-height: 14px;\r\n}\r\n.fault24hChart{\r\n  width: 400px;\r\n  height: 230px;\r\n  margin-left: 10px;\r\n  margin-top: 13px;\r\n}\r\n.serviceNotice{\r\n  font-size: 14px;\r\n  color: #29B3ff;\r\n  position: relative;\r\n  margin: 10px 0 0 16px;\r\n  img{\r\n    width: 8px;\r\n    height: 12px;\r\n  }\r\n}\r\n.eachRows{\r\n  width: 33.33%;\r\n  height: 100%;\r\n  font-size: 14px;\r\n  color: white;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n}\r\n.dateContainer{\r\n  //width: 155px;\r\n  position: relative;\r\n  width: 210px;\r\n  height: 48px;\r\n  background-size: 100% 100%;\r\n  background-image: url(\"../../assets/statisticalImage/dateBg.png\");\r\n  position: absolute;\r\n  top: 130px;\r\n  left: 550px;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n}\r\n.postInfo{\r\n  width: 617px;\r\n  height: 455px;\r\n  background-image: url(\"../../assets/statisticalImage/postInfoBg.png\");\r\n  position: absolute;\r\n  z-index: 999999;\r\n  left: 651px;\r\n  top: 251px;\r\n  .title{\r\n    width: 100%;\r\n    height: 40px;\r\n    color: #29B3ff;\r\n    font-size: 16px;\r\n    font-weight: bold;\r\n    display: flex;\r\n    align-items: center;\r\n    margin-left: 20px;\r\n  }\r\n  .closeButton {\r\n    width: 20px;\r\n    height: 20px;\r\n    background-image: url(\"../../assets/map_image/ejectCloseButton.png\");\r\n    background-size: 100%;\r\n    background-position: center;\r\n    background-repeat: no-repeat;\r\n    position: absolute;\r\n    right: 15px;\r\n    top: 10px;\r\n    cursor: pointer;\r\n  }\r\n  .postDetail{\r\n    width: 100%;\r\n    height: 35px;\r\n    display: flex;\r\n    margin-left: 10px;\r\n    .title{\r\n      width: 80px;\r\n      height: 100%;\r\n      color: rgba(255,255,255,0.7);\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: flex-end\r\n    }\r\n    .content{\r\n      width: 450px;\r\n      height: 100%;\r\n      color: white;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: flex-start\r\n    }\r\n  }\r\n  .faultTablePost {\r\n    float: left;\r\n    margin-left: 19px;\r\n    margin-top: 10px;\r\n    height: 130px;\r\n    width: 580px;\r\n    overflow: hidden;\r\n    color: white;\r\n    line-height: 32px;\r\n    font-size: 14px;\r\n  }\r\n  /deep/.el-select .el-input.is-disabled .el-input__inner{\r\n    background-color: transparent;\r\n    cursor: default;\r\n  }\r\n  /deep/.el-select .el-input.is-disabled .el-input__suffix{\r\n    display: none;\r\n  }\r\n}\r\n\r\n.thead1{\r\n  display: flex;\r\n  &>div{\r\n    text-align: center;\r\n  }\r\n  .td11{\r\n    width: 45%;\r\n    //width: 170px;\r\n  }\r\n  .td12{\r\n    width: 33%;\r\n  }\r\n  .td13{\r\n    width: 24%;\r\n  }\r\n}\r\n.schedulingContainer1{\r\n  border-top: none!important;\r\n  border-bottom: 1px solid rgba(41,179,255,0.5)!important;\r\n  /deep/ .el-collapse-item__wrap{\r\n    background-color: transparent;\r\n    border: none;\r\n  }\r\n  /deep/ .el-collapse-item__header{\r\n    background-color: rgba(41,179,255,0.5);\r\n    color: white;\r\n    height: 40px;\r\n    border-bottom: 1px solid rgba(41,179,255,0.6);\r\n    //line-height: 50px;\r\n    font-size: 14px;\r\n    padding-left: 20px;\r\n  }\r\n}\r\n  .miaodianDiv{\r\n    color: #00a0e9;\r\n    height: 32px;\r\n    width: 32px;\r\n    border: 1px solid #00a0e9;\r\n    border-radius: 3px;\r\n    margin-left: 10px;\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    font-size: 20px;\r\n    cursor: pointer;\r\n  }\r\n  .miaodianDivActives{\r\n    color: #fff;\r\n    background: #00a0e9;\r\n  }\r\n  .searchBtnDiv{\r\n    color: #0c85c7;\r\n\r\n  }\r\n</style>\r\n\n\n---\nD:/nzy/workspace_git/Baseplatform-Ui-V3/src/views/serviceManage/schedulingStatistical.vue:\n<template>\n  <bg-and-info title-menu=\"勤务管理\" title-name=\"勤务统计\" step-url=\"/frontend/schedulingStatistical\" bg-size=\"1920\">\n    <div class=\"scheduling-page\">\n      <!-- 地图背景 -->\n      <div class=\"map-bg\">\n        <MapContainer\n          map-id=\"schedulingMap\"\n          :map-zoom=\"13\"\n          :map-height=\"960\"\n          :map-width=\"1920\"\n          map-style=\"mapabc-wd\"\n          :drag-rotate=\"false\"\n        />\n      </div>\n\n      <!-- 左侧岗位列表面板 -->\n      <div class=\"point-view\">\n        <div class=\"content-title\">\n          <span>岗位列表</span>\n          <span class=\"icon-desc\" @click=\"showIconDesc = true\">图标说明</span>\n        </div>\n\n        <!-- 搜索栏 -->\n        <div class=\"search-bar\">\n          <div class=\"search-left\">\n            <select v-model=\"searchData.postPrimaryType\" class=\"mini-select\" style=\"width: 90px\" @change=\"onPostTypeChange\">\n              <option value=\"\">全部</option>\n              <option v-for=\"item in postManager\" :key=\"item.id\" :value=\"item.id\">{{ item.name }}</option>\n            </select>\n            <select\n              v-if=\"searchData.postPrimaryType && searchData.postPrimaryType !== 5\"\n              v-model=\"searchData.postSecondType\"\n              class=\"mini-select\"\n              style=\"width: 110px; margin-left: 8px\"\n            >\n              <option value=\"\">全部</option>\n              <option v-for=\"item in postManagerMini\" :key=\"item.id\" :value=\"item.id\">{{ item.name }}</option>\n            </select>\n          </div>\n          <div class=\"search-right\">\n            <input\n              v-model=\"searchData.searchPostName\"\n              class=\"search-input\"\n              placeholder=\"输入关键字搜索\"\n              @keyup.enter=\"onSearch\"\n            />\n            <span class=\"locate-btn\" :class=\"{ active: isDotPrint }\" @click=\"onDotPrint\">\n              <i class=\"locate-icon\"></i>\n            </span>\n            <span class=\"search-btn\" @click=\"onSearch\">查询</span>\n          </div>\n        </div>\n\n        <!-- 部门树 + 岗位列表 -->\n        <div class=\"left-container\">\n          <!-- 部门树 -->\n          <div class=\"tree-panel\">\n            <a-tree\n              v-model:checkedKeys=\"checkedKeys\"\n              :tree-data=\"treeData\"\n              :field-names=\"{ title: 'label', key: 'id', children: 'children' }\"\n              checkable\n              :check-strictly=\"true\"\n              :default-expanded-keys=\"['100']\"\n              @check=\"onTreeCheck\"\n              @select=\"onTreeSelect\"\n              class=\"dept-tree\"\n            >\n              <template #title=\"node\">\n                <span :class=\"`dept-level-${node.deptLevel}`\">{{ node.label }}</span>\n              </template>\n            </a-tree>\n          </div>\n\n          <!-- 岗位列表 -->\n          <div class=\"post-panel\">\n            <div class=\"post-table-head\">\n              <div class=\"pth pth-name\" style=\"text-align: left; padding-left: 10px\">岗位名称</div>\n              <div class=\"pth pth-force\" style=\"text-align: left; padding-left: 10px\">警力部署</div>\n              <div class=\"pth pth-index\">指数</div>\n              <div class=\"pth pth-type\">类型</div>\n            </div>\n            <div class=\"post-table-body\">\n              <div\n                v-for=\"(item, idx) in filteredPostList\"\n                :key=\"item.id\"\n                class=\"post-row\"\n                :class=\"{ active: selectedPostId === item.id }\"\n                @click=\"onSelectPost(item)\"\n              >\n                <div class=\"ptd ptd-name\">\n                  <a-tooltip :title=\"item.postName\" placement=\"topLeft\">\n                    <span class=\"text-ellipsis\">{{ item.postName }}</span>\n                  </a-tooltip>\n                </div>\n                <div class=\"ptd ptd-force\">\n                  <template v-if=\"item.schedulingPoliceNum + item.schedulingAssistantNum + item.schedulingSafeguardNum > 0\">\n                    <span class=\"num-police\">{{ item.schedulingPoliceNum }}</span>\n                    <span class=\"num-sep\">/</span>\n                    <span class=\"num-assistant\">{{ item.schedulingAssistantNum }}</span>\n                    <span class=\"num-sep\">/</span>\n                    <span class=\"num-safeguard\">{{ item.schedulingSafeguardNum }}</span>\n                  </template>\n                  <span v-else class=\"num-dash\">--</span>\n                </div>\n                <div class=\"ptd ptd-index\">\n                  <span v-if=\"item.delayIndex\" class=\"red-dot\"></span>\n                  {{ item.delayIndex ? item.delayIndex.toFixed(2) : '--' }}\n                </div>\n                <div class=\"ptd pth-type\">{{ getPostTypeName(item.postPrimaryType, item.postSecondType) }}</div>\n              </div>\n              <div v-if=\"filteredPostList.length === 0\" class=\"no-data\">暂无数据</div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 右上：出勤情况 / 路勤统计 -->\n      <div class=\"right-top-panel\">\n        <!-- 模式切换 -->\n        <div class=\"mode-tabs\">\n          <div class=\"mode-tab\" :class=\"{ active: showPostInfo }\" @click=\"showPostInfo = true\">出勤情况</div>\n          <div class=\"mode-tab\" :class=\"{ active: !showPostInfo }\" @click=\"showPostInfo = false\">路勤统计</div>\n        </div>\n\n        <!-- 出勤情况 -->\n        <div v-show=\"showPostInfo\" class=\"attendance-panel\">\n          <div class=\"panel-scroll\">\n            <a-collapse v-model:activeKey=\"activeScheduleKeys\" class=\"sched-collapse\" :bordered=\"false\">\n              <a-collapse-item v-for=\"(item, idx) in postSchedulesReportInfo\" :key=\"idx + 1\" :label=\"renderSchedTitle(item, idx)\">\n                <div class=\"sched-detail\">\n                  <!-- 班次切换 -->\n                  <div class=\"sched-switcher\">\n                    <a-radio-group :value=\"schedulesData[idx]\" @change=\"(e: any) => onSchedChange(idx, e.target.value)\">\n                      <a-radio v-for=\"(sched, si) in item.rangeList\" :key=\"si\" :value=\"si\">\n                        {{ sched.startTime }}~{{ sched.endTime }}\n                      </a-radio>\n                    </a-radio-group>\n                  </div>\n                  <!-- 民警 -->\n                  <div v-if=\"item.rangeList[schedulesData[idx]].policeList.length > 0\" class=\"person-group\">\n                    <div class=\"group-title\">\n                      <span class=\"group-icon\"></span>\n                      民警（{{ item.rangeList[schedulesData[idx]].policeList.length }}人）\n                    </div>\n                    <div class=\"person-list\">\n                      <div v-for=\"(p, pi) in item.rangeList[schedulesData[idx]].policeList\" :key=\"'pol'+pi\" class=\"person-row\">\n                        <div class=\"p-name\">{{ p.nickName }}</div>\n                        <div class=\"p-status\" :style=\"{ color: getOndutyColor(p.ondutyFlag)[0] }\">\n                          <a-tooltip :title=\"getOndutyColor(p.ondutyFlag)[1]\">\n                            {{ getOndutyColor(p.ondutyFlag)[1] }}\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-device\">\n                          <template v-if=\"p.recorderId\">\n                            <a-tooltip :title=\"getRecorderColor(p.recorderShowOndutyFlag)[0]\">\n                              <span :style=\"{ color: getRecorderColor(p.recorderShowOndutyFlag)[1] }\">4G</span>\n                            </a-tooltip>\n                          </template>\n                        </div>\n                        <div class=\"p-device\">\n                          <a-tooltip :title=\"getIntercomColor(p.interphoneShowOndutyFlag)[0]\">\n                            <span :style=\"{ color: getIntercomColor(p.interphoneShowOndutyFlag)[1] }\">对讲机</span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signInFlag, 1, p.signInTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signInFlag, 1, p.signInTime)[0] }\">\n                              {{ getSignText(p.signInFlag, 1, p.signInTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signOutFlag, 2, p.signOutTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signOutFlag, 2, p.signOutTime)[0] }\">\n                              {{ getSignText(p.signOutFlag, 2, p.signOutTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <!-- 辅警 -->\n                  <div v-if=\"item.rangeList[schedulesData[idx]].assistantList.length > 0\" class=\"person-group\">\n                    <div class=\"group-title\">\n                      <span class=\"group-icon\"></span>\n                      辅警（{{ item.rangeList[schedulesData[idx]].assistantList.length }}人）\n                    </div>\n                    <div class=\"person-list\">\n                      <div v-for=\"(p, pi) in item.rangeList[schedulesData[idx]].assistantList\" :key=\"'aux'+pi\" class=\"person-row\">\n                        <div class=\"p-name\">{{ p.nickName }}</div>\n                        <div class=\"p-device\">\n                          <template v-if=\"p.recorderId\">\n                            <a-tooltip :title=\"getRecorderColor(p.recorderShowOndutyFlag)[0]\">\n                              <span :style=\"{ color: getRecorderColor(p.recorderShowOndutyFlag)[1] }\">4G</span>\n                            </a-tooltip>\n                          </template>\n                        </div>\n                        <div class=\"p-device\">\n                          <a-tooltip :title=\"getIntercomColor(p.interphoneOnlineFlag)[0]\">\n                            <span :style=\"{ color: getIntercomColor(p.interphoneOnlineFlag)[1] }\">对讲机</span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signInFlag, 1, p.signInTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signInFlag, 1, p.signInTime)[0] }\">\n                              {{ getSignText(p.signInFlag, 1, p.signInTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signOutFlag, 2, p.signOutTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signOutFlag, 2, p.signOutTime)[0] }\">\n                              {{ getSignText(p.signOutFlag, 2, p.signOutTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <!-- 保通员 -->\n                  <div v-if=\"item.rangeList[schedulesData[idx]].safeguardList.length > 0\" class=\"person-group\">\n                    <div class=\"group-title\">\n                      <span class=\"group-icon\"></span>\n                      保通员（{{ item.rangeList[schedulesData[idx]].safeguardList.length }}人）\n                    </div>\n                    <div class=\"person-list\">\n                      <div v-for=\"(p, pi) in item.rangeList[schedulesData[idx]].safeguardList\" :key=\"'saf'+pi\" class=\"person-row\">\n                        <div class=\"p-name\">{{ p.nickName }}</div>\n                        <div class=\"p-device\" style=\"width: 30px\"></div>\n                        <div class=\"p-device\">\n                          <a-tooltip :title=\"getIntercomColor(p.interphoneShowOndutyFlag)[0]\">\n                            <span :style=\"{ color: getIntercomColor(p.interphoneShowOndutyFlag)[1] }\">对讲机</span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signInFlag, 1, p.signInTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signInFlag, 1, p.signInTime)[0] }\">\n                              {{ getSignText(p.signInFlag, 1, p.signInTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signOutFlag, 2, p.signOutTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signOutFlag, 2, p.signOutTime)[0] }\">\n                              {{ getSignText(p.signOutFlag, 2, p.signOutTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </a-collapse-item>\n            </a-collapse>\n          </div>\n        </div>\n\n        <!-- 路勤统计 -->\n        <div v-show=\"!showPostInfo\" class=\"road-stat-panel\">\n          <!-- 路勤岗位 -->\n          <div class=\"stat-block\">\n            <div class=\"stat-title\">路勤岗位</div>\n            <div class=\"stat-cards-3\">\n              <div class=\"stat-card\">\n                <div class=\"sc-num\">{{ postReportInfo.totalNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">总岗位数</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #ffe478\">{{ postReportInfo.keyNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">重点岗位</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #e13c14\">{{ postReportInfo.abnormalNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">排班异常岗位</div>\n              </div>\n            </div>\n            <!-- 环形图 -->\n            <div class=\"ring-chart-container\">\n              <div class=\"ring-legend ring-legend-left\">\n                <div v-for=\"(item, idx) in ringChartData.slice(0, 4)\" :key=\"'rl'+idx\" class=\"legend-item\">\n                  <span class=\"legend-dot\" :style=\"{ background: ringColors[idx] }\"></span>\n                  <span class=\"legend-name\">{{ item.name }}</span>\n                  <span class=\"legend-value\">{{ item.num }}</span>\n                </div>\n              </div>\n              <div ref=\"ringChartRef\" class=\"ring-chart\"></div>\n              <div class=\"ring-legend ring-legend-right\">\n                <div v-for=\"(item, idx) in ringChartData.slice(4, 8)\" :key=\"'rr'+idx\" class=\"legend-item\">\n                  <span class=\"legend-dot\" :style=\"{ background: ringColors[idx + 4] }\"></span>\n                  <span class=\"legend-name\">{{ item.name }}</span>\n                  <span class=\"legend-value\">{{ item.num }}</span>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <!-- 今日路勤警力 -->\n          <div class=\"stat-block\" style=\"margin-top: 8px\">\n            <div class=\"stat-title\">今日路勤警力</div>\n            <div class=\"stat-cards-3\">\n              <div class=\"stat-card\">\n                <div class=\"sc-num\">{{ postRoadReportInfo.schedulingPoliceNum }}/{{ postRoadReportInfo.totalPoliceNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">民警</div>\n                <div class=\"sc-sub\">（排班/总人数）</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #ffe478\">\n                  {{ postRoadReportInfo.schedulingAssistantNum }}/{{ postRoadReportInfo.totalAssistantNum }}\n                </div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">辅警</div>\n                <div class=\"sc-sub\">（排班/总人数）</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #11b95c\">\n                  {{ postRoadReportInfo.schedulingSafeguardNum }}/{{ postRoadReportInfo.totalSafeguardNum }}\n                </div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">保通员</div>\n                <div class=\"sc-sub\">（排班/总人数）</div>\n              </div>\n            </div>\n            <div class=\"rate-row\">\n              <div class=\"rate-item\">\n                <div class=\"sc-num\">{{ postRoadReportInfo.schedulingRatio }}%</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">排班率</div>\n              </div>\n              <div class=\"rate-item\">\n                <div class=\"sc-num\">{{ postRoadReportInfo.ontimeRatio }}%</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">准点率</div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 右下：路面保通情况 / 异常班次 -->\n      <div class=\"right-bottom-panel\">\n        <div class=\"rb-title\">\n          {{ showPostInfo ? '路面保通情况' : '异常班次' }}\n        </div>\n        <div v-show=\"showPostInfo\" class=\"line-chart-container\">\n          <div ref=\"lineChartRef\" class=\"line-chart\"></div>\n        </div>\n        <div v-show=\"!showPostInfo\" class=\"abnormal-table\">\n          <div class=\"abnormal-head\">\n            <div class=\"ah ah-1\">班次</div>\n            <div class=\"ah ah-2\">岗位</div>\n            <div class=\"ah ah-3\">异常人员</div>\n          </div>\n          <div class=\"abnormal-body\">\n            <div v-for=\"(item, idx) in abnormalListData\" :key=\"idx\" class=\"abnormal-row\">\n              <div class=\"ah ah-1\">\n                <a-tooltip :title=\"item.schedulesName\">\n                  <span class=\"text-ellipsis\">{{ item.schedulesName }}</span>\n                </a-tooltip>\n              </div>\n              <div class=\"ah ah-2\">\n                <a-tooltip :title=\"item.postName\">\n                  <span class=\"text-ellipsis\">{{ item.postName }}</span>\n                </a-tooltip>\n              </div>\n              <div class=\"ah ah-3\">\n                <a-tooltip :title=\"item.abnormalPersonNames\">\n                  <span class=\"text-ellipsis\">{{ item.abnormalPersonNames }}</span>\n                </a-tooltip>\n              </div>\n            </div>\n            <div v-if=\"abnormalListData.length === 0\" class=\"no-data-small\">暂无数据</div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 日期选择器 -->\n      <div class=\"date-container\">\n        <a-date-picker\n          v-model:value=\"searchDate\"\n          :show-time=\"true\"\n          format=\"YYYY-MM-DD HH:mm\"\n          @change=\"onDateChange\"\n          :allow-clear=\"false\"\n          class=\"dark-date-picker\"\n        />\n        <div class=\"now-btn\" @click=\"onNow\">当前</div>\n      </div>\n\n      <!-- 岗位信息弹窗 -->\n      <div v-if=\"showPostInfoWindow\" class=\"post-info-modal\" @click.self=\"showPostInfoWindow = false\">\n        <div class=\"post-info-dialog\">\n          <div class=\"dialog-head\">\n            <span>岗位信息</span>\n            <span class=\"close-btn\" @click=\"showPostInfoWindow = false\">×</span>\n          </div>\n          <div class=\"dialog-body\">\n            <div class=\"info-section\">\n              <div class=\"section-title\">\n                <span class=\"section-icon\"></span>\n                基础信息\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">岗位名称：</span>\n                <span class=\"info-value\">{{ currentPostInfo.postName }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">岗位类型：</span>\n                <span class=\"info-value\">{{ getPostTypeName(currentPostInfo.postPrimaryType, currentPostInfo.postSecondType) }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">岗位属性：</span>\n                <span class=\"info-value\">{{ currentPostInfo.postProperty === '1' ? '重点岗位' : currentPostInfo.postProperty === '2' ? '一般岗位' : '其他岗位' }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">勤务类型：</span>\n                <span class=\"info-value\">{{ currentPostInfo.serviceTypeName }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">所属部门：</span>\n                <span class=\"info-value\">{{ currentPostInfo.deptName }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">位置信息：</span>\n                <span class=\"info-value\">{{ currentPostInfo.postAddress }}</span>\n              </div>\n            </div>\n            <div class=\"info-section\" style=\"margin-top: 10px\">\n              <div class=\"section-title\">\n                <span class=\"section-icon\"></span>\n                班次信息\n              </div>\n              <div class=\"schedule-list\">\n                <div v-for=\"(s, si) in currentPostInfo.schedules\" :key=\"si\" class=\"sched-item\">\n                  <div class=\"sched-name\">{{ s.schedulesName }}</div>\n                  <div class=\"sched-time\">{{ s.startTime }} ~ {{ s.endTime }}</div>\n                  <div class=\"sched-people\">\n                    民警 {{ s.policeCount }}人 / 辅警 {{ s.assistantCount }}人 / 保通员 {{ s.safeguardCount }}人\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 图标说明弹窗 -->\n      <div v-if=\"showIconDesc\" class=\"icon-desc-modal\" @click.self=\"showIconDesc = false\">\n        <div class=\"icon-desc-dialog\">\n          <div class=\"dialog-head\">\n            <span>图标说明</span>\n            <span class=\"close-btn\" @click=\"showIconDesc = false\">×</span>\n          </div>\n          <div class=\"icon-desc-body\">\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #1682bd\"></span>\n              <span>民警</span>\n            </div>\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #e1c022\"></span>\n              <span>辅警</span>\n            </div>\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #11b95c\"></span>\n              <span>保通员</span>\n            </div>\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #e13c14\"></span>\n              <span>异常</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </bg-and-info>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, nextTick, watch } from 'vue';\nimport * as echarts from 'echarts';\nimport dayjs from 'dayjs';\nimport BgAndInfo from '/@/components/Common/bgAndInfo.vue';\nimport MapContainer from '/@/components/TumengIndex/MapContainer.vue';\n\n// ========== 类型定义 ==========\ninterface TreeData {\n  id: string;\n  label: string;\n  deptLevel: number;\n  children?: TreeData[];\n}\n\ninterface PostItem {\n  id: string;\n  deptId: string;\n  postName: string;\n  postPrimaryType: number;\n  postSecondType: number;\n  postProperty: string;\n  serviceTypeName: string;\n  schedulingPoliceNum: number;\n  schedulingAssistantNum: number;\n  schedulingSafeguardNum: number;\n  delayIndex: number;\n  deptName: string;\n  postAddress: string;\n  schedules: any[];\n}\n\ninterface Person {\n  nickName: string;\n  ondutyFlag: number;\n  recorderId: string;\n  recorderShowOndutyFlag: number;\n  recorderDeviceStatus: number;\n  interphoneShowOndutyFlag: number;\n  interphoneOnlineFlag: number;\n  signInFlag: number;\n  signInTime: string;\n  signOutFlag: number;\n  signOutTime: string;\n}\n\ninterface ScheduleRange {\n  startTime: string;\n  endTime: string;\n  policeList: Person[];\n  assistantList: Person[];\n  safeguardList: Person[];\n}\n\ninterface ScheduleItem {\n  schedulesName: string;\n  postPrimaryType: number;\n  rangeList: ScheduleRange[];\n}\n\ninterface AbnormalItem {\n  schedulesName: string;\n  postName: string;\n  abnormalPersonNames: string;\n}\n\n// ========== 部门树数据 ==========\nconst treeData = ref<TreeData[]>([\n  {\n    id: '100',\n    label: '交警支队',\n    deptLevel: 1,\n    children: [\n      {\n        id: 'd1', label: '一大队', deptLevel: 2,\n        children: [\n          { id: 'd1-1', label: '一中队', deptLevel: 3 },\n          { id: 'd1-2', label: '二中队', deptLevel: 3 },\n          { id: 'd1-3', label: '三中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd2', label: '二大队', deptLevel: 2,\n        children: [\n          { id: 'd2-1', label: '一中队', deptLevel: 3 },\n          { id: 'd2-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd3', label: '三大队', deptLevel: 2,\n        children: [\n          { id: 'd3-1', label: '一中队', deptLevel: 3 },\n          { id: 'd3-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd4', label: '四大队', deptLevel: 2,\n        children: [\n          { id: 'd4-1', label: '一中队', deptLevel: 3 },\n          { id: 'd4-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd5', label: '五大队', deptLevel: 2,\n        children: [\n          { id: 'd5-1', label: '一中队', deptLevel: 3 },\n          { id: 'd5-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd6', label: '六大队', deptLevel: 2,\n        children: [{ id: 'd6-1', label: '一中队', deptLevel: 3 }],\n      },\n      {\n        id: 'd7', label: '七大队', deptLevel: 2,\n        children: [{ id: 'd7-1', label: '一中队', deptLevel: 3 }],\n      },\n      {\n        id: 'd8', label: '八大队', deptLevel: 2,\n        children: [{ id: 'd8-1', label: '一中队', deptLevel: 3 }],\n      },\n    ],\n  },\n]);\n\nconst checkedKeys = ref<string[]>(['100']);\n\n// ========== 岗位类型数据 ==========\nconst postManager = ref([\n  { name: '路勤', id: 1 },\n  { name: '内勤', id: 2 },\n  { name: '值班', id: 3 },\n  { name: '其他', id: 5 },\n]);\n\nconst postManagerMini = ref<{ name: string; id: number }[]>([]);\n\nconst postTypeFull = [\n  {\n    id: 1, name: '路勤',\n    children: [\n      { id: 1, name: '一类固定岗' },\n      { id: 2, name: '二类固定岗' },\n      { id: 3, name: '三类固定岗' },\n      { id: 4, name: '机动巡逻岗' },\n      { id: 5, name: '夜巡管理岗' },\n      { id: 6, name: '高峰加勤岗' },\n      { id: 7, name: '春城骑警' },\n    ],\n  },\n  {\n    id: 2, name: '内勤',\n    children: [\n      { id: 1, name: '行政岗' },\n      { id: 2, name: '窗口岗' },\n      { id: 3, name: '高峰加勤岗' },\n    ],\n  },\n  {\n    id: 3, name: '值班',\n    children: [\n      { id: 1, name: '事故值班' },\n      { id: 2, name: '大队值班' },\n      { id: 3, name: '110值班' },\n      { id: 4, name: '指挥室值班' },\n      { id: 5, name: '备勤值班' },\n    ],\n  },\n  { id: 5, name: '其他', children: [] },\n];\n\n// ========== 搜索数据 ==========\nconst searchData = reactive({\n  postPrimaryType: '' as number | string,\n  postSecondType: '' as number | string,\n  searchPostName: '',\n});\n\nconst searchDate = ref<dayjs.Dayjs>(dayjs());\n\n// ========== Mock 岗位列表数据 ==========\nfunction genPerson(name: string, onduty: number, has4g: boolean, hasIntercom: boolean, signIn: number, signOut: number): Person {\n  return {\n    nickName: name,\n    ondutyFlag: onduty,\n    recorderId: has4g ? 'REC' + name : '',\n    recorderShowOndutyFlag: has4g ? (onduty === 1 ? 1 : 0) : 0,\n    recorderDeviceStatus: has4g ? 1 : 0,\n    interphoneShowOndutyFlag: hasIntercom ? (onduty === 1 ? 1 : 0) : 0,\n    interphoneOnlineFlag: hasIntercom ? 1 : 0,\n    signInFlag: signIn,\n    signInTime: signIn === 1 ? '07:55' : signIn === 2 ? '08:12' : '--',\n    signOutFlag: signOut,\n    signOutTime: signOut === 1 ? '18:02' : signOut === 2 ? '17:48' : '--',\n  };\n}\n\nconst postListData = ref<PostItem[]>([\n  {\n    id: 'p001', deptId: 'd1', postName: '人民东路岗', postPrimaryType: 1, postSecondType: 1,\n    postProperty: '1', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 3, schedulingAssistantNum: 2, schedulingSafeguardNum: 1,\n    delayIndex: 1.25, deptName: '一大队', postAddress: '人民东路与北京路交叉口',\n    schedules: [\n      { schedulesName: '早班', startTime: '07:00', endTime: '14:00', policeCount: 2, assistantCount: 1, safeguardCount: 0 },\n      { schedulesName: '中班', startTime: '12:00', endTime: '19:00', policeCount: 2, assistantCount: 1, safeguardCount: 1 },\n      { schedulesName: '晚班', startTime: '18:00', endTime: '次日01:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p002', deptId: 'd1-1', postName: '东风广场岗', postPrimaryType: 1, postSecondType: 2,\n    postProperty: '1', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 4, schedulingAssistantNum: 3, schedulingSafeguardNum: 2,\n    delayIndex: 0.85, deptName: '一大队一中队', postAddress: '东风路与白塔路交叉口',\n    schedules: [\n      { schedulesName: '早班', startTime: '07:00', endTime: '15:00', policeCount: 2, assistantCount: 2, safeguardCount: 1 },\n      { schedulesName: '晚班', startTime: '14:00', endTime: '22:00', policeCount: 2, assistantCount: 1, safeguardCount: 1 },\n    ],\n  },\n  {\n    id: 'p003', deptId: 'd2', postName: '火车站站前岗', postPrimaryType: 1, postSecondType: 1,\n    postProperty: '1', serviceTypeName: '专项勤务',\n    schedulingPoliceNum: 6, schedulingAssistantNum: 4, schedulingSafeguardNum: 3,\n    delayIndex: 2.15, deptName: '二大队', postAddress: '北京路南端火车站广场',\n    schedules: [\n      { schedulesName: '白班', startTime: '06:00', endTime: '18:00', policeCount: 4, assistantCount: 3, safeguardCount: 2 },\n      { schedulesName: '夜班', startTime: '18:00', endTime: '次日06:00', policeCount: 2, assistantCount: 1, safeguardCount: 1 },\n    ],\n  },\n  {\n    id: 'p004', deptId: 'd2-1', postName: '北京路巡逻岗', postPrimaryType: 1, postSecondType: 4,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 2, schedulingSafeguardNum: 0,\n    delayIndex: 0.5, deptName: '二大队一中队', postAddress: '北京路全段机动巡逻',\n    schedules: [\n      { schedulesName: '日班', startTime: '08:00', endTime: '20:00', policeCount: 2, assistantCount: 2, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p005', deptId: 'd3', postName: '行政值班岗', postPrimaryType: 3, postSecondType: 2,\n    postProperty: '2', serviceTypeName: '警卫勤务',\n    schedulingPoliceNum: 1, schedulingAssistantNum: 1, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '三大队', postAddress: '三大队办公楼',\n    schedules: [\n      { schedulesName: '值班', startTime: '08:30', endTime: '次日08:30', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p006', deptId: 'd3-2', postName: '110接处警岗', postPrimaryType: 3, postSecondType: 3,\n    postProperty: '1', serviceTypeName: '应急勤务',\n    schedulingPoliceNum: 3, schedulingAssistantNum: 2, schedulingSafeguardNum: 0,\n    delayIndex: 1.8, deptName: '三大队二中队', postAddress: '三大队辖区',\n    schedules: [\n      { schedulesName: '日班', startTime: '08:00', endTime: '20:00', policeCount: 2, assistantCount: 1, safeguardCount: 0 },\n      { schedulesName: '夜班', startTime: '20:00', endTime: '次日08:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p007', deptId: 'd4', postName: '春城骑警-四分队', postPrimaryType: 1, postSecondType: 7,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 5, schedulingAssistantNum: 0, schedulingSafeguardNum: 0,\n    delayIndex: 0.3, deptName: '四大队', postAddress: '四大队辖区机动',\n    schedules: [\n      { schedulesName: '日班', startTime: '07:30', endTime: '19:30', policeCount: 5, assistantCount: 0, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p008', deptId: 'd4-1', postName: '学府路夜巡岗', postPrimaryType: 1, postSecondType: 5,\n    postProperty: '3', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 1, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '四大队一中队', postAddress: '学府路全段',\n    schedules: [\n      { schedulesName: '夜班', startTime: '22:00', endTime: '次日06:00', policeCount: 2, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p009', deptId: 'd5', postName: '窗口服务岗', postPrimaryType: 2, postSecondType: 2,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 3, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '五大队', postAddress: '五大队违法处理窗口',\n    schedules: [\n      { schedulesName: '白班', startTime: '09:00', endTime: '17:00', policeCount: 2, assistantCount: 3, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p010', deptId: 'd5-2', postName: '广福路高峰岗', postPrimaryType: 1, postSecondType: 6,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 2, schedulingSafeguardNum: 1,\n    delayIndex: 0.65, deptName: '五大队二中队', postAddress: '广福路与前兴路交叉口',\n    schedules: [\n      { schedulesName: '早高峰', startTime: '07:00', endTime: '09:30', policeCount: 2, assistantCount: 2, safeguardCount: 1 },\n      { schedulesName: '晚高峰', startTime: '17:00', endTime: '19:30', policeCount: 2, assistantCount: 2, safeguardCount: 1 },\n    ],\n  },\n  {\n    id: 'p011', deptId: 'd6', postName: '指挥室值班', postPrimaryType: 3, postSecondType: 4,\n    postProperty: '1', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 2, schedulingSafeguardNum: 0,\n    delayIndex: 0.1, deptName: '六大队', postAddress: '六大队指挥中心',\n    schedules: [\n      { schedulesName: '白班', startTime: '08:00', endTime: '20:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n      { schedulesName: '夜班', startTime: '20:00', endTime: '次日08:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p012', deptId: 'd6-1', postName: '呈贡老城岗', postPrimaryType: 1, postSecondType: 3,\n    postProperty: '3', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 1, schedulingAssistantNum: 1, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '六大队一中队', postAddress: '呈贡区古银路',\n    schedules: [\n      { schedulesName: '白班', startTime: '08:00', endTime: '18:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n]);\n\n// ========== 筛选后的岗位列表 ==========\nconst filteredPostList = computed(() => {\n  let list = [...postListData.value];\n\n  // 部门过滤\n  if (checkedKeys.value.length > 0) {\n    const allDeptIds = new Set<string>();\n    function addAll(nodes: TreeData[]) {\n      for (const n of nodes) {\n        if ((checkedKeys.value as string[]).includes(n.id)) {\n          allDeptIds.add(n.id);\n          if (n.children) addChildren(n.children);\n        }\n        if (n.children) addAll(n.children);\n      }\n    }\n    function addChildren(nodes: TreeData[]) {\n      for (const n of nodes) {\n        allDeptIds.add(n.id);\n        if (n.children) addChildren(n.children);\n      }\n    }\n    addAll(treeData.value);\n    list = list.filter(item => allDeptIds.has(item.deptId));\n  }\n\n  // 岗位大类\n  if (searchData.postPrimaryType) {\n    list = list.filter(item => item.postPrimaryType === Number(searchData.postPrimaryType));\n    // 岗位细类\n    if (searchData.postSecondType) {\n      list = list.filter(item => item.postSecondType === Number(searchData.postSecondType));\n    }\n  }\n\n  // 关键字\n  if (searchData.searchPostName) {\n    const kw = searchData.searchPostName.toLowerCase();\n    list = list.filter(item => item.postName.toLowerCase().includes(kw));\n  }\n\n  return list;\n});\n\n// ========== 选中岗位 ==========\nconst selectedPostId = ref<string>('');\nconst showPostInfo = ref(true); // true=出勤情况, false=路勤统计\nconst isDotPrint = ref(false);\nconst showIconDesc = ref(false);\n\nfunction onSelectPost(item: PostItem) {\n  selectedPostId.value = item.id;\n  currentPostInfo.value = item;\n  showPostInfoWindow.value = true;\n  // 加载排班详情\n  loadScheduleDetail(item);\n}\n\n// ========== 出勤排班详情 ==========\nconst postSchedulesReportInfo = ref<ScheduleItem[]>([]);\nconst activeScheduleKeys = ref<number[]>([1]);\nconst schedulesData = ref<number[]>([]);\n\nfunction loadScheduleDetail(post: PostItem) {\n  // 根据岗位生成 mock 排班详情\n  const schedList: ScheduleItem[] = post.schedules.map((s: any, idx: number) => {\n    // 生成每个班次的人员列表\n    const policeList: Person[] = [];\n    const assistantList: Person[] = [];\n    const safeguardList: Person[] = [];\n\n    for (let i = 0; i < s.policeCount; i++) {\n      policeList.push(genPerson(\n        `民警${i + 1}`,\n        i === 0 ? 2 : 1,\n        true,\n        true,\n        i === 1 ? 2 : 1,\n        i === 0 ? 0 : 1,\n      ));\n    }\n    for (let i = 0; i < s.assistantCount; i++) {\n      assistantList.push(genPerson(\n        `辅警${i + 1}`,\n        i === 0 ? 0 : 1,\n        i !== 1,\n        true,\n        i === 0 ? 0 : 1,\n        i === 1 ? 2 : 1,\n      ));\n    }\n    for (let i = 0; i < s.safeguardCount; i++) {\n      safeguardList.push(genPerson(\n        `保通员${i + 1}`,\n        1,\n        false,\n        i === 0,\n        1,\n        i === 0 ? 0 : 1,\n      ));\n    }\n\n    return {\n      schedulesName: s.schedulesName,\n      postPrimaryType: post.postPrimaryType,\n      rangeList: [\n        {\n          startTime: s.startTime,\n          endTime: s.endTime,\n          policeList,\n          assistantList,\n          safeguardList,\n        },\n      ],\n    };\n  });\n\n  postSchedulesReportInfo.value = schedList;\n  schedulesData.value = schedList.map(() => 0);\n  activeScheduleKeys.value = schedList.length > 0 ? [1] : [];\n}\n\nfunction onSchedChange(idx: number, val: number) {\n  schedulesData.value[idx] = val;\n}\n\n// ========== 路勤统计数据 ==========\nconst postReportInfo = reactive({\n  totalNum: 48,\n  keyNum: 15,\n  abnormalNum: 3,\n});\n\nconst postRoadReportInfo = reactive({\n  schedulingPoliceNum: 86,\n  totalPoliceNum: 120,\n  schedulingAssistantNum: 64,\n  totalAssistantNum: 95,\n  schedulingSafeguardNum: 32,\n  totalSafeguardNum: 48,\n  schedulingRatio: 72.5,\n  ontimeRatio: 94.3,\n});\n\n// 环形图数据\nconst ringChartData = ref([\n  { name: '一类固定岗', num: 12 },\n  { name: '二类固定岗', num: 8 },\n  { name: '三类固定岗', num: 6 },\n  { name: '机动巡逻岗', num: 10 },\n  { name: '夜巡管理岗', num: 4 },\n  { name: '高峰加勤岗', num: 12 },\n  { name: '春城骑警', num: 8 },\n  { name: '其他', num: 3 },\n]);\n\nconst ringColors = ['#29B3FF', '#44FFFD', '#FFE478', '#FF9F43', '#EE5A52', '#52C41A', '#9254DE', '#13C2C2'];\n\n// ========== 异常班次 ==========\nconst abnormalListData = ref<AbnormalItem[]>([\n  { schedulesName: '早班', postName: '火车站站前岗', abnormalPersonNames: '张三、李四（未签到）' },\n  { schedulesName: '夜班', postName: '110接处警岗', abnormalPersonNames: '王五（脱岗）' },\n  { schedulesName: '晚班', postName: '人民东路岗', abnormalPersonNames: '赵六（晚到15分钟）' },\n]);\n\n// ========== 岗位信息弹窗 ==========\nconst showPostInfoWindow = ref(false);\nconst currentPostInfo = ref<PostItem>(postListData.value[0]);\n\n// ========== 日期 ==========\nfunction onDateChange() {}\nfunction onNow() {\n  searchDate.value = dayjs();\n}\n\n// ========== 图表 refs ==========\nconst ringChartRef = ref<HTMLDivElement>();\nconst lineChartRef = ref<HTMLDivElement>();\nlet ringChart: echarts.ECharts | null = null;\nlet lineChart: echarts.ECharts | null = null;\n\n// ========== 初始化环形图 ==========\nfunction initRingChart() {\n  if (!ringChartRef.value) return;\n  ringChart = echarts.init(ringChartRef.value);\n  const option: echarts.EChartsOption = {\n    tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },\n    series: [\n      {\n        name: '岗位类型',\n        type: 'pie',\n        radius: ['45%', '70%'],\n        center: ['50%', '50%'],\n        avoidLabelOverlap: false,\n        itemStyle: { borderColor: 'transparent', borderWidth: 2 },\n        label: { show: false },\n        emphasis: {\n          label: { show: false },\n        },\n        data: ringChartData.value.map((item, idx) => ({\n          name: item.name,\n          value: item.num,\n          itemStyle: { color: ringColors[idx] },\n        })),\n      },\n    ],\n  };\n  ringChart.setOption(option);\n}\n\n// ========== 初始化折线图（路面保通） ==========\nfunction initLineChart() {\n  if (!lineChartRef.value) return;\n  lineChart = echarts.init(lineChartRef.value);\n\n  const hours = ['00', '02', '04', '06', '08', '10', '12', '14', '16', '18', '20', '22'];\n  const data1 = [1.2, 0.8, 0.5, 1.5, 3.2, 2.8, 2.1, 2.5, 3.0, 3.8, 2.6, 1.8];\n  const data2 = [0.8, 0.5, 0.3, 1.0, 2.5, 2.2, 1.8, 2.0, 2.4, 3.0, 2.0, 1.2];\n\n  const option: echarts.EChartsOption = {\n    grid: { left: 40, right: 20, top: 30, bottom: 30 },\n    tooltip: {\n      trigger: 'axis',\n      backgroundColor: 'rgba(10, 26, 41, 0.9)',\n      borderColor: '#29B3FF',\n      textStyle: { color: '#fff' },\n    },\n    legend: {\n      data: ['拥堵指数', '平均速度'],\n      textStyle: { color: '#7aabc6', fontSize: 11 },\n      top: 5,\n      right: 20,\n    },\n    xAxis: {\n      type: 'category',\n      data: hours,\n      axisLine: { lineStyle: { color: 'rgba(41, 179, 255, 0.3)' } },\n      axisLabel: { color: '#7aabc6', fontSize: 10 },\n    },\n    yAxis: {\n      type: 'value',\n      axisLine: { show: false },\n      axisTick: { show: false },\n      splitLine: { lineStyle: { color: 'rgba(41, 179, 255, 0.1)' } },\n      axisLabel: { color: '#7aabc6', fontSize: 10 },\n    },\n    series: [\n      {\n        name: '拥堵指数',\n        type: 'line',\n        data: data1,\n        smooth: true,\n        symbol: 'circle',\n        symbolSize: 4,\n        lineStyle: { color: '#29B3FF', width: 2 },\n        itemStyle: { color: '#29B3FF' },\n        areaStyle: {\n          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n            { offset: 0, color: 'rgba(41, 179, 255, 0.3)' },\n            { offset: 1, color: 'rgba(41, 179, 255, 0.02)' },\n          ]),\n        },\n      },\n      {\n        name: '平均速度',\n        type: 'line',\n        data: data2,\n        smooth: true,\n        symbol: 'circle',\n        symbolSize: 4,\n        lineStyle: { color: '#FFE478', width: 2 },\n        itemStyle: { color: '#FFE478' },\n        areaStyle: {\n          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n            { offset: 0, color: 'rgba(255, 228, 120, 0.2)' },\n            { offset: 1, color: 'rgba(255, 228, 120, 0.02)' },\n          ]),\n        },\n      },\n    ],\n  };\n  lineChart.setOption(option);\n}\n\n// ========== 辅助函数 ==========\nfunction onTreeCheck(keys: any) {\n  const keyArr = Array.isArray(keys) ? keys : keys.checked;\n  checkedKeys.value = keyArr;\n}\n\nfunction onTreeSelect(selectedKeys: any) {\n  const key = selectedKeys[0];\n  if (!key) return;\n  const current = checkedKeys.value as string[];\n  if (current.includes(key)) {\n    checkedKeys.value = current.filter(k => k !== key);\n  } else {\n    checkedKeys.value = [key];\n  }\n}\n\nfunction onPostTypeChange() {\n  searchData.postSecondType = '';\n  const found = postTypeFull.find(item => item.id === Number(searchData.postPrimaryType));\n  postManagerMini.value = found?.children || [];\n}\n\nfunction onSearch() {\n  // 查询已通过 computed 自动过滤\n}\n\nfunction onDotPrint() {\n  isDotPrint.value = !isDotPrint.value;\n}\n\nfunction getPostTypeName(primary: number, second: number): string {\n  for (const p of postTypeFull) {\n    if (p.id === primary) {\n      for (const c of p.children) {\n        if (c.id === second) return c.name;\n      }\n      return p.name;\n    }\n  }\n  return '-';\n}\n\nfunction getOndutyColor(flag: number): [string, string] {\n  switch (flag) {\n    case 1: return ['#52c41a', '在岗'];\n    case 2: return ['#ffa940', '离岗'];\n    case 0: return ['#8c8c8c', '未上岗'];\n    default: return ['#8c8c8c', '未知'];\n  }\n}\n\nfunction getRecorderColor(flag: number): [string, string] {\n  return flag === 1 ? ['#52c41a', '在线'] : ['#8c8c8c', '离线'];\n}\n\nfunction getIntercomColor(flag: number): [string, string] {\n  return flag === 1 ? ['#52c41a', '在线'] : ['#8c8c8c', '离线'];\n}\n\nfunction getSignText(flag: number, type: number, time: string): [string, string, string] {\n  // 返回 [颜色, 文字, 详情提示]\n  if (type === 1) {\n    // 签到\n    switch (flag) {\n      case 1: return ['#52c41a', '已签到', `签到时间：${time}`];\n      case 2: return ['#ffa940', '迟到', `迟到签到：${time}`];\n      case 0: return ['#f5222d', '未签到', '未签到'];\n      default: return ['#8c8c8c', '-', '-'];\n    }\n  } else {\n    // 签退\n    switch (flag) {\n      case 1: return ['#52c41a', '已签退', `签退时间：${time}`];\n      case 2: return ['#ffa940', '早退', `早退签退：${time}`];\n      case 0: return ['#f5222d', '未签退', '未签退'];\n      default: return ['#8c8c8c', '-', '-'];\n    }\n  }\n}\n\nfunction renderSchedTitle(item: ScheduleItem, idx: number) {\n  const range = item.rangeList[schedulesData.value[idx] || 0];\n  return `${item.schedulesName}  ${range?.startTime || '--'} ~ ${range?.endTime || '--'}`;\n}\n\n// ========== 生命周期 ==========\nonMounted(() => {\n  nextTick(() => {\n    initRingChart();\n    initLineChart();\n  });\n\n  window.addEventListener('resize', () => {\n    ringChart?.resize();\n    lineChart?.resize();\n  });\n});\n\n// 切换模式后重绘图表\nwatch(showPostInfo, (val) => {\n  nextTick(() => {\n    if (!val) {\n      ringChart?.resize();\n    } else {\n      lineChart?.resize();\n    }\n  });\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.scheduling-page {\n  position: relative;\n  width: 100%;\n  height: 100vh;\n  color: #eaf8ff;\n  overflow: hidden;\n}\n\n/* ========== 地图背景 ========== */\n.map-bg {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 1;\n}\n\n/* ========== 左侧岗位列表 ========== */\n.point-view {\n  position: absolute;\n  left: 60px;\n  top: 100px;\n  width: 420px;\n  z-index: 10;\n  background: linear-gradient(180deg, rgba(10, 26, 41, 0.95) 0%, rgba(10, 26, 41, 0.85) 100%);\n  border: 1px solid rgba(41, 179, 255, 0.3);\n  border-radius: 4px;\n  padding: 10px 12px;\n  box-sizing: border-box;\n  backdrop-filter: blur(4px);\n}\n\n.content-title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  height: 30px;\n  line-height: 30px;\n  font-size: 16px;\n  color: #29b3ff;\n  font-weight: bold;\n  padding-bottom: 4px;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.2);\n  margin-bottom: 8px;\n\n  .icon-desc {\n    font-size: 12px;\n    color: #7aabc6;\n    cursor: pointer;\n    font-weight: normal;\n\n    &:hover { color: #29b3ff; }\n  }\n}\n\n/* 搜索栏 */\n.search-bar {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  margin-bottom: 8px;\n  flex-wrap: wrap;\n}\n\n.search-left {\n  display: flex;\n  align-items: center;\n}\n\n.search-right {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  gap: 6px;\n}\n\n.mini-select {\n  height: 28px;\n  padding: 0 24px 0 8px;\n  background: rgba(12, 60, 105, 0.8);\n  border: 1px solid #29b3ff;\n  border-radius: 2px;\n  color: #fff;\n  font-size: 12px;\n  outline: none;\n  cursor: pointer;\n  appearance: none;\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10'%3E%3Cpath d='M5 7L2 3h6z' fill='%2329b3ff'/%3E%3C/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 6px center;\n\n  option {\n    background: #0a1a29;\n    color: #fff;\n  }\n}\n\n.search-input {\n  flex: 1;\n  height: 28px;\n  padding: 0 10px;\n  background: rgba(12, 60, 105, 0.8);\n  border: 1px solid #29b3ff;\n  border-radius: 2px;\n  color: #fff;\n  font-size: 12px;\n  outline: none;\n\n  &::placeholder {\n    color: rgba(255, 255, 255, 0.4);\n  }\n}\n\n.locate-btn {\n  width: 28px;\n  height: 28px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid #29b3ff;\n  border-radius: 2px;\n  cursor: pointer;\n  background: rgba(12, 60, 105, 0.8);\n\n  .locate-icon {\n    width: 14px;\n    height: 14px;\n    background: #29b3ff;\n    mask: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Cpath d='M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z'/%3E%3C/svg%3E\") center/contain no-repeat;\n  }\n\n  &.active {\n    background: rgba(41, 179, 255, 0.3);\n\n    .locate-icon { background: #44fffd; }\n  }\n}\n\n.search-btn {\n  width: 60px;\n  height: 28px;\n  line-height: 28px;\n  text-align: center;\n  font-size: 12px;\n  color: #fff;\n  background-image: url('/@/assets/map_image/goScreenBg.png');\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n  cursor: pointer;\n  flex-shrink: 0;\n}\n\n/* 左栏：树 + 岗位列表 */\n.left-container {\n  display: flex;\n  height: 720px;\n  gap: 8px;\n}\n\n.tree-panel {\n  width: 160px;\n  border: 1px solid rgba(41, 179, 255, 0.2);\n  border-radius: 2px;\n  overflow-y: auto;\n  padding: 6px 4px;\n  box-sizing: border-box;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n/* 覆盖 AntD Tree */\n:deep(.dept-tree) {\n  background: transparent;\n  color: #fff;\n  font-size: 12px;\n\n  .ant-tree-node-content-wrapper {\n    color: #fff;\n    &:hover { background: rgba(41, 179, 255, 0.15) !important; }\n  }\n\n  .ant-tree-treenode { padding: 2px 0; }\n\n  .ant-tree-checkbox {\n    .ant-tree-checkbox-inner {\n      width: 12px; height: 12px;\n      background: transparent;\n      border: 1px solid #29b3ff;\n      border-radius: 2px;\n\n      &::after {\n        inset-inline-start: 2px;\n        top: 0;\n        width: 3px; height: 6px;\n        border: 1.5px solid #29b3ff;\n        border-top: 0;\n        border-left: 0;\n      }\n    }\n    &.ant-tree-checkbox-checked .ant-tree-checkbox-inner {\n      background: rgba(41, 179, 255, 0.2);\n    }\n    &.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after {\n      background: #29b3ff;\n      inset-inline-start: 1.5px;\n      top: 4px;\n      width: 5px; height: 1.5px;\n    }\n  }\n\n  .ant-tree-switcher { color: #29b3ff; font-size: 10px; }\n  .ant-tree-indent-unit { width: 14px; }\n\n  .dept-level-1 { font-size: 14px; font-weight: bold; }\n  .dept-level-2 { font-weight: bold; }\n  .dept-level-3 { color: #41a4ef; }\n}\n\n/* 岗位列表 */\n.post-panel {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  border: 1px solid rgba(41, 179, 255, 0.2);\n  border-radius: 2px;\n  overflow: hidden;\n}\n\n.post-table-head {\n  display: flex;\n  background: rgba(41, 179, 255, 0.2);\n  font-size: 12px;\n  color: #29b3ff;\n  font-weight: bold;\n  flex-shrink: 0;\n\n  .pth {\n    height: 28px;\n    line-height: 28px;\n    text-align: center;\n    padding: 0 4px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n.pth-name { width: 32%; }\n.pth-force { width: 28%; }\n.pth-index { width: 16%; }\n.pth-type { width: 24%; }\n\n.post-table-body {\n  flex: 1;\n  overflow-y: auto;\n  font-size: 12px;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n.post-row {\n  display: flex;\n  cursor: pointer;\n  transition: background 0.15s;\n\n  &:nth-child(odd) { background: rgba(41, 179, 255, 0.08); }\n  &:nth-child(even) { background: rgba(41, 179, 255, 0.12); }\n  &:hover { background: rgba(41, 179, 255, 0.25); }\n\n  &.active {\n    background: rgba(41, 179, 255, 0.35);\n    border-left: 2px solid #44fffd;\n    box-sizing: border-box;\n  }\n\n  .ptd {\n    height: 30px;\n    line-height: 30px;\n    text-align: center;\n    padding: 0 4px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    color: #eaf8ff;\n  }\n}\n\n.text-ellipsis {\n  display: block;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.num-police { color: #1682bd; }\n.num-assistant { color: #e1c022; }\n.num-safeguard { color: #11b95c; }\n.num-sep { color: #fff; margin: 0 2px; }\n.num-dash { color: #fff; }\n\n.red-dot {\n  display: inline-block;\n  width: 6px;\n  height: 6px;\n  background: #ff4d4f;\n  border-radius: 50%;\n  margin-right: 4px;\n  vertical-align: middle;\n}\n\n.no-data {\n  text-align: center;\n  color: rgba(255, 255, 255, 0.5);\n  padding: 60px 0;\n  font-size: 13px;\n}\n\n.no-data-small {\n  text-align: center;\n  color: rgba(255, 255, 255, 0.5);\n  padding: 30px 0;\n  font-size: 12px;\n}\n\n/* ========== 右侧上面板 ========== */\n.right-top-panel {\n  position: absolute;\n  right: 60px;\n  top: 100px;\n  width: 420px;\n  z-index: 10;\n}\n\n.mode-tabs {\n  display: flex;\n  margin-bottom: 6px;\n  gap: 4px;\n\n  .mode-tab {\n    flex: 1;\n    height: 32px;\n    line-height: 32px;\n    text-align: center;\n    font-size: 14px;\n    color: #7aabc6;\n    background: rgba(10, 26, 41, 0.8);\n    border: 1px solid rgba(41, 179, 255, 0.2);\n    border-radius: 2px;\n    cursor: pointer;\n    transition: all 0.2s;\n\n    &.active {\n      color: #fff;\n      background: rgba(41, 179, 255, 0.2);\n      border-color: #29b3ff;\n    }\n\n    &:hover:not(.active) {\n      border-color: rgba(41, 179, 255, 0.5);\n      color: #29b3ff;\n    }\n  }\n}\n\n.attendance-panel, .road-stat-panel {\n  background: linear-gradient(180deg, rgba(10, 26, 41, 0.95) 0%, rgba(10, 26, 41, 0.85) 100%);\n  border: 1px solid rgba(41, 179, 255, 0.3);\n  border-radius: 4px;\n  backdrop-filter: blur(4px);\n}\n\n.attendance-panel {\n  .panel-scroll {\n    max-height: 420px;\n    overflow-y: auto;\n    padding: 8px;\n\n    &::-webkit-scrollbar { width: 4px; }\n    &::-webkit-scrollbar-thumb {\n      background: rgba(41, 179, 255, 0.3);\n      border-radius: 2px;\n    }\n  }\n}\n\n/* 手风琴 */\n:deep(.sched-collapse) {\n  background: transparent;\n  border: none;\n\n  .ant-collapse-item {\n    border: 1px solid rgba(41, 179, 255, 0.2);\n    border-radius: 2px;\n    margin-bottom: 6px;\n    background: rgba(41, 179, 255, 0.05);\n\n    .ant-collapse-header {\n      color: #29b3ff !important;\n      font-size: 13px !important;\n      padding: 8px 10px !important;\n\n      .ant-collapse-arrow {\n        color: #29b3ff !important;\n        font-size: 10px !important;\n      }\n    }\n\n    .ant-collapse-content {\n      background: transparent;\n      border-top: 1px solid rgba(41, 179, 255, 0.15);\n\n      .ant-collapse-content-box {\n        padding: 8px 10px 12px !important;\n      }\n    }\n  }\n\n  .ant-collapse-item-active {\n    background: rgba(41, 179, 255, 0.1);\n  }\n}\n\n.sched-detail {\n  .sched-switcher {\n    margin-bottom: 10px;\n    margin-left: 10px;\n\n    :deep(.ant-radio-group) {\n      .ant-radio-wrapper {\n        color: #eaf8ff;\n        font-size: 12px;\n        margin-right: 12px;\n\n        .ant-radio-inner {\n          border-color: #29b3ff;\n          background: transparent;\n          width: 12px; height: 12px;\n\n          &::after {\n            width: 6px; height: 6px;\n            background: #29b3ff;\n            inset-inline-start: 2px;\n            top: 2px;\n          }\n        }\n\n        &.ant-radio-wrapper-checked {\n          .ant-radio-inner { border-color: #29b3ff; }\n        }\n      }\n    }\n  }\n}\n\n/* 人员分组 */\n.person-group {\n  margin-bottom: 14px;\n}\n\n.group-title {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 12px;\n  color: #29b3ff;\n  margin: 8px 0 6px;\n\n  .group-icon {\n    width: 12px;\n    height: 12px;\n    background: url('/@/assets/service/videoDes.png') center/contain no-repeat;\n  }\n}\n\n.person-list {\n  background: rgba(41, 179, 255, 0.12);\n  border-radius: 2px;\n  width: 96%;\n  margin: 0 auto;\n}\n\n.person-row {\n  display: flex;\n  align-items: center;\n  height: 28px;\n  font-size: 11px;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.06);\n\n  &:last-child { border-bottom: none; }\n\n  .p-name {\n    width: 20%;\n    padding-left: 8px;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  .p-status {\n    width: 22%;\n    text-align: center;\n  }\n\n  .p-device {\n    width: 50px;\n    text-align: center;\n    cursor: pointer;\n  }\n\n  .p-sign {\n    width: 22%;\n    text-align: center;\n  }\n}\n\n/* ========== 路勤统计 ========== */\n.road-stat-panel {\n  padding: 10px 12px;\n}\n\n.stat-block {\n  .stat-title {\n    font-size: 16px;\n    color: #29b3ff;\n    font-weight: bold;\n    margin-bottom: 8px;\n    padding-bottom: 4px;\n    border-bottom: 1px solid rgba(41, 179, 255, 0.2);\n  }\n}\n\n.stat-cards-3 {\n  display: flex;\n  justify-content: space-around;\n  margin: 10px 0;\n}\n\n.stat-card {\n  text-align: center;\n\n  .sc-num {\n    font-size: 22px;\n    font-weight: bold;\n    color: #29b3ff;\n    line-height: 1.2;\n  }\n\n  .sc-bar {\n    width: 40px;\n    height: 3px;\n    margin: 4px auto;\n    background: linear-gradient(90deg, transparent 0%, #29b3ff 50%, transparent 100%);\n  }\n\n  .sc-label {\n    font-size: 12px;\n    color: #7aabc6;\n  }\n\n  .sc-sub {\n    font-size: 10px;\n    color: #7aabc6;\n    margin-top: 2px;\n  }\n}\n\n.rate-row {\n  display: flex;\n  justify-content: space-around;\n  margin-top: 10px;\n  padding-top: 10px;\n  border-top: 1px solid rgba(41, 179, 255, 0.1);\n}\n\n.rate-item {\n  text-align: center;\n\n  .sc-num {\n    font-size: 20px;\n    font-weight: bold;\n    color: #44fffd;\n  }\n\n  .sc-bar {\n    width: 30px;\n    height: 2px;\n    margin: 3px auto;\n    background: linear-gradient(90deg, transparent 0%, #44fffd 50%, transparent 100%);\n  }\n\n  .sc-label {\n    font-size: 12px;\n    color: #7aabc6;\n  }\n}\n\n/* 环形图 */\n.ring-chart-container {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin: 10px 0;\n}\n\n.ring-chart {\n  width: 160px;\n  height: 160px;\n}\n\n.ring-legend {\n  width: 100px;\n\n  .legend-item {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 11px;\n    color: #eaf8ff;\n    margin-bottom: 6px;\n  }\n\n  .legend-dot {\n    width: 8px;\n    height: 8px;\n    border-radius: 2px;\n    flex-shrink: 0;\n  }\n\n  .legend-name {\n    flex: 1;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  .legend-value {\n    color: #29b3ff;\n    font-weight: bold;\n  }\n}\n\n/* ========== 右下底部面板 ========== */\n.right-bottom-panel {\n  position: absolute;\n  right: 60px;\n  bottom: 80px;\n  width: 420px;\n  height: 260px;\n  z-index: 10;\n  background: linear-gradient(180deg, rgba(10, 26, 41, 0.95) 0%, rgba(10, 26, 41, 0.85) 100%);\n  border: 1px solid rgba(41, 179, 255, 0.3);\n  border-radius: 4px;\n  backdrop-filter: blur(4px);\n  padding: 8px 12px;\n  box-sizing: border-box;\n}\n\n.rb-title {\n  font-size: 16px;\n  color: #29b3ff;\n  font-weight: bold;\n  margin-bottom: 6px;\n  padding-bottom: 4px;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.2);\n}\n\n.line-chart-container {\n  width: 100%;\n  height: calc(100% - 40px);\n}\n\n.line-chart {\n  width: 100%;\n  height: 100%;\n}\n\n/* 异常班次表 */\n.abnormal-table {\n  height: calc(100% - 40px);\n  display: flex;\n  flex-direction: column;\n}\n\n.abnormal-head, .abnormal-body {\n  font-size: 12px;\n}\n\n.abnormal-head {\n  display: flex;\n  background: rgba(41, 179, 255, 0.2);\n  color: #29b3ff;\n  font-weight: bold;\n  flex-shrink: 0;\n\n  .ah {\n    height: 28px;\n    line-height: 28px;\n    text-align: center;\n    padding: 0 6px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n.ah-1 { width: 30%; }\n.ah-2 { width: 30%; }\n.ah-3 { width: 40%; }\n\n.abnormal-body {\n  flex: 1;\n  overflow-y: auto;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n.abnormal-row {\n  display: flex;\n  color: #eaf8ff;\n\n  &:nth-child(odd) { background: rgba(41, 179, 255, 0.08); }\n  &:nth-child(even) { background: rgba(41, 179, 255, 0.12); }\n  &:hover { background: rgba(41, 179, 255, 0.2); }\n\n  .ah {\n    height: 28px;\n    line-height: 28px;\n    text-align: center;\n    padding: 0 6px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n/* ========== 日期选择器 ========== */\n.date-container {\n  position: absolute;\n  top: 100px;\n  left: 50%;\n  transform: translateX(-50%);\n  z-index: 10;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n\n  :deep(.dark-date-picker) {\n    .ant-picker {\n      background: rgba(10, 26, 41, 0.9);\n      border: 1px solid #29b3ff;\n      color: #fff;\n      border-radius: 2px;\n\n      .ant-picker-input {\n        input { color: #fff; font-size: 13px; }\n        .ant-picker-suffix { color: #29b3ff; }\n        .ant-picker-clear {\n          background: rgba(10, 26, 41, 0.9);\n          color: #7aabc6;\n        }\n      }\n    }\n  }\n}\n\n.now-btn {\n  width: 60px;\n  height: 30px;\n  line-height: 30px;\n  text-align: center;\n  font-size: 12px;\n  color: #fff;\n  background-image: url('/@/assets/map_image/goScreenBg.png');\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n  cursor: pointer;\n}\n\n/* ========== 弹窗通用 ========== */\n.post-info-modal, .icon-desc-modal {\n  position: fixed;\n  top: 0; left: 0; right: 0; bottom: 0;\n  background: rgba(0, 0, 0, 0.6);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  z-index: 1000;\n}\n\n.post-info-dialog, .icon-desc-dialog {\n  background: linear-gradient(180deg, #0a1a29 0%, #0d2137 100%);\n  border: 1px solid #29b3ff;\n  border-radius: 4px;\n  min-width: 400px;\n  max-height: 80vh;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n}\n\n.dialog-head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 16px;\n  font-size: 15px;\n  color: #29b3ff;\n  font-weight: bold;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.3);\n\n  .close-btn {\n    font-size: 22px;\n    color: #7aabc6;\n    cursor: pointer;\n    line-height: 1;\n\n    &:hover { color: #ff6b6b; }\n  }\n}\n\n.dialog-body {\n  padding: 14px 16px;\n  overflow-y: auto;\n  flex: 1;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n/* 岗位信息 */\n.info-section {\n  margin-bottom: 6px;\n\n  .section-title {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 13px;\n    color: #29b3ff;\n    margin-bottom: 8px;\n\n    .section-icon {\n      width: 12px;\n      height: 12px;\n      background: url('/@/assets/service/videoDes.png') center/contain no-repeat;\n    }\n  }\n}\n\n.info-row {\n  display: flex;\n  margin-bottom: 6px;\n  font-size: 13px;\n\n  .info-label {\n    color: #7aabc6;\n    min-width: 80px;\n    flex-shrink: 0;\n  }\n\n  .info-value {\n    color: #eaf8ff;\n    flex: 1;\n  }\n}\n\n.schedule-list {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n\n.sched-item {\n  padding: 8px 10px;\n  background: rgba(41, 179, 255, 0.08);\n  border: 1px solid rgba(41, 179, 255, 0.15);\n  border-radius: 2px;\n\n  .sched-name {\n    font-size: 13px;\n    color: #29b3ff;\n    font-weight: bold;\n    margin-bottom: 4px;\n  }\n\n  .sched-time {\n    font-size: 12px;\n    color: #7aabc6;\n    margin-bottom: 4px;\n  }\n\n  .sched-people {\n    font-size: 12px;\n    color: #eaf8ff;\n  }\n}\n\n/* 图标说明 */\n.icon-desc-dialog {\n  min-width: 200px;\n}\n\n.icon-desc-body {\n  padding: 16px 20px;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.icon-desc-row {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  font-size: 13px;\n  color: #eaf8ff;\n\n  .desc-dot {\n    width: 12px;\n    height: 12px;\n    border-radius: 50%;\n  }\n}\n</style>\n\n"}],"structuredContent":{"content":"D:/nzy/workspace_git/baseplatform-ui/src/views/postPage/schedulingStatistical.vue:\n<template>\r\n  <div :style=\"{height:height,width:width,transform:data.transform}\" class=\"smallBg\">\r\n    <bg-info title-menu=\"勤务查看\" title-name=\"勤务查看\" :stepUrl=\"stepUrl\"></bg-info>\r\n<!--    <div class=\"topClass activesBtn\" style=\"width: 100px;right: 80px\" @click=\"changeTo('/frontend/servicePost')\" >人员维度查看</div>-->\r\n    <alertWindow :nowWidth=\"1920\" @closeTraject=\"closeTraject\" :showTraject=\"showTraject\" :ejectData=\"ejectData\" :showPostViewAlert=\"false\" @functionMap=\"functionMap\" :style=\"{transform:data.transformMap}\" ref=\"alertWindow\"></alertWindow>\r\n    <largeRightNav @trajectortBtn=\"trajectortBtn\" @setMapStyle=\"setMapStyle\" ref=\"largeRightNav\" :resolution=\"1920\" :topNavList=\"'228px'\" :rightNavList=\"indexRightNavRight\" :screenButtonStatus=\"screenButtonStatus\" @resetMap=\"resetMap\" @faceNorth=\"faceNorth()\" @showTraffic=\"showTraffic\" @showMarkers=\"showMarkers\" @hideMarkers=\"hideMarkers\" @setPoiShow=\"setPoiShow\" @flyTo=\"flyTo\" @functionMap=\"functionMap\"></largeRightNav>\r\n    <div class=\"mapBg\">\r\n      <div :style=\"{height:0,width:0,marginLeft:0,transform:data.transformMap}\">\r\n        <largeMap :sandStartDot=\"[]\" :sendMapInfo=\"[]\" @schDotPrintFun=\"schDotPrintFun\" @closeTrajectMc=\"closeTrajectMc\" ref=\"mapBg\" @getDot=\"getDot\" @getZoom=\"getZoom\" @getDdflId=\"getDdflId\" @showAreaWindow=\"showAreaWindow\" @getShowAreaId=\"getShowAreaId\" @alertWindow=\"alertWindow\"></largeMap>\r\n      </div>\r\n    </div>\r\n    <div class=\"pointView\">\r\n      <div class=\"contentTitle\">\r\n        岗位列表\r\n        <span @click=\"closeImg=true\">图标说明</span>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n      <div class=\"searchView\" style=\"display: flex\">\r\n        <div>\r\n          <el-select placeholder=\"请选择\" clearable @clear=\"clearSeach\" style=\"width: 90px\" @change=\"changeSearchDate(1,2)\" v-model=\"searchData.postPrimaryType\" size=\"medium\">\r\n            <el-option v-for=\"item in postManager\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n          </el-select>\r\n          <el-select @change=\"changeSearchDate(1)\" style=\"margin-left: 10px;width: 120px\"  clearable placeholder=\"请选择\" v-model=\"searchData.postSecondType\" size=\"medium\">\r\n            <el-option v-for=\"item in postManagerMiniS\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n          </el-select>\r\n\r\n        </div>\r\n        <div style=\"flex: 1\">\r\n          <input placeholder=\"输入关键字搜索\" v-model=\"searchData.searchPostName\" style=\"margin-left: 0\" class=\"inputView inputFocus\"></input>\r\n          <div class=\"miaodianDiv\" :class=\"isDotPrint?'miaodianDivActives':''\" @click=\"dotPrint\">\r\n            <i class=\"el-icon-location-information\"></i>\r\n          </div>\r\n          <div class=\"nowClass activesBtn\" style=\"cursor: pointer;height: 32px;position: unset\" @click=\"changeSearchDate(1)\">查询</div>\r\n<!--          statisticsList-->\r\n        </div>\r\n      </div>\r\n      <div class=\"leftContainer\">\r\n        <div class=\"tree\">\r\n          <div style=\"height: 100%;width: 100%;overflow: auto\" class=\"workForceManage\">\r\n<!--             :current-node-key=\"searchDeptId\"-->\r\n            <el-tree\r\n              :data=\"treeData\"\r\n              style=\"width: max-content\"\r\n              :indent=\"26\"\r\n              node-key=\"id\"\r\n              highlight-current\r\n              :default-expanded-keys=\"[100]\"\r\n              ref=\"tree\"\r\n              show-checkbox\r\n              :check-strictly=\"ischecked\"\r\n              :expand-on-click-node=false\r\n              @current-change=\"changeNode\"\r\n              @check=\"handleNodeTree\"\r\n            >\r\n            <span slot-scope=\"{node,data}\" style=\"width: 100%\">\r\n              <span :style=\"{color:data.deptLevel==3?'rgba(65,164,239,1)':'white',marginLeft:data.deptLevel==3?'2px':'',fontSize:data.deptLevel==1?'19px':'',fontWeight:data.deptLevel!=3?'bold':'' }\">{{node.label}}</span>\r\n            </span>\r\n<!--               @node-click=\"handleNodeClick\"-->\r\n<!--              @current-change=\"changeNode\"-->\r\n<!--              @check=\"handleNodeTree\"-->\r\n            </el-tree>\r\n          </div>\r\n        </div>\r\n        <div class=\"post\">\r\n          <div class=\"workRankView\">\r\n            <div class=\"faultTable\" style=\"float: none\">\r\n              <div class=\"thead thead1\">\r\n                <div class=\"th td11\" style=\"text-align: left;padding-left: 10px\">岗位名称</div>\r\n                <div class=\"th td12\" style=\"text-align: left;padding-left: 10px\">警力部署</div>\r\n<!--                @click=\"clickSearch(3)\"-->\r\n                <div class=\"th td13 diplayFlex\" style=\"justify-content: center;\"  >指数\r\n                  <div class=\"diplayFlexI\">\r\n                    <p :class=\"'colorBlue'\" ><i class=\"el-icon-caret-top\"></i></p>\r\n                    <p :class=\"'colorBlue'\"><i class=\"el-icon-caret-bottom\"></i></p>\r\n                  </div>\r\n                </div>\r\n                <div class=\"th\">类型</div>\r\n              </div>\r\n              <div v-loading=\"loadingPost\" class=\"postClass\" style=\"height: 670px\">\r\n                <div class=\"tbody\" v-if=\"postList.length>0\" style=\"height: 638px;overflow-y: auto;width: 100%;overflow-x: hidden;float: none\">\r\n<!--                  selectedIndexVal-->\r\n                  <div class=\"tr thead1\" style=\"cursor: pointer\" v-for=\"(item, index) in postList\" :key=\"index\" :id=\"selectedIndexVal==item.id?'selected':''\" :class=\"{'active':selectedIndexVal==item.id}\" @click=\"setSelectedIndex(index,item)\">\r\n                    <div class=\"td td11 spaceWhite\" style=\"width: 121px;text-align: left;padding-left: 10px;overflow-x: hidden\">\r\n                      <el-popover popper-class=\"popperClassB\"\r\n                                  placement=\"top-start\"\r\n                                  width=\"100\"\r\n                                  trigger=\"hover\"\r\n                                  :open-delay=\"200\"\r\n                                  :content=\"item.postName\">\r\n                        <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 100px\"> {{item.postName}}</div>\r\n                      </el-popover>\r\n                    </div>\r\n                    <div class=\"td td12\" v-show=\"item.schedulingPoliceNum+item.schedulingAssistantNum+item.schedulingSafeguardNum!=0\" style=\"text-align: center;padding-left: 10px;color: #fff\">\r\n                      <span :style=\"{color: item.schedulingPoliceNum>0?'rgb(22, 130, 189)':'#fff'}\">{{item.schedulingPoliceNum}}</span> / <span :style=\"{color:item.schedulingAssistantNum>0?'#e1c022':'#fff' }\">{{item.schedulingAssistantNum}}</span> / <span :style=\"{color: item.schedulingSafeguardNum>0?'#11b95c':'#fff'}\">{{item.schedulingSafeguardNum}}</span>\r\n                    </div>\r\n                    <div class=\"td td12\" v-show=\"item.schedulingPoliceNum+item.schedulingAssistantNum+item.schedulingSafeguardNum==0\" style=\"text-align: center;padding-left: 10px\" :style=\"{color:'#fff'}\">\r\n                     --\r\n                    </div>\r\n                    <div class=\"td td13\" style=\"text-align: center;justify-content: center;padding-left: 10px;height: 100%;display: flex;align-items: center\">\r\n                      <span class=\"redIcon\" v-show=\"item.delayIndex\"></span>\r\n                      {{item.delayIndex?item.delayIndex.toFixed(2):'--'}}\r\n                    </div>\r\n                    <div class=\"th\" style=\"width: 20%\">{{returnType(item.postPrimaryType,item.postSecondType)}}</div>\r\n                  </div>\r\n                  <div style=\"float: none\"></div>\r\n                </div>\r\n                <div class=\"noData\" v-else style=\"color:#fff;height: 190px;text-align: center;line-height: 190px;\">\r\n                  暂无数据\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n    </div>\r\n    <div class=\"rightView\" v-show=\"showPostInfo\">\r\n      <div class=\"contentTitle\">出勤情况</div>\r\n      <div\r\n        v-loading=\"ydLoading\"\r\n        element-loading-text=\"加载中...\"\r\n        element-loading-background=\"rgba(0,0,0,0.6)\"\r\n        element-loading-spinner=\"el-icon-loading\"\r\n        style=\"width: 100%;height: 500px;padding: 10px 10px;overflow-y: scroll\">\r\n        <el-collapse v-model=\"activeNames\" class=\"schedulingContainer1\">\r\n          <el-collapse-item :name=\"index+1\" v-for=\"(item,index) in postSchedulesReportInfo\">\r\n            <template slot=\"title\">\r\n              <div style=\"width: 100%;display: flex;justify-content: space-between;padding-right: 20px\">\r\n                <el-popover popper-class=\"popperClassB\"\r\n                            placement=\"top-start\"\r\n                            width=\"100\"\r\n                            trigger=\"hover\"\r\n                            :open-delay=\"450\"\r\n                            :content=\"item.schedulesName\">\r\n                  <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 200px\">{{item.schedulesName}}</div>\r\n                </el-popover>\r\n                <span>{{item.rangeList[schedulesData[index]].startTime}} ~ {{item.rangeList[schedulesData[index]].endTime}}</span>\r\n              </div>\r\n            </template>\r\n            <div class=\"similarAlert3\" style=\"margin-top: 20px\">\r\n              <div style=\"margin-top: 20px;margin-left: 40px;\">\r\n                <el-radio-group v-model=\"schedulesData[index]\" @change=\"showDotPoint()\">\r\n                  <el-radio :label=\"secondIndex\" style=\"height: 30px\" v-for=\"(scond,secondIndex) in item.rangeList\">{{scond.startTime}}~{{scond.endTime}}</el-radio>\r\n                </el-radio-group>\r\n              </div>\r\n              <div class=\"serviceNotice\">\r\n                <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n                民警（{{item.rangeList[schedulesData[index]].policeList.length}}人）\r\n              </div>\r\n              <div v-if=\"item.rangeList[schedulesData[index]].policeList.length>0\" style=\"margin-top: 10px;width: 94%;margin-left:3%;background-color: rgba(41,179,255,0.22);\">\r\n                <div style=\"height: 30px;display: flex\" v-for=\"three in item.rangeList[schedulesData[index]].policeList\">\r\n                  <div class=\"eachRows\" style=\"width: 20%\">{{three.nickName}}</div>\r\n                  <div class=\"eachRows\" v-show=\"item.postPrimaryType==1\" style=\"width: 26%\" :style=\"{color: returnColor(three.ondutyFlag)[0]}\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                content=\"在岗状态\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" style=\"width: 68px;\" :style=\"{color:returnColor(three.ondutyFlag)[0]}\">{{returnColor(three.ondutyFlag)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\" style=\"width: 68px;cursor: pointer\"  >\r\n<!--                    <span :style=\"{color:three.recorderDeviceStatus==1?'#149e14':'#b5b3b3' }\">4G</span>-->\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                v-show=\"three.recorderId\"\r\n                                :content=\"ruturnColor(three.recorderShowOndutyFlag)[0]\">\r\n                      <div  v-show=\"three.recorderId\" slot=\"reference\" @click=\"show4GBtn(three)\" :style=\"{color:ruturnColor(three.recorderShowOndutyFlag)[1]}\" class=\"spaceWhite eachRows\" style=\"width: 48px;\">4G</div>\r\n                    </el-popover>\r\n                    <div  v-show=\"!three.recorderId\" style=\"width: 48px\"></div>\r\n                  </div>\r\n                  <el-popover popper-class=\"popperClassB\"\r\n                              placement=\"top-start\"\r\n                              width=\"100\"\r\n                              trigger=\"hover\"\r\n                              :open-delay=\"200\"\r\n                              :content=\"ruturnColor(three.interphoneShowOndutyFlag)[0]\">\r\n                    <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:ruturnColor(three.interphoneShowOndutyFlag)[1] }\" style=\"width: 68px;\">对讲机</div>\r\n                  </el-popover>\r\n\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(three.signInFlag,1,three.signInTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(three.signInFlag,1,three.signInTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(three.signInFlag,1,three.signInTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(three.signOutFlag,2,three.signOutTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(three.signOutFlag,2,three.signOutTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(three.signOutFlag,2,three.signOutTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"serviceNotice\" style=\"margin-top: 20px\">\r\n                <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n                辅警（{{item.rangeList[schedulesData[index]].assistantList.length}}人）\r\n              </div>\r\n              <div v-if=\"item.rangeList[schedulesData[index]].assistantList.length>0\" style=\"margin-top: 10px;width: 94%;margin-left:3%;background-color: rgba(41,179,255,0.22);\">\r\n                <div style=\"height: 30px;display: flex\" v-for=\"four in item.rangeList[schedulesData[index]].assistantList\">\r\n                  <div class=\"eachRows\" style=\"width: 20%\">{{four.nickName}}</div>\r\n<!--                  <div class=\"eachRows\" v-show=\"item.postPrimaryType==1\" style=\"width: 26%\" >-->\r\n<!--                    <el-popover popper-class=\"popperClassB\"-->\r\n<!--                                placement=\"top-start\"-->\r\n<!--                                width=\"100\"-->\r\n<!--                                trigger=\"hover\"-->\r\n<!--                                :open-delay=\"200\"-->\r\n<!--                                content=\"在岗状态\">-->\r\n<!--                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color: returnColor(four.ondutyFlag)[0]}\" style=\"width: 68px;\">{{returnColor(four.ondutyFlag)[1]}}</div>-->\r\n<!--                    </el-popover>-->\r\n<!--                  </div>-->\r\n                  <div class=\"eachRows\" style=\"width: 68px\"  >\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                v-show=\"four.recorderId\"\r\n                                :content=\"ruturnColor(four.recorderShowOndutyFlag)[0]\">\r\n                      <div slot=\"reference\" @click=\"show4GBtn(four)\" v-show=\"four.recorderId\" :style=\"{color:ruturnColor(four.recorderShowOndutyFlag)[1] }\" class=\"spaceWhite eachRows\" style=\"width: 48px;\">4G</div>\r\n                    </el-popover>\r\n<!--                    <span :style=\"{color:four.recorderDeviceStatus==1?'#149e14':'#b5b3b3' }\">4G</span></div>-->\r\n                  </div>\r\n                  <el-popover popper-class=\"popperClassB\"\r\n                              placement=\"top-start\"\r\n                              width=\"100\"\r\n                              trigger=\"hover\"\r\n                              :open-delay=\"200\"\r\n                              :content=\"ruturnColor(four.interphoneOnlineFlag)[0]\">\r\n                    <div slot=\"reference\" :style=\"{color:ruturnColor(four.interphoneOnlineFlag)[1]}\" class=\"spaceWhite eachRows\" style=\"width: 58px;\">对讲机</div>\r\n                  </el-popover>\r\n\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(four.signInFlag,1,four.signInTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(four.signInFlag,1,four.signInTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(four.signInFlag,1,four.signInTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(four.signOutFlag,2,four.signOutTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(four.signOutFlag,2,four.signOutTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(four.signOutFlag,2,four.signOutTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n              <div class=\"serviceNotice\" style=\"margin-top: 20px\">\r\n                <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n                保通员（{{item.rangeList[schedulesData[index]].safeguardList.length}}人）\r\n              </div>\r\n              <div v-if=\"item.rangeList[schedulesData[index]].safeguardList.length>0\" style=\"margin-top: 10px;width: 94%;margin-left:3%;background-color: rgba(41,179,255,0.22);\">\r\n                <div style=\"height: 30px;display: flex\" v-for=\"five in item.rangeList[schedulesData[index]].safeguardList\">\r\n                  <div class=\"eachRows\" style=\"width: 20%\">{{five.nickName}}</div>\r\n<!--                  <div class=\"eachRows\" v-show=\"item.postPrimaryType==1\" style=\"width: 26%\" >-->\r\n<!--                    <el-popover popper-class=\"popperClassB\"-->\r\n<!--                                placement=\"top-start\"-->\r\n<!--                                width=\"100\"-->\r\n<!--                                trigger=\"hover\"-->\r\n<!--                                :open-delay=\"200\"-->\r\n<!--                                content=\"在岗状态\">-->\r\n<!--                      <div slot=\"reference\" class=\"spaceWhite eachRows\" style=\"width: 68px;\" :style=\"{color: returnColor(five.ondutyFlag)[0]}\">{{returnColor(five.ondutyFlag)[1]}}</div>-->\r\n<!--                    </el-popover>-->\r\n<!--                  </div>-->\r\n<!--                  <div class=\"eachRows\" style=\"width: 20%\">{{five.phonenumber}}</div>-->\r\n                  <div class=\"eachRows\" style=\"width: 48px;cursor: pointer\"  ></div>\r\n                  <div class=\"eachRows\" style=\"width: 30%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"ruturnColor(five.interphoneShowOndutyFlag)[0]\">\r\n                      <div slot=\"reference\" :style=\"{color: ruturnColor(five.interphoneShowOndutyFlag)[1]}\" class=\"spaceWhite eachRows\" style=\"width: 68px;\">对讲机</div>\r\n                    </el-popover>\r\n<!--                    <span>{{ five.interphoneId }}</span>-->\r\n                  </div>\r\n\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(five.signInFlag,1,five.signInTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(five.signInFlag,1,five.signInTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(five.signInFlag,1,five.signInTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                  <div class=\"eachRows\"  style=\"width: 26%\">\r\n                    <el-popover popper-class=\"popperClassB\"\r\n                                placement=\"top-start\"\r\n                                width=\"100\"\r\n                                trigger=\"hover\"\r\n                                :open-delay=\"200\"\r\n                                :content=\"returnSBdk(five.signOutFlag,2,five.signOutTime)[2]\">\r\n                      <div slot=\"reference\" class=\"spaceWhite eachRows\" :style=\"{color:returnSBdk(five.signOutFlag,2,five.signOutTime)[0] }\" style=\"width: 68px;\">{{returnSBdk(five.signOutFlag,2,five.signOutTime)[1]}}</div>\r\n                    </el-popover>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </el-collapse-item>\r\n        </el-collapse>\r\n      </div>\r\n\r\n    </div>\r\n    <div v-show=\"!showPostInfo\">\r\n      <div class=\"rightViewPost\">\r\n        <div class=\"contentTitle\">路勤岗位</div>\r\n        <div class=\"topContainer\">\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{ postReportInfo.totalNum?postReportInfo.totalNum:0 }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">总岗位数</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #ffe478\">{{ postReportInfo.keyNum?postReportInfo.keyNum:0 }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">重点岗位</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #e13c14\">{{ postReportInfo.abnormalNum?postReportInfo.abnormalNum:0 }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">排班异常岗位</div>\r\n          </div>\r\n        </div>\r\n        <div class=\"ringContainer\">\r\n          <div class=\"eventCateLeft\">\r\n            <div class=\"eventCateBar\" v-for=\"(item,index) in echartData.slice(0,4)\" :key=\"index\">\r\n              <div class=\"eventBlock\" :style=\"{'background-color':colorList[index]}\"></div>\r\n              <div class=\"eventDes\">{{item.name}}：{{item.num}}</div>\r\n            </div>\r\n          </div>\r\n          <div id=\"eventCateChart\" class=\"eventCateChart\"></div>\r\n          <div class=\"eventCateRight\">\r\n            <div class=\"eventCateBar\" v-for=\"(item,index) in echartData.slice(4,8)\" :key=\"index\">\r\n              <div class=\"eventBlock\" :style=\"{'background-color':colorList[index+4]}\"></div>\r\n              <div class=\"eventDes\">{{item.name}}：{{item.num}}</div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div class=\"rightViewPolice\">\r\n        <div class=\"contentTitle\">今日路勤警力</div>\r\n        <div class=\"topContainer\">\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{postRoadReportInfo.schedulingPoliceNum}}/{{postRoadReportInfo.totalPoliceNum}}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\" style=\"margin-top: 10px\">民警</div>\r\n            <div class=\"title\">(排班/总人数)</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #ffe478\">{{ postRoadReportInfo.schedulingAssistantNum }}/{{ postRoadReportInfo.totalAssistantNum }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\" style=\"margin-top: 10px\">辅警</div>\r\n            <div class=\"title\">(排班/总人数)</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\" style=\"color: #11b95c\">{{postRoadReportInfo.schedulingSafeguardNum}}/{{ postRoadReportInfo.totalSafeguardNum }}</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\" style=\"margin-top: 10px\">保通员</div>\r\n            <div class=\"title\">(排班/总人数)</div>\r\n          </div>\r\n        </div>\r\n        <div class=\"rateContainer\">\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{postRoadReportInfo.schedulingRatio}}%</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">排班率</div>\r\n          </div>\r\n          <div class=\"each\">\r\n            <div class=\"num\">{{ postRoadReportInfo.ontimeRatio }}%</div>\r\n            <div class=\"bg\"></div>\r\n            <div class=\"title\">准点率</div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n    </div>\r\n    <div class=\"roadInfo\" v-show=\"showPostInfo\">\r\n      <div class=\"contentTitle\">路面保通情况</div>\r\n      <div class=\"fault24hChart\" id=\"fault24hChart\"></div>\r\n    </div>\r\n<!--    异常班次-->\r\n    <div class=\"roadInfo\" v-show=\"!showPostInfo\">\r\n      <div class=\"contentTitle\">异常班次</div>\r\n      <div style=\"clear: both\"></div>\r\n      <div\r\n        class=\"roadInfoDiv\"\r\n        v-loading=\"roadLoading\"\r\n        element-loading-text=\"加载中...\"\r\n        element-loading-background=\"rgba(0,0,0,0.6)\"\r\n        element-loading-spinner=\"el-icon-loading\"\r\n      >\r\n        <div class=\"thead\">\r\n           <div class=\"th th1\">班次</div>\r\n          <div class=\"th th2\">岗位</div>\r\n          <div class=\"th th3\">异常人员</div>\r\n        </div>\r\n        <div v-show=\"abnormalListData.length>0\" class=\"tbody\" style=\"height: 180px;overflow-y: auto\">\r\n          <div class=\"tr\" v-for=\"item in abnormalListData\">\r\n            <div class=\"th th1\">\r\n              <el-popover popper-class=\"popperClassB\"\r\n                          placement=\"top-start\"\r\n                          width=\"100\"\r\n                          trigger=\"hover\"\r\n                          :open-delay=\"200\"\r\n                          :content=\"item.schedulesName\">\r\n                <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 122px\"> {{item.schedulesName}}</div>\r\n              </el-popover>\r\n            </div>\r\n            <div class=\"th th2\">\r\n              <el-popover popper-class=\"popperClassB\"\r\n                          placement=\"top-start\"\r\n                          width=\"100\"\r\n                          trigger=\"hover\"\r\n                          :open-delay=\"200\"\r\n                          :content=\"item.postName\">\r\n                <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 122px\"> {{item.postName}}</div>\r\n              </el-popover>\r\n            </div>\r\n            <div class=\"th th3\">\r\n              <el-popover popper-class=\"popperClassB\"\r\n                          placement=\"top-start\"\r\n                          width=\"100\"\r\n                          trigger=\"hover\"\r\n                          :open-delay=\"200\"\r\n                          :content=\"item.abnormalPersonNames\">\r\n                <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 161px\"> {{item.abnormalPersonNames}}</div>\r\n              </el-popover>\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <div\r\n          style=\"    line-height: 100px;\r\n    text-align: center;\r\n    color: rgba(255,255,255,.5)\"\r\n          v-show=\"abnormalListData.length<=0\">\r\n          暂无数据！\r\n        </div>\r\n      </div>\r\n      <div style=\"clear: both\"></div>\r\n    </div>\r\n\r\n    <div class=\"dateContainer\">\r\n<!--      <el-date-picker-->\r\n<!--      v-model=\"searchDate\"-->\r\n<!--      value-format=\"yyyy-MM-dd\"-->\r\n<!--      type=\"date\"-->\r\n<!--      @change=\"changeSearchDate\"-->\r\n<!--      :clearable=\"false\"-->\r\n<!--      ></el-date-picker>-->\r\n\r\n      <el-date-picker\r\n        v-model=\"searchDate\"\r\n        value-format=\"yyyy-MM-dd HH:mm\"\r\n        type=\"datetime\"\r\n        @change=\"changeSearchDate\"\r\n        :clearable=\"false\"\r\n      ></el-date-picker>\r\n      <div class=\"nowClass activesBtn\" @click=\"changeNow\">当前</div>\r\n    </div>\r\n    <div class=\"postInfo displayContainer\" v-dialog-drag v-show=\"showPostInfoWindow\">\r\n      <div class=\"title dialogHead\">岗位信息</div>\r\n      <div class=\"closeButton\" @click=\"showPostInfoWindow=false\"></div>\r\n      <div class=\"serviceNotice\">\r\n        <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n        基础信息\r\n      </div>\r\n      <div class=\"postDetail\" style=\"margin-top: 5px\">\r\n        <div class=\"title\">岗位名称：</div>\r\n        <div class=\"content\">{{ formData.postName }}</div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">岗位类型：</div>\r\n        <div class=\"content\">\r\n          <el-select placeholder=\"\" :disabled=\"true\" v-model=\"formData.postPrimaryType\" size=\"medium\" style=\"margin-left: -12px\">\r\n          <el-option v-for=\"item in postManager\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n        </el-select>\r\n          <el-select placeholder=\"\" v-if=\"formData.postPrimaryType!=5&&formData.postPrimaryType\" :disabled=\"true\" v-model=\"formData.postSecondType\"  size=\"medium\" style=\"width: 210px !important;margin-left: -140px\">\r\n            <el-option v-for=\"item in postManagerMini\" :key=\"item.id\" :label=\"item.name\" :value=\"item.id\"></el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">勤务类型：</div>\r\n        <div class=\"content\">\r\n          <el-select :disabled=\"true\" v-model=\"formData.serviceType\" placeholder=\"\" size=\"medium\" style=\"width: 500px !important;margin-left: -13px\">\r\n            <el-option v-for=\"item in serviceTypeList\" :key=\"item.dictCode\" :label=\"item.dictLabel\" :value=\"item.dictValue\">\r\n            </el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">岗位属性：</div>\r\n        <div class=\"content\">\r\n          <el-select placeholder=\"\" :disabled=\"true\" v-model=\"formData.postProperty\" size=\"medium\" style=\"width: 500px !important;margin-left: -13px\">\r\n            <el-option v-for=\"item in postPropertyList\" :key=\"item.dictCode\" :label=\"item.dictLabel\" :value=\"item.dictCode\">\r\n            </el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">警区：</div>\r\n        <div class=\"content\">\r\n          <el-select placeholder=\"\" :disabled=\"true\" v-model=\"formData.policeAreaId\" size=\"medium\" style=\"width: 500px !important;margin-left: -13px\">\r\n            <el-option v-for=\"item in policeDistrictList\" v-if=\"item.state\" :key=\"item.name\" :label=\"item.name\" :value=\"item.id\">\r\n            </el-option>\r\n          </el-select>\r\n        </div>\r\n      </div>\r\n      <div class=\"postDetail\">\r\n        <div class=\"title\">位置信息：</div>\r\n        <div class=\"content\">{{formData.postAddress}}</div>\r\n      </div>\r\n      <div class=\"serviceNotice\">\r\n        <img src=\"../../assets/service/videoDes.png\" alt=\"\">\r\n        班次信息\r\n      </div>\r\n      <div class=\"faultTablePost\">\r\n        <div class=\"thead\" style=\"width: 100%\">\r\n          <div class=\"th td1\" style=\"width: 10%\">班次名称</div>\r\n          <div class=\"th td2\" style=\"width: 21%;\">班次时间段</div>\r\n          <div class=\"th td3\" style=\"width: 8%;\">民警</div>\r\n          <div class=\"th td4\" style=\"width: 8%;\">辅警</div>\r\n          <div class=\"th td5\" style=\"width: 8%;\">保通员</div>\r\n          <div class=\"th td6\" style=\"width: calc(22%);\">工作建议</div>\r\n          <div class=\"th td7\" style=\"width: 23%;\">生效规则</div>\r\n        </div>\r\n        <div class=\"tbody\" v-if=\"formData.scheduleInfoList.length>0\" style=\"height: 130px;overflow-y: auto;float: left;width: 100%\">\r\n          <div v-for=\"(item, index) in formData.scheduleInfoList\" :key=\"index\">\r\n            <div class=\"tr\" style=\"width: 100%\" v-show=\"item.deleteFlag!='2'\">\r\n              <div class=\"td td1 spaceWhite\" style=\"width: 10%;\">\r\n                <el-popover popper-class=\"popperClassB\"\r\n                            placement=\"top-start\"\r\n                            width=\"100\"\r\n                            trigger=\"hover\"\r\n                            :open-delay=\"200\"\r\n                            :content=\"item.schedulesName\">\r\n                  <div slot=\"reference\" class=\"spaceWhite\" style=\"width: 68px;\"> {{item.schedulesName}}</div>\r\n                </el-popover>\r\n              </div>\r\n              <div class=\"td td2 spaceWhite\" style=\"width: 21%\">\r\n                <p v-for=\"(itime, itnde) in item.time\"> {{itime.length>0?itime.join('-'):''}}</p>\r\n              </div>\r\n              <div class=\"td td3 spaceWhite\" style=\"width: 8%\"> {{item.policeNumber}}</div>\r\n              <div class=\"td td4 spaceWhite\" style=\"width: 8%\"> {{item.assistantPoliceNumber}}</div>\r\n              <div class=\"td td5 spaceWhite\" style=\"width: 8%\"> {{item.safeguardNumber}}</div>\r\n              <div  class=\"td td6\" style=\"width:22%\">\r\n                <span v-show=\"!item.suggest\" style=\"width: 20px;display: inline-block;height: 10px\"> </span>\r\n                <el-popover popper-class=\"popperClassB\"\r\n                            placement=\"top-start\"\r\n                            width=\"100\"\r\n                            trigger=\"hover\"\r\n                            :open-delay=\"300\"\r\n                            :content=\"item.suggest\">\r\n                  <div slot=\"reference\" class=\"spaceWhite\" style=\"width:100%\"> {{item.suggest}}</div>\r\n                </el-popover>\r\n              </div>\r\n\r\n              <div class=\"td td7\" style=\"width: 23%\"> {{returnRule(item.executeFlag)}}</div>\r\n            </div>\r\n          </div>\r\n\r\n        </div>\r\n        <div class=\"noData\" style=\"color:#fff;height: 130px;text-align: center;line-height: 190px;\">\r\n          暂无数据\r\n        </div>\r\n      </div>\r\n    </div>\r\n<!--    图标说明-->\r\n\r\n\r\n    <div class=\"mcImg\" v-show=\"closeImg\">\r\n        <transition name=\"el-zoom-in-top\">\r\n            <div class=\"mcImgDiv\">\r\n             <h1>图标说明\r\n               <img @click=\"closeImg=false\" src=\"../../assets/customLayer/closeButton.png\" alt=\"\">\r\n             </h1>\r\n              <div class=\"mcImgDivCon\">\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/q2.png\" alt=\"\"> <span>春城骑警岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/g2.png\" alt=\"\"> <span>高峰加勤岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/j2.png\" alt=\"\"> <span>机动巡逻岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/y2.png\" alt=\"\"> <span>夜巡管理岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/yi2.png\" alt=\"\"> <span>一类固定岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/e2.png\" alt=\"\"> <span>二类固定岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/s2.png\" alt=\"\"> <span>三类固定岗</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/qi2.png\" alt=\"\"> <span>其他</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/n2.png\" alt=\"\"> <span>内勤</span>\r\n                </div>\r\n                <div>\r\n                  <img src=\"../../assets/shedulingStatistical/z2.png\" alt=\"\"> <span>值班</span>\r\n                </div>\r\n                <div style=\"width: 100%\">\r\n                  <img src=\"../../assets/shedulingStatistical/s1.png\" alt=\"\"> <span>灰色代表此岗位在此时间未警力部署</span>\r\n                </div>\r\n              </div>\r\n            </div>\r\n        </transition>\r\n    </div>\r\n\r\n  </div>\r\n</template>\r\n\r\n<script>\r\nimport largeMap from \"../components/largeMap\";\r\nimport largeRightNav from '../components/largeRightNav'\r\nimport alertWindow from '@/views/components/alertWindow'\r\nimport request from \"@/utils/request\";\r\nimport echarts from 'echarts'\r\nimport log from '@/views/monitor/job/log'\r\nexport default {\r\n  name: 'schedulingStatistical',\r\n  components: {\r\n    largeMap,\r\n    largeRightNav,\r\n    alertWindow\r\n  },\r\n  data(){\r\n    return{\r\n      closeTrajectShow:false,\r\n      showTraject: false,\r\n      roadLoading: false,\r\n      abnormalListData: [],\r\n      closeImg: false,\r\n      ydLoading: false,\r\n      postListIdArr: [],\r\n      selectedIndexVal: '',\r\n      loadingPost: false,\r\n      timersout: null,\r\n      ischecked: false,\r\n      postManagerMini:[],\r\n      ssMarkers: [],\r\n      postManager: [\r\n        {\r\n          name: '路勤',\r\n          id: 1,\r\n          children: [\r\n            {name: '一类固定岗', id: 1},\r\n            {name: '二类固定岗', id: 2},\r\n            {name: '三类固定岗', id: 3},\r\n            {name: '机动巡逻岗', id: 4},\r\n            {name: '夜巡管理岗', id: 5},\r\n            {name: '高峰加勤岗', id: 6},\r\n            {name: '春城骑警', id: 7},\r\n          ]},\r\n        {\r\n          name: '内勤',\r\n          id: 2,\r\n          children: [\r\n            {name: '行政岗', id: 1},\r\n            {name: '窗口岗', id: 2},\r\n            {name: '高峰加勤岗', id: 3},\r\n          ]},\r\n        {\r\n          name: '值班',\r\n          id: 3,\r\n          children: [\r\n            {name: '事故值班', id: 1},\r\n            {name: '大队值班', id: 2},\r\n            {name: '110值班', id: 3},\r\n            {name: '指挥室值班', id: 4},\r\n            {name: '备勤值班', id: 5},\r\n          ]},\r\n        {\r\n          name: '其他',\r\n          id: 5,\r\n          children: []}\r\n      ],\r\n      postManagerMiniS: [\r\n        {name: '一类固定岗', id: 1},\r\n        {name: '二类固定岗', id: 2},\r\n        {name: '三类固定岗', id: 3},\r\n        {name: '机动巡逻岗', id: 4},\r\n        {name: '夜巡管理岗', id: 5},\r\n        {name: '高峰加勤岗', id: 6},\r\n        {name: '春城骑警', id: 7},\r\n      ],\r\n      postManager1: [\r\n        {\r\n          name: '路勤',\r\n          id: 1,\r\n          children: [\r\n            {name: '一类', id: 1},\r\n            {name: '二类', id: 2},\r\n            {name: '三类', id: 3},\r\n            {name: '机动', id: 4},\r\n            {name: '夜巡', id: 5},\r\n            {name: '高峰', id: 6},\r\n            {name: '春城', id: 7},\r\n          ]},\r\n        {\r\n          name: '内勤',\r\n          id: 2,\r\n          children: [\r\n            {name: '行政', id: 1},\r\n            {name: '窗口', id: 2},\r\n            {name: '高峰加勤', id: 3},\r\n          ]},\r\n        {\r\n          name: '值班',\r\n          id: 3,\r\n          children: [\r\n            {name: '事故', id: 1},\r\n            {name: '大队', id: 2},\r\n            {name: '110', id: 3},\r\n            {name: '指挥室', id: 4},\r\n          ]},\r\n        {\r\n          name: '其他',\r\n          id: 5,\r\n          children: []}\r\n      ],\r\n      formData:{\r\n        scheduleInfoList:[],\r\n      },\r\n      showPostInfoWindow:false,\r\n      schedulesId:0,\r\n      schedulesData: [],\r\n      postSchedulesReportInfo:[],\r\n      selectedIndex:-1,\r\n      isDrawingAll:false,\r\n      showPostInfo:false,\r\n      activeNames: [1],\r\n      searchDate:'',\r\n      searchDeptId:'',\r\n      searchData: {\r\n        searchPostName:'',\r\n        postPrimaryType: 1,\r\n        postSecondType: ''\r\n      },\r\n\r\n      showAreaId:null,\r\n      postList:[],\r\n      allWindowData:[],\r\n      width: '1920px',\r\n      height: '960px',\r\n      stepUrl:'',\r\n      treeData:[],\r\n      postRoadReportInfo:{\r\n        abnormalNum:0,\r\n        keyNum:0,\r\n        ontimeRatio:0,\r\n        postSecondTypeList:0,\r\n        schedulingAssistantNum:0,\r\n        schedulingPoliceNum:0,\r\n        schedulingRatio:0,\r\n        schedulingSafeguardNum:0,\r\n        totalAssistantNum:0,\r\n        totalNum:0,\r\n        totalPoliceNum:0,\r\n        totalSafeguardNum:0,\r\n      },\r\n      postReportInfo:{\r\n        totalNum:0,\r\n        keyNum:0,\r\n        abnormalNum:0,\r\n        postSecondTypeList:[],\r\n      },\r\n      data:{\r\n        transform: 'scale(0.5,0.5)',\r\n        transformMap:'scale(0.5,0.5)',\r\n        transformNotice: ''\r\n      },\r\n      ejectData:{}, // 父子组件传值\r\n      screenButtonStatus:{\r\n        trafficStatus: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        video: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        policeSituation: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        policeman: {\r\n          isShow:true,\r\n          timer:1000\r\n        },\r\n        policeCar: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        ranger: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        rtRecorder4g: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        work: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        ponding: {\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        trailer:{\r\n          isShow:true,\r\n          timer:false\r\n        },\r\n        bayonet: {\r\n          isShow:true,\r\n          timer:false\r\n        }, // 卡口\r\n        controlBayonet: {\r\n          isShow:true,\r\n          timer:false\r\n        }, // 卡口\r\n      },\r\n      indexRightNavRight: 470,\r\n      colorList:['#e13c14','#f6795b','#ffe478','#29b3ff','#86bb64','#315fdc','#44fffd'],\r\n      echartData:[\r\n        {name: '一类固定岗', id: 1,num:0},\r\n        {name: '二类固定岗', id: 2,num:0},\r\n        {name: '三类固定岗', id: 3,num:0},\r\n        {name: '机动巡逻岗', id: 4,num:0},\r\n        {name: '夜巡管理岗', id: 5,num:0},\r\n        {name: '高峰加勤岗', id: 6,num:0},\r\n        {name: '春城骑警', id: 7,num:0}],\r\n      chart:null,\r\n      serviceTypeList:[],\r\n      postPrimaryTypeList:[],\r\n      policeDistrictList:[],\r\n      postSecondTypeList:[],\r\n      postPropertyList:[\r\n        {dictCode:1,dictLabel:'重点岗位'},\r\n        {dictCode:2,dictLabel:'一般岗位'},\r\n        {dictCode:3,dictLabel:'其他岗位'},\r\n      ],\r\n      deptLevel:3,\r\n      deptFlag:3,\r\n      searchDeptLevel:1,\r\n      deptIds: '',\r\n      isDotPrint:false,\r\n      printLatlon:[]\r\n    }\r\n  },\r\n  created() {\r\n    this.convert()\r\n    this.deptIds = this.$store.getters.deptId;\r\n    this.getPostReportInfo();\r\n    this.getPostRoadReportInfo()\r\n  },\r\n  mounted() {\r\n    // this.initChart()\r\n  },\r\n  methods:{\r\n    schDotPrintFun(val) {\r\n      if(val) {\r\n        this.printLatlon = val\r\n        this.$refs.mapBg.stopToMarkLayers();\r\n      }\r\n    },\r\n    dotPrint() {\r\n      this.isDotPrint = !this.isDotPrint;\r\n      if(this.isDotPrint) {\r\n        this.$refs.mapBg.startToMark('schDotPrint')//HWL\r\n      }else{\r\n        this.printLatlon = []\r\n        this.$refs.mapBg.stopPrintDot()\r\n      }\r\n    },\r\n    closeTrajectMc() {\r\n      this.$refs.alertWindow.showTrajectBtn()\r\n    },\r\n    closeTraject() {\r\n      this.showTraject = false;\r\n      this.$refs.largeRightNav.trajectorySearch1(false)\r\n    },\r\n    trajectortBtn(val) {\r\n      this.showTraject = val\r\n    },\r\n    //修改地图主题颜色\r\n    setMapStyle(val){\r\n      this.$refs.mapBg.mapSetStyleClick(val)//HWL\r\n      // @setMapStyle=\"setMapStyle\"\r\n    },\r\n    hourSlot(id) {\r\n      this.$axios.get(`/baseplatform/kmdnLocalPoliceScheduling/statistics/post/hourSlot/list?postId=${id}&currentDate=${this.getTimeDate(this.searchDate)}`).then(res=>{\r\n        this.initChart(res.data.rows)\r\n      })\r\n    },\r\n    // 获取异常班次e\r\n    abnormalList() {\r\n      this.roadLoading = true;\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/abnormalSchedules/list`,{\r\n        postPrimaryType: this.searchData.postPrimaryType,\r\n        postSecondType: this.searchData.postSecondType,\r\n        deptIds: this.searchDeptId?this.searchDeptId:[],\r\n        postNameLike: this.searchData.searchPostName,\r\n        currentTime: `${this.searchDate}:00`,\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n      }).then(res=>{\r\n        this.roadLoading = false;\r\n        if(res.data.code==200) {\r\n          this.abnormalListData = res.data.data\r\n        }\r\n      })\r\n    },\r\n    returnSBdk(val,index, timers) {\r\n      if(index==1) {\r\n        // 上班\r\n        if(val==1) {\r\n          return ['#00B83F','正常打卡',`区域内 ${timers}`]\r\n        }else if(val==2) {\r\n          return ['rgb(236, 123, 123)','迟到打卡',`区域内 ${timers}`]\r\n        }else if(val==3) {\r\n          return ['#00B83F','正常打卡',`区域外 ${timers}`]\r\n        }else if(val==4) {\r\n          return ['rgb(236, 123, 123)','迟到打卡',`区域外 ${timers}`]\r\n        }else{\r\n          return ['rgb(236, 123, 123)','未打卡',`未打卡`]\r\n        }\r\n      }else {\r\n        if(val==1) {\r\n          return ['#00B83F','正常打卡',`区域内 ${timers}`]\r\n        }else if(val==2) {\r\n          return ['rgb(236, 123, 123)','早退打卡',`区域内 ${timers}`]\r\n        }else if(val==3) {\r\n          return ['#00B83F','正常打卡',`区域外 ${timers}`]\r\n        }else if(val==4) {\r\n          return ['rgb(236, 123, 123)','早退打卡',`区域外 ${timers}`]\r\n        }else{\r\n          return ['rgb(236, 123, 123)','未打卡',`未打卡`]\r\n        }\r\n      }\r\n    },\r\n    returnType(val,val1) {\r\n\r\n\r\n      if(val==5) {\r\n        return '其他'\r\n      }\r\n      let hs = this.postManager1[val-1].children;\r\n      if(val1) {\r\n        let returnVal = hs[val1-1]?hs[val1-1].name:''\r\n        return returnVal\r\n      }\r\n\r\n    },\r\n    ruturnColor(val, index) {\r\n        // 4g\r\n        if(val==1) {\r\n          return ['在线且在区域','#149e14']\r\n        }else if(val==2) {\r\n          return ['在线但不在区域','#d2b603']\r\n        }else{\r\n          return ['离线','#b5b3b3']\r\n        }\r\n    },\r\n    show4GBtn(val) {\r\n      this.$refs.mapBg.hideMarkers('rtRecorder4g')\r\n      if(val.recorderDeviceStatus!=1) {\r\n        return false;\r\n      }\r\n      this.$refs.alertWindow.getRtRecorder4gEjectVideo(\r\n        {\r\n          type:'rtRecorder4g',\r\n          lng: val.recorderLongitude,\r\n          lat: val.recorderLatitude,//纬度值\r\n          id: val.recorderId,\r\n          deptName: val.deptName,\r\n          flag:2,\r\n          deviceId: val.recorderId,\r\n          vehicleName: val.nickName,\r\n          vehicleId: val.policeId\r\n        }\r\n      )\r\n      // this.$refs.mapBg.showMarkers([{\r\n      //     type:'rtRecorder4g',\r\n      //     lng: val.recorderLongitude,\r\n      //     lat: val.recorderLatitude,//纬度值\r\n      //     id: val.recorderId,\r\n      //     deptName: val.deptName,\r\n      //     flag:2,\r\n      //     deviceId: val.recorderId,\r\n      //     vehicleName: val.nickName,\r\n      //     vehicleId: val.policeId\r\n      // }], false, false)\r\n    },\r\n    returnColor(val) {\r\n\r\n      if(val==0) {\r\n        return ['#787575', '未开始']\r\n      }else if(val==1) {\r\n        return ['#00B83F', '在岗']\r\n      }else if(val==2) {\r\n        return ['#ec7b7b', '异常']\r\n      }else{\r\n        return ['', '']\r\n      }\r\n    },\r\n    convert(){\r\n      this.stepUrl=this.$store.getters.deptLevel>2?'/frontend/serviceTable':this.$store.getters.deptLevel>1?'/frontend/serviceIndexDd':'/frontend/serviceIndexDd'\r\n      let scaleX = window.innerWidth / 1920\r\n      let scaleY = window.innerHeight / 960\r\n      this.data.transform = 'scale(' + scaleX + ',' + scaleY + ')'\r\n      this.data.transformMap = 'scale(' + 1 / scaleX + ',' + 1 / scaleY + ')'\r\n      this.data.transformNotice = 'scale(' + 192/500 + ',' +96/250 + ')'\r\n      Date.prototype.format = function(fmt) {\r\n        var o = {\r\n          \"M+\" : this.getMonth()+1,                 //月份\r\n          \"d+\" : this.getDate(),                    //日\r\n          \"W+\" : this.getDay(),                    //日\r\n          \"h+\" : this.getHours(),                   //小时\r\n          \"m+\" : this.getMinutes(),                 //分\r\n          \"s+\" : this.getSeconds(),                 //秒\r\n          \"q+\" : Math.floor((this.getMonth()+3)/3), //季度\r\n          \"S\"  : this.getMilliseconds()             //毫秒\r\n        };\r\n        if(/(y+)/.test(fmt)) {\r\n          fmt=fmt.replace(RegExp.$1, (this.getFullYear()+\"\").substr(4 - RegExp.$1.length));\r\n        }\r\n        for(var k in o) {\r\n          if(new RegExp(\"(\"+ k +\")\").test(fmt)){\r\n            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : ((\"00\"+ o[k]).substr((\"\"+ o[k]).length)));\r\n          }\r\n        }\r\n        return fmt;\r\n      }\r\n      // this.searchDate=new Date(new Date().getTime()).format('yyyy-MM-dd HH:mm:ss')\r\n      this.searchDate=(new Date()).format('yyyy-MM-dd hh:mm')\r\n      this.deptLevel=this.$store.getters.deptLevel\r\n      this.getTreeData()\r\n      this.getSelectType()\r\n    },\r\n    alertWindow:function(ejectData){\r\n      this.ejectData=ejectData\r\n    },\r\n    faceNorth:function(){\r\n      this.$refs.mapBg.faceNorth()\r\n    },\r\n    resetMap:function(){\r\n      this.$refs.mapBg.resetMap()\r\n    },\r\n    showMarkers:function(markers,isBestShow,isMul){\r\n      this.$refs.mapBg.showMarkers(markers,isBestShow,isMul)\r\n    },\r\n    hideMarkers:function(type){\r\n      this.$refs.mapBg.hideMarkers(type)\r\n    },\r\n    showTraffic:function(type){\r\n      this.$refs.mapBg.showTraffic(type, 30)\r\n    },\r\n    setPoiShow:function(){\r\n      this.$refs.mapBg.setPoiShow()\r\n    },\r\n    changeTo(val){\r\n      this.$router.push(val)\r\n    },\r\n    functionMap:function(func,args){\r\n      this.$refs.mapBg.functionMap(func,args)\r\n    },\r\n    flyTo:function(lngLat,zoom,picth){\r\n      this.$refs.mapBg.flyTo(lngLat,zoom,picth)\r\n    },\r\n    getTreeData(){\r\n      request({\r\n        url:`/system/dept/treeselectByUser`,\r\n        method: 'get',\r\n      }).then(res=>{\r\n        if(res.code==200) {\r\n          // this.searchDeptId=res.data[0].id\r\n          this.treeData = res.data\r\n          // this.handleNodeClick()\r\n        }\r\n      })\r\n    },\r\n    eventCategoryChart: function(val) {\r\n      let colorList = ['#e13c14','#f6795b','#ffe478','#29b3ff','#86bb64','#315fdc','#44fffd'];\r\n      let datas = [];\r\n      val.forEach(function(val,index) {\r\n        if(index<7) {\r\n          datas.push({\r\n            value:val.num,\r\n            name:val.name\r\n          });\r\n        }\r\n      })\r\n      var option = {\r\n        tooltip: {\r\n          trigger: 'item',\r\n          formatter: '{a} <br/>{b}: {c} ({d}%)'\r\n        },\r\n        color:colorList,\r\n        graphic:{\r\n          type: 'text',　　　　　　　　　　　　//通过不同top值可以设置上下显示\r\n          left: 'center',\r\n          top:'center',\r\n          style:{\r\n            text:\"岗位\\n分类\",\r\n            fill: '#ffffff',\r\n            fontSize: 14,\r\n          }\r\n        },\r\n        series: [\r\n          {\r\n            name: '岗位分类',\r\n            type: 'pie',\r\n            radius: ['50%', '70%'],\r\n            avoidLabelOverlap: false,\r\n            label: {\r\n              show: false,\r\n              position: 'center'\r\n            },\r\n            emphasis: {\r\n              label: {\r\n                show: false,\r\n                fontSize: '16',\r\n                fontWeight: 'bold',\r\n              }\r\n            },\r\n            labelLine: {\r\n              show: false\r\n            },\r\n            data: datas\r\n          }\r\n        ]\r\n      }\r\n      this.chart = echarts.init(document.getElementById('eventCateChart'))\r\n      this.chart.setOption(option)\r\n    },\r\n    initChart: function(data) {\r\n      let category = []\r\n      let data1 = []; // 分析时间\r\n      data.forEach(item=>{\r\n        category.push(item.hour)\r\n        data1.push(item.idx)\r\n      })\r\n      let option = {\r\n        xAxis: {\r\n          type: 'category',\r\n          boundaryGap: true,\r\n          data: category,\r\n          axisLabel: {\r\n            fontSize: 14,\r\n            align: 'right',\r\n            color: '#a0a0a0',\r\n            fontFamily: 'Microsoft YaHei',\r\n            lineHeight: 14\r\n          },\r\n          axisLine: {\r\n            show: false\r\n          },\r\n          axisTick: {\r\n            show: false\r\n          },\r\n          splitArea:{\r\n            show:true,\r\n            areaStyle:{\r\n              color:[\r\n                'rgba(41, 179, 255, 0.09)',\r\n                'rgba(41, 179, 255, 0.05)',\r\n              ]\r\n            }\r\n          }\r\n        },\r\n        tooltip: {\r\n          trigger: 'axis',\r\n          axisPointer: {\r\n            type: 'shadow',\r\n          },\r\n          textStyle:{\r\n            fontSize:14\r\n          },\r\n          padding:5\r\n        },\r\n        legend: {\r\n          right: 20,\r\n          top:5,\r\n          itemHeight: 10,\r\n          itemWidth: 10,\r\n          textStyle: {\r\n            fontSize: 14,\r\n            color: 'white'\r\n          },\r\n          formatter: function(name) {\r\n            return ' ' + name\r\n          },\r\n          itemGap: 10,\r\n          icon: 'rect'\r\n        },\r\n        grid: {\r\n          left: 30,\r\n          right: 0,\r\n          top:40\r\n        },\r\n        yAxis: {\r\n          type: 'value',\r\n          splitLine: {\r\n            show: false\r\n          },\r\n          axisLine: {\r\n            show: false\r\n          },\r\n          axisTick: {\r\n            show: false\r\n          },\r\n          axisLabel: {\r\n            fontSize: 14,\r\n            align: 'right',\r\n            color: '#a0a0a0',\r\n            fontFamily: 'Microsoft YaHei',\r\n            lineHeight: 14\r\n          }\r\n        },\r\n        series: [\r\n          {\r\n          name: '拥堵指数',\r\n          data: data1,\r\n          type: 'line',\r\n          smooth: false,\r\n          // areaStyle: { type: 'default' },\r\n          symbolSize: 0,\r\n          color: '#f6795b',\r\n          itemStyle:{\r\n            normal:{\r\n              lineStyle:{\r\n                width:2,\r\n                type:'solid',\r\n              }\r\n            }\r\n          }\r\n        }]\r\n      }\r\n      this.chart = echarts.init(document.getElementById('fault24hChart'))\r\n      // this.chart.resize({height:'230px' })\r\n      this.chart.setOption(option)\r\n    },\r\n    changeNode(val1, val2) {\r\n      this.showPostInfo = false;\r\n      this.abnormalListData = [];\r\n      if(val1.deptLevel==3){\r\n        this.flyToZd(val1.id)\r\n      }\r\n      this.allWindowData=[];\r\n      this.selectedIndex=-1;\r\n      this.selectedIndexVal = '';\r\n      this.showPostInfo=false\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.resetMap()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n\r\n\r\n      this.ischecked = true;\r\n      let arr = this.$refs.tree.getCheckedKeys()\r\n      if(arr.includes(val1.id)) {\r\n        this.$refs.tree.setCheckedKeys([],false)\r\n        this.postList = []\r\n        this.loadingPost= false;\r\n        this.searchDeptId = '';\r\n        this.getPostReportInfo();\r\n        this.getPostRoadReportInfo();\r\n        this.abnormalList()\r\n      }else{\r\n        // this.loadingPost= true;\r\n        let sm = val1.id.toString()\r\n        this.statisticsList(sm.split(','))\r\n        this.$refs.tree.setCheckedKeys([])\r\n        this.$refs.tree.setChecked(val1.id,true,false)\r\n\r\n      }\r\n    },\r\n    handleNodeTree(val,val2) {\r\n      this.selectedIndex=-1;\r\n      this.selectedIndexVal = '';\r\n      this.showPostInfo = false;\r\n      this.abnormalListData = [];\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.resetMap()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      if(this.ischecked) {\r\n        this.$refs.tree.setCheckedKeys([])\r\n        this.ischecked = false;\r\n\r\n        return false\r\n      }\r\n      let data=val2.checkedNodes\r\n      for(let i=data.length-1;i>-1;i--){\r\n        if(data[i].deptLevel==3){\r\n          this.flyToZd(data[i].id)\r\n          break\r\n        }\r\n      }\r\n      this.allWindowData=[];\r\n      this.selectedIndex=-1\r\n\r\n      this.ischecked = false;\r\n\r\n      if(val2.checkedKeys.length>0) {\r\n        let h = []\r\n        if(val2.checkedKeys.length<=1) {\r\n          h[0] = val2.checkedNodes[0].id\r\n          if(val2.checkedNodes[0].children) {\r\n            val2.checkedNodes[0].children.forEach(item=>{\r\n              h.push(item.id)\r\n            })\r\n          }\r\n        }else{\r\n          h = val2.checkedKeys\r\n        }\r\n        this.$refs.tree.setCheckedKeys(h)\r\n        //h.join(',')\r\n        this.statisticsList(h)\r\n        // this.loadingPost= true;\r\n      }else{\r\n        this.$refs.tree.setCheckedKeys([],false)\r\n        this.postList = []\r\n        this.searchDeptId = ''\r\n        this.loadingPost= false;\r\n        this.getPostReportInfo();\r\n        this.getPostRoadReportInfo();\r\n        this.abnormalList()\r\n      }\r\n\r\n    },\r\n    flyToZd(id){\r\n      this.$axios.get(`/baseplatform/kmdnLocalDdfl/info/ddfl/${id}`).then(res=>{\r\n      //  中队中心点聚焦\r\n        if(res.data.code==200&&res.data.data){\r\n          this.$refs.mapBg.flyTo([res.data.data.centerLongitude,res.data.data.centerLatitude],13)\r\n        }\r\n      })\r\n    },\r\n    statisticsList(val) {\r\n      if(val) {\r\n        this.searchDeptId=val\r\n        // this.searchDeptLevel=val.deptLevel\r\n      }\r\n\r\n      if(!this.searchDeptId){\r\n        return this.$message.error('请先选择部门！')\r\n      }\r\n      if(this.searchDeptLevel==3) {\r\n        this.allWindowData=[]\r\n        this.postInfoList(this.searchDeptId,'')\r\n      }\r\n      this.allWindowData=[];\r\n      if(this.timersout) {\r\n        clearTimeout(this.timersout)\r\n        this.timersout = null\r\n      }\r\n      this.timersout =  setTimeout(()=>{\r\n        this.postInfoList(this.searchDeptId,'')\r\n        // this.listStati()\r\n        this.getPostReportInfo()\r\n        this.getPostRoadReportInfo()\r\n        this.abnormalList()\r\n      },1000)\r\n    },\r\n    listStati() {\r\n      if(!this.searchDeptId) {\r\n        return this.$message.error('请选择部门')\r\n      }\r\n      this.loadingPost = true;\r\n      this.postListIdArr = []\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/list`,{\r\n        postPrimaryType: this.searchData.postPrimaryType,\r\n        postSecondType: this.searchData.postSecondType,\r\n        deptIds: this.searchDeptId,\r\n        postNameLike: this.searchData.searchPostName,\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n        currentTime: `${this.searchDate}:00`\r\n      }).then(res=>{\r\n        this.loadingPost =false;\r\n        res.data.rows.forEach(item=>{\r\n          this.postListIdArr.push(item.id)\r\n        })\r\n        this.postList=res.data.rows\r\n        this.$refs.mapBg.removeArea()\r\n        this.allWindowData=[]\r\n        if(res.data.rows.length>0) {\r\n          this.postList.forEach((val)=>{\r\n            let datas=[]\r\n            val.coordinateInfoList.forEach((each)=>{\r\n              datas.push([each.longitude,each.latitude])\r\n            })\r\n            this.drawAllDdArea([],[val.centerLongitude,val.centerLatitude],val.id,{name:val.postName,level:3,idx:2.32,center:[val.centerLongitude,val.centerLatitude]})\r\n            // this.allWindowData.push([[val.centerLongitude,val.centerLatitude],{schedulingPoliceNum:val.schedulingPoliceNum?val.schedulingPoliceNum:0,schedulingAssistantNum:val.schedulingAssistantNum?val.schedulingAssistantNum:0,schedulingSafeguardNum:val.schedulingSafeguardNum?val.schedulingSafeguardNum:0,postName:val.postName,postProperty:val.postProperty,postPrimaryType: val.postPrimaryType,postSecondType:val.postSecondType},true])\r\n\r\n          })\r\n        }\r\n\r\n      })\r\n    },\r\n    // 根据部门、岗位描点\r\n    postInfoList(deptIds,id,index) {\r\n      let url=`&currentDate=${this.getTimeDate(this.searchDate)}&currentTime=${this.searchDate}:00`\r\n      if(!this.searchDeptId) {\r\n        return this.$message.error('请选择部门')\r\n      }\r\n      if(!this.selectedIndexVal) {\r\n        this.ssMarkers = []\r\n      }\r\n\r\n      this.loadingPost = true;\r\n      this.postListIdArr = []\r\n\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/schedulingPostInfo/list`,{\r\n        postNameLike: this.searchData.searchPostName,\r\n        postPrimaryType:this.searchData.postPrimaryType,\r\n        postSecondType: this.searchData.postSecondType,\r\n        deptIds:this.searchDeptId,\r\n        id:id,\r\n        lonLat: this.printLatlon.toString(),\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n        currentTime: `${this.searchDate}:00`\r\n      }).then(res=>{\r\n\r\n        this.loadingPost =false;\r\n        res.data.rows.forEach(item=>{\r\n          this.postListIdArr.push(item.id)\r\n        })\r\n        this.postList=res.data.rows\r\n        this.$refs.mapBg.removeArea()\r\n        this.allWindowData=[]\r\n        if(res.data.rows.length>0) {\r\n          this.postList.forEach((val)=>{\r\n            let datas=[]\r\n            val.coordinateInfoList.forEach((each)=>{\r\n              datas.push([each.longitude,each.latitude])\r\n            })\r\n            this.drawAllDdArea([],[val.centerLongitude,val.centerLatitude],val.id,{name:val.postName,level:3,idx:2.32,center:[val.centerLongitude,val.centerLatitude]})\r\n\r\n          })\r\n        }\r\n\r\n\r\n\r\n        res.data.rows.forEach((val,indexs)=>{\r\n          if(!index) {\r\n          }\r\n          else{\r\n            this.$refs.mapBg.flyTo([val.centerLongitude,val.centerLatitude],16,0)\r\n          }\r\n          if(!this.selectedIndexVal) {\r\n            this.ssMarkers.push({\r\n              type:'schedulingStatistical',\r\n              lng: val.centerLongitude,\r\n              lat: val.centerLatitude,\r\n              id: val.id,\r\n              index: indexs,\r\n              schedulingPoliceNum: val.schedulingPoliceNum,\r\n              schedulingAssistantNum:val.schedulingAssistantNum,\r\n              schedulingSafeguardNum:val.schedulingSafeguardNum,\r\n              postName:val.postName,postProperty:val.postProperty,\r\n              postPrimaryType: val.postPrimaryType,\r\n              postSecondType:val.postSecondType,\r\n              data: val\r\n            })\r\n          }\r\n\r\n        })\r\n\r\n        if(!this.selectedIndexVal) {\r\n          this.$refs.mapBg.showMarkers(this.ssMarkers, false, false)\r\n        }else{\r\n          if(res.data.rows.length>0) {\r\n            this.$refs.mapBg.addMulInfoWindow([{\r\n              type:'schedulingStatistical1',\r\n              lng: res.data.rows[0].centerLongitude,\r\n              lat: res.data.rows[0].centerLatitude,\r\n              schedulingPoliceNum: res.data.rows[0].schedulingPoliceNum,\r\n              schedulingAssistantNum:res.data.rows[0].schedulingAssistantNum,\r\n              schedulingSafeguardNum:res.data.rows[0].schedulingSafeguardNum,\r\n              postName:res.data.rows[0].postName,postProperty:res.data.rows[0].postProperty,\r\n              postPrimaryType: res.data.rows[0].postPrimaryType,\r\n              postSecondType:res.data.rows[0].postSecondType\r\n            }], '')\r\n          }\r\n\r\n        }\r\n\r\n      })\r\n    },\r\n    drawAllWindow(center,data,type){\r\n      this.$refs.mapBg.drawAllPostWindow(center, data,type)\r\n    },\r\n    drawAllDdArea(datas,center,id,centerShow) { //绘制全部地理围栏\r\n      this.$refs.mapBg.drawArea(datas, center, id, false)\r\n    },\r\n    getPostReportInfo(){\r\n      let tomorrowDate=new Date(new Date(this.searchDate).getTime()+24*60*60*1000).format('yyyy-MM-dd')\r\n      // this.echartData = [];\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/postReportInfo`,{\r\n        postPrimaryType: 1,\r\n        tomorrowDate: tomorrowDate,\r\n        deptIds: this.searchDeptId?this.searchDeptId:null\r\n      }).then(res=>{\r\n        let getType = [];\r\n        this.postReportInfo=res.data.data\r\n        this.postReportInfo.postSecondTypeList.forEach((val)=>{\r\n          getType.push({id: parseInt(val.postSecondType),num:val.num})\r\n          let index = parseInt(val.postSecondType)-1\r\n          this.echartData[index].num=val.num\r\n        })\r\n        let getOdd =[1,2,3,4,5,6,7].filter(item=>{\r\n          return [...getType].every(x=> x.id!=item)\r\n        })\r\n        getOdd.forEach(item=>{\r\n          this.echartData[item-1].num=0\r\n        })\r\n        this.eventCategoryChart(this.echartData)\r\n      })\r\n    },\r\n    getTimeDate(val) {\r\n      return (new Date(val)).format('yyyy-MM-dd')\r\n    },\r\n    getPostRoadReportInfo(){\r\n      this.$axios.post(`/baseplatform/kmdnLocalPoliceScheduling/statistics/postRoadReportInfo`,{\r\n        deptIds: this.searchDeptId?this.searchDeptId:null,\r\n        currentDate: this.getTimeDate(this.searchDate),\r\n        currentTime:`${this.searchDate}:00`\r\n      }).then(res=>{\r\n        this.postRoadReportInfo=res.data.data\r\n      })\r\n    },\r\n    setSelectedIndex(index, valData){\r\n      // if(this.deptLevel!=this.deptFlag){\r\n      //   this.$refs.mapBg.removeArea()\r\n      // }\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      this.$refs.mapBg.removeArea()\r\n\r\n      if(this.selectedIndex==index){\r\n        this.selectedIndex=-1\r\n        this.selectedIndexVal = ''\r\n        this.showPostInfo=false\r\n        this.$refs.mapBg.removePostArea()\r\n        // this.$refs.mapBg.resetMap()\r\n        this.$refs.mapBg.showMarkers(this.ssMarkers, false, false)\r\n        return false\r\n      }\r\n      this.selectedIndexVal = valData.id\r\n      let val=this.postList[index]\r\n      this.$refs.mapBg.flyTo([val.centerLongitude,val.centerLatitude],16,0)\r\n      this.schedulesId=0\r\n      this.getPostSchedulesReportInfo(index)\r\n      this.displayPost(this.postList[index].id,this.postList[index])\r\n      this.hourSlot(this.postList[index].id)\r\n      this.showPostInfo=true\r\n      this.selectedIndex=index;\r\n\r\n\r\n    },\r\n    showDotPoint(){\r\n      let policeList=[]\r\n      this.postSchedulesReportInfo.forEach(((val,index) =>{\r\n       if(val.rangeList.length>0){\r\n         val.rangeList[this.schedulesData[index]].policeList.forEach(point=>{\r\n           if(point.recorderLongitude&&point.recorderDeviceStatus==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.recorderLongitude,\r\n               lat: point.recorderLatitude,//纬度值\r\n               id: point.recorderDetailInfoId,\r\n               pointRule: 2,\r\n               policeType: 0,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n           else if(point.interphoneLongitude&&point.interphoneOnlineFlag==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.interphoneLongitude,\r\n               lat: point.interphoneLatitude,//纬度值\r\n               id: point.interphoneDetailInfoId,\r\n               pointRule: 1,\r\n               policeType: 0,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n         })\r\n         val.rangeList[this.schedulesData[index]].assistantList.forEach(point=>{\r\n           if(point.recorderLongitude&&point.recorderDeviceStatus==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.recorderLongitude,\r\n               lat: point.recorderLatitude,//纬度值\r\n               id: point.recorderDetailInfoId,\r\n               pointRule: 2,\r\n               policeType: 1,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n           else if(point.interphoneLongitude&&point.interphoneOnlineFlag==1){\r\n             let marker = {\r\n               type: 'policeStatistical',\r\n               lng: point.interphoneLongitude,\r\n               lat: point.interphoneLatitude,//纬度值\r\n               id: point.interphoneDetailInfoId,\r\n               pointRule: 1,\r\n               policeType: 1,\r\n               policeId: point.policeId\r\n             }\r\n             // if(point.policeSn||point.policeName) {\r\n             policeList.push(marker)\r\n           }\r\n         })\r\n\r\n       }\r\n      }))\r\n      this.$refs.mapBg.hideMarkers('policeStatistical')\r\n      this.$refs.mapBg.showMarkers(policeList,false,false)\r\n    },\r\n    getPostSchedulesReportInfo(index){\r\n      if(this.postList.length===0){\r\n        return false\r\n      }\r\n      this.schedulesData = []\r\n      this.postSchedulesReportInfo = [];\r\n      this.ydLoading = true;\r\n        this.$axios.get(`/baseplatform/kmdnLocalPoliceScheduling/statistics/postSchedulesReportInfo?postId=${this.postList[index].id}&currentDate=${this.getTimeDate(this.searchDate)}&currentTime=${this.searchDate}:00`).then(res=>{\r\n          this.ydLoading = false;\r\n          this.postSchedulesReportInfo=res.data.rows;\r\n          res.data.rows.forEach((item,index)=>{\r\n            this.schedulesData.push(0)\r\n            this.activeNames.push(index+1)\r\n          })\r\n          this.showDotPoint()\r\n          return false\r\n          if(index) {\r\n            let markers= [];\r\n            // for(let i=0;i<res.data.rows.) {\r\n            //\r\n            // }\r\n\r\n\r\n\r\n            let getData= res.data.rows[this.schedulesId]\r\n\r\n            for(let i=0; i<getData.assistantList.length; i++) {\r\n              if(getData.assistantList[i].recorderId&&getData.assistantList[i].recorderDeviceStatus==1){\r\n\r\n                markers.push({\r\n                  type:'rtRecorder4g',\r\n                  lng: getData.assistantList[i].recorderLongitude,\r\n                  lat: getData.assistantList[i].recorderLatitude,//纬度值\r\n                  id: getData.assistantList[i].recorderId,\r\n                  deptName: getData.assistantList[i].deptName,\r\n                  flag:2,\r\n                  deviceId: getData.assistantList[i].recorderId,\r\n                  vehicleName: getData.assistantList[i].nickName,\r\n                  vehicleId: getData.assistantList[i].vehicleId\r\n                })\r\n              }\r\n            }\r\n            for(let i=0; i<getData.policeList.length; i++) {\r\n              if(getData.policeList[i].recorderId&&getData.policeList[i].recorderDeviceStatus==1){\r\n                markers.push({\r\n                  type:'rtRecorder4g',\r\n                  lng: getData.policeList[i].recorderLongitude,\r\n                  lat: getData.policeList[i].recorderLatitude,//纬度值\r\n                  id: getData.policeList[i].recorderId,\r\n                  deptName: getData.policeList[i].deptName,\r\n                  flag:2,\r\n                  deviceId: getData.policeList[i].recorderId,\r\n                  vehicleName: getData.assistantList[i].nickName,\r\n                  vehicleId: getData.assistantList[i].vehicleId\r\n                })\r\n              }\r\n            }\r\n            for(let i=0; i<getData.safeguardList.length; i++) {\r\n              if(getData.safeguardList[i].recorderId&&getData.safeguardList[i].recorderDeviceStatus==1){\r\n                markers.push({\r\n                  type:'rtRecorder4g',\r\n                  lng: getData.safeguardList[i].recorderLongitude,\r\n                  lat: getData.safeguardList[i].recorderLatitude,//纬度值\r\n                  id: getData.safeguardList[i].recorderId,\r\n                  deptName: getData.safeguardList[i].deptName,\r\n                  flag:2,\r\n                  deviceId: getData.safeguardList[i].recorderId,\r\n                  vehicleName: getData.assistantList[i].nickName,\r\n                  vehicleId: getData.assistantList[i].vehicleId\r\n                })\r\n              }\r\n            }\r\n            this.$refs.mapBg.showMarkers(markers, false, false)\r\n          }\r\n      })\r\n    },\r\n    returnRule(val){\r\n      let res=''\r\n      if(val.indexOf(1)>-1||val.indexOf(\"1\")>-1){\r\n        res+='工作日'\r\n      }\r\n      if(val.indexOf(2)>-1||val.indexOf(\"2\")>-1){\r\n        if(res.length>0){\r\n          res+=','\r\n        }\r\n        res+='双休'\r\n      }\r\n      if(val.indexOf(4)>-1||val.indexOf(\"4\")>-1){\r\n        if(res.length>0){\r\n          res+=','\r\n        }\r\n        res+='节假日'\r\n      }\r\n      return res\r\n    },\r\n    changeType(val) {\r\n      this.postManagerMini = this.postManager[val-1].children\r\n    },\r\n    changeTypeSearch(val) {\r\n      this.postManagerMiniS=[]\r\n      this.searchData.postSecondType=''\r\n      if(this.postManager[val-1]){\r\n        this.postManagerMiniS = this.postManager[val-1].children\r\n      }\r\n    },\r\n    clearSeach() {\r\n      this.postManagerMiniS = [];\r\n      this.searchData.postSecondType = ''\r\n      this.changeSearchDate(1,2)\r\n    },\r\n    getSelectType(){\r\n      let _this=this\r\n      this.$axios.get(`/baseplatform/system/dict/data/type/serviceType`).then(function(res) {\r\n        if (res.data.code === 200 && res.status === 200){\r\n          _this.serviceTypeList = res.data.data\r\n        }\r\n      })\r\n      this.$axios.get(`/baseplatform/system/dict/data/type/postPrimaryType`).then(function(res) {\r\n        if (res.data.code === 200 && res.status === 200){\r\n          _this.postPrimaryTypeList = res.data.data\r\n        }\r\n      })\r\n      this.$axios.get(`/baseplatform/system/dict/data/type/postSecondType`).then(function(res) {\r\n        if (res.data.code === 200 && res.status === 200){\r\n          _this.postSecondTypeList = res.data.data\r\n        }\r\n      })\r\n      this.$axios.get(`/baseplatform/kmdnLocalPostAreaInfo/list`).then(res=>{\r\n        _this.policeDistrictList = [];\r\n        res.data.rows.forEach(item=>{\r\n          _this.policeDistrictList.push({\r\n            name:item.policeArea,\r\n            man: item.principal,\r\n            tel: item.principalTel,\r\n            state: item.state==0?false:true,\r\n            id: item.id\r\n          })\r\n        })\r\n      })\r\n    },\r\n    getDot(val) {\r\n      this.selectedIndexVal = val.id\r\n      this.selectedIndex = val.index\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      this.displayPost(val.id, val.data)\r\n      this.showPostInfo=true\r\n      this.getPostSchedulesReportInfo(this.selectedIndex)\r\n      // setTimeout(()=>{\r\n      //   document.getElementById('selected').scrollIntoView();\r\n      // },100)\r\n    },\r\n    displayPost(id,val){\r\n      let _this=this\r\n      this.$axios.get(`/baseplatform/kmdnLocalPostInfo/${id}`)\r\n        .then(res=>{\r\n          if(res.data.code===200){\r\n            _this.formData=res.data.data\r\n            _this.formData.postPrimaryType=parseInt(_this.formData.postPrimaryType)\r\n            _this.formData.postProperty=parseInt(_this.formData.postProperty)\r\n            _this.formData.postSecondType=parseInt(_this.formData.postSecondType)\r\n            _this.formData.serviceType=_this.formData.serviceType\r\n            _this.formData.policeAreaId=parseInt(_this.formData.policeAreaId)\r\n            _this.changeType(parseInt(_this.formData.postPrimaryType))\r\n            _this.formData.scheduleInfoList.forEach((val,index)=>{\r\n              val.rangeList.forEach((ite,is)=>{\r\n                if(is==0) {\r\n                  val['time'] =[];\r\n                }\r\n                val['time'].push([ite.startTime,ite.endTime]);\r\n              })\r\n              if(val.rangeList.length<=0){\r\n                val['time'] = []\r\n              }\r\n              if(val['executeFlag']==1||val['executeFlag']==2||val['executeFlag']==4){\r\n                val['executeFlag']=[val['executeFlag']]\r\n              }else if(val['executeFlag']==3){\r\n                val['executeFlag']=['1','2']\r\n              }else if(val['executeFlag']==5){\r\n                val['executeFlag']=['1','4']\r\n              }else if(val['executeFlag']==6){\r\n                val['executeFlag']=['2','4']\r\n              }else if(val['executeFlag']==7){\r\n                val['executeFlag']=['1','2','4']\r\n              }\r\n\r\n            })\r\n            let datas=[]\r\n            _this.formData.coordinateInfoList.forEach((val)=>{\r\n              datas.push([val.longitude,val.latitude])\r\n            })\r\n\r\n            console.log('====val', val.id)\r\n              _this.drawAllDdArea([{geo:datas}],[res.data.data.centerLongitude,res.data.data.centerLatitude],val.id,{name:res.data.data.postName,level:3,idx:2.32,center:[res.data.data.centerLongitude,res.data.data.centerLatitude]})\r\n\r\n             // this.postInfoList('', id,1)\r\n          }\r\n        })\r\n    },\r\n    getZoom(zoom){\r\n      if(zoom<13||this.selectedIndex!=-1){\r\n        this.isDrawingAll=false\r\n        this.$refs.mapBg.removeAreaAll()\r\n      }else{\r\n        //this.searchDeptLevel==3&&\r\n        if(!this.isDrawingAll){\r\n          this.isDrawingAll=true\r\n          // this.allWindowData.forEach((val)=>{\r\n          //   this.$refs.mapBg.drawAllPostWindow(...val)\r\n          // })\r\n        }\r\n      }\r\n    },\r\n    getShowAreaId(id){\r\n      this.showAreaId=id\r\n    },\r\n    showAreaWindow(){\r\n      this.getDdflId(this.showAreaId)\r\n    },\r\n    getDdflId(id){\r\n      let index =-1\r\n      this.postList.forEach((val,inx)=>{\r\n        if(val.id==id){\r\n          index=inx\r\n        }\r\n      })\r\n      this.schedulesId=0\r\n      this.getPostSchedulesReportInfo(index)\r\n      this.displayPost(this.postList[index].id)\r\n      this.showPostInfo=true\r\n      this.selectedIndex=index\r\n      this.showPostInfoWindow=true\r\n    },\r\n    changeNow() {\r\n      this.searchDate=(new Date()).format('yyyy-MM-dd hh:mm')\r\n      this.changeSearchDate()\r\n    },\r\n    changeSearchDate(indeVal, indexVal2){\r\n      if(indexVal2) {\r\n       this.changeTypeSearch(this.searchData.postPrimaryType)\r\n      }\r\n      this.activeNames=[]\r\n      for(let i=0;i<this.postSchedulesReportInfo.length;i++){\r\n        this.activeNames.push(i+1)\r\n      }\r\n      this.$refs.mapBg.removePostArea()\r\n      this.$refs.mapBg.removeAreaAll()\r\n      this.$refs.mapBg.removeArea()\r\n      this.$refs.mapBg.resetMap()\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical')\r\n      this.$refs.mapBg.hideMarkers('schedulingStatistical1')\r\n      this.$refs.mapBg.hideMarkers('mulInfoWindow')\r\n      // this.listStati()\r\n      this.getPostReportInfo()\r\n      this.getPostRoadReportInfo()\r\n\r\n      if(indeVal==1) {\r\n        this.selectedIndexVal=''\r\n        this.selectedIndex = -1;\r\n        this.showPostInfo=false\r\n      }\r\n\r\n      let id = this.selectedIndex>-1?this.postList[this.selectedIndex].id:''\r\n      // if(this.selectedIndexVal) {\r\n      if(this.selectedIndex>-1){\r\n        this.getPostSchedulesReportInfo(this.selectedIndex)\r\n      }\r\n      this.postInfoList(this.searchDeptId,'')\r\n\r\n\r\n      if(indeVal!=1) {\r\n        let h = []\r\n        let choseIndex =-1\r\n        this.postList.forEach((item,index)=>{\r\n          if(item.id == this.selectedIndexVal) {\r\n            choseIndex = index\r\n          }\r\n          h.push(item.id)\r\n        })\r\n        if(h.includes(this.selectedIndexVal)) {\r\n          this.postInfoList('', id,choseIndex)\r\n          this.displayPost(this.postList[choseIndex].id,this.postList[choseIndex])\r\n        }else if(this.selectedIndex!=-1){\r\n          this.$refs.mapBg.removePostArea()\r\n          this.$refs.mapBg.removeAreaAll()\r\n          this.$refs.mapBg.removeArea()\r\n          this.selectedIndex=-1\r\n          this.selectedIndexVal = ''\r\n          this.showPostInfo=false\r\n          this.$refs.mapBg.removePostArea()\r\n          this.$refs.mapBg.resetMap()\r\n        }\r\n      }\r\n    },\r\n  },\r\n  watch: {\r\n    showPostInfo(){\r\n      if(!this.showPostInfo){\r\n        this.$refs.mapBg.hideMarkers('policeStatistical')\r\n      }\r\n    }\r\n  }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.contentTitle{\r\n  position: relative;\r\n  span{\r\n    position: absolute;\r\n    color: #ccc;\r\n    right: 10px;\r\n    top: 2px;\r\n    font-size: 14px;\r\n    display: inline-block;\r\n    cursor: pointer;\r\n    &:hover{\r\n      color: #29B3FF;\r\n    }\r\n  }\r\n}\r\n.mcImg{\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  width: 100%;\r\n  height: 100%;\r\n  background: rgba(0,0,0,0.4);\r\n  z-index: 9999;\r\n  .mcImgDiv{\r\n    background-image: url(\"../../assets/image/组 16283.png\");\r\n    background-size: 100% 100%;\r\n    position: absolute;\r\n    width: 750px;\r\n    height: 400px;\r\n    background-repeat: no-repeat;\r\n    left: 50%;\r\n    top: 50%;\r\n    transform: translate(-50%,-50%);\r\n    h1{\r\n      color: #29B3FF;\r\n      text-align: center;\r\n      font-size: 16px;\r\n      position: relative;\r\n      img{\r\n        position: absolute;\r\n        right: 10px;\r\n        cursor: pointer;\r\n      }\r\n    }\r\n    .mcImgDivCon{\r\n      padding: 30px 50px;\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      &>div{\r\n        display: flex;\r\n        color: #fff;\r\n        align-items: center;\r\n        margin-bottom: 10px;\r\n        width: 50%;\r\n        img{\r\n          width: 34px;\r\n          margin-right: 10px;\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n.postClass{\r\n  /deep/ .el-loading-mask{\r\n    background-color: rgba(0,0,0,0.4)!important;\r\n  }\r\n  .tr,.td{\r\n    float: none!important;\r\n  }\r\n}\r\n.nowClass{\r\n height: 33px;\r\n  color: #fff;\r\n  line-height: 33px;\r\n  text-align: center;\r\n  font-size: 14px;\r\n  width: 60px;\r\n  margin-left: 10px;\r\n  background-image: url(\"../../assets/map_image/confirmBg.png\");\r\n  background-size: 100% 100%;\r\n  position: absolute;\r\n  right: -80px;\r\n  cursor: pointer;\r\n}\r\n.topClass{\r\n  position: fixed;\r\n  top: 72px;\r\n  right: 80px;\r\n  height: 26px!important;\r\n  line-height: 26px!important;\r\n  font-size: 12px!important;\r\n  background-image: url(\"../../assets/map_image/confirmBg.png\");\r\n  background-size: 100% 100%;\r\n  background-repeat: no-repeat;\r\n  width: 84px;\r\n  color: #fff;\r\n  text-align: center;\r\n  cursor: pointer;\r\n  margin-right: 20px;\r\n}\r\n.rightView{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 536px;\r\n  right: 40px;\r\n  top: 128px;\r\n  background-image: url(\"../../assets/statisticalImage/pointBg.png\");\r\n  /deep/ .el-loading-spinner .el-loading-text{\r\n    font-size: 16px!important;\r\n  }\r\n  /deep/ .el-loading-spinner{\r\n    font-size: 24px!important;\r\n  }\r\n}\r\n.rightViewPost{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 266px;\r\n  right: 40px;\r\n  top: 128px;\r\n  background-image: url(\"../../assets/statisticalImage/postInfo.png\");\r\n  .topContainer{\r\n    width: 100%;\r\n    height: 70px;\r\n    margin-top: 50px;\r\n    display: flex;\r\n    .each{\r\n      width: 33%;\r\n      height: 100%;\r\n      text-align: center;\r\n      position: relative;\r\n      .num{\r\n        font-size: 24px;\r\n        font-weight: bold;\r\n        color: #29B3ff;\r\n      }\r\n      .bg{\r\n        width: 94px;\r\n        height: 42px;\r\n        background-image: url(\"../../assets/statisticalImage/bg.png\");\r\n        position: absolute;\r\n        top: 21px;\r\n        left: 24px;\r\n      }\r\n      .title{\r\n        font-size: 14px;\r\n        color: white;\r\n        margin-top: 20px;\r\n      }\r\n    }\r\n  }\r\n  .ringContainer{\r\n    width: 100%;\r\n    height: 130px;\r\n    margin-top: 10px;\r\n  }\r\n}\r\n.rightViewPolice{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 266px;\r\n  right: 40px;\r\n  top: 400px;\r\n  background-image: url(\"../../assets/statisticalImage/policeInfo.png\");\r\n  .topContainer{\r\n    width: 100%;\r\n    height: 78px;\r\n    margin-top: 45px;\r\n    display: flex;\r\n    .each{\r\n      width: 126px;\r\n      margin-left: 8px;\r\n      height: 100%;\r\n      text-align: center;\r\n      position: relative;\r\n      border-left: 3px solid #29B3ff;\r\n      padding-top: 5px;\r\n      .num{\r\n        color: #29B3ff;\r\n        font-size: 20px;\r\n        font-weight: bold;\r\n      }\r\n      .bg{\r\n        width: 126px;\r\n        height: 78px;\r\n        background: linear-gradient(360deg,rgba(41,179,255,0) 0%,#29b3ff 100%);\r\n        opacity: 0.2;\r\n        position: absolute;\r\n        top: 0;\r\n      }\r\n      .title{\r\n        color: white;\r\n        font-size: 14px;\r\n        font-weight: 400;\r\n        margin-top: 5px;\r\n      }\r\n    }\r\n  }\r\n  .rateContainer{\r\n    width: 100%;\r\n    height: 130px;\r\n    margin-top: 30px;\r\n    display: flex;\r\n    .each{\r\n      width: 153px;\r\n      height: 80px;\r\n      margin-left: 40px;\r\n      position: relative;\r\n      text-align: center;\r\n      .num{\r\n        font-size: 24px;\r\n        font-weight: bold;\r\n        color: white;\r\n        position: absolute;\r\n        z-index: 10;\r\n        width: 100%;\r\n        display: flex;\r\n        justify-content: center;\r\n        top: 6px;\r\n      }\r\n      .bg{\r\n        width: 153px;\r\n        height: 72px;\r\n        background: url(\"../../assets/statisticalImage/rateBg.png\");\r\n        position: absolute;\r\n        top: 0;\r\n        z-index: 1;\r\n      }\r\n      .title{\r\n        font-size: 14px;\r\n        color: white;\r\n        font-weight: 400;\r\n        position: absolute;\r\n        width: 100%;\r\n        display: flex;\r\n        justify-content: center;\r\n        top: 80px;\r\n      }\r\n    }\r\n  }\r\n}\r\n.roadInfo{\r\n  position: fixed;\r\n  z-index: 20;\r\n  width: 426px;\r\n  height: 266px;\r\n  right: 40px;\r\n  top: 662px;\r\n  background-size: 100% 100%;\r\n  background-image: url(\"../../assets/statisticalImage/policeInfo.png\");\r\n  .roadInfoDiv{\r\n    height: 230px;\r\n    padding: 10px;\r\n    /deep/ .el-loading-text{\r\n      font-size: 16px!important;\r\n    }\r\n    /deep/ .el-loading-spinner{\r\n      font-size: 26px!important;\r\n    }\r\n    .thead{\r\n      background: rgba(41, 179, 255, 0.4);\r\n      float: none;\r\n    }\r\n    .tr{\r\n      float: none;\r\n      background: rgba(41, 179, 255, 0.3);\r\n    }\r\n    .tr:nth-child(odd){\r\n      background: rgba(41, 179, 255, 0.16);\r\n    }\r\n    .tr,.thead{\r\n      display: flex;\r\n    }\r\n    .th{\r\n      line-height: 32px;\r\n      color: #fff;\r\n      font-size: 12px;\r\n      text-align: center;\r\n    }\r\n    .th1,.th2{\r\n      width: 30%;\r\n    }\r\n    .th3{\r\n      flex: 1;\r\n    }\r\n  }\r\n}\r\n.pointView{\r\n  position: relative;\r\n  /*position: fixed;*/\r\n  z-index: 20;\r\n  overflow: hidden;\r\n  //width: 426px;\r\n  width: 480px;\r\n  height: 774px;\r\n  left: 40px;\r\n  top: 30px;\r\n  /*top: 128px;*/\r\n  background-size: 100% 100%;\r\n  background-image: url(\"../../assets/map_image/ponding/pointBg.png\");\r\n  .searchView{\r\n    margin-top: 15px;\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    padding: 0 10px;\r\n    &>div{\r\n      display: flex;\r\n      width: 50%;\r\n    }\r\n    .inputView{\r\n      border: 1px solid rgba(41,179,255,0.6);\r\n      font-size: 14px;\r\n      margin-left: 10px;\r\n      /*border-right: 0px;*/\r\n      float: none;\r\n\r\n    }\r\n    .searchIcon{\r\n      background-image: url(\"../../assets/image/组 16037@2x.png\");\r\n      background-size: 14px;\r\n      background-repeat: no-repeat;\r\n      background-position: center;\r\n      width: 34px;\r\n      height: 33px;\r\n      background-color: #29B3FF;\r\n      border-radius: 0px 3px 3px 0px;\r\n      margin-left: -1px;\r\n    }\r\n  }\r\n\r\n  .leftContainer{\r\n    width: 100%;\r\n    height: 672px;\r\n    //height: 630px;\r\n    display: flex;\r\n    padding-left: 10px;\r\n    //padding-top: 10px;\r\n    .tree{\r\n      width: 146px;\r\n      height: 100%;\r\n      margin-top: 10px;\r\n      background-color: rgba(41,179,255,0.15);\r\n    }\r\n    .post{\r\n      //width: 260px;\r\n      flex: 1;\r\n      padding-right: 10px;\r\n      height: 100%\r\n    }\r\n  }\r\n  .workRankView .faultTable {\r\n    width: 100%;\r\n    height: 100%;\r\n    margin-left: 0px;\r\n    margin-top: 10px;\r\n  }\r\n  .diplayFlex{\r\n    display: flex;\r\n    position: relative;\r\n    p{\r\n      margin: 0;\r\n      padding: 0;\r\n    }\r\n    .diplayFlexI{\r\n      position: relative;\r\n      right: 0;\r\n      top: -1px;\r\n\r\n      p{\r\n        width: 20px;\r\n        height: 14px;\r\n        font-size: 12px;\r\n      }\r\n      p:last-of-type{\r\n        margin-top: -8px;\r\n      }\r\n    }\r\n  }\r\n  .redIcon{\r\n    display: inline-block;\r\n    width: 7px;\r\n    height: 7px;\r\n    margin-right: 5px;\r\n    border-radius: 50%;\r\n    background: #de1038;\r\n  }\r\n  .active {\r\n    background: #3DBAFF;\r\n  }\r\n}\r\n.eventCateChart{\r\n  width: 122px;\r\n  height: 122px;\r\n  background-image: url(\"../../assets/map_image/policeSituation/ringCenter.png\");\r\n  position: absolute;\r\n  left: 152px;\r\n  top: 123px;\r\n}\r\n.ringContainer{\r\n  width: 122px;\r\n  height: 154px;\r\n  float: left;\r\n  margin-top: 18px;\r\n  background-image: url(\"../../assets/map_image/policeSituation/ringBottom.png\");\r\n  background-repeat: no-repeat;\r\n  background-position: bottom center;\r\n}\r\n.eventCateLeft{\r\n  float: left;\r\n  width: 140px;\r\n  height: 90px;\r\n  margin-top: 18px;\r\n  background-image: url(\"../../assets/statisticalImage/ringLeft.png\");\r\n  background-size: 100% 100%;\r\n  -webkit-box-sizing: border-box;\r\n  -moz-box-sizing: border-box;\r\n  box-sizing: border-box;\r\n  padding-top: 8px;\r\n  padding-left: 5px;\r\n  display: grid;\r\n  position: relative;\r\n  left: 30px;\r\n}\r\n.eventCateRight{\r\n  float: left;\r\n  width: 140px;\r\n  height: 90px;\r\n  margin-top: 18px;\r\n  background-image: url(\"../../assets/statisticalImage/ringRight.png\");\r\n  -webkit-box-sizing: border-box;\r\n  -moz-box-sizing: border-box;\r\n  box-sizing: border-box;\r\n  padding-top: 8px;\r\n  padding-left: 0px;\r\n  display: grid;\r\n  position: relative;\r\n  left: 135px;\r\n}\r\n.eventBlock{\r\n  width: 11px;\r\n  height: 9px;\r\n  float: left;\r\n  margin-top: 2.5px;\r\n  margin-right: 8px;\r\n}\r\n.eventCateBar{\r\n  width: 100%;\r\n  height: 14px;\r\n  float: left;\r\n  font-size: 14px;\r\n  color: white;\r\n  line-height: 14px;\r\n}\r\n.fault24hChart{\r\n  width: 400px;\r\n  height: 230px;\r\n  margin-left: 10px;\r\n  margin-top: 13px;\r\n}\r\n.serviceNotice{\r\n  font-size: 14px;\r\n  color: #29B3ff;\r\n  position: relative;\r\n  margin: 10px 0 0 16px;\r\n  img{\r\n    width: 8px;\r\n    height: 12px;\r\n  }\r\n}\r\n.eachRows{\r\n  width: 33.33%;\r\n  height: 100%;\r\n  font-size: 14px;\r\n  color: white;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n}\r\n.dateContainer{\r\n  //width: 155px;\r\n  position: relative;\r\n  width: 210px;\r\n  height: 48px;\r\n  background-size: 100% 100%;\r\n  background-image: url(\"../../assets/statisticalImage/dateBg.png\");\r\n  position: absolute;\r\n  top: 130px;\r\n  left: 550px;\r\n  display: flex;\r\n  justify-content: center;\r\n  align-items: center;\r\n}\r\n.postInfo{\r\n  width: 617px;\r\n  height: 455px;\r\n  background-image: url(\"../../assets/statisticalImage/postInfoBg.png\");\r\n  position: absolute;\r\n  z-index: 999999;\r\n  left: 651px;\r\n  top: 251px;\r\n  .title{\r\n    width: 100%;\r\n    height: 40px;\r\n    color: #29B3ff;\r\n    font-size: 16px;\r\n    font-weight: bold;\r\n    display: flex;\r\n    align-items: center;\r\n    margin-left: 20px;\r\n  }\r\n  .closeButton {\r\n    width: 20px;\r\n    height: 20px;\r\n    background-image: url(\"../../assets/map_image/ejectCloseButton.png\");\r\n    background-size: 100%;\r\n    background-position: center;\r\n    background-repeat: no-repeat;\r\n    position: absolute;\r\n    right: 15px;\r\n    top: 10px;\r\n    cursor: pointer;\r\n  }\r\n  .postDetail{\r\n    width: 100%;\r\n    height: 35px;\r\n    display: flex;\r\n    margin-left: 10px;\r\n    .title{\r\n      width: 80px;\r\n      height: 100%;\r\n      color: rgba(255,255,255,0.7);\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: flex-end\r\n    }\r\n    .content{\r\n      width: 450px;\r\n      height: 100%;\r\n      color: white;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: flex-start\r\n    }\r\n  }\r\n  .faultTablePost {\r\n    float: left;\r\n    margin-left: 19px;\r\n    margin-top: 10px;\r\n    height: 130px;\r\n    width: 580px;\r\n    overflow: hidden;\r\n    color: white;\r\n    line-height: 32px;\r\n    font-size: 14px;\r\n  }\r\n  /deep/.el-select .el-input.is-disabled .el-input__inner{\r\n    background-color: transparent;\r\n    cursor: default;\r\n  }\r\n  /deep/.el-select .el-input.is-disabled .el-input__suffix{\r\n    display: none;\r\n  }\r\n}\r\n\r\n.thead1{\r\n  display: flex;\r\n  &>div{\r\n    text-align: center;\r\n  }\r\n  .td11{\r\n    width: 45%;\r\n    //width: 170px;\r\n  }\r\n  .td12{\r\n    width: 33%;\r\n  }\r\n  .td13{\r\n    width: 24%;\r\n  }\r\n}\r\n.schedulingContainer1{\r\n  border-top: none!important;\r\n  border-bottom: 1px solid rgba(41,179,255,0.5)!important;\r\n  /deep/ .el-collapse-item__wrap{\r\n    background-color: transparent;\r\n    border: none;\r\n  }\r\n  /deep/ .el-collapse-item__header{\r\n    background-color: rgba(41,179,255,0.5);\r\n    color: white;\r\n    height: 40px;\r\n    border-bottom: 1px solid rgba(41,179,255,0.6);\r\n    //line-height: 50px;\r\n    font-size: 14px;\r\n    padding-left: 20px;\r\n  }\r\n}\r\n  .miaodianDiv{\r\n    color: #00a0e9;\r\n    height: 32px;\r\n    width: 32px;\r\n    border: 1px solid #00a0e9;\r\n    border-radius: 3px;\r\n    margin-left: 10px;\r\n    display: flex;\r\n    justify-content: center;\r\n    align-items: center;\r\n    font-size: 20px;\r\n    cursor: pointer;\r\n  }\r\n  .miaodianDivActives{\r\n    color: #fff;\r\n    background: #00a0e9;\r\n  }\r\n  .searchBtnDiv{\r\n    color: #0c85c7;\r\n\r\n  }\r\n</style>\r\n\n\n---\nD:/nzy/workspace_git/Baseplatform-Ui-V3/src/views/serviceManage/schedulingStatistical.vue:\n<template>\n  <bg-and-info title-menu=\"勤务管理\" title-name=\"勤务统计\" step-url=\"/frontend/schedulingStatistical\" bg-size=\"1920\">\n    <div class=\"scheduling-page\">\n      <!-- 地图背景 -->\n      <div class=\"map-bg\">\n        <MapContainer\n          map-id=\"schedulingMap\"\n          :map-zoom=\"13\"\n          :map-height=\"960\"\n          :map-width=\"1920\"\n          map-style=\"mapabc-wd\"\n          :drag-rotate=\"false\"\n        />\n      </div>\n\n      <!-- 左侧岗位列表面板 -->\n      <div class=\"point-view\">\n        <div class=\"content-title\">\n          <span>岗位列表</span>\n          <span class=\"icon-desc\" @click=\"showIconDesc = true\">图标说明</span>\n        </div>\n\n        <!-- 搜索栏 -->\n        <div class=\"search-bar\">\n          <div class=\"search-left\">\n            <select v-model=\"searchData.postPrimaryType\" class=\"mini-select\" style=\"width: 90px\" @change=\"onPostTypeChange\">\n              <option value=\"\">全部</option>\n              <option v-for=\"item in postManager\" :key=\"item.id\" :value=\"item.id\">{{ item.name }}</option>\n            </select>\n            <select\n              v-if=\"searchData.postPrimaryType && searchData.postPrimaryType !== 5\"\n              v-model=\"searchData.postSecondType\"\n              class=\"mini-select\"\n              style=\"width: 110px; margin-left: 8px\"\n            >\n              <option value=\"\">全部</option>\n              <option v-for=\"item in postManagerMini\" :key=\"item.id\" :value=\"item.id\">{{ item.name }}</option>\n            </select>\n          </div>\n          <div class=\"search-right\">\n            <input\n              v-model=\"searchData.searchPostName\"\n              class=\"search-input\"\n              placeholder=\"输入关键字搜索\"\n              @keyup.enter=\"onSearch\"\n            />\n            <span class=\"locate-btn\" :class=\"{ active: isDotPrint }\" @click=\"onDotPrint\">\n              <i class=\"locate-icon\"></i>\n            </span>\n            <span class=\"search-btn\" @click=\"onSearch\">查询</span>\n          </div>\n        </div>\n\n        <!-- 部门树 + 岗位列表 -->\n        <div class=\"left-container\">\n          <!-- 部门树 -->\n          <div class=\"tree-panel\">\n            <a-tree\n              v-model:checkedKeys=\"checkedKeys\"\n              :tree-data=\"treeData\"\n              :field-names=\"{ title: 'label', key: 'id', children: 'children' }\"\n              checkable\n              :check-strictly=\"true\"\n              :default-expanded-keys=\"['100']\"\n              @check=\"onTreeCheck\"\n              @select=\"onTreeSelect\"\n              class=\"dept-tree\"\n            >\n              <template #title=\"node\">\n                <span :class=\"`dept-level-${node.deptLevel}`\">{{ node.label }}</span>\n              </template>\n            </a-tree>\n          </div>\n\n          <!-- 岗位列表 -->\n          <div class=\"post-panel\">\n            <div class=\"post-table-head\">\n              <div class=\"pth pth-name\" style=\"text-align: left; padding-left: 10px\">岗位名称</div>\n              <div class=\"pth pth-force\" style=\"text-align: left; padding-left: 10px\">警力部署</div>\n              <div class=\"pth pth-index\">指数</div>\n              <div class=\"pth pth-type\">类型</div>\n            </div>\n            <div class=\"post-table-body\">\n              <div\n                v-for=\"(item, idx) in filteredPostList\"\n                :key=\"item.id\"\n                class=\"post-row\"\n                :class=\"{ active: selectedPostId === item.id }\"\n                @click=\"onSelectPost(item)\"\n              >\n                <div class=\"ptd ptd-name\">\n                  <a-tooltip :title=\"item.postName\" placement=\"topLeft\">\n                    <span class=\"text-ellipsis\">{{ item.postName }}</span>\n                  </a-tooltip>\n                </div>\n                <div class=\"ptd ptd-force\">\n                  <template v-if=\"item.schedulingPoliceNum + item.schedulingAssistantNum + item.schedulingSafeguardNum > 0\">\n                    <span class=\"num-police\">{{ item.schedulingPoliceNum }}</span>\n                    <span class=\"num-sep\">/</span>\n                    <span class=\"num-assistant\">{{ item.schedulingAssistantNum }}</span>\n                    <span class=\"num-sep\">/</span>\n                    <span class=\"num-safeguard\">{{ item.schedulingSafeguardNum }}</span>\n                  </template>\n                  <span v-else class=\"num-dash\">--</span>\n                </div>\n                <div class=\"ptd ptd-index\">\n                  <span v-if=\"item.delayIndex\" class=\"red-dot\"></span>\n                  {{ item.delayIndex ? item.delayIndex.toFixed(2) : '--' }}\n                </div>\n                <div class=\"ptd pth-type\">{{ getPostTypeName(item.postPrimaryType, item.postSecondType) }}</div>\n              </div>\n              <div v-if=\"filteredPostList.length === 0\" class=\"no-data\">暂无数据</div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 右上：出勤情况 / 路勤统计 -->\n      <div class=\"right-top-panel\">\n        <!-- 模式切换 -->\n        <div class=\"mode-tabs\">\n          <div class=\"mode-tab\" :class=\"{ active: showPostInfo }\" @click=\"showPostInfo = true\">出勤情况</div>\n          <div class=\"mode-tab\" :class=\"{ active: !showPostInfo }\" @click=\"showPostInfo = false\">路勤统计</div>\n        </div>\n\n        <!-- 出勤情况 -->\n        <div v-show=\"showPostInfo\" class=\"attendance-panel\">\n          <div class=\"panel-scroll\">\n            <a-collapse v-model:activeKey=\"activeScheduleKeys\" class=\"sched-collapse\" :bordered=\"false\">\n              <a-collapse-item v-for=\"(item, idx) in postSchedulesReportInfo\" :key=\"idx + 1\" :label=\"renderSchedTitle(item, idx)\">\n                <div class=\"sched-detail\">\n                  <!-- 班次切换 -->\n                  <div class=\"sched-switcher\">\n                    <a-radio-group :value=\"schedulesData[idx]\" @change=\"(e: any) => onSchedChange(idx, e.target.value)\">\n                      <a-radio v-for=\"(sched, si) in item.rangeList\" :key=\"si\" :value=\"si\">\n                        {{ sched.startTime }}~{{ sched.endTime }}\n                      </a-radio>\n                    </a-radio-group>\n                  </div>\n                  <!-- 民警 -->\n                  <div v-if=\"item.rangeList[schedulesData[idx]].policeList.length > 0\" class=\"person-group\">\n                    <div class=\"group-title\">\n                      <span class=\"group-icon\"></span>\n                      民警（{{ item.rangeList[schedulesData[idx]].policeList.length }}人）\n                    </div>\n                    <div class=\"person-list\">\n                      <div v-for=\"(p, pi) in item.rangeList[schedulesData[idx]].policeList\" :key=\"'pol'+pi\" class=\"person-row\">\n                        <div class=\"p-name\">{{ p.nickName }}</div>\n                        <div class=\"p-status\" :style=\"{ color: getOndutyColor(p.ondutyFlag)[0] }\">\n                          <a-tooltip :title=\"getOndutyColor(p.ondutyFlag)[1]\">\n                            {{ getOndutyColor(p.ondutyFlag)[1] }}\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-device\">\n                          <template v-if=\"p.recorderId\">\n                            <a-tooltip :title=\"getRecorderColor(p.recorderShowOndutyFlag)[0]\">\n                              <span :style=\"{ color: getRecorderColor(p.recorderShowOndutyFlag)[1] }\">4G</span>\n                            </a-tooltip>\n                          </template>\n                        </div>\n                        <div class=\"p-device\">\n                          <a-tooltip :title=\"getIntercomColor(p.interphoneShowOndutyFlag)[0]\">\n                            <span :style=\"{ color: getIntercomColor(p.interphoneShowOndutyFlag)[1] }\">对讲机</span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signInFlag, 1, p.signInTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signInFlag, 1, p.signInTime)[0] }\">\n                              {{ getSignText(p.signInFlag, 1, p.signInTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signOutFlag, 2, p.signOutTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signOutFlag, 2, p.signOutTime)[0] }\">\n                              {{ getSignText(p.signOutFlag, 2, p.signOutTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <!-- 辅警 -->\n                  <div v-if=\"item.rangeList[schedulesData[idx]].assistantList.length > 0\" class=\"person-group\">\n                    <div class=\"group-title\">\n                      <span class=\"group-icon\"></span>\n                      辅警（{{ item.rangeList[schedulesData[idx]].assistantList.length }}人）\n                    </div>\n                    <div class=\"person-list\">\n                      <div v-for=\"(p, pi) in item.rangeList[schedulesData[idx]].assistantList\" :key=\"'aux'+pi\" class=\"person-row\">\n                        <div class=\"p-name\">{{ p.nickName }}</div>\n                        <div class=\"p-device\">\n                          <template v-if=\"p.recorderId\">\n                            <a-tooltip :title=\"getRecorderColor(p.recorderShowOndutyFlag)[0]\">\n                              <span :style=\"{ color: getRecorderColor(p.recorderShowOndutyFlag)[1] }\">4G</span>\n                            </a-tooltip>\n                          </template>\n                        </div>\n                        <div class=\"p-device\">\n                          <a-tooltip :title=\"getIntercomColor(p.interphoneOnlineFlag)[0]\">\n                            <span :style=\"{ color: getIntercomColor(p.interphoneOnlineFlag)[1] }\">对讲机</span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signInFlag, 1, p.signInTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signInFlag, 1, p.signInTime)[0] }\">\n                              {{ getSignText(p.signInFlag, 1, p.signInTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signOutFlag, 2, p.signOutTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signOutFlag, 2, p.signOutTime)[0] }\">\n                              {{ getSignText(p.signOutFlag, 2, p.signOutTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                  <!-- 保通员 -->\n                  <div v-if=\"item.rangeList[schedulesData[idx]].safeguardList.length > 0\" class=\"person-group\">\n                    <div class=\"group-title\">\n                      <span class=\"group-icon\"></span>\n                      保通员（{{ item.rangeList[schedulesData[idx]].safeguardList.length }}人）\n                    </div>\n                    <div class=\"person-list\">\n                      <div v-for=\"(p, pi) in item.rangeList[schedulesData[idx]].safeguardList\" :key=\"'saf'+pi\" class=\"person-row\">\n                        <div class=\"p-name\">{{ p.nickName }}</div>\n                        <div class=\"p-device\" style=\"width: 30px\"></div>\n                        <div class=\"p-device\">\n                          <a-tooltip :title=\"getIntercomColor(p.interphoneShowOndutyFlag)[0]\">\n                            <span :style=\"{ color: getIntercomColor(p.interphoneShowOndutyFlag)[1] }\">对讲机</span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signInFlag, 1, p.signInTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signInFlag, 1, p.signInTime)[0] }\">\n                              {{ getSignText(p.signInFlag, 1, p.signInTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                        <div class=\"p-sign\">\n                          <a-tooltip :title=\"getSignText(p.signOutFlag, 2, p.signOutTime)[2]\">\n                            <span :style=\"{ color: getSignText(p.signOutFlag, 2, p.signOutTime)[0] }\">\n                              {{ getSignText(p.signOutFlag, 2, p.signOutTime)[1] }}\n                            </span>\n                          </a-tooltip>\n                        </div>\n                      </div>\n                    </div>\n                  </div>\n                </div>\n              </a-collapse-item>\n            </a-collapse>\n          </div>\n        </div>\n\n        <!-- 路勤统计 -->\n        <div v-show=\"!showPostInfo\" class=\"road-stat-panel\">\n          <!-- 路勤岗位 -->\n          <div class=\"stat-block\">\n            <div class=\"stat-title\">路勤岗位</div>\n            <div class=\"stat-cards-3\">\n              <div class=\"stat-card\">\n                <div class=\"sc-num\">{{ postReportInfo.totalNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">总岗位数</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #ffe478\">{{ postReportInfo.keyNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">重点岗位</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #e13c14\">{{ postReportInfo.abnormalNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">排班异常岗位</div>\n              </div>\n            </div>\n            <!-- 环形图 -->\n            <div class=\"ring-chart-container\">\n              <div class=\"ring-legend ring-legend-left\">\n                <div v-for=\"(item, idx) in ringChartData.slice(0, 4)\" :key=\"'rl'+idx\" class=\"legend-item\">\n                  <span class=\"legend-dot\" :style=\"{ background: ringColors[idx] }\"></span>\n                  <span class=\"legend-name\">{{ item.name }}</span>\n                  <span class=\"legend-value\">{{ item.num }}</span>\n                </div>\n              </div>\n              <div ref=\"ringChartRef\" class=\"ring-chart\"></div>\n              <div class=\"ring-legend ring-legend-right\">\n                <div v-for=\"(item, idx) in ringChartData.slice(4, 8)\" :key=\"'rr'+idx\" class=\"legend-item\">\n                  <span class=\"legend-dot\" :style=\"{ background: ringColors[idx + 4] }\"></span>\n                  <span class=\"legend-name\">{{ item.name }}</span>\n                  <span class=\"legend-value\">{{ item.num }}</span>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <!-- 今日路勤警力 -->\n          <div class=\"stat-block\" style=\"margin-top: 8px\">\n            <div class=\"stat-title\">今日路勤警力</div>\n            <div class=\"stat-cards-3\">\n              <div class=\"stat-card\">\n                <div class=\"sc-num\">{{ postRoadReportInfo.schedulingPoliceNum }}/{{ postRoadReportInfo.totalPoliceNum }}</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">民警</div>\n                <div class=\"sc-sub\">（排班/总人数）</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #ffe478\">\n                  {{ postRoadReportInfo.schedulingAssistantNum }}/{{ postRoadReportInfo.totalAssistantNum }}\n                </div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">辅警</div>\n                <div class=\"sc-sub\">（排班/总人数）</div>\n              </div>\n              <div class=\"stat-card\">\n                <div class=\"sc-num\" style=\"color: #11b95c\">\n                  {{ postRoadReportInfo.schedulingSafeguardNum }}/{{ postRoadReportInfo.totalSafeguardNum }}\n                </div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">保通员</div>\n                <div class=\"sc-sub\">（排班/总人数）</div>\n              </div>\n            </div>\n            <div class=\"rate-row\">\n              <div class=\"rate-item\">\n                <div class=\"sc-num\">{{ postRoadReportInfo.schedulingRatio }}%</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">排班率</div>\n              </div>\n              <div class=\"rate-item\">\n                <div class=\"sc-num\">{{ postRoadReportInfo.ontimeRatio }}%</div>\n                <div class=\"sc-bar\"></div>\n                <div class=\"sc-label\">准点率</div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 右下：路面保通情况 / 异常班次 -->\n      <div class=\"right-bottom-panel\">\n        <div class=\"rb-title\">\n          {{ showPostInfo ? '路面保通情况' : '异常班次' }}\n        </div>\n        <div v-show=\"showPostInfo\" class=\"line-chart-container\">\n          <div ref=\"lineChartRef\" class=\"line-chart\"></div>\n        </div>\n        <div v-show=\"!showPostInfo\" class=\"abnormal-table\">\n          <div class=\"abnormal-head\">\n            <div class=\"ah ah-1\">班次</div>\n            <div class=\"ah ah-2\">岗位</div>\n            <div class=\"ah ah-3\">异常人员</div>\n          </div>\n          <div class=\"abnormal-body\">\n            <div v-for=\"(item, idx) in abnormalListData\" :key=\"idx\" class=\"abnormal-row\">\n              <div class=\"ah ah-1\">\n                <a-tooltip :title=\"item.schedulesName\">\n                  <span class=\"text-ellipsis\">{{ item.schedulesName }}</span>\n                </a-tooltip>\n              </div>\n              <div class=\"ah ah-2\">\n                <a-tooltip :title=\"item.postName\">\n                  <span class=\"text-ellipsis\">{{ item.postName }}</span>\n                </a-tooltip>\n              </div>\n              <div class=\"ah ah-3\">\n                <a-tooltip :title=\"item.abnormalPersonNames\">\n                  <span class=\"text-ellipsis\">{{ item.abnormalPersonNames }}</span>\n                </a-tooltip>\n              </div>\n            </div>\n            <div v-if=\"abnormalListData.length === 0\" class=\"no-data-small\">暂无数据</div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 日期选择器 -->\n      <div class=\"date-container\">\n        <a-date-picker\n          v-model:value=\"searchDate\"\n          :show-time=\"true\"\n          format=\"YYYY-MM-DD HH:mm\"\n          @change=\"onDateChange\"\n          :allow-clear=\"false\"\n          class=\"dark-date-picker\"\n        />\n        <div class=\"now-btn\" @click=\"onNow\">当前</div>\n      </div>\n\n      <!-- 岗位信息弹窗 -->\n      <div v-if=\"showPostInfoWindow\" class=\"post-info-modal\" @click.self=\"showPostInfoWindow = false\">\n        <div class=\"post-info-dialog\">\n          <div class=\"dialog-head\">\n            <span>岗位信息</span>\n            <span class=\"close-btn\" @click=\"showPostInfoWindow = false\">×</span>\n          </div>\n          <div class=\"dialog-body\">\n            <div class=\"info-section\">\n              <div class=\"section-title\">\n                <span class=\"section-icon\"></span>\n                基础信息\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">岗位名称：</span>\n                <span class=\"info-value\">{{ currentPostInfo.postName }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">岗位类型：</span>\n                <span class=\"info-value\">{{ getPostTypeName(currentPostInfo.postPrimaryType, currentPostInfo.postSecondType) }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">岗位属性：</span>\n                <span class=\"info-value\">{{ currentPostInfo.postProperty === '1' ? '重点岗位' : currentPostInfo.postProperty === '2' ? '一般岗位' : '其他岗位' }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">勤务类型：</span>\n                <span class=\"info-value\">{{ currentPostInfo.serviceTypeName }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">所属部门：</span>\n                <span class=\"info-value\">{{ currentPostInfo.deptName }}</span>\n              </div>\n              <div class=\"info-row\">\n                <span class=\"info-label\">位置信息：</span>\n                <span class=\"info-value\">{{ currentPostInfo.postAddress }}</span>\n              </div>\n            </div>\n            <div class=\"info-section\" style=\"margin-top: 10px\">\n              <div class=\"section-title\">\n                <span class=\"section-icon\"></span>\n                班次信息\n              </div>\n              <div class=\"schedule-list\">\n                <div v-for=\"(s, si) in currentPostInfo.schedules\" :key=\"si\" class=\"sched-item\">\n                  <div class=\"sched-name\">{{ s.schedulesName }}</div>\n                  <div class=\"sched-time\">{{ s.startTime }} ~ {{ s.endTime }}</div>\n                  <div class=\"sched-people\">\n                    民警 {{ s.policeCount }}人 / 辅警 {{ s.assistantCount }}人 / 保通员 {{ s.safeguardCount }}人\n                  </div>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n\n      <!-- 图标说明弹窗 -->\n      <div v-if=\"showIconDesc\" class=\"icon-desc-modal\" @click.self=\"showIconDesc = false\">\n        <div class=\"icon-desc-dialog\">\n          <div class=\"dialog-head\">\n            <span>图标说明</span>\n            <span class=\"close-btn\" @click=\"showIconDesc = false\">×</span>\n          </div>\n          <div class=\"icon-desc-body\">\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #1682bd\"></span>\n              <span>民警</span>\n            </div>\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #e1c022\"></span>\n              <span>辅警</span>\n            </div>\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #11b95c\"></span>\n              <span>保通员</span>\n            </div>\n            <div class=\"icon-desc-row\">\n              <span class=\"desc-dot\" style=\"background: #e13c14\"></span>\n              <span>异常</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </bg-and-info>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, reactive, computed, onMounted, nextTick, watch } from 'vue';\nimport * as echarts from 'echarts';\nimport dayjs from 'dayjs';\nimport BgAndInfo from '/@/components/Common/bgAndInfo.vue';\nimport MapContainer from '/@/components/TumengIndex/MapContainer.vue';\n\n// ========== 类型定义 ==========\ninterface TreeData {\n  id: string;\n  label: string;\n  deptLevel: number;\n  children?: TreeData[];\n}\n\ninterface PostItem {\n  id: string;\n  deptId: string;\n  postName: string;\n  postPrimaryType: number;\n  postSecondType: number;\n  postProperty: string;\n  serviceTypeName: string;\n  schedulingPoliceNum: number;\n  schedulingAssistantNum: number;\n  schedulingSafeguardNum: number;\n  delayIndex: number;\n  deptName: string;\n  postAddress: string;\n  schedules: any[];\n}\n\ninterface Person {\n  nickName: string;\n  ondutyFlag: number;\n  recorderId: string;\n  recorderShowOndutyFlag: number;\n  recorderDeviceStatus: number;\n  interphoneShowOndutyFlag: number;\n  interphoneOnlineFlag: number;\n  signInFlag: number;\n  signInTime: string;\n  signOutFlag: number;\n  signOutTime: string;\n}\n\ninterface ScheduleRange {\n  startTime: string;\n  endTime: string;\n  policeList: Person[];\n  assistantList: Person[];\n  safeguardList: Person[];\n}\n\ninterface ScheduleItem {\n  schedulesName: string;\n  postPrimaryType: number;\n  rangeList: ScheduleRange[];\n}\n\ninterface AbnormalItem {\n  schedulesName: string;\n  postName: string;\n  abnormalPersonNames: string;\n}\n\n// ========== 部门树数据 ==========\nconst treeData = ref<TreeData[]>([\n  {\n    id: '100',\n    label: '交警支队',\n    deptLevel: 1,\n    children: [\n      {\n        id: 'd1', label: '一大队', deptLevel: 2,\n        children: [\n          { id: 'd1-1', label: '一中队', deptLevel: 3 },\n          { id: 'd1-2', label: '二中队', deptLevel: 3 },\n          { id: 'd1-3', label: '三中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd2', label: '二大队', deptLevel: 2,\n        children: [\n          { id: 'd2-1', label: '一中队', deptLevel: 3 },\n          { id: 'd2-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd3', label: '三大队', deptLevel: 2,\n        children: [\n          { id: 'd3-1', label: '一中队', deptLevel: 3 },\n          { id: 'd3-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd4', label: '四大队', deptLevel: 2,\n        children: [\n          { id: 'd4-1', label: '一中队', deptLevel: 3 },\n          { id: 'd4-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd5', label: '五大队', deptLevel: 2,\n        children: [\n          { id: 'd5-1', label: '一中队', deptLevel: 3 },\n          { id: 'd5-2', label: '二中队', deptLevel: 3 },\n        ],\n      },\n      {\n        id: 'd6', label: '六大队', deptLevel: 2,\n        children: [{ id: 'd6-1', label: '一中队', deptLevel: 3 }],\n      },\n      {\n        id: 'd7', label: '七大队', deptLevel: 2,\n        children: [{ id: 'd7-1', label: '一中队', deptLevel: 3 }],\n      },\n      {\n        id: 'd8', label: '八大队', deptLevel: 2,\n        children: [{ id: 'd8-1', label: '一中队', deptLevel: 3 }],\n      },\n    ],\n  },\n]);\n\nconst checkedKeys = ref<string[]>(['100']);\n\n// ========== 岗位类型数据 ==========\nconst postManager = ref([\n  { name: '路勤', id: 1 },\n  { name: '内勤', id: 2 },\n  { name: '值班', id: 3 },\n  { name: '其他', id: 5 },\n]);\n\nconst postManagerMini = ref<{ name: string; id: number }[]>([]);\n\nconst postTypeFull = [\n  {\n    id: 1, name: '路勤',\n    children: [\n      { id: 1, name: '一类固定岗' },\n      { id: 2, name: '二类固定岗' },\n      { id: 3, name: '三类固定岗' },\n      { id: 4, name: '机动巡逻岗' },\n      { id: 5, name: '夜巡管理岗' },\n      { id: 6, name: '高峰加勤岗' },\n      { id: 7, name: '春城骑警' },\n    ],\n  },\n  {\n    id: 2, name: '内勤',\n    children: [\n      { id: 1, name: '行政岗' },\n      { id: 2, name: '窗口岗' },\n      { id: 3, name: '高峰加勤岗' },\n    ],\n  },\n  {\n    id: 3, name: '值班',\n    children: [\n      { id: 1, name: '事故值班' },\n      { id: 2, name: '大队值班' },\n      { id: 3, name: '110值班' },\n      { id: 4, name: '指挥室值班' },\n      { id: 5, name: '备勤值班' },\n    ],\n  },\n  { id: 5, name: '其他', children: [] },\n];\n\n// ========== 搜索数据 ==========\nconst searchData = reactive({\n  postPrimaryType: '' as number | string,\n  postSecondType: '' as number | string,\n  searchPostName: '',\n});\n\nconst searchDate = ref<dayjs.Dayjs>(dayjs());\n\n// ========== Mock 岗位列表数据 ==========\nfunction genPerson(name: string, onduty: number, has4g: boolean, hasIntercom: boolean, signIn: number, signOut: number): Person {\n  return {\n    nickName: name,\n    ondutyFlag: onduty,\n    recorderId: has4g ? 'REC' + name : '',\n    recorderShowOndutyFlag: has4g ? (onduty === 1 ? 1 : 0) : 0,\n    recorderDeviceStatus: has4g ? 1 : 0,\n    interphoneShowOndutyFlag: hasIntercom ? (onduty === 1 ? 1 : 0) : 0,\n    interphoneOnlineFlag: hasIntercom ? 1 : 0,\n    signInFlag: signIn,\n    signInTime: signIn === 1 ? '07:55' : signIn === 2 ? '08:12' : '--',\n    signOutFlag: signOut,\n    signOutTime: signOut === 1 ? '18:02' : signOut === 2 ? '17:48' : '--',\n  };\n}\n\nconst postListData = ref<PostItem[]>([\n  {\n    id: 'p001', deptId: 'd1', postName: '人民东路岗', postPrimaryType: 1, postSecondType: 1,\n    postProperty: '1', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 3, schedulingAssistantNum: 2, schedulingSafeguardNum: 1,\n    delayIndex: 1.25, deptName: '一大队', postAddress: '人民东路与北京路交叉口',\n    schedules: [\n      { schedulesName: '早班', startTime: '07:00', endTime: '14:00', policeCount: 2, assistantCount: 1, safeguardCount: 0 },\n      { schedulesName: '中班', startTime: '12:00', endTime: '19:00', policeCount: 2, assistantCount: 1, safeguardCount: 1 },\n      { schedulesName: '晚班', startTime: '18:00', endTime: '次日01:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p002', deptId: 'd1-1', postName: '东风广场岗', postPrimaryType: 1, postSecondType: 2,\n    postProperty: '1', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 4, schedulingAssistantNum: 3, schedulingSafeguardNum: 2,\n    delayIndex: 0.85, deptName: '一大队一中队', postAddress: '东风路与白塔路交叉口',\n    schedules: [\n      { schedulesName: '早班', startTime: '07:00', endTime: '15:00', policeCount: 2, assistantCount: 2, safeguardCount: 1 },\n      { schedulesName: '晚班', startTime: '14:00', endTime: '22:00', policeCount: 2, assistantCount: 1, safeguardCount: 1 },\n    ],\n  },\n  {\n    id: 'p003', deptId: 'd2', postName: '火车站站前岗', postPrimaryType: 1, postSecondType: 1,\n    postProperty: '1', serviceTypeName: '专项勤务',\n    schedulingPoliceNum: 6, schedulingAssistantNum: 4, schedulingSafeguardNum: 3,\n    delayIndex: 2.15, deptName: '二大队', postAddress: '北京路南端火车站广场',\n    schedules: [\n      { schedulesName: '白班', startTime: '06:00', endTime: '18:00', policeCount: 4, assistantCount: 3, safeguardCount: 2 },\n      { schedulesName: '夜班', startTime: '18:00', endTime: '次日06:00', policeCount: 2, assistantCount: 1, safeguardCount: 1 },\n    ],\n  },\n  {\n    id: 'p004', deptId: 'd2-1', postName: '北京路巡逻岗', postPrimaryType: 1, postSecondType: 4,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 2, schedulingSafeguardNum: 0,\n    delayIndex: 0.5, deptName: '二大队一中队', postAddress: '北京路全段机动巡逻',\n    schedules: [\n      { schedulesName: '日班', startTime: '08:00', endTime: '20:00', policeCount: 2, assistantCount: 2, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p005', deptId: 'd3', postName: '行政值班岗', postPrimaryType: 3, postSecondType: 2,\n    postProperty: '2', serviceTypeName: '警卫勤务',\n    schedulingPoliceNum: 1, schedulingAssistantNum: 1, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '三大队', postAddress: '三大队办公楼',\n    schedules: [\n      { schedulesName: '值班', startTime: '08:30', endTime: '次日08:30', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p006', deptId: 'd3-2', postName: '110接处警岗', postPrimaryType: 3, postSecondType: 3,\n    postProperty: '1', serviceTypeName: '应急勤务',\n    schedulingPoliceNum: 3, schedulingAssistantNum: 2, schedulingSafeguardNum: 0,\n    delayIndex: 1.8, deptName: '三大队二中队', postAddress: '三大队辖区',\n    schedules: [\n      { schedulesName: '日班', startTime: '08:00', endTime: '20:00', policeCount: 2, assistantCount: 1, safeguardCount: 0 },\n      { schedulesName: '夜班', startTime: '20:00', endTime: '次日08:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p007', deptId: 'd4', postName: '春城骑警-四分队', postPrimaryType: 1, postSecondType: 7,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 5, schedulingAssistantNum: 0, schedulingSafeguardNum: 0,\n    delayIndex: 0.3, deptName: '四大队', postAddress: '四大队辖区机动',\n    schedules: [\n      { schedulesName: '日班', startTime: '07:30', endTime: '19:30', policeCount: 5, assistantCount: 0, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p008', deptId: 'd4-1', postName: '学府路夜巡岗', postPrimaryType: 1, postSecondType: 5,\n    postProperty: '3', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 1, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '四大队一中队', postAddress: '学府路全段',\n    schedules: [\n      { schedulesName: '夜班', startTime: '22:00', endTime: '次日06:00', policeCount: 2, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p009', deptId: 'd5', postName: '窗口服务岗', postPrimaryType: 2, postSecondType: 2,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 3, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '五大队', postAddress: '五大队违法处理窗口',\n    schedules: [\n      { schedulesName: '白班', startTime: '09:00', endTime: '17:00', policeCount: 2, assistantCount: 3, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p010', deptId: 'd5-2', postName: '广福路高峰岗', postPrimaryType: 1, postSecondType: 6,\n    postProperty: '2', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 2, schedulingSafeguardNum: 1,\n    delayIndex: 0.65, deptName: '五大队二中队', postAddress: '广福路与前兴路交叉口',\n    schedules: [\n      { schedulesName: '早高峰', startTime: '07:00', endTime: '09:30', policeCount: 2, assistantCount: 2, safeguardCount: 1 },\n      { schedulesName: '晚高峰', startTime: '17:00', endTime: '19:30', policeCount: 2, assistantCount: 2, safeguardCount: 1 },\n    ],\n  },\n  {\n    id: 'p011', deptId: 'd6', postName: '指挥室值班', postPrimaryType: 3, postSecondType: 4,\n    postProperty: '1', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 2, schedulingAssistantNum: 2, schedulingSafeguardNum: 0,\n    delayIndex: 0.1, deptName: '六大队', postAddress: '六大队指挥中心',\n    schedules: [\n      { schedulesName: '白班', startTime: '08:00', endTime: '20:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n      { schedulesName: '夜班', startTime: '20:00', endTime: '次日08:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n  {\n    id: 'p012', deptId: 'd6-1', postName: '呈贡老城岗', postPrimaryType: 1, postSecondType: 3,\n    postProperty: '3', serviceTypeName: '日常勤务',\n    schedulingPoliceNum: 1, schedulingAssistantNum: 1, schedulingSafeguardNum: 0,\n    delayIndex: 0, deptName: '六大队一中队', postAddress: '呈贡区古银路',\n    schedules: [\n      { schedulesName: '白班', startTime: '08:00', endTime: '18:00', policeCount: 1, assistantCount: 1, safeguardCount: 0 },\n    ],\n  },\n]);\n\n// ========== 筛选后的岗位列表 ==========\nconst filteredPostList = computed(() => {\n  let list = [...postListData.value];\n\n  // 部门过滤\n  if (checkedKeys.value.length > 0) {\n    const allDeptIds = new Set<string>();\n    function addAll(nodes: TreeData[]) {\n      for (const n of nodes) {\n        if ((checkedKeys.value as string[]).includes(n.id)) {\n          allDeptIds.add(n.id);\n          if (n.children) addChildren(n.children);\n        }\n        if (n.children) addAll(n.children);\n      }\n    }\n    function addChildren(nodes: TreeData[]) {\n      for (const n of nodes) {\n        allDeptIds.add(n.id);\n        if (n.children) addChildren(n.children);\n      }\n    }\n    addAll(treeData.value);\n    list = list.filter(item => allDeptIds.has(item.deptId));\n  }\n\n  // 岗位大类\n  if (searchData.postPrimaryType) {\n    list = list.filter(item => item.postPrimaryType === Number(searchData.postPrimaryType));\n    // 岗位细类\n    if (searchData.postSecondType) {\n      list = list.filter(item => item.postSecondType === Number(searchData.postSecondType));\n    }\n  }\n\n  // 关键字\n  if (searchData.searchPostName) {\n    const kw = searchData.searchPostName.toLowerCase();\n    list = list.filter(item => item.postName.toLowerCase().includes(kw));\n  }\n\n  return list;\n});\n\n// ========== 选中岗位 ==========\nconst selectedPostId = ref<string>('');\nconst showPostInfo = ref(true); // true=出勤情况, false=路勤统计\nconst isDotPrint = ref(false);\nconst showIconDesc = ref(false);\n\nfunction onSelectPost(item: PostItem) {\n  selectedPostId.value = item.id;\n  currentPostInfo.value = item;\n  showPostInfoWindow.value = true;\n  // 加载排班详情\n  loadScheduleDetail(item);\n}\n\n// ========== 出勤排班详情 ==========\nconst postSchedulesReportInfo = ref<ScheduleItem[]>([]);\nconst activeScheduleKeys = ref<number[]>([1]);\nconst schedulesData = ref<number[]>([]);\n\nfunction loadScheduleDetail(post: PostItem) {\n  // 根据岗位生成 mock 排班详情\n  const schedList: ScheduleItem[] = post.schedules.map((s: any, idx: number) => {\n    // 生成每个班次的人员列表\n    const policeList: Person[] = [];\n    const assistantList: Person[] = [];\n    const safeguardList: Person[] = [];\n\n    for (let i = 0; i < s.policeCount; i++) {\n      policeList.push(genPerson(\n        `民警${i + 1}`,\n        i === 0 ? 2 : 1,\n        true,\n        true,\n        i === 1 ? 2 : 1,\n        i === 0 ? 0 : 1,\n      ));\n    }\n    for (let i = 0; i < s.assistantCount; i++) {\n      assistantList.push(genPerson(\n        `辅警${i + 1}`,\n        i === 0 ? 0 : 1,\n        i !== 1,\n        true,\n        i === 0 ? 0 : 1,\n        i === 1 ? 2 : 1,\n      ));\n    }\n    for (let i = 0; i < s.safeguardCount; i++) {\n      safeguardList.push(genPerson(\n        `保通员${i + 1}`,\n        1,\n        false,\n        i === 0,\n        1,\n        i === 0 ? 0 : 1,\n      ));\n    }\n\n    return {\n      schedulesName: s.schedulesName,\n      postPrimaryType: post.postPrimaryType,\n      rangeList: [\n        {\n          startTime: s.startTime,\n          endTime: s.endTime,\n          policeList,\n          assistantList,\n          safeguardList,\n        },\n      ],\n    };\n  });\n\n  postSchedulesReportInfo.value = schedList;\n  schedulesData.value = schedList.map(() => 0);\n  activeScheduleKeys.value = schedList.length > 0 ? [1] : [];\n}\n\nfunction onSchedChange(idx: number, val: number) {\n  schedulesData.value[idx] = val;\n}\n\n// ========== 路勤统计数据 ==========\nconst postReportInfo = reactive({\n  totalNum: 48,\n  keyNum: 15,\n  abnormalNum: 3,\n});\n\nconst postRoadReportInfo = reactive({\n  schedulingPoliceNum: 86,\n  totalPoliceNum: 120,\n  schedulingAssistantNum: 64,\n  totalAssistantNum: 95,\n  schedulingSafeguardNum: 32,\n  totalSafeguardNum: 48,\n  schedulingRatio: 72.5,\n  ontimeRatio: 94.3,\n});\n\n// 环形图数据\nconst ringChartData = ref([\n  { name: '一类固定岗', num: 12 },\n  { name: '二类固定岗', num: 8 },\n  { name: '三类固定岗', num: 6 },\n  { name: '机动巡逻岗', num: 10 },\n  { name: '夜巡管理岗', num: 4 },\n  { name: '高峰加勤岗', num: 12 },\n  { name: '春城骑警', num: 8 },\n  { name: '其他', num: 3 },\n]);\n\nconst ringColors = ['#29B3FF', '#44FFFD', '#FFE478', '#FF9F43', '#EE5A52', '#52C41A', '#9254DE', '#13C2C2'];\n\n// ========== 异常班次 ==========\nconst abnormalListData = ref<AbnormalItem[]>([\n  { schedulesName: '早班', postName: '火车站站前岗', abnormalPersonNames: '张三、李四（未签到）' },\n  { schedulesName: '夜班', postName: '110接处警岗', abnormalPersonNames: '王五（脱岗）' },\n  { schedulesName: '晚班', postName: '人民东路岗', abnormalPersonNames: '赵六（晚到15分钟）' },\n]);\n\n// ========== 岗位信息弹窗 ==========\nconst showPostInfoWindow = ref(false);\nconst currentPostInfo = ref<PostItem>(postListData.value[0]);\n\n// ========== 日期 ==========\nfunction onDateChange() {}\nfunction onNow() {\n  searchDate.value = dayjs();\n}\n\n// ========== 图表 refs ==========\nconst ringChartRef = ref<HTMLDivElement>();\nconst lineChartRef = ref<HTMLDivElement>();\nlet ringChart: echarts.ECharts | null = null;\nlet lineChart: echarts.ECharts | null = null;\n\n// ========== 初始化环形图 ==========\nfunction initRingChart() {\n  if (!ringChartRef.value) return;\n  ringChart = echarts.init(ringChartRef.value);\n  const option: echarts.EChartsOption = {\n    tooltip: { trigger: 'item', formatter: '{b}: {c} ({d}%)' },\n    series: [\n      {\n        name: '岗位类型',\n        type: 'pie',\n        radius: ['45%', '70%'],\n        center: ['50%', '50%'],\n        avoidLabelOverlap: false,\n        itemStyle: { borderColor: 'transparent', borderWidth: 2 },\n        label: { show: false },\n        emphasis: {\n          label: { show: false },\n        },\n        data: ringChartData.value.map((item, idx) => ({\n          name: item.name,\n          value: item.num,\n          itemStyle: { color: ringColors[idx] },\n        })),\n      },\n    ],\n  };\n  ringChart.setOption(option);\n}\n\n// ========== 初始化折线图（路面保通） ==========\nfunction initLineChart() {\n  if (!lineChartRef.value) return;\n  lineChart = echarts.init(lineChartRef.value);\n\n  const hours = ['00', '02', '04', '06', '08', '10', '12', '14', '16', '18', '20', '22'];\n  const data1 = [1.2, 0.8, 0.5, 1.5, 3.2, 2.8, 2.1, 2.5, 3.0, 3.8, 2.6, 1.8];\n  const data2 = [0.8, 0.5, 0.3, 1.0, 2.5, 2.2, 1.8, 2.0, 2.4, 3.0, 2.0, 1.2];\n\n  const option: echarts.EChartsOption = {\n    grid: { left: 40, right: 20, top: 30, bottom: 30 },\n    tooltip: {\n      trigger: 'axis',\n      backgroundColor: 'rgba(10, 26, 41, 0.9)',\n      borderColor: '#29B3FF',\n      textStyle: { color: '#fff' },\n    },\n    legend: {\n      data: ['拥堵指数', '平均速度'],\n      textStyle: { color: '#7aabc6', fontSize: 11 },\n      top: 5,\n      right: 20,\n    },\n    xAxis: {\n      type: 'category',\n      data: hours,\n      axisLine: { lineStyle: { color: 'rgba(41, 179, 255, 0.3)' } },\n      axisLabel: { color: '#7aabc6', fontSize: 10 },\n    },\n    yAxis: {\n      type: 'value',\n      axisLine: { show: false },\n      axisTick: { show: false },\n      splitLine: { lineStyle: { color: 'rgba(41, 179, 255, 0.1)' } },\n      axisLabel: { color: '#7aabc6', fontSize: 10 },\n    },\n    series: [\n      {\n        name: '拥堵指数',\n        type: 'line',\n        data: data1,\n        smooth: true,\n        symbol: 'circle',\n        symbolSize: 4,\n        lineStyle: { color: '#29B3FF', width: 2 },\n        itemStyle: { color: '#29B3FF' },\n        areaStyle: {\n          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n            { offset: 0, color: 'rgba(41, 179, 255, 0.3)' },\n            { offset: 1, color: 'rgba(41, 179, 255, 0.02)' },\n          ]),\n        },\n      },\n      {\n        name: '平均速度',\n        type: 'line',\n        data: data2,\n        smooth: true,\n        symbol: 'circle',\n        symbolSize: 4,\n        lineStyle: { color: '#FFE478', width: 2 },\n        itemStyle: { color: '#FFE478' },\n        areaStyle: {\n          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [\n            { offset: 0, color: 'rgba(255, 228, 120, 0.2)' },\n            { offset: 1, color: 'rgba(255, 228, 120, 0.02)' },\n          ]),\n        },\n      },\n    ],\n  };\n  lineChart.setOption(option);\n}\n\n// ========== 辅助函数 ==========\nfunction onTreeCheck(keys: any) {\n  const keyArr = Array.isArray(keys) ? keys : keys.checked;\n  checkedKeys.value = keyArr;\n}\n\nfunction onTreeSelect(selectedKeys: any) {\n  const key = selectedKeys[0];\n  if (!key) return;\n  const current = checkedKeys.value as string[];\n  if (current.includes(key)) {\n    checkedKeys.value = current.filter(k => k !== key);\n  } else {\n    checkedKeys.value = [key];\n  }\n}\n\nfunction onPostTypeChange() {\n  searchData.postSecondType = '';\n  const found = postTypeFull.find(item => item.id === Number(searchData.postPrimaryType));\n  postManagerMini.value = found?.children || [];\n}\n\nfunction onSearch() {\n  // 查询已通过 computed 自动过滤\n}\n\nfunction onDotPrint() {\n  isDotPrint.value = !isDotPrint.value;\n}\n\nfunction getPostTypeName(primary: number, second: number): string {\n  for (const p of postTypeFull) {\n    if (p.id === primary) {\n      for (const c of p.children) {\n        if (c.id === second) return c.name;\n      }\n      return p.name;\n    }\n  }\n  return '-';\n}\n\nfunction getOndutyColor(flag: number): [string, string] {\n  switch (flag) {\n    case 1: return ['#52c41a', '在岗'];\n    case 2: return ['#ffa940', '离岗'];\n    case 0: return ['#8c8c8c', '未上岗'];\n    default: return ['#8c8c8c', '未知'];\n  }\n}\n\nfunction getRecorderColor(flag: number): [string, string] {\n  return flag === 1 ? ['#52c41a', '在线'] : ['#8c8c8c', '离线'];\n}\n\nfunction getIntercomColor(flag: number): [string, string] {\n  return flag === 1 ? ['#52c41a', '在线'] : ['#8c8c8c', '离线'];\n}\n\nfunction getSignText(flag: number, type: number, time: string): [string, string, string] {\n  // 返回 [颜色, 文字, 详情提示]\n  if (type === 1) {\n    // 签到\n    switch (flag) {\n      case 1: return ['#52c41a', '已签到', `签到时间：${time}`];\n      case 2: return ['#ffa940', '迟到', `迟到签到：${time}`];\n      case 0: return ['#f5222d', '未签到', '未签到'];\n      default: return ['#8c8c8c', '-', '-'];\n    }\n  } else {\n    // 签退\n    switch (flag) {\n      case 1: return ['#52c41a', '已签退', `签退时间：${time}`];\n      case 2: return ['#ffa940', '早退', `早退签退：${time}`];\n      case 0: return ['#f5222d', '未签退', '未签退'];\n      default: return ['#8c8c8c', '-', '-'];\n    }\n  }\n}\n\nfunction renderSchedTitle(item: ScheduleItem, idx: number) {\n  const range = item.rangeList[schedulesData.value[idx] || 0];\n  return `${item.schedulesName}  ${range?.startTime || '--'} ~ ${range?.endTime || '--'}`;\n}\n\n// ========== 生命周期 ==========\nonMounted(() => {\n  nextTick(() => {\n    initRingChart();\n    initLineChart();\n  });\n\n  window.addEventListener('resize', () => {\n    ringChart?.resize();\n    lineChart?.resize();\n  });\n});\n\n// 切换模式后重绘图表\nwatch(showPostInfo, (val) => {\n  nextTick(() => {\n    if (!val) {\n      ringChart?.resize();\n    } else {\n      lineChart?.resize();\n    }\n  });\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.scheduling-page {\n  position: relative;\n  width: 100%;\n  height: 100vh;\n  color: #eaf8ff;\n  overflow: hidden;\n}\n\n/* ========== 地图背景 ========== */\n.map-bg {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 1;\n}\n\n/* ========== 左侧岗位列表 ========== */\n.point-view {\n  position: absolute;\n  left: 60px;\n  top: 100px;\n  width: 420px;\n  z-index: 10;\n  background: linear-gradient(180deg, rgba(10, 26, 41, 0.95) 0%, rgba(10, 26, 41, 0.85) 100%);\n  border: 1px solid rgba(41, 179, 255, 0.3);\n  border-radius: 4px;\n  padding: 10px 12px;\n  box-sizing: border-box;\n  backdrop-filter: blur(4px);\n}\n\n.content-title {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  height: 30px;\n  line-height: 30px;\n  font-size: 16px;\n  color: #29b3ff;\n  font-weight: bold;\n  padding-bottom: 4px;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.2);\n  margin-bottom: 8px;\n\n  .icon-desc {\n    font-size: 12px;\n    color: #7aabc6;\n    cursor: pointer;\n    font-weight: normal;\n\n    &:hover { color: #29b3ff; }\n  }\n}\n\n/* 搜索栏 */\n.search-bar {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  margin-bottom: 8px;\n  flex-wrap: wrap;\n}\n\n.search-left {\n  display: flex;\n  align-items: center;\n}\n\n.search-right {\n  display: flex;\n  align-items: center;\n  flex: 1;\n  gap: 6px;\n}\n\n.mini-select {\n  height: 28px;\n  padding: 0 24px 0 8px;\n  background: rgba(12, 60, 105, 0.8);\n  border: 1px solid #29b3ff;\n  border-radius: 2px;\n  color: #fff;\n  font-size: 12px;\n  outline: none;\n  cursor: pointer;\n  appearance: none;\n  background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 10 10'%3E%3Cpath d='M5 7L2 3h6z' fill='%2329b3ff'/%3E%3C/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: right 6px center;\n\n  option {\n    background: #0a1a29;\n    color: #fff;\n  }\n}\n\n.search-input {\n  flex: 1;\n  height: 28px;\n  padding: 0 10px;\n  background: rgba(12, 60, 105, 0.8);\n  border: 1px solid #29b3ff;\n  border-radius: 2px;\n  color: #fff;\n  font-size: 12px;\n  outline: none;\n\n  &::placeholder {\n    color: rgba(255, 255, 255, 0.4);\n  }\n}\n\n.locate-btn {\n  width: 28px;\n  height: 28px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border: 1px solid #29b3ff;\n  border-radius: 2px;\n  cursor: pointer;\n  background: rgba(12, 60, 105, 0.8);\n\n  .locate-icon {\n    width: 14px;\n    height: 14px;\n    background: #29b3ff;\n    mask: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Cpath d='M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z'/%3E%3C/svg%3E\") center/contain no-repeat;\n  }\n\n  &.active {\n    background: rgba(41, 179, 255, 0.3);\n\n    .locate-icon { background: #44fffd; }\n  }\n}\n\n.search-btn {\n  width: 60px;\n  height: 28px;\n  line-height: 28px;\n  text-align: center;\n  font-size: 12px;\n  color: #fff;\n  background-image: url('/@/assets/map_image/goScreenBg.png');\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n  cursor: pointer;\n  flex-shrink: 0;\n}\n\n/* 左栏：树 + 岗位列表 */\n.left-container {\n  display: flex;\n  height: 720px;\n  gap: 8px;\n}\n\n.tree-panel {\n  width: 160px;\n  border: 1px solid rgba(41, 179, 255, 0.2);\n  border-radius: 2px;\n  overflow-y: auto;\n  padding: 6px 4px;\n  box-sizing: border-box;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n/* 覆盖 AntD Tree */\n:deep(.dept-tree) {\n  background: transparent;\n  color: #fff;\n  font-size: 12px;\n\n  .ant-tree-node-content-wrapper {\n    color: #fff;\n    &:hover { background: rgba(41, 179, 255, 0.15) !important; }\n  }\n\n  .ant-tree-treenode { padding: 2px 0; }\n\n  .ant-tree-checkbox {\n    .ant-tree-checkbox-inner {\n      width: 12px; height: 12px;\n      background: transparent;\n      border: 1px solid #29b3ff;\n      border-radius: 2px;\n\n      &::after {\n        inset-inline-start: 2px;\n        top: 0;\n        width: 3px; height: 6px;\n        border: 1.5px solid #29b3ff;\n        border-top: 0;\n        border-left: 0;\n      }\n    }\n    &.ant-tree-checkbox-checked .ant-tree-checkbox-inner {\n      background: rgba(41, 179, 255, 0.2);\n    }\n    &.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner::after {\n      background: #29b3ff;\n      inset-inline-start: 1.5px;\n      top: 4px;\n      width: 5px; height: 1.5px;\n    }\n  }\n\n  .ant-tree-switcher { color: #29b3ff; font-size: 10px; }\n  .ant-tree-indent-unit { width: 14px; }\n\n  .dept-level-1 { font-size: 14px; font-weight: bold; }\n  .dept-level-2 { font-weight: bold; }\n  .dept-level-3 { color: #41a4ef; }\n}\n\n/* 岗位列表 */\n.post-panel {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  border: 1px solid rgba(41, 179, 255, 0.2);\n  border-radius: 2px;\n  overflow: hidden;\n}\n\n.post-table-head {\n  display: flex;\n  background: rgba(41, 179, 255, 0.2);\n  font-size: 12px;\n  color: #29b3ff;\n  font-weight: bold;\n  flex-shrink: 0;\n\n  .pth {\n    height: 28px;\n    line-height: 28px;\n    text-align: center;\n    padding: 0 4px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n.pth-name { width: 32%; }\n.pth-force { width: 28%; }\n.pth-index { width: 16%; }\n.pth-type { width: 24%; }\n\n.post-table-body {\n  flex: 1;\n  overflow-y: auto;\n  font-size: 12px;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n.post-row {\n  display: flex;\n  cursor: pointer;\n  transition: background 0.15s;\n\n  &:nth-child(odd) { background: rgba(41, 179, 255, 0.08); }\n  &:nth-child(even) { background: rgba(41, 179, 255, 0.12); }\n  &:hover { background: rgba(41, 179, 255, 0.25); }\n\n  &.active {\n    background: rgba(41, 179, 255, 0.35);\n    border-left: 2px solid #44fffd;\n    box-sizing: border-box;\n  }\n\n  .ptd {\n    height: 30px;\n    line-height: 30px;\n    text-align: center;\n    padding: 0 4px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n    color: #eaf8ff;\n  }\n}\n\n.text-ellipsis {\n  display: block;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n}\n\n.num-police { color: #1682bd; }\n.num-assistant { color: #e1c022; }\n.num-safeguard { color: #11b95c; }\n.num-sep { color: #fff; margin: 0 2px; }\n.num-dash { color: #fff; }\n\n.red-dot {\n  display: inline-block;\n  width: 6px;\n  height: 6px;\n  background: #ff4d4f;\n  border-radius: 50%;\n  margin-right: 4px;\n  vertical-align: middle;\n}\n\n.no-data {\n  text-align: center;\n  color: rgba(255, 255, 255, 0.5);\n  padding: 60px 0;\n  font-size: 13px;\n}\n\n.no-data-small {\n  text-align: center;\n  color: rgba(255, 255, 255, 0.5);\n  padding: 30px 0;\n  font-size: 12px;\n}\n\n/* ========== 右侧上面板 ========== */\n.right-top-panel {\n  position: absolute;\n  right: 60px;\n  top: 100px;\n  width: 420px;\n  z-index: 10;\n}\n\n.mode-tabs {\n  display: flex;\n  margin-bottom: 6px;\n  gap: 4px;\n\n  .mode-tab {\n    flex: 1;\n    height: 32px;\n    line-height: 32px;\n    text-align: center;\n    font-size: 14px;\n    color: #7aabc6;\n    background: rgba(10, 26, 41, 0.8);\n    border: 1px solid rgba(41, 179, 255, 0.2);\n    border-radius: 2px;\n    cursor: pointer;\n    transition: all 0.2s;\n\n    &.active {\n      color: #fff;\n      background: rgba(41, 179, 255, 0.2);\n      border-color: #29b3ff;\n    }\n\n    &:hover:not(.active) {\n      border-color: rgba(41, 179, 255, 0.5);\n      color: #29b3ff;\n    }\n  }\n}\n\n.attendance-panel, .road-stat-panel {\n  background: linear-gradient(180deg, rgba(10, 26, 41, 0.95) 0%, rgba(10, 26, 41, 0.85) 100%);\n  border: 1px solid rgba(41, 179, 255, 0.3);\n  border-radius: 4px;\n  backdrop-filter: blur(4px);\n}\n\n.attendance-panel {\n  .panel-scroll {\n    max-height: 420px;\n    overflow-y: auto;\n    padding: 8px;\n\n    &::-webkit-scrollbar { width: 4px; }\n    &::-webkit-scrollbar-thumb {\n      background: rgba(41, 179, 255, 0.3);\n      border-radius: 2px;\n    }\n  }\n}\n\n/* 手风琴 */\n:deep(.sched-collapse) {\n  background: transparent;\n  border: none;\n\n  .ant-collapse-item {\n    border: 1px solid rgba(41, 179, 255, 0.2);\n    border-radius: 2px;\n    margin-bottom: 6px;\n    background: rgba(41, 179, 255, 0.05);\n\n    .ant-collapse-header {\n      color: #29b3ff !important;\n      font-size: 13px !important;\n      padding: 8px 10px !important;\n\n      .ant-collapse-arrow {\n        color: #29b3ff !important;\n        font-size: 10px !important;\n      }\n    }\n\n    .ant-collapse-content {\n      background: transparent;\n      border-top: 1px solid rgba(41, 179, 255, 0.15);\n\n      .ant-collapse-content-box {\n        padding: 8px 10px 12px !important;\n      }\n    }\n  }\n\n  .ant-collapse-item-active {\n    background: rgba(41, 179, 255, 0.1);\n  }\n}\n\n.sched-detail {\n  .sched-switcher {\n    margin-bottom: 10px;\n    margin-left: 10px;\n\n    :deep(.ant-radio-group) {\n      .ant-radio-wrapper {\n        color: #eaf8ff;\n        font-size: 12px;\n        margin-right: 12px;\n\n        .ant-radio-inner {\n          border-color: #29b3ff;\n          background: transparent;\n          width: 12px; height: 12px;\n\n          &::after {\n            width: 6px; height: 6px;\n            background: #29b3ff;\n            inset-inline-start: 2px;\n            top: 2px;\n          }\n        }\n\n        &.ant-radio-wrapper-checked {\n          .ant-radio-inner { border-color: #29b3ff; }\n        }\n      }\n    }\n  }\n}\n\n/* 人员分组 */\n.person-group {\n  margin-bottom: 14px;\n}\n\n.group-title {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  font-size: 12px;\n  color: #29b3ff;\n  margin: 8px 0 6px;\n\n  .group-icon {\n    width: 12px;\n    height: 12px;\n    background: url('/@/assets/service/videoDes.png') center/contain no-repeat;\n  }\n}\n\n.person-list {\n  background: rgba(41, 179, 255, 0.12);\n  border-radius: 2px;\n  width: 96%;\n  margin: 0 auto;\n}\n\n.person-row {\n  display: flex;\n  align-items: center;\n  height: 28px;\n  font-size: 11px;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.06);\n\n  &:last-child { border-bottom: none; }\n\n  .p-name {\n    width: 20%;\n    padding-left: 8px;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  .p-status {\n    width: 22%;\n    text-align: center;\n  }\n\n  .p-device {\n    width: 50px;\n    text-align: center;\n    cursor: pointer;\n  }\n\n  .p-sign {\n    width: 22%;\n    text-align: center;\n  }\n}\n\n/* ========== 路勤统计 ========== */\n.road-stat-panel {\n  padding: 10px 12px;\n}\n\n.stat-block {\n  .stat-title {\n    font-size: 16px;\n    color: #29b3ff;\n    font-weight: bold;\n    margin-bottom: 8px;\n    padding-bottom: 4px;\n    border-bottom: 1px solid rgba(41, 179, 255, 0.2);\n  }\n}\n\n.stat-cards-3 {\n  display: flex;\n  justify-content: space-around;\n  margin: 10px 0;\n}\n\n.stat-card {\n  text-align: center;\n\n  .sc-num {\n    font-size: 22px;\n    font-weight: bold;\n    color: #29b3ff;\n    line-height: 1.2;\n  }\n\n  .sc-bar {\n    width: 40px;\n    height: 3px;\n    margin: 4px auto;\n    background: linear-gradient(90deg, transparent 0%, #29b3ff 50%, transparent 100%);\n  }\n\n  .sc-label {\n    font-size: 12px;\n    color: #7aabc6;\n  }\n\n  .sc-sub {\n    font-size: 10px;\n    color: #7aabc6;\n    margin-top: 2px;\n  }\n}\n\n.rate-row {\n  display: flex;\n  justify-content: space-around;\n  margin-top: 10px;\n  padding-top: 10px;\n  border-top: 1px solid rgba(41, 179, 255, 0.1);\n}\n\n.rate-item {\n  text-align: center;\n\n  .sc-num {\n    font-size: 20px;\n    font-weight: bold;\n    color: #44fffd;\n  }\n\n  .sc-bar {\n    width: 30px;\n    height: 2px;\n    margin: 3px auto;\n    background: linear-gradient(90deg, transparent 0%, #44fffd 50%, transparent 100%);\n  }\n\n  .sc-label {\n    font-size: 12px;\n    color: #7aabc6;\n  }\n}\n\n/* 环形图 */\n.ring-chart-container {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin: 10px 0;\n}\n\n.ring-chart {\n  width: 160px;\n  height: 160px;\n}\n\n.ring-legend {\n  width: 100px;\n\n  .legend-item {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 11px;\n    color: #eaf8ff;\n    margin-bottom: 6px;\n  }\n\n  .legend-dot {\n    width: 8px;\n    height: 8px;\n    border-radius: 2px;\n    flex-shrink: 0;\n  }\n\n  .legend-name {\n    flex: 1;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n\n  .legend-value {\n    color: #29b3ff;\n    font-weight: bold;\n  }\n}\n\n/* ========== 右下底部面板 ========== */\n.right-bottom-panel {\n  position: absolute;\n  right: 60px;\n  bottom: 80px;\n  width: 420px;\n  height: 260px;\n  z-index: 10;\n  background: linear-gradient(180deg, rgba(10, 26, 41, 0.95) 0%, rgba(10, 26, 41, 0.85) 100%);\n  border: 1px solid rgba(41, 179, 255, 0.3);\n  border-radius: 4px;\n  backdrop-filter: blur(4px);\n  padding: 8px 12px;\n  box-sizing: border-box;\n}\n\n.rb-title {\n  font-size: 16px;\n  color: #29b3ff;\n  font-weight: bold;\n  margin-bottom: 6px;\n  padding-bottom: 4px;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.2);\n}\n\n.line-chart-container {\n  width: 100%;\n  height: calc(100% - 40px);\n}\n\n.line-chart {\n  width: 100%;\n  height: 100%;\n}\n\n/* 异常班次表 */\n.abnormal-table {\n  height: calc(100% - 40px);\n  display: flex;\n  flex-direction: column;\n}\n\n.abnormal-head, .abnormal-body {\n  font-size: 12px;\n}\n\n.abnormal-head {\n  display: flex;\n  background: rgba(41, 179, 255, 0.2);\n  color: #29b3ff;\n  font-weight: bold;\n  flex-shrink: 0;\n\n  .ah {\n    height: 28px;\n    line-height: 28px;\n    text-align: center;\n    padding: 0 6px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n.ah-1 { width: 30%; }\n.ah-2 { width: 30%; }\n.ah-3 { width: 40%; }\n\n.abnormal-body {\n  flex: 1;\n  overflow-y: auto;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n.abnormal-row {\n  display: flex;\n  color: #eaf8ff;\n\n  &:nth-child(odd) { background: rgba(41, 179, 255, 0.08); }\n  &:nth-child(even) { background: rgba(41, 179, 255, 0.12); }\n  &:hover { background: rgba(41, 179, 255, 0.2); }\n\n  .ah {\n    height: 28px;\n    line-height: 28px;\n    text-align: center;\n    padding: 0 6px;\n    box-sizing: border-box;\n    overflow: hidden;\n    white-space: nowrap;\n    text-overflow: ellipsis;\n  }\n}\n\n/* ========== 日期选择器 ========== */\n.date-container {\n  position: absolute;\n  top: 100px;\n  left: 50%;\n  transform: translateX(-50%);\n  z-index: 10;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n\n  :deep(.dark-date-picker) {\n    .ant-picker {\n      background: rgba(10, 26, 41, 0.9);\n      border: 1px solid #29b3ff;\n      color: #fff;\n      border-radius: 2px;\n\n      .ant-picker-input {\n        input { color: #fff; font-size: 13px; }\n        .ant-picker-suffix { color: #29b3ff; }\n        .ant-picker-clear {\n          background: rgba(10, 26, 41, 0.9);\n          color: #7aabc6;\n        }\n      }\n    }\n  }\n}\n\n.now-btn {\n  width: 60px;\n  height: 30px;\n  line-height: 30px;\n  text-align: center;\n  font-size: 12px;\n  color: #fff;\n  background-image: url('/@/assets/map_image/goScreenBg.png');\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n  cursor: pointer;\n}\n\n/* ========== 弹窗通用 ========== */\n.post-info-modal, .icon-desc-modal {\n  position: fixed;\n  top: 0; left: 0; right: 0; bottom: 0;\n  background: rgba(0, 0, 0, 0.6);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  z-index: 1000;\n}\n\n.post-info-dialog, .icon-desc-dialog {\n  background: linear-gradient(180deg, #0a1a29 0%, #0d2137 100%);\n  border: 1px solid #29b3ff;\n  border-radius: 4px;\n  min-width: 400px;\n  max-height: 80vh;\n  overflow: hidden;\n  display: flex;\n  flex-direction: column;\n}\n\n.dialog-head {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 10px 16px;\n  font-size: 15px;\n  color: #29b3ff;\n  font-weight: bold;\n  border-bottom: 1px solid rgba(41, 179, 255, 0.3);\n\n  .close-btn {\n    font-size: 22px;\n    color: #7aabc6;\n    cursor: pointer;\n    line-height: 1;\n\n    &:hover { color: #ff6b6b; }\n  }\n}\n\n.dialog-body {\n  padding: 14px 16px;\n  overflow-y: auto;\n  flex: 1;\n\n  &::-webkit-scrollbar { width: 4px; }\n  &::-webkit-scrollbar-thumb {\n    background: rgba(41, 179, 255, 0.3);\n    border-radius: 2px;\n  }\n}\n\n/* 岗位信息 */\n.info-section {\n  margin-bottom: 6px;\n\n  .section-title {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 13px;\n    color: #29b3ff;\n    margin-bottom: 8px;\n\n    .section-icon {\n      width: 12px;\n      height: 12px;\n      background: url('/@/assets/service/videoDes.png') center/contain no-repeat;\n    }\n  }\n}\n\n.info-row {\n  display: flex;\n  margin-bottom: 6px;\n  font-size: 13px;\n\n  .info-label {\n    color: #7aabc6;\n    min-width: 80px;\n    flex-shrink: 0;\n  }\n\n  .info-value {\n    color: #eaf8ff;\n    flex: 1;\n  }\n}\n\n.schedule-list {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n\n.sched-item {\n  padding: 8px 10px;\n  background: rgba(41, 179, 255, 0.08);\n  border: 1px solid rgba(41, 179, 255, 0.15);\n  border-radius: 2px;\n\n  .sched-name {\n    font-size: 13px;\n    color: #29b3ff;\n    font-weight: bold;\n    margin-bottom: 4px;\n  }\n\n  .sched-time {\n    font-size: 12px;\n    color: #7aabc6;\n    margin-bottom: 4px;\n  }\n\n  .sched-people {\n    font-size: 12px;\n    color: #eaf8ff;\n  }\n}\n\n/* 图标说明 */\n.icon-desc-dialog {\n  min-width: 200px;\n}\n\n.icon-desc-body {\n  padding: 16px 20px;\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n}\n\n.icon-desc-row {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  font-size: 13px;\n  color: #eaf8ff;\n\n  .desc-dot {\n    width: 12px;\n    height: 12px;\n    border-radius: 50%;\n  }\n}\n</style>\n\n"},"isError":false}}}],"role":"user"},"invocation_id":"e-a5956bec-6f8a-451f-b787-adfb9dfce554","author":"my_agent","actions":{"state_delta":{},"artifact_delta":{},"requested_auth_configs":{},"requested_tool_confirmations":{}},"node_info":{"path":"my_agent@1"},"id":"e51185af-38cf-4a14-af39-f70d0946ad7f","timestamp":1785486245.5288663}


