From c89dd113d8573a10a9e666785b8be5d4c3ef511d Mon Sep 17 00:00:00 2001
From: ali <ali9696@163.com>
Date: 星期一, 24 二月 2025 15:05:27 +0800
Subject: [PATCH] Merge branch 'develop1.0' into develop_alioo

---
 readme/img/统计指标.png                                                                                       |    0 
 .gitignore                                                                                                |    8 
 package-lock.json                                                                                         |    6 
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java     |   62 +
 zhitan-vue/src/views/poweranalysis/perPassu/index.vue                                                     |  594 ++++++++++++++++
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java |  183 +++++
 zhitan-vue/src/views/poweranalysis/pariPassu/index.vue                                                    |  592 ++++++++++++++++
 zhitan-generator/src/main/java/com/zhitan/generator/config/GenConfig.java                                 |   47 
 zhitan-system/src/.DS_Store                                                                               |    0 
 readme/img/计算公式.png                                                                                       |    0 
 readme/logo-chinese.png                                                                                   |    0 
 zhitan-common/src/.DS_Store                                                                               |    0 
 zhitan-generator/.DS_Store                                                                                |    0 
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java             |   49 +
 zhitan-vue/vite.config.js                                                                                 |    2 
 readme/img/1-登录页.png                                                                                      |    0 
 zhitan-common/.DS_Store                                                                                   |    0 
 zhitan-vue/.env.development                                                                               |   10 
 zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java         |    9 
 LICENSE                                                                                                   |  213 +++++
 zhitan-admin/src/main/java/com/zhitan/web/core/config/SwaggerConfig.java                                  |    6 
 zhitan-vue/.gitignore                                                                                     |    3 
 readme/img/模型配置.png                                                                                       |    0 
 zhitan-vue/src/api/energyAnalysis/energyAnalysis.js                                                       |   16 
 readme/img/image.png                                                                                      |    0 
 README.md                                                                                                 |   50 +
 zhitan-admin/src/.DS_Store                                                                                |    0 
 zhitan-system/.DS_Store                                                                                   |    0 
 zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java                                      |   71 -
 /dev/null                                                                                                 |   92 --
 readme/img/指标配置.png                                                                                       |    0 
 zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java    |   30 
 zhitan-quartz/src/main/java/com/zhitan/quartz/controller/SysJobController.java                            |  104 -
 zhitan-quartz/.DS_Store                                                                                   |    0 
 34 files changed, 1,882 insertions(+), 265 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5f073e0..e608c29 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,12 @@
 
 ######################################################################
 # IDE
+.DS_Store
+/.DS_Store
+zhitan-admin/.DS_Store
+zhitan-admin/src/.DS_Store
+zhitan-system/.DS_Store
+zhitan-system/src/.DS_Store
 
 ### STS ###
 .apt_generated
@@ -46,4 +52,6 @@
 !*/build/*.html
 !*/build/*.xml
 
+*/.DS_Store
+
 uploadPath
diff --git a/LICENSE b/LICENSE
index 204d22b..261eeb9 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,20 +1,201 @@
-The MIT License (MIT)
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
 
-Copyright (c) 2018 admin
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
+   1. Definitions.
 
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.md b/README.md
index 204f42c..f996849 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,50 @@
+<div align="center">
+    <img src="readme/logo-chinese.png" alt="杈撳叆鍥剧墖璇存槑" height="150" width="150">
+</div>
 <h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">鏅虹⒊鑳芥簮绠$悊绯荤粺</h1>
 <h4 align="center">鍩轰簬SpringBoot鍜岃嫢渚濇鏋跺紑鍙�</h4>
 <p align="center">
     <a href='https://gitee.com/ustcyc/zhitan-ems/stargazers'><img src='https://gitee.com/ustcyc/zhitan-ems/badge/star.svg?theme=dark' alt='star'></img></a>
     <a href='https://gitee.com/ustcyc/zhitan-ems/members'><img src='https://gitee.com/ustcyc/zhitan-ems/badge/fork.svg?theme=dark' alt='fork'></img></a>
-	<a href="https://gitee.com/y_project/RuoYi/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
 </p>
 
 ## 浠嬬粛
-閫氳繃鐗╄仈缃戞妧鏈紝閲囬泦浼佷笟姘淬�佺數銆佹皵銆佺儹绛夎兘鑰楁暟鎹紝甯紒涓氬缓绔嬭兘婧愮鐞嗕綋绯伙紝鎵惧埌璺戝啋婊存紡锛屼粠鑰屼负浼佷笟鑺傝兘鎻愪緵渚濇嵁銆�
-杩涗竴姝ヤ负浼佷笟瀹炵幇纰宠窡韪�佺⒊鐩樻煡銆佺⒊浜ゆ槗銆佽皥姹囨姤鐨勫叏鐢熷懡杩囩▼銆� 涓轰腑鍥界⒊杈惧嘲-纰充腑鍜屽仛鍑鸿础鐚��
+鑳芥簮绠$悊绯荤粺锛岄噰闆嗕紒涓氭按銆佺數銆佹皵銆佺儹绛夎兘鑰楁暟鎹紝甯紒涓氬缓绔嬭兘婧愮鐞嗕綋绯伙紝鎵惧埌璺戝啋婊存紡锛屼粠鑰屼负浼佷笟鑺傝兘鎻愪緵渚濇嵁銆�
+杩涗竴姝ヤ负浼佷笟瀹炵幇纰宠窡韪�佺⒊鐩樻煡銆佺⒊浜ゆ槗銆佺⒊姹囨姤鐨勫叏鐢熷懡杩囩▼銆� 涓轰腑鍥界⒊杈惧嘲-纰充腑鍜屽仛鍑鸿础鐚��
+
 閽堝瀹㈡埛鍦烘櫙锛氭斂搴溿�佸洯鍖恒�佷紒涓氥�佸伐鐭裤�佸叕鍏卞缓绛戠瓑銆�
 
 
 澧欏唴浠撳簱鍦板潃锛堢爜浜戯級锛歨ttps://gitee.com/ustcyc/zhitan-ems
 
-
 宸插悓姝ユ洿鏂板埌github浠撳簱锛歨ttps://github.com/Andy-Yin/zhitan-ems
+
+
+## 鍦ㄧ嚎浣撻獙
+
+- guestUser/guest@123456
+
+婕旂ず鍦板潃锛歨ttps://demo-ems.zhitancloud.com/  
+
 
 ## 妗嗘灦锛�
 
-鍩轰簬SpringBoot鐨勮嫢渚濇鏋� 鏄撹鏄撴噦銆佺晫闈㈢畝娲佺編瑙傘��   
-鍏崇郴鏁版嵁搴擄細mysql 鎴栬�� postgredb   
+鍩轰簬SpringBoot鐨勮嫢渚濇鏋� 鏄撹鏄撴噦銆佺晫闈㈢畝娲佺編瑙傘�傛敮鎸佹繁鑹�&娴呰壊涓ょ椋庢牸鍒囨崲锛堟紨绀虹郴缁熷彸涓婅锛�   
+鍏崇郴鏁版嵁搴擄細postgresql锛坢ysql闇�鑷閫傞厤锛宮ysql鎬ц兘澶樊浜嗭級   
 鏃跺簭鏁版嵁搴擄細influxdb 2.7+  
 涓棿浠讹細redis锛宮q  
 VUE鐗堟湰锛歏UE 3
 
-## 鏁版嵁椹卞姩鐨勮绠楁ā鍨嬪拰涓氬姟妯″瀷閰嶇疆
-鏀寔鍔ㄦ�佺偣浣嶉厤缃�佹暟鎹ā鍨嬨�佷笟鍔℃ā鍨嬬瓑銆� 
+## 鐗硅壊锛氭暟鎹┍鍔ㄧ殑璁$畻妯″瀷鍜屼笟鍔℃ā鍨嬮厤缃�
+1.  鏀寔鍔ㄦ�佺偣浣嶉厤缃��
+![杈撳叆鍥剧墖璇存槑](readme/img/鎸囨爣閰嶇疆.png)
+2.  鏀寔璁$畻鍏紡銆�
+![杈撳叆鍥剧墖璇存槑](readme/img/璁$畻鍏紡.png)
+3.  鏀寔妯″瀷閰嶇疆銆佸寘鎷暟鎹ā鍨嬨�佷笟鍔℃ā鍨嬨��
+![杈撳叆鍥剧墖璇存槑](readme/img/妯″瀷閰嶇疆.png)
+4.  澶嶆潅椤圭洰搴曞眰浠g爜&鏁版嵁缁撴瀯瀹屽叏涓嶉渶瑕佸彉鍖栵紝鍙揩閫熶氦浠樺疄鏂姐��
+5.  宸插畬鎴愭爣鍑嗗寲鐨勭綉鍏�&鐢佃〃绛夐噰闆嗚澶囧鎺ワ紝蹇�熶负瀹㈡埛杞‖浠朵竴浣撳寲浜や粯銆�
 
-## 鍦ㄧ嚎浣撻獙
-
-- guestUser/guestUser  
-
-婕旂ず鍦板潃锛歨ttps://demo-ems.zhitancloud.com/  
 
 ## 浜偣鍔熻兘
 ![杈撳叆鍥剧墖璇存槑](readme/浜偣鍔熻兘.png)
@@ -42,7 +54,7 @@
 2.  瀹炴椂鏁版嵁鐩戞祴  
     2.1.  瀹炴椂鏁版嵁鏌ョ湅  
     2.2.  缁勬�佸浘鍒嗘瀽锛坰vg 鍥剧粦瀹氾級
-3. 鍘嗗彶鏁版嵁鍒嗘瀽
+3. 鍘嗗彶鐐逛綅鍒嗘瀽
 4. 缁煎悎鎸囨爣鍒嗘瀽  
    4.1.  缁煎悎鎸囨爣鍒嗘瀽锛堟棩锛�  
    4.2.  缁煎悎鎸囨爣鍒嗘瀽锛堟湀锛�  
@@ -61,6 +73,7 @@
 8. 鑳借�楀姣斿垎鏋愶紙鍚勮兘婧愬搧绉嶏級  
    8.1.  鐢靛悓鐜瘮鍒嗘瀽      
    8.2.  姘村悓鐜瘮鍒嗘瀽
+   8.3.  鍏朵粬鑳芥簮鍝佺鍒嗘瀽
 9. 鏅鸿兘鎶ヨ  
    9.1.  鎶ヨ鍒嗘瀽        
    9.2.  鎶ヨ閰嶇疆
@@ -111,6 +124,15 @@
 ![杈撳叆鍥剧墖璇存槑](readme/鎶�鏈灦鏋�-1.png)
 ![杈撳叆鍥剧墖璇存槑](readme/鎶�鏈灦鏋�.png)
 
+## 娌熼�氫氦娴�
+
+鎵爜娣诲姞寰俊浜ゆ祦锛屽姞寰俊璇峰娉細ems銆�
+
+<p align="center">
+  <img src="readme/img/image.png" width=50% height=50%>
+</p>
+
+
 ## 鍙備笌璐$尞
 
 1.  Fork 鏈粨搴�
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..56b8aee
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,6 @@
+{
+  "name": "zhitan-ems",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {}
+}
diff --git "a/readme/img/1-\347\231\273\345\275\225\351\241\265.png" "b/readme/img/1-\347\231\273\345\275\225\351\241\265.png"
index 40e9eba..bf7816b 100644
--- "a/readme/img/1-\347\231\273\345\275\225\351\241\265.png"
+++ "b/readme/img/1-\347\231\273\345\275\225\351\241\265.png"
Binary files differ
diff --git a/readme/img/image.png b/readme/img/image.png
new file mode 100644
index 0000000..0521eaa
--- /dev/null
+++ b/readme/img/image.png
Binary files differ
diff --git "a/readme/img/\346\214\207\346\240\207\351\205\215\347\275\256.png" "b/readme/img/\346\214\207\346\240\207\351\205\215\347\275\256.png"
new file mode 100644
index 0000000..80da8ae
--- /dev/null
+++ "b/readme/img/\346\214\207\346\240\207\351\205\215\347\275\256.png"
Binary files differ
diff --git "a/readme/img/\346\250\241\345\236\213\351\205\215\347\275\256.png" "b/readme/img/\346\250\241\345\236\213\351\205\215\347\275\256.png"
new file mode 100644
index 0000000..6a77de9
--- /dev/null
+++ "b/readme/img/\346\250\241\345\236\213\351\205\215\347\275\256.png"
Binary files differ
diff --git "a/readme/img/\347\273\237\350\256\241\346\214\207\346\240\207.png" "b/readme/img/\347\273\237\350\256\241\346\214\207\346\240\207.png"
new file mode 100644
index 0000000..c2421ff
--- /dev/null
+++ "b/readme/img/\347\273\237\350\256\241\346\214\207\346\240\207.png"
Binary files differ
diff --git "a/readme/img/\350\256\241\347\256\227\345\205\254\345\274\217.png" "b/readme/img/\350\256\241\347\256\227\345\205\254\345\274\217.png"
new file mode 100644
index 0000000..5c90a8f
--- /dev/null
+++ "b/readme/img/\350\256\241\347\256\227\345\205\254\345\274\217.png"
Binary files differ
diff --git a/readme/logo-chinese.png b/readme/logo-chinese.png
new file mode 100644
index 0000000..5c08b1c
--- /dev/null
+++ b/readme/logo-chinese.png
Binary files differ
diff --git a/zhitan-admin/src/.DS_Store b/zhitan-admin/src/.DS_Store
new file mode 100644
index 0000000..0d5f426
--- /dev/null
+++ b/zhitan-admin/src/.DS_Store
Binary files differ
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
index af79e0b..b3028e2 100644
--- a/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
+++ b/zhitan-admin/src/main/java/com/zhitan/web/controller/statisticalAnalysis/EnergyDataItemController.java
@@ -1,9 +1,12 @@
 package com.zhitan.web.controller.statisticalAnalysis;
 
 import com.zhitan.common.annotation.Log;
+import com.zhitan.common.constant.CommonConst;
 import com.zhitan.common.core.domain.AjaxResult;
 import com.zhitan.dataitem.service.IDataItemService;
 import com.zhitan.statisticalAnalysis.domain.dto.FlowChartsDTO;
+import com.zhitan.statisticalAnalysis.domain.vo.QueryCompareRequest;
+import com.zhitan.statisticalAnalysis.service.IEnergyConsumeDataService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +27,9 @@
     @Autowired
     private IDataItemService dataItemService;
 
+    @Autowired
+    private IEnergyConsumeDataService energyConsumeDataService;
+
     /**
      * 鑾峰彇鑳芥祦鍥惧舰鍒嗘瀽
      *
@@ -36,4 +42,28 @@
     public AjaxResult getFlowCharts(@Validated FlowChartsDTO dto) {
         return AjaxResult.success(dataItemService.getFlowCharts(dto));
     }
+
+    @Log(title = "鑳借�楃粺璁″垎鏋�-鑾峰彇鍚屾瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @ApiOperation(value = "鑳借�楃粺璁″垎鏋�-鑾峰彇鍚屾瘮鍒嗘瀽鍒楄〃鏁版嵁", notes = "鑳借�楃粺璁″垎鏋�-鑾峰彇鍚屾瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @GetMapping(value = "/querySameCompareList")
+    public AjaxResult querySameCompareList(@Validated QueryCompareRequest queryCompareRequest) {
+        return AjaxResult.success(energyConsumeDataService.listEnergyTypeYoyInfo(queryCompareRequest, CommonConst.ENERGY_COMPARISON_YOY));
+    }
+
+    /**
+     * 鑾峰彇鐜瘮鍒嗘瀽鏁版嵁
+     * <p>
+     * 閫氳繃鑷繁鐨勬湇鍔¤闂湴鍧�锛歨ttp://localhost:7005/fengniao/energyDataItem/queryLoopCompare?timeType=1
+     * 閫氳繃缃戝叧璁块棶鍦板潃锛歨ttp://localhost:9999/jeecg-fengniao/fengniao/energyDataItem/queryLoopCompare?timeType=1
+     *
+     * @param queryCompareRequest
+     * @return
+     */
+    @Log(title = "鑳借�楃粺璁″垎鏋�-鑾峰彇鐜瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @ApiOperation(value = "鑳借�楃粺璁″垎鏋�-鑾峰彇鐜瘮鍒嗘瀽鍒楄〃鏁版嵁", notes = "鑳借�楃粺璁″垎鏋�-鑾峰彇鐜瘮鍒嗘瀽鍒楄〃鏁版嵁")
+    @GetMapping(value = "/queryLoopCompareList")
+    public AjaxResult queryLoopCompareList(@Validated QueryCompareRequest queryCompareRequest) {
+
+        return AjaxResult.success(energyConsumeDataService.listEnergyTypeYoyInfo(queryCompareRequest, CommonConst.ENERGY_COMPARISON_MOM));
+    }
 }
diff --git a/zhitan-admin/src/main/java/com/zhitan/web/core/config/SwaggerConfig.java b/zhitan-admin/src/main/java/com/zhitan/web/core/config/SwaggerConfig.java
index 540acc0..aba5d1d 100644
--- a/zhitan-admin/src/main/java/com/zhitan/web/core/config/SwaggerConfig.java
+++ b/zhitan-admin/src/main/java/com/zhitan/web/core/config/SwaggerConfig.java
@@ -115,11 +115,11 @@
         // 鐢ˋpiInfoBuilder杩涜瀹氬埗
         return new ApiInfoBuilder()
                 // 璁剧疆鏍囬
-                .title("鏍囬:鍚庡彴绠$悊绯荤粺_鎺ュ彛鏂囨。")
+                .title("鏅虹⒊_鑳芥簮绠$悊绯荤粺_鎺ュ彛鏂囨。")
                 // 鎻忚堪
-                .description("鎻忚堪:鎺ュ彛鏂囨。")
+                .description("閲囬泦浼佷笟姘淬�佺數銆佹皵銆佺儹绛夎兘鑰楁暟鎹紱甯姪浼佷笟寤虹珛鑳芥簮绠$悊浣撶郴锛屾壘鍒拌窇鍐掓淮婕忥紝涓轰紒涓氳妭鑳芥彁渚涙暟鎹敮鎾戯紱涓轰紒涓氬疄鐜扮⒊璺熻釜銆佺⒊鐩樻煡銆佺⒊浜ゆ槗銆佺⒊姹囨姤鐨勫叏鐢熷懡杩囩▼锛涗负涓浗纰宠揪宄�-纰充腑鍜屽仛鍑鸿础鐚紒")
                 // 浣滆�呬俊鎭�
-                .contact(new Contact(baseConfig.getName(), null, null))
+                .contact(new Contact(baseConfig.getName(), "https://www.zhitancloud.com", "yin.cun@qq.com"))
                 // 鐗堟湰
                 .version("鐗堟湰鍙�:" + baseConfig.getVersion())
                 .build();
diff --git a/zhitan-common/.DS_Store b/zhitan-common/.DS_Store
new file mode 100644
index 0000000..d52fba7
--- /dev/null
+++ b/zhitan-common/.DS_Store
Binary files differ
diff --git a/zhitan-common/src/.DS_Store b/zhitan-common/src/.DS_Store
new file mode 100644
index 0000000..8fef99f
--- /dev/null
+++ b/zhitan-common/src/.DS_Store
Binary files differ
diff --git a/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java b/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java
index 04ee184..f7530a2 100644
--- a/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java
+++ b/zhitan-common/src/main/java/com/zhitan/common/config/BaseConfig.java
@@ -5,29 +5,40 @@
 
 /**
  * 璇诲彇椤圭洰鐩稿叧閰嶇疆
- * 
+ *
  * @author zhitan
  */
 @Component
 @ConfigurationProperties(prefix = "base")
-public class BaseConfig
-{
-    /** 椤圭洰鍚嶇О */
+public class BaseConfig {
+    /**
+     * 椤圭洰鍚嶇О
+     */
     private String name;
 
-    /** 鐗堟湰 */
+    /**
+     * 鐗堟湰
+     */
     private String version;
 
-    /** 鐗堟潈骞翠唤 */
+    /**
+     * 鐗堟潈骞翠唤
+     */
     private String copyrightYear;
 
-    /** 涓婁紶璺緞 */
+    /**
+     * 涓婁紶璺緞
+     */
     private static String profile;
 
-    /** 鑾峰彇鍦板潃寮�鍏� */
+    /**
+     * 鑾峰彇鍦板潃寮�鍏�
+     */
     private static boolean addressEnabled;
 
-    /** 楠岃瘉鐮佺被鍨� */
+    /**
+     * 楠岃瘉鐮佺被鍨�
+     */
     private static String captchaType;
 
     /**
@@ -36,53 +47,43 @@
     private String domainName;
 
 
-    public String getName()
-    {
+    public String getName() {
         return name;
     }
 
-    public void setName(String name)
-    {
+    public void setName(String name) {
         this.name = name;
     }
 
-    public String getVersion()
-    {
+    public String getVersion() {
         return version;
     }
 
-    public void setVersion(String version)
-    {
+    public void setVersion(String version) {
         this.version = version;
     }
 
-    public String getCopyrightYear()
-    {
+    public String getCopyrightYear() {
         return copyrightYear;
     }
 
-    public void setCopyrightYear(String copyrightYear)
-    {
+    public void setCopyrightYear(String copyrightYear) {
         this.copyrightYear = copyrightYear;
     }
 
-    public static String getProfile()
-    {
+    public static String getProfile() {
         return profile;
     }
 
-    public void setProfile(String profile)
-    {
+    public void setProfile(String profile) {
         BaseConfig.profile = profile;
     }
 
-    public static boolean isAddressEnabled()
-    {
+    public static boolean isAddressEnabled() {
         return addressEnabled;
     }
 
-    public void setAddressEnabled(boolean addressEnabled)
-    {
+    public void setAddressEnabled(boolean addressEnabled) {
         BaseConfig.addressEnabled = addressEnabled;
     }
 
@@ -97,32 +98,28 @@
     /**
      * 鑾峰彇瀵煎叆涓婁紶璺緞
      */
-    public static String getImportPath()
-    {
+    public static String getImportPath() {
         return getProfile() + "/import";
     }
 
     /**
      * 鑾峰彇澶村儚涓婁紶璺緞
      */
-    public static String getAvatarPath()
-    {
+    public static String getAvatarPath() {
         return getProfile() + "/avatar";
     }
 
     /**
      * 鑾峰彇涓嬭浇璺緞
      */
-    public static String getDownloadPath()
-    {
+    public static String getDownloadPath() {
         return getProfile() + "/download/";
     }
 
     /**
      * 鑾峰彇涓婁紶璺緞
      */
-    public static String getUploadPath()
-    {
+    public static String getUploadPath() {
         return getProfile() + "/upload";
     }
 
diff --git a/zhitan-generator/.DS_Store b/zhitan-generator/.DS_Store
new file mode 100644
index 0000000..9c98af2
--- /dev/null
+++ b/zhitan-generator/.DS_Store
Binary files differ
diff --git a/zhitan-generator/src/main/java/com/zhitan/generator/config/GenConfig.java b/zhitan-generator/src/main/java/com/zhitan/generator/config/GenConfig.java
index 4988259..dad763c 100644
--- a/zhitan-generator/src/main/java/com/zhitan/generator/config/GenConfig.java
+++ b/zhitan-generator/src/main/java/com/zhitan/generator/config/GenConfig.java
@@ -7,67 +7,66 @@
 
 /**
  * 璇诲彇浠g爜鐢熸垚鐩稿叧閰嶇疆
- * 
+ *
  * @author zhitan
  */
 @Component
 @ConfigurationProperties(prefix = "gen")
-@PropertySource(value = { "classpath:generator.yml" })
-public class GenConfig
-{
-    /** 浣滆�� */
+@PropertySource(value = {"classpath:generator.yml"})
+public class GenConfig {
+    /**
+     * 浣滆��
+     */
     public static String author;
 
-    /** 鐢熸垚鍖呰矾寰� */
+    /**
+     * 鐢熸垚鍖呰矾寰�
+     */
     public static String packageName;
 
-    /** 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸false */
+    /**
+     * 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸false
+     */
     public static boolean autoRemovePre;
 
-    /** 琛ㄥ墠缂�(绫诲悕涓嶄細鍖呭惈琛ㄥ墠缂�) */
+    /**
+     * 琛ㄥ墠缂�(绫诲悕涓嶄細鍖呭惈琛ㄥ墠缂�)
+     */
     public static String tablePrefix;
 
-    public static String getAuthor()
-    {
+    public static String getAuthor() {
         return author;
     }
 
     @Value("${author}")
-    public void setAuthor(String author)
-    {
+    public void setAuthor(String author) {
         GenConfig.author = author;
     }
 
-    public static String getPackageName()
-    {
+    public static String getPackageName() {
         return packageName;
     }
 
     @Value("${packageName}")
-    public void setPackageName(String packageName)
-    {
+    public void setPackageName(String packageName) {
         GenConfig.packageName = packageName;
     }
 
-    public static boolean getAutoRemovePre()
-    {
+    public static boolean getAutoRemovePre() {
         return autoRemovePre;
     }
 
     @Value("${autoRemovePre}")
-    public void setAutoRemovePre(boolean autoRemovePre)
-    {
+    public void setAutoRemovePre(boolean autoRemovePre) {
         GenConfig.autoRemovePre = autoRemovePre;
     }
 
-    public static String getTablePrefix()
-    {
+    public static String getTablePrefix() {
         return tablePrefix;
     }
 
     @Value("${tablePrefix}")
-    public void setTablePrefix(String tablePrefix)
-    {
+    public void setTablePrefix(String tablePrefix) {
         GenConfig.tablePrefix = tablePrefix;
     }
 }
diff --git a/zhitan-quartz/.DS_Store b/zhitan-quartz/.DS_Store
new file mode 100644
index 0000000..93d6ade
--- /dev/null
+++ b/zhitan-quartz/.DS_Store
Binary files differ
diff --git a/zhitan-quartz/src/main/java/com/zhitan/quartz/controller/SysJobController.java b/zhitan-quartz/src/main/java/com/zhitan/quartz/controller/SysJobController.java
index 2a35da4..3bdd6a6 100644
--- a/zhitan-quartz/src/main/java/com/zhitan/quartz/controller/SysJobController.java
+++ b/zhitan-quartz/src/main/java/com/zhitan/quartz/controller/SysJobController.java
@@ -1,23 +1,5 @@
 package com.zhitan.quartz.controller;
 
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-
-import com.zhitan.quartz.domain.SysJob;
-import com.zhitan.quartz.service.ISysJobService;
-import com.zhitan.quartz.util.CronUtils;
-import com.zhitan.quartz.util.ScheduleUtils;
-import org.quartz.SchedulerException;
-import javax.annotation.Resource;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.zhitan.common.annotation.Log;
 import com.zhitan.common.constant.Constants;
 import com.zhitan.common.core.controller.BaseController;
@@ -27,16 +9,26 @@
 import com.zhitan.common.exception.job.TaskException;
 import com.zhitan.common.utils.StringUtils;
 import com.zhitan.common.utils.poi.ExcelUtil;
+import com.zhitan.quartz.domain.SysJob;
+import com.zhitan.quartz.service.ISysJobService;
+import com.zhitan.quartz.util.CronUtils;
+import com.zhitan.quartz.util.ScheduleUtils;
+import org.quartz.SchedulerException;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * 璋冨害浠诲姟淇℃伅鎿嶄綔澶勭悊
- * 
+ *
  * @author zhitan
  */
 @RestController
 @RequestMapping("/monitor/job")
-public class SysJobController extends BaseController
-{
+public class SysJobController extends BaseController {
     @Resource
     private ISysJobService jobService;
 
@@ -45,8 +37,7 @@
      */
     @PreAuthorize("@ss.hasPermi('monitor:job:list')")
     @GetMapping("/list")
-    public TableDataInfo list(SysJob sysJob)
-    {
+    public TableDataInfo list(SysJob sysJob) {
         startPage();
         List<SysJob> list = jobService.selectJobList(sysJob);
         return getDataTable(list);
@@ -58,8 +49,7 @@
     @PreAuthorize("@ss.hasPermi('monitor:job:export')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, SysJob sysJob)
-    {
+    public void export(HttpServletResponse response, SysJob sysJob) {
         List<SysJob> list = jobService.selectJobList(sysJob);
         ExcelUtil<SysJob> util = new ExcelUtil<SysJob>(SysJob.class);
         util.exportExcel(response, list, "瀹氭椂浠诲姟");
@@ -70,8 +60,7 @@
      */
     @PreAuthorize("@ss.hasPermi('monitor:job:query')")
     @GetMapping(value = "/{jobId}")
-    public AjaxResult getInfo(@PathVariable("jobId") Long jobId)
-    {
+    public AjaxResult getInfo(@PathVariable("jobId") Long jobId) {
         return success(jobService.selectJobById(jobId));
     }
 
@@ -81,30 +70,18 @@
     @PreAuthorize("@ss.hasPermi('monitor:job:add')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException
-    {
-        if (!CronUtils.isValid(job.getCronExpression()))
-        {
+    public AjaxResult add(@RequestBody SysJob job) throws SchedulerException, TaskException {
+        if (!CronUtils.isValid(job.getCronExpression())) {
             return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
-        }
-        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
-        {
+        } else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) {
             return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
-        {
+        } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS})) {
             return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
-        {
+        } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.HTTP, Constants.HTTPS})) {
             return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
-        {
+        } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) {
             return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
-        }
-        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
-        {
+        } else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) {
             return error("鏂板浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
         }
         job.setCreateBy(getUsername());
@@ -117,30 +94,18 @@
     @PreAuthorize("@ss.hasPermi('monitor:job:edit')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException
-    {
-        if (!CronUtils.isValid(job.getCronExpression()))
-        {
+    public AjaxResult edit(@RequestBody SysJob job) throws SchedulerException, TaskException {
+        if (!CronUtils.isValid(job.getCronExpression())) {
             return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛孋ron琛ㄨ揪寮忎笉姝g‘");
-        }
-        else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI))
-        {
+        } else if (StringUtils.containsIgnoreCase(job.getInvokeTarget(), Constants.LOOKUP_RMI)) {
             return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'rmi'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS }))
-        {
+        } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.LOOKUP_LDAP, Constants.LOOKUP_LDAPS})) {
             return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'ldap(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[] { Constants.HTTP, Constants.HTTPS }))
-        {
+        } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), new String[]{Constants.HTTP, Constants.HTTPS})) {
             return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅厑璁�'http(s)'璋冪敤");
-        }
-        else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR))
-        {
+        } else if (StringUtils.containsAnyIgnoreCase(job.getInvokeTarget(), Constants.JOB_ERROR_STR)) {
             return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆瀛樺湪杩濊");
-        }
-        else if (!ScheduleUtils.whiteList(job.getInvokeTarget()))
-        {
+        } else if (!ScheduleUtils.whiteList(job.getInvokeTarget())) {
             return error("淇敼浠诲姟'" + job.getJobName() + "'澶辫触锛岀洰鏍囧瓧绗︿覆涓嶅湪鐧藉悕鍗曞唴");
         }
         job.setUpdateBy(getUsername());
@@ -153,8 +118,7 @@
     @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
-    public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException
-    {
+    public AjaxResult changeStatus(@RequestBody SysJob job) throws SchedulerException {
         SysJob newJob = jobService.selectJobById(job.getJobId());
         newJob.setStatus(job.getStatus());
         return toAjax(jobService.changeStatus(newJob));
@@ -166,8 +130,7 @@
     @PreAuthorize("@ss.hasPermi('monitor:job:changeStatus')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.UPDATE)
     @PutMapping("/run")
-    public AjaxResult run(@RequestBody SysJob job) throws SchedulerException
-    {
+    public AjaxResult run(@RequestBody SysJob job) throws SchedulerException {
         boolean result = jobService.run(job);
         return result ? success() : error("浠诲姟涓嶅瓨鍦ㄦ垨宸茶繃鏈燂紒");
     }
@@ -178,8 +141,7 @@
     @PreAuthorize("@ss.hasPermi('monitor:job:remove')")
     @Log(title = "瀹氭椂浠诲姟", businessType = BusinessType.DELETE)
     @DeleteMapping("/{jobIds}")
-    public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException
-    {
+    public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException {
         jobService.deleteJobByIds(jobIds);
         return success();
     }
diff --git a/zhitan-system/.DS_Store b/zhitan-system/.DS_Store
new file mode 100644
index 0000000..bb388d5
--- /dev/null
+++ b/zhitan-system/.DS_Store
Binary files differ
diff --git a/zhitan-system/src/.DS_Store b/zhitan-system/src/.DS_Store
new file mode 100644
index 0000000..08dd54b
--- /dev/null
+++ b/zhitan-system/src/.DS_Store
Binary files differ
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java
new file mode 100644
index 0000000..e598661
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/EnergyTypeValueContrastedVO.java
@@ -0,0 +1,62 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鍚勮兘婧愮被鍨嬪�煎悓姣斻�佺幆姣擵O
+ *
+ * @Author: Zhujw
+ * @Date: 2023/2/8
+ */
+@Data
+public class EnergyTypeValueContrastedVO {
+
+    /**
+     * 鐢ㄨ兘鍗曞厓鍚嶇О
+     */
+    @ApiModelProperty(value = "鐢ㄨ兘鍗曞厓鍚嶇О")
+    private String energyUnitName;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷")
+    private String energyType;
+
+    /**
+     * 鏈湡鏃堕棿
+     */
+    @ApiModelProperty(value = "鏈湡鏃堕棿")
+    private String currentTime;
+
+    /**
+     * 鏈湡鍊�
+     */
+    @ApiModelProperty(value = "鏈湡鍊�")
+    private BigDecimal currentValue;
+
+    /**
+     * 瀵规瘮鏃堕棿
+     */
+    @ApiModelProperty(value = "瀵规瘮鏃堕棿")
+    private String compareTime;
+
+    /**
+     * 瀵规瘮鍊�
+     */
+    @ApiModelProperty(value = "瀵规瘮鍊�")
+    private BigDecimal contrastValues;
+
+    /**
+     * 鍚屾瘮鍊�
+     * 鍚屾瘮澧為暱鐜�=锛堟湰鏈熷��-鍘诲勾鍚屾湡鍊硷級/鍘诲勾鍚屾湡鍊济�100%
+     * 鐜瘮鍊�
+     * 鐜瘮澧為暱鐜�=锛堟湰鏈熷��-涓婃湡鍊硷級/涓婃湡鍊济�100%
+     */
+    @ApiModelProperty(value = "鍚屾瘮澧為暱鐜�/鐜瘮澧為暱鐜�")
+    private BigDecimal ratio;
+
+}
\ No newline at end of file
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java
new file mode 100644
index 0000000..71998cb
--- /dev/null
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/domain/vo/QueryCompareRequest.java
@@ -0,0 +1,49 @@
+package com.zhitan.statisticalAnalysis.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @Description: 鏁版嵁鏌ヨ鏉′欢瀹炰綋
+ * @author: yxw
+ * @date: 2022骞�01鏈�28鏃� 14:49
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="QueryCompareRequest", description="鑾峰彇鏁版嵁鐨勫弬鏁板疄浣�")
+public class QueryCompareRequest {
+
+    /**
+     * 鏌ヨ鏃堕棿绫诲瀷,瀵瑰簲甯搁噺绫伙細TimeTypeConst
+     */
+    @NotBlank(message = "鏃堕棿绫诲瀷涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鏌ヨ鏃堕棿绫诲瀷,瀵瑰簲甯搁噺锛欴AY/MONTH/SEASON/YEAR锛岄粯璁ONTH")
+    private String timeType;
+
+    /**
+     * 鏃ユ湡鍊硷紝鏈堜唤(202201-202212)銆佸勾浠�(2022-~)
+     */
+    @NotBlank(message = "鏃堕棿缂栫爜涓嶈兘涓虹┖")
+    @ApiModelProperty(value = "鏃ユ湡鍊硷紝鏈堜唤(202201-202212)銆佸勾浠�(2022-~)")
+    private String timeCode;
+
+    /**
+     * 鑺傜偣Id
+     */
+    @NotBlank(message = "鑺傜偣Id")
+    @ApiModelProperty(value = "鑺傜偣Id")
+    private String nodeId;
+
+    /**
+     * 鑳芥簮绫诲瀷锛岄�氳繃/闅斿紑,water/gas
+     */
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷锛岄�氳繃/闅斿紑,water/gas")
+    private String energyType;
+
+}
\ No newline at end of file
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
index e7c0174..382d099 100644
--- a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/IEnergyConsumeDataService.java
@@ -32,4 +32,13 @@
      * @return
      */
     List<EnergyConsumeTrendDetailItem> listEnergyCostTrendDetail(String timeCode, String timeType, String modelCode, String energyType);
+
+    /**
+     * 鍚屾瘮鐜瘮鍒嗘瀽
+     *
+     * @param req            璇锋眰鍙傛暟
+     * @param comparisonType 瀵规瘮绫诲瀷
+     * @return
+     */
+    public List<EnergyTypeValueContrastedVO> listEnergyTypeYoyInfo(QueryCompareRequest req, String comparisonType);
 }
diff --git a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
index bb3a01f..94fcfe6 100644
--- a/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
+++ b/zhitan-system/src/main/java/com/zhitan/statisticalAnalysis/service/impl/EnergyConsumeDataServiceImpl.java
@@ -1,5 +1,6 @@
 package com.zhitan.statisticalAnalysis.service.impl;
 
+import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.zhitan.basicdata.domain.SysEnergy;
@@ -20,6 +21,7 @@
 import org.apache.commons.lang3.ObjectUtils;
 import com.zhitan.statisticalAnalysis.domain.vo.*;
 import com.zhitan.statisticalAnalysis.service.IEnergyConsumeDataService;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -312,4 +314,185 @@
         costValueList.add(totalCost);
         accumulationValueList.add(totalAccumulation);
     }
+
+    /**
+     * 鍚屾鐜瘮鍒嗘瀽
+     *
+     * @param req            璇锋眰鍙傛暟
+     * @param comparisonType 瀵规瘮绫诲瀷
+     * @return
+     */
+    @Override
+    public List<EnergyTypeValueContrastedVO> listEnergyTypeYoyInfo(QueryCompareRequest req, String comparisonType) {
+        String energyType = req.getEnergyType();
+        String timeType = req.getTimeType();
+        String timeCode = req.getTimeCode();
+        String nodeId = req.getNodeId();
+        //鑳芥簮绫诲瀷淇℃伅
+        SysEnergy sysEnergy = new SysEnergy();
+        sysEnergy.setEnersno(energyType);
+        List<SysEnergy> sysEnergies = sysEnergyMapper.selectSysEnergyList(sysEnergy);
+        if (sysEnergies.isEmpty()) {
+            throw new RuntimeException("鏈煡璇㈠埌鑳芥簮淇℃伅");
+        }
+        SysEnergy sysEnergyInfo = sysEnergies.get(0);
+
+        // 鑳借�椾俊鎭�
+        Date startTime = DateTimeUtil.getTime(timeType, timeCode);
+        Date endTime = DateTimeUtil.getEndTimeByType(timeType, startTime);
+        //鏄惁鍚屾瘮
+        boolean isYoy = comparisonType.equals(CommonConst.ENERGY_COMPARISON_YOY);
+        // 璁$畻涓婁竴骞寸殑鍚屾湡鏃堕棿
+        Date lastBeginTime = DateUtil.offset(startTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        Date lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        if (!isYoy) {
+            switch (timeType) {
+                case TimeTypeConst.TIME_TYPE_DAY:
+                    lastBeginTime = DateUtil.offsetDay(startTime, CommonConst.DIGIT_MINUS_1);
+                    lastEndTime = DateUtil.offsetDay(endTime, CommonConst.DIGIT_MINUS_1);
+                    break;
+                case TimeTypeConst.TIME_TYPE_MONTH:
+                    lastBeginTime = DateUtil.offsetMonth(startTime, CommonConst.DIGIT_MINUS_1);
+                    lastEndTime = DateUtil.offsetMonth(endTime, CommonConst.DIGIT_MINUS_1);
+                    break;
+            }
+        }
+
+        //鐢碉細鍙湁HOUR鏁版嵁鏈夋晥锛涘叾浠栬兘婧愮被鍨嬶細HOUR銆丏AY鏈夋暟鎹�
+        String queryTimeType = TimeTypeConst.TIME_TYPE_HOUR;
+        List<EnergyConsumeVO> energyConsumeVOList = new ArrayList<>();
+        switch (sysEnergyInfo.getEnersno()) {
+            case "electric":
+                List<ElectricityDataItem> electricityDataItems = peakValleyMapper.getCostTrends(startTime, endTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                List<ElectricityDataItem> lastDataItemList = peakValleyMapper.getCostTrends(lastBeginTime, lastEndTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                if (!lastDataItemList.isEmpty()) {
+                    electricityDataItems.addAll(lastDataItemList);
+                }
+                if (!electricityDataItems.isEmpty()) {
+                    electricityDataItems.forEach(electricityDataItem -> {
+                        EnergyConsumeVO temp = new EnergyConsumeVO();
+                        temp.setDataTime(electricityDataItem.getDataTime());
+                        temp.setAccumulationValue(electricityDataItem.getElectricity());
+                        energyConsumeVOList.add(temp);
+                    });
+                }
+                break;
+            default:
+                if (timeType.equals(TimeTypeConst.TIME_TYPE_MONTH) || timeType.equals(TimeTypeConst.TIME_TYPE_YEAR)) {
+                    queryTimeType = TimeTypeConst.TIME_TYPE_DAY;
+                }
+                List<CarbonEmission> dataItems = dataItemMapper.getMiddleCarbonEmission(startTime, endTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                List<CarbonEmission> lastDataItems = dataItemMapper.getMiddleCarbonEmission(lastBeginTime, lastEndTime, queryTimeType, nodeId, sysEnergyInfo.getEnersno());
+                if (!lastDataItems.isEmpty()) {
+                    dataItems.addAll(lastDataItems);
+                }
+                dataItems.addAll(lastDataItems);
+                if (!dataItems.isEmpty()) {
+                    dataItems.forEach(dataItem -> {
+                        EnergyConsumeVO temp = new EnergyConsumeVO();
+                        temp.setDataTime(dataItem.getDataTime());
+                        temp.setAccumulationValue(new BigDecimal(dataItem.getValue()));
+                        energyConsumeVOList.add(temp);
+                    });
+                }
+                break;
+        }
+        // 缁勮缁熻鍥句俊鎭�
+        return getEnergyTypeValueContrastedVOList(startTime, timeType, energyConsumeVOList, sysEnergyInfo.getEnersno(), isYoy);
+    }
+
+    /**
+     * 缁勮鎴愭湰瓒嬪娍鍒嗘瀽-缁熻鍥句俊鎭�
+     *
+     * @param bsTime     鏃堕棿
+     * @param timeType   鏃堕棿绫诲瀷
+     * @param dataItems  鑳借��
+     * @param energyType 鑳芥簮绫诲瀷
+     * @param isYoy      鏄惁鍚屾瘮
+     */
+    private List<EnergyTypeValueContrastedVO> getEnergyTypeValueContrastedVOList(Date bsTime, String timeType,
+                                                                                 List<EnergyConsumeVO> dataItems, String energyType, boolean isYoy) {
+        Map<String, List<EnergyConsumeVO>> energyConsumeVOMap;
+        Map<String, List<EnergyConsumeVO>> lastEnergyConsumeVOMap;
+        List<EnergyTypeValueContrastedVO> itemList = new ArrayList<>();
+        //鎸夋椂闂寸被鍨嬬粍缁囪繑鍥炴暟鎹�
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_DAY:
+                energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> DateUtil.formatDateTime(li.getDataTime())));
+                for (int i = 0; i < CommonConst.DIGIT_24; i++) {
+                    Date currentTime = DateUtil.offsetHour(bsTime, i);
+                    Date compareTime = isYoy ? DateUtil.offset(currentTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1) : DateUtil.offsetDay(currentTime, CommonConst.DIGIT_MINUS_1);
+                    String keyCurrentTime = DateUtil.formatDateTime(currentTime);
+                    String keyCompareTime = DateUtil.formatDateTime(compareTime);
+                    EnergyTypeValueContrastedVO item = getEnergyTypeValueContrastedVO(energyType, energyConsumeVOMap, keyCurrentTime, keyCompareTime, currentTime, compareTime);
+                    itemList.add(item);
+                }
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> DateUtil.formatDate(li.getDataTime())));
+                Date endTime = DateTimeUtil.getEndTimeByType(timeType, bsTime);
+                while (bsTime.before(endTime)) {
+                    Date currentTime = bsTime;
+                    Date compareTime = isYoy ? DateUtil.offset(currentTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1) : DateUtil.offsetMonth(currentTime, CommonConst.DIGIT_MINUS_1);
+                    String keyCurrentTime = DateUtil.formatDate(currentTime);
+                    String keyCompareTime = DateUtil.formatDate(compareTime);
+                    EnergyTypeValueContrastedVO item = getEnergyTypeValueContrastedVO(energyType, energyConsumeVOMap, keyCurrentTime, keyCompareTime, currentTime, compareTime);
+                    itemList.add(item);
+                    bsTime = DateUtil.offsetDay(bsTime, CommonConst.DIGIT_1);
+                }
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                SimpleDateFormat formatter = new SimpleDateFormat(DateTimeUtil.COMMON_PATTERN_TO_MONTH_ZH);
+                energyConsumeVOMap = dataItems.stream().collect(Collectors.groupingBy(li -> formatter.format(li.getDataTime())));
+                for (int i = 0; i < CommonConst.DIGIT_12; i++) {
+                    Date currentTime = DateUtil.offsetMonth(bsTime, i);
+                    Date compareTime = DateUtil.offset(currentTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+                    String keyCurrentTime = formatter.format(currentTime);
+                    String keyCompareTime = formatter.format(compareTime);
+                    EnergyTypeValueContrastedVO item = getEnergyTypeValueContrastedVO(energyType, energyConsumeVOMap, keyCurrentTime, keyCompareTime, currentTime, compareTime);
+                    itemList.add(item);
+                }
+                break;
+            default:
+                break;
+        }
+        return itemList;
+    }
+
+    private @NotNull EnergyTypeValueContrastedVO getEnergyTypeValueContrastedVO(String energyType, Map<String, List<EnergyConsumeVO>> energyConsumeVOMap,
+                                                                                String keyCurrentTime, String keyCompareTime, Date currentTime, Date compareTime) {
+        List<EnergyConsumeVO> energyConsumeList = Optional.ofNullable(energyConsumeVOMap.get(keyCurrentTime))
+                .orElse(Collections.emptyList());
+        BigDecimal currentValue = calculateSum(energyConsumeList);
+        List<EnergyConsumeVO> lastEnergyConsumeList = Optional.ofNullable(energyConsumeVOMap.get(keyCompareTime))
+                .orElse(Collections.emptyList());
+        BigDecimal contrastValues = calculateSum(lastEnergyConsumeList);
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
+        BigDecimal ratio = calculateRatio(currentValue, contrastValues, multiple);
+        EnergyTypeValueContrastedVO item = new EnergyTypeValueContrastedVO();
+        item.setEnergyType(energyType);
+        item.setCurrentTime(DateUtil.formatDateTime(currentTime));
+        item.setCompareTime(DateUtil.formatDateTime(compareTime));
+        item.setCurrentValue(currentValue);
+        item.setContrastValues(contrastValues);
+        item.setRatio(ratio);
+        return item;
+    }
+
+    private BigDecimal calculateSum(List<EnergyConsumeVO> dataItemList) {
+        return dataItemList.stream()
+                .map(EnergyConsumeVO::getAccumulationValue)
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+    }
+
+    private BigDecimal calculateRatio(BigDecimal currentSum, BigDecimal lastSum, BigDecimal multiple) {
+        if (lastSum.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
+        return currentSum.subtract(lastSum)
+                .divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP)
+                .multiply(multiple)
+                .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+    }
 }
diff --git a/zhitan-vue/.env.development b/zhitan-vue/.env.development
index 849d24c..e2c2499 100644
--- a/zhitan-vue/.env.development
+++ b/zhitan-vue/.env.development
@@ -5,11 +5,7 @@
 VITE_APP_ENV = 'development'
 
 # 绯荤粺/寮�鍙戠幆澧�
-# wangxiang
-# VITE_APP_BASE_API = 'http://127.0.0.1:8080'
-# hangmingjun
-# VITE_APP_BASE_API = 'http://127.0.0.1:8080'
-# weishuaishuai
-# VITE_APP_BASE_API = 'https://demo-ems.zhitancloud.com'
 # test
-VITE_APP_BASE_API = 'http://139.159.201.118:8201'
+VITE_APP_BASE_API = 'http://127.0.0.1:8080'
+# hangmingjun
+
diff --git a/zhitan-vue/.gitignore b/zhitan-vue/.gitignore
index 78a752d..1cfeb88 100644
--- a/zhitan-vue/.gitignore
+++ b/zhitan-vue/.gitignore
@@ -1,4 +1,4 @@
-.DS_Store
+*/.DS_Store
 node_modules/
 dist/
 npm-debug.log*
@@ -6,6 +6,7 @@
 yarn-error.log*
 **/*.log
 
+
 tests/**/coverage/
 tests/e2e/reports
 selenium-debug.log
diff --git a/zhitan-vue/src/api/energyAnalysis/energyAnalysis.js b/zhitan-vue/src/api/energyAnalysis/energyAnalysis.js
index cbb5712..20f6551 100644
--- a/zhitan-vue/src/api/energyAnalysis/energyAnalysis.js
+++ b/zhitan-vue/src/api/energyAnalysis/energyAnalysis.js
@@ -60,3 +60,19 @@
     params: query,
   })
 }
+// 瀵规瘮鍒嗘瀽鍚屾瘮
+export function querySameCompareList(query) {
+  return request({
+    url: "/statisticsAnalysis/querySameCompareList",
+    method: "get",
+    params: query,
+  })
+}
+// 瀵规瘮鍒嗘瀽鐜瘮
+export function queryLoopCompareList(query) {
+  return request({
+    url: "/statisticsAnalysis/queryLoopCompareList",
+    method: "get",
+    params: query,
+  })
+}
diff --git a/zhitan-vue/src/views/energyconservation/policyrule/components/EditModal copy.vue b/zhitan-vue/src/views/energyconservation/policyrule/components/EditModal copy.vue
deleted file mode 100644
index fc5f899..0000000
--- a/zhitan-vue/src/views/energyconservation/policyrule/components/EditModal copy.vue
+++ /dev/null
@@ -1,92 +0,0 @@
-<template>
-    <el-dialog v-model="visible" :title="title" width="600" @close="handleClose">
-        <el-form :model="form" ref="queryRef" :rules="formRules" label-width="120px" v-loading="loading">
-            <el-form-item label="鏂囦欢鏍囬" prop="limitName">
-                <el-input v-model="form.value1" placeholder="璇疯緭鍏ユ枃浠舵爣棰�" />
-            </el-form-item>
-            <el-form-item label="鏂囦欢绫诲埆">
-                <el-select v-model="form.value2" placeholder="璇烽�夋嫨">
-                    <el-option v-for="item in 6" :key="item" :label="item" :value="item">
-                    </el-option>
-                </el-select>
-            </el-form-item>
-
-        </el-form>
-        <div slot="footer" class="text-right">
-            <el-button type="primary" @click="submitForm" :loading="loading">纭� 瀹�</el-button>
-            <el-button @click="handleClose">鍙� 娑�</el-button>
-        </div>
-    </el-dialog>
-</template>
-
-<script setup>
-const { proxy } = getCurrentInstance();
-
-
-let visible = ref(false)
-let title = ref('')
-let loading = ref(false)
-let form = ref({
-    value1: '',
-    value2: '',
-})
-let emit = defineEmits(['get-list'])
-const formRules = {
-    value1: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ枃浠舵爣棰�" }],
-    value2: [{ required: true, trigger: "change", message: "璇烽�夋嫨鏂囦欢绫诲瀷" }],
-}
-
-function submitForm() {
-    proxy.$refs.queryRef.validate(valid => {
-        if (valid) {
-            // loading.value = true;
-            // let obj = form.value.id ? alarmEdit(form.value) : alarmAdd(form.value)
-            // obj.then((res) => {
-            //     if (res.code == 200) {
-            //         proxy.$modal.msgSuccess(res.message);
-            //         emit('get-list')
-            //     } else {
-            //         proxy.$modal.msgError(res.message);
-            //     }
-
-            // }).catch((err) => {
-
-            // }).finally(() => {
-            //     handleClose()
-            // });
-        }
-    })
-}
-
-
-
-
-
-function handleOpen(row) {
-    if (row && row.id) {
-        title.value = "缂栬緫鏀跨瓥娉曡"
-        form.value = JSON.parse(JSON.stringify(row))
-    } else {
-        title.value = "娣诲姞鏀跨瓥娉曡"
-    }
-    visible.value = true
-}
-
-function handleClose(value) {
-    visible.value = false
-    loading.value = false
-    proxy.$refs.queryRef.resetFields()
-    form.value = {
-        value1: '',
-        value2: '',
-
-    }
-}
-
-defineExpose({ handleOpen })
-
-</script>
-
-
-
-<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/zhitan-vue/src/views/poweranalysis/pariPassu/index.vue b/zhitan-vue/src/views/poweranalysis/pariPassu/index.vue
new file mode 100644
index 0000000..d6bcfd1
--- /dev/null
+++ b/zhitan-vue/src/views/poweranalysis/pariPassu/index.vue
@@ -0,0 +1,592 @@
+<template>
+  <div class="page">
+    <div class="page-container">
+      <div class="page-container-left">
+        <LeftTree ref="leftTreeRef" @handleNodeClick="handleNodeClick" />
+      </div>
+      <div class="page-container-right">
+        <div class="form-card">
+          <el-form :model="queryParams" ref="queryRef" :inline="true">
+            <el-form-item label="鏈熼棿" prop="timeType">
+              <el-select v-model="queryParams.timeType" placeholder="鏈熼棿" clearable style="width: 120px"
+                @change="handleTimeType">
+                <el-option v-for="dict in period" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="鏃堕棿">
+              <el-date-picker v-model="queryParams.dataTime" :type="queryParams.timeType == 'YEAR'
+                ? 'year'
+                : queryParams.timeType == 'MONTH'
+                  ? 'month'
+                  : 'date'
+                " :format="queryParams.timeType == 'YEAR'
+                  ? 'YYYY'
+                  : queryParams.timeType == 'MONTH'
+                    ? 'YYYY-MM'
+                    : 'YYYY-MM-DD'
+                  " value-format="YYYY-MM-DD" placeholder="鏃堕棿" style="width: 100%" />
+            </el-form-item>
+            <el-form-item label="鑳芥簮绫诲瀷" prop="energyType">
+              <el-select v-model="queryParams.energyType" placeholder="鑳芥簮绫诲瀷" clearable style="width: 120px">
+                <el-option :label="item.enername" :value="item.enersno" v-for="item in energyTypeList"
+                  :key="item.enersno" @click="handleEnergyType(item)" />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">
+                鎼滅储
+              </el-button>
+              <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+            <!-- <el-form-item>
+              <el-button :type="queryParams.analysisType == 'YOY' ? 'primary' : ''" @click="handleAnalysisType('YOY')">
+                鍚屾瘮
+              </el-button>
+              <el-button :type="queryParams.analysisType == 'MOM' ? 'primary' : ''" @click="handleAnalysisType('MOM')">
+                鐜瘮
+              </el-button>
+            </el-form-item> -->
+            <!-- <el-form-item>
+              <el-button type="primary" icon="Download" @click="handleExport">
+                瀵煎嚭
+              </el-button>
+            </el-form-item> -->
+          </el-form>
+        </div>
+        <div style="
+            height: calc(100vh - 220px) !important;
+            max-height: calc(100vh - 220px) !important;
+            overflow-y: auto;
+          " v-loading="loading">
+       
+          <BaseCard :title="queryParams.nodeName + '-鑳借�楀姣斿垎鏋�'">
+            <div class="chart-box">
+              <div id="Chart1" />
+            </div>
+          </BaseCard>
+
+          <BaseCard :title="queryParams.nodeName +
+            '-鑳借�楀姣斿垎鏋愬悓姣斿垎鏋愯〃-' +
+            queryParams.enername
+            ">
+            <div class="table-box">
+              <el-table :data="departmentList" show-summary>
+                <el-table-column label="鏈湡鏃堕棿" align="center" key="currentTime" prop="currentTime"
+                  :show-overflow-tooltip="true" />
+                <el-table-column :label="'鏈湡鑰�' +
+                  queryParams.enername +
+                  '(' +
+                  queryParams.muid +
+                  ')'
+                  " align="center" key="currentValue" prop="currentValue" :show-overflow-tooltip="true" />
+                <el-table-column label="鍚屾湡鏃堕棿" align="center" key="compareTime" prop="compareTime"
+                  :show-overflow-tooltip="true" />
+                <el-table-column :label="'鍚屾湡鑰�' +
+                  queryParams.enername +
+                  '(' +
+                  queryParams.muid +
+                  ')'
+                  " align="center" key="contrastValues" prop="contrastValues" :show-overflow-tooltip="true" />
+                <el-table-column :label="(queryParams.analysisType == 'YOY' ? '鍚�' : '鐜�') + '姣�(%)'
+                  " align="center" key="ratio" prop="ratio" :show-overflow-tooltip="true" width="200" />
+              </el-table>
+            </div>
+          </BaseCard>
+          <!-- </el-col>
+          </el-row> -->
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup name="department">
+import {
+  listRegion,
+  listDepartment,
+  querySameCompareList,
+} from "@/api/energyAnalysis/energyAnalysis";
+import { listEnergyTypeList } from "@/api/modelConfiguration/energyType";
+import * as echarts from "echarts";
+const { proxy } = getCurrentInstance();
+const { period } = proxy.useDict("period");
+import { useRoute } from "vue-router";
+import useSettingsStore from "@/store/modules/settings";
+const settingsStore = useSettingsStore();
+watch(
+  () => settingsStore.sideTheme,
+  (val) => {
+    getList();
+  }
+);
+const energyTypeList = ref(undefined);
+const departmentList = ref([]);
+const loading = ref(false);
+const data = reactive({
+  queryParams: {
+    nodeId: null,
+    timeType: null,
+    dataTime: null,
+    timeCode: null,
+    analysisType: "YOY",
+    energyType: null,
+  },
+  query: {
+    modelCode: null,
+  },
+});
+const { queryParams, query } = toRefs(data);
+/** 鑺傜偣鍗曞嚮浜嬩欢 */
+function handleNodeClick(data) {
+  queryParams.value.nodeId = data.id;
+  queryParams.value.nodeName = data.label;
+  handleTimeType(period.value[1].value);
+  listEnergyTypeList().then((res) => {
+    energyTypeList.value = res.data;
+    queryParams.value.energyType = energyTypeList.value[0].enersno;
+    queryParams.value.enername = energyTypeList.value[0].enername;
+    queryParams.value.muid = energyTypeList.value[0].muid;
+    handleQuery();
+  });
+}
+function handleTimeType(e) {
+  queryParams.value.timeType = e;
+  if(e=='MONTH'){
+    queryParams.value.timeCode = proxy.dayjs(new Date()).format("YYYY-MM");
+  }else if(e=='YEAR'){
+    queryParams.value.timeCode = proxy.dayjs(new Date()).format("YYYY");
+  }else{
+    queryParams.value.timeCode = proxy.dayjs(new Date()).format("YYYY-MM-DD");
+  }
+  
+}
+function handleEnergyType(item) {
+  queryParams.value.enername = item.enername;
+  queryParams.value.muid = item.muid;
+  handleQuery();
+}
+function handleAnalysisType(analysisType) {
+  queryParams.value.analysisType = analysisType;
+  getList();
+}
+// 鑳借�楀姣斿垎鏋�-鍒楄〃
+function getList() {
+  loading.value = true;
+  // 鍦ㄥ垵濮嬪寲涔嬪墠锛屽厛dispose鏃х殑瀹炰緥
+  if (echarts.getInstanceByDom(document.getElementById("Chart1"))) {
+    echarts.dispose(document.getElementById("Chart1"));
+  }
+  // if (echarts.getInstanceByDom(document.getElementById("Chart2"))) {
+  //   echarts.dispose(document.getElementById("Chart2"));
+  // }
+  const myChart1 = echarts.init(document.getElementById("Chart1"));
+  // const myChart2 = echarts.init(document.getElementById("Chart2"));
+  querySameCompareList(
+    proxy.addDateRange({
+      ...queryParams.value,
+      ...query.value,
+    })
+  ).then((res) => {
+    if (!!res.code && res.code == 200) {
+      loading.value = false;
+      let xdata = [];
+      let yvalue = [];
+      let ycompareValue = [];
+      let yqoq = [];
+      if (!!res.data) {
+        res.data.map((item) => {
+          xdata.push(
+            proxy
+              .dayjs(item.currentTime)
+              .format(
+                queryParams.value.timeType == "YEAR"? "MM鏈�": queryParams.value.timeType =="MONTH"? "DD鏃�": "HH鏃�"
+              )
+          );
+          yvalue.push(!!item.currentValue ? item.currentValue : 0);
+          ycompareValue.push(!!item.contrastValues? item.contrastValues : 0);
+          yqoq.push(!!item.ratio ? item.ratio : 0);
+        });
+       console.log(xdata)
+      }
+      setTimeout(() => {
+        myChart1.setOption({
+          color: ["#2979ff", "#19be6b", "#ff9900", "#fa3534"],
+          grid: {
+            top: "45",
+            left: "7%",
+            right: "5%",
+            bottom: "10",
+            containLabel: true,
+          },
+          tooltip: {
+            trigger: "axis",
+            axisPointer: {
+              type: "shadow",
+            },
+          },
+          legend: {
+            icon: "rect",
+            itemWidth: 14,
+            itemHeight: 10,
+            textStyle: {
+              color:
+                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+            },
+          },
+          xAxis: {
+            type: "category",
+            axisPointer: {
+              type: "shadow",
+            },
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+              },
+            },
+            axisTick: {
+              show: false,
+            },
+            splitArea: {
+              show: false,
+            },
+            splitLine: {
+              show: false,
+            },
+            axisLabel: {
+              color:
+                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              fontSize: 14,
+              padding: [5, 0, 0, 0],
+              //   formatter: '{value} ml'
+            },
+            data: xdata,
+          },
+          yAxis: [
+            {
+              type: "value",
+              name:
+                "鑰�" +
+                queryParams.value.enername +
+                "閲�(" +
+                queryParams.value.muid +
+                ")",
+              nameTextStyle: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+                padding: [0, 0, 5, 0],
+              },
+              axisLine: {
+                show: false,
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  type: "dashed",
+                  color:
+                    settingsStore.sideTheme == "theme-dark"
+                      ? "#FFFFFF"
+                      : "#222222",
+                },
+              },
+              axisTick: {
+                show: false,
+              },
+              splitArea: {
+                show: false,
+              },
+              axisLabel: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+              },
+            },
+            {
+              type: "value",
+              name: queryParams.value.analysisType == "YOY" ? "鍚屾瘮(%)" : "鐜瘮(%)",
+              alignTicks: true,
+              nameTextStyle: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+                padding: [0, 0, 5, 0],
+              },
+              axisLine: {
+                show: false,
+              },
+              axisTick: {
+                show: false,
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  type: "dashed",
+                  color:
+                    settingsStore.sideTheme == "theme-dark"
+                      ? "#FFFFFF"
+                      : "#222222",
+                },
+              },
+              splitArea: {
+                show: false,
+              },
+              axisLabel: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+              },
+            },
+          ],
+          series: [
+            {
+              name: "鏈湡鍊�",
+              type: "bar",
+              barWidth: "8",
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value + queryParams.value.muid;
+                },
+              },
+              itemStyle: {
+                borderRadius: [15, 15, 0, 0],
+              },
+              data: yvalue,
+              markPoint: {
+                data: [
+                  { type: "max", name: "Max" },
+                  { type: "min", name: "Min" },
+                ],
+              },
+            },
+            {
+              name: "鍚屾湡鍊�",
+              type: "bar",
+              barWidth: "8",
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value + queryParams.value.muid;
+                },
+              },
+              itemStyle: {
+                borderRadius: [15, 15, 0, 0],
+              },
+              data: ycompareValue,
+              markPoint: {
+                data: [
+                  { type: "max", name: "Max" },
+                  { type: "min", name: "Min" },
+                ],
+              },
+            },
+            {
+              name: queryParams.value.analysisType == "YOY" ? "鍚屾瘮" : "鐜瘮",
+              type: "line",
+              yAxisIndex: 1,
+              symbol: "none", // 璁剧疆涓� 'none' 鍘绘帀鍦嗙偣
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value + "%";
+                },
+              },
+              data: yqoq,
+            },
+          ],
+        });
+      }, 100);
+      departmentList.value = !!res.data ? res.data : [];
+      window.addEventListener(
+        "resize",
+        () => {
+          myChart1.resize();
+        },
+        { passive: true }
+      );
+    }
+  });
+  // listDepartment(
+  //   proxy.addDateRange({
+  //     ...queryParams.value,
+  //     ...query.value,
+  //   })
+  // ).then((res) => {
+  //   if (!!res.code && res.code == 200) {
+  //     loading.value = false;
+  //     let seriesdata = [];
+  //     let xdata = [];
+  //     if (!!energyTypeList.value) {
+  //       energyTypeList.value.map((item) => {
+  //         seriesdata.push({
+  //           name: item.enername,
+  //           type: "bar",
+  //           barWidth: "16",
+  //           stack: "total",
+  //           data: [],
+  //         });
+  //       });
+  //     }
+  //     if (!!res.data) {
+  //       res.data.map((dataItem) => {
+  //         xdata.push(dataItem.nodeName)
+  //         seriesdata.forEach((seriesdataItem) => {
+  //           if (
+  //             dataItem.data.find(
+  //               (dataItemItem) =>
+  //                 dataItemItem.energyTypeName == seriesdataItem.name
+  //             ) == undefined
+  //           ) {
+  //             dataItem.data.push({
+  //               nodeId: dataItem.nodeId,
+  //               nodeName: dataItem.nodeName,
+  //               energyTypeNo: null,
+  //               energyTypeName: seriesdataItem.name,
+  //               energyConsumption: 0,
+  //             });
+  //           }
+  //           dataItem.data.map(dataItemItem => {
+  //             if (seriesdataItem.name == dataItemItem.energyTypeName) {
+  //               seriesdataItem.data.push(dataItemItem.energyConsumption)
+  //             }
+  //           })
+  //         });
+  //       });
+  //     }
+  //     setTimeout(() => {
+  //       myChart2.setOption({
+  //         color: ["#2979ff", "#19be6b", "#ff9900", "#fa3534"],
+  //         grid: {
+  //           top: "45",
+  //           left: "17%",
+  //           right: "5%",
+  //           bottom: "10",
+  //           containLabel: true,
+  //         },
+  //         tooltip: {
+  //           trigger: "axis",
+  //           axisPointer: {
+  //             type: "shadow",
+  //           },
+  //         },
+  //         legend: {
+  //           icon: "rect",
+  //           itemWidth: 14,
+  //           itemHeight: 10,
+  //           right: 0,
+  //           textStyle: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //           },
+  //         },
+  //         xAxis: {
+  //           nameLocation: "start",
+  //           type: "value",
+  //           name: "鍗曚綅tce",
+  //           nameTextStyle: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             fontSize: 14,
+  //             padding: [0, 0, 5, 0],
+  //           },
+  //           axisLine: {
+  //             show: false,
+  //           },
+  //           splitLine: {
+  //             show: true,
+  //             lineStyle: {
+  //               type: "dashed",
+  //               color:
+  //                 settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             },
+  //           },
+  //           axisTick: {
+  //             show: false,
+  //           },
+  //           splitArea: {
+  //             show: false,
+  //           },
+  //           axisLabel: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             fontSize: 14,
+  //             //   formatter: '{value} ml'
+  //           },
+  //         },
+  //         yAxis: {
+  //           type: "category",
+  //           axisPointer: {
+  //             type: "shadow",
+  //           },
+  //           axisLine: {
+  //             show: true,
+  //             lineStyle: {
+  //               color:
+  //                 settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             },
+  //           },
+  //           axisTick: {
+  //             show: false,
+  //           },
+  //           splitArea: {
+  //             show: false,
+  //           },
+  //           splitLine: {
+  //             show: false,
+  //           },
+  //           axisLabel: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             fontSize: 14,
+  //             padding: [5, 0, 0, 0],
+  //             //   formatter: '{value} ml'
+  //           },
+  //           data: xdata.splice(0, 6),
+  //         },
+  //         series: seriesdata,
+  //       });
+  //     }, 100);
+  //     window.addEventListener("resize", () => {
+  //       myChart2.resize();
+  //     },{passive: true});
+  //   }
+  // });
+}
+// 鑳借�楀姣斿垎鏋�-绉戝鑳借�楀垎鏋�-鎼滅储
+function handleQuery() {
+  getList();
+}
+// 鑳借�楀姣斿垎鏋�-閲嶇疆
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleTimeType(period.value[1].value);
+  queryParams.value.energyType = energyTypeList.value[0].enersno;
+  queryParams.value.enername = energyTypeList.value[0].enername;
+  queryParams.value.muid = energyTypeList.value[0].muid;
+  queryParams.value.analysisType = "YOY";
+  handleQuery();
+}
+// 鑳借�楀姣斿垎鏋�-绉戝鑳借�楀垎鏋�-瀵煎嚭
+function handleExport() {
+  proxy.download(
+    "consumptionanalysis/energyExport",
+    {
+      ...queryParams.value,
+      ...query.value,
+    },
+    `${queryParams.value.nodeName}-鍘傚尯鑳借�楀垎鏋恄${new Date().getTime()}.xlsx`
+  );
+}
+</script>
+<style scoped lang="scss">
+@import "@/assets/styles/page.scss";
+</style>
diff --git a/zhitan-vue/src/views/poweranalysis/perPassu/index.vue b/zhitan-vue/src/views/poweranalysis/perPassu/index.vue
new file mode 100644
index 0000000..a639577
--- /dev/null
+++ b/zhitan-vue/src/views/poweranalysis/perPassu/index.vue
@@ -0,0 +1,594 @@
+<template>
+  <div class="page">
+    <div class="page-container">
+      <div class="page-container-left">
+        <LeftTree ref="leftTreeRef" @handleNodeClick="handleNodeClick" />
+      </div>
+      <div class="page-container-right">
+        <div class="form-card">
+          <el-form :model="queryParams" ref="queryRef" :inline="true">
+            <el-form-item label="鏈熼棿" prop="timeType">
+              <el-select v-model="queryParams.timeType" placeholder="鏈熼棿" clearable style="width: 120px"
+                @change="handleTimeType">
+                <el-option v-for="dict in period" :key="dict.value" :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="鏃堕棿">
+              <el-date-picker v-model="queryParams.dataTime" :type="queryParams.timeType == 'YEAR'
+                ? 'year'
+                : queryParams.timeType == 'MONTH'
+                  ? 'month'
+                  : 'date'
+                " :format="queryParams.timeType == 'YEAR'
+                  ? 'YYYY'
+                  : queryParams.timeType == 'MONTH'
+                    ? 'YYYY-MM'
+                    : 'YYYY-MM-DD'
+                  " value-format="YYYY-MM-DD" placeholder="鏃堕棿" style="width: 100%" />
+            </el-form-item>
+            <el-form-item label="鑳芥簮绫诲瀷" prop="energyType">
+              <el-select v-model="queryParams.energyType" placeholder="鑳芥簮绫诲瀷" clearable style="width: 120px">
+                <el-option :label="item.enername" :value="item.enersno" v-for="item in energyTypeList"
+                  :key="item.enersno" @click="handleEnergyType(item)" />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">
+                鎼滅储
+              </el-button>
+              <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+            <!-- <el-form-item>
+              <el-button :type="queryParams.analysisType == 'YOY' ? 'primary' : ''" @click="handleAnalysisType('YOY')">
+                鍚屾瘮
+              </el-button>
+              <el-button :type="queryParams.analysisType == 'MOM' ? 'primary' : ''" @click="handleAnalysisType('MOM')">
+                鐜瘮
+              </el-button>
+            </el-form-item> -->
+            <!-- <el-form-item>
+              <el-button type="primary" icon="Download" @click="handleExport">
+                瀵煎嚭
+              </el-button>
+            </el-form-item> -->
+          </el-form>
+        </div>
+        <div style="
+            height: calc(100vh - 220px) !important;
+            max-height: calc(100vh - 220px) !important;
+            overflow-y: auto;
+          " v-loading="loading">
+       
+          <BaseCard :title="queryParams.nodeName + '-鑳借�楀姣斿垎鏋�'">
+            <div class="chart-box">
+              <div id="Chart1" />
+            </div>
+          </BaseCard>
+
+          <BaseCard :title="queryParams.nodeName +
+            '-鑳借�楀姣斿垎鏋愮幆姣斿垎鏋愯〃-' +
+            queryParams.enername
+            ">
+            <div class="table-box">
+              <el-table :data="departmentList" show-summary>
+                <el-table-column label="鏈湡鏃堕棿" align="center" key="currentTime" prop="currentTime"
+                  :show-overflow-tooltip="true" />
+                <el-table-column :label="'鏈湡鑰�' +
+                  queryParams.enername +
+                  '(' +
+                  queryParams.muid +
+                  ')'
+                  " align="center" key="currentValue" prop="currentValue" :show-overflow-tooltip="true" />
+                <el-table-column label="鍚屾湡鏃堕棿" align="center" key="compareTime" prop="compareTime"
+                  :show-overflow-tooltip="true" />
+                <el-table-column :label="'鍚屾湡鑰�' +
+                  queryParams.enername +
+                  '(' +
+                  queryParams.muid +
+                  ')'
+                  " align="center" key="contrastValues" prop="contrastValues" :show-overflow-tooltip="true" />
+                <el-table-column :label="(queryParams.analysisType == 'YOY' ? '鍚�' : '鐜�') + '姣�(%)'
+                  " align="center" key="ratio" prop="ratio" :show-overflow-tooltip="true" width="200" />
+              </el-table>
+            </div>
+          </BaseCard>
+          <!-- </el-col>
+          </el-row> -->
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup name="department">
+import {
+  listRegion,
+  listDepartment,
+  queryLoopCompareList,
+} from "@/api/energyAnalysis/energyAnalysis";
+import { listEnergyTypeList } from "@/api/modelConfiguration/energyType";
+import * as echarts from "echarts";
+const { proxy } = getCurrentInstance();
+const { period } = proxy.useDict("period");
+import { useRoute } from "vue-router";
+import useSettingsStore from "@/store/modules/settings";
+const settingsStore = useSettingsStore();
+watch(
+  () => settingsStore.sideTheme,
+  (val) => {
+    getList();
+  }
+);
+const energyTypeList = ref(undefined);
+const departmentList = ref([]);
+const loading = ref(false);
+const data = reactive({
+  queryParams: {
+    nodeId: null,
+    timeType: null,
+    dataTime: null,
+    analysisType: "MOM",
+    timeCode: null,
+    energyType: null,
+  },
+  query: {
+    modelCode: null,
+  },
+});
+const { queryParams, query } = toRefs(data);
+/** 鑺傜偣鍗曞嚮浜嬩欢 */
+function handleNodeClick(data) {
+  queryParams.value.nodeId = data.id;
+  queryParams.value.nodeName = data.label;
+  handleTimeType(period.value[1].value);
+  listEnergyTypeList().then((res) => {
+    energyTypeList.value = res.data;
+    queryParams.value.energyType = energyTypeList.value[0].enersno;
+    queryParams.value.enername = energyTypeList.value[0].enername;
+    queryParams.value.muid = energyTypeList.value[0].muid;
+    handleQuery();
+  });
+}
+function handleTimeType(e) {
+  queryParams.value.timeType = e;
+  if(e=='MONTH'){
+    queryParams.value.timeCode = proxy.dayjs(new Date()).format("YYYY-MM");
+  }else if(e=='YEAR'){
+    queryParams.value.timeCode = proxy.dayjs(new Date()).format("YYYY");
+  }else{
+    queryParams.value.timeCode = proxy.dayjs(new Date()).format("YYYY-MM-DD");
+  }
+}
+function handleEnergyType(item) {
+  queryParams.value.enername = item.enername;
+  queryParams.value.muid = item.muid;
+  handleQuery();
+}
+function handleAnalysisType(analysisType) {
+  queryParams.value.analysisType = analysisType;
+  getList();
+}
+// 鑳借�楀姣斿垎鏋�-鍒楄〃
+function getList() {
+  loading.value = true;
+  // 鍦ㄥ垵濮嬪寲涔嬪墠锛屽厛dispose鏃х殑瀹炰緥
+  if (echarts.getInstanceByDom(document.getElementById("Chart1"))) {
+    echarts.dispose(document.getElementById("Chart1"));
+  }
+  // if (echarts.getInstanceByDom(document.getElementById("Chart2"))) {
+  //   echarts.dispose(document.getElementById("Chart2"));
+  // }
+  const myChart1 = echarts.init(document.getElementById("Chart1"));
+  // const myChart2 = echarts.init(document.getElementById("Chart2"));
+  queryLoopCompareList(
+    proxy.addDateRange({
+      ...queryParams.value,
+      ...query.value,
+    })
+  ).then((res) => {
+    if (!!res.code && res.code == 200) {
+      loading.value = false;
+      let xdata = [];
+      let yvalue = [];
+      let ycompareValue = [];
+      let yqoq = [];
+      if (!!res.data) {
+        res.data.map((item) => {
+          xdata.push(
+            proxy
+              .dayjs(item.currentTime)
+              .format(
+                queryParams.value.timeType == "YEAR"
+                  ? "MM鏈�"
+                  : queryParams.value.timeType == "MONTH"
+                    ? "DD鏃�"
+                    : "HH鏃�"
+              )
+          );
+          yvalue.push(!!item.currentValue ? item.currentValue : 0);
+          ycompareValue.push(!!item.contrastValues ? item.contrastValues : 0);
+          yqoq.push(!!item.ratio ? item.ratio : 0);
+        });
+      }
+      setTimeout(() => {
+        myChart1.setOption({
+          color: ["#2979ff", "#19be6b", "#ff9900", "#fa3534"],
+          grid: {
+            top: "45",
+            left: "7%",
+            right: "5%",
+            bottom: "10",
+            containLabel: true,
+          },
+          tooltip: {
+            trigger: "axis",
+            axisPointer: {
+              type: "shadow",
+            },
+          },
+          legend: {
+            icon: "rect",
+            itemWidth: 14,
+            itemHeight: 10,
+            textStyle: {
+              color:
+                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+            },
+          },
+          xAxis: {
+            type: "category",
+            axisPointer: {
+              type: "shadow",
+            },
+            axisLine: {
+              show: true,
+              lineStyle: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+              },
+            },
+            axisTick: {
+              show: false,
+            },
+            splitArea: {
+              show: false,
+            },
+            splitLine: {
+              show: false,
+            },
+            axisLabel: {
+              color:
+                settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+              fontSize: 14,
+              padding: [5, 0, 0, 0],
+              //   formatter: '{value} ml'
+            },
+            data: xdata,
+          },
+          yAxis: [
+            {
+              type: "value",
+              name:
+                "鑰�" +
+                queryParams.value.enername +
+                "閲�(" +
+                queryParams.value.muid +
+                ")",
+              nameTextStyle: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+                padding: [0, 0, 5, 0],
+              },
+              axisLine: {
+                show: false,
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  type: "dashed",
+                  color:
+                    settingsStore.sideTheme == "theme-dark"
+                      ? "#FFFFFF"
+                      : "#222222",
+                },
+              },
+              axisTick: {
+                show: false,
+              },
+              splitArea: {
+                show: false,
+              },
+              axisLabel: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+              },
+            },
+            {
+              type: "value",
+              name: queryParams.value.analysisType == "YOY" ? "鍚屾瘮(%)" : "鐜瘮(%)",
+              alignTicks: true,
+              nameTextStyle: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+                padding: [0, 0, 5, 0],
+              },
+              axisLine: {
+                show: false,
+              },
+              axisTick: {
+                show: false,
+              },
+              splitLine: {
+                show: true,
+                lineStyle: {
+                  type: "dashed",
+                  color:
+                    settingsStore.sideTheme == "theme-dark"
+                      ? "#FFFFFF"
+                      : "#222222",
+                },
+              },
+              splitArea: {
+                show: false,
+              },
+              axisLabel: {
+                color:
+                  settingsStore.sideTheme == "theme-dark"
+                    ? "#FFFFFF"
+                    : "#222222",
+                fontSize: 14,
+              },
+            },
+          ],
+          series: [
+            {
+              name: "鏈湡鍊�",
+              type: "bar",
+              barWidth: "8",
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value + queryParams.value.muid;
+                },
+              },
+              itemStyle: {
+                borderRadius: [15, 15, 0, 0],
+              },
+              data: yvalue,
+              markPoint: {
+                data: [
+                  { type: "max", name: "Max" },
+                  { type: "min", name: "Min" },
+                ],
+              },
+            },
+            {
+              name: "鍚屾湡鍊�",
+              type: "bar",
+              barWidth: "8",
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value + queryParams.value.muid;
+                },
+              },
+              itemStyle: {
+                borderRadius: [15, 15, 0, 0],
+              },
+              data: ycompareValue,
+              markPoint: {
+                data: [
+                  { type: "max", name: "Max" },
+                  { type: "min", name: "Min" },
+                ],
+              },
+            },
+            {
+              name: queryParams.value.analysisType == "YOY" ? "鍚屾瘮" : "鐜瘮",
+              type: "line",
+              yAxisIndex: 1,
+              symbol: "none", // 璁剧疆涓� 'none' 鍘绘帀鍦嗙偣
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value + "%";
+                },
+              },
+              data: yqoq,
+            },
+          ],
+        });
+      }, 100);
+      departmentList.value = !!res.data ? res.data : [];
+      window.addEventListener(
+        "resize",
+        () => {
+          myChart1.resize();
+        },
+        { passive: true }
+      );
+    }
+  });
+  // listDepartment(
+  //   proxy.addDateRange({
+  //     ...queryParams.value,
+  //     ...query.value,
+  //   })
+  // ).then((res) => {
+  //   if (!!res.code && res.code == 200) {
+  //     loading.value = false;
+  //     let seriesdata = [];
+  //     let xdata = [];
+  //     if (!!energyTypeList.value) {
+  //       energyTypeList.value.map((item) => {
+  //         seriesdata.push({
+  //           name: item.enername,
+  //           type: "bar",
+  //           barWidth: "16",
+  //           stack: "total",
+  //           data: [],
+  //         });
+  //       });
+  //     }
+  //     if (!!res.data) {
+  //       res.data.map((dataItem) => {
+  //         xdata.push(dataItem.nodeName)
+  //         seriesdata.forEach((seriesdataItem) => {
+  //           if (
+  //             dataItem.data.find(
+  //               (dataItemItem) =>
+  //                 dataItemItem.energyTypeName == seriesdataItem.name
+  //             ) == undefined
+  //           ) {
+  //             dataItem.data.push({
+  //               nodeId: dataItem.nodeId,
+  //               nodeName: dataItem.nodeName,
+  //               energyTypeNo: null,
+  //               energyTypeName: seriesdataItem.name,
+  //               energyConsumption: 0,
+  //             });
+  //           }
+  //           dataItem.data.map(dataItemItem => {
+  //             if (seriesdataItem.name == dataItemItem.energyTypeName) {
+  //               seriesdataItem.data.push(dataItemItem.energyConsumption)
+  //             }
+  //           })
+  //         });
+  //       });
+  //     }
+  //     setTimeout(() => {
+  //       myChart2.setOption({
+  //         color: ["#2979ff", "#19be6b", "#ff9900", "#fa3534"],
+  //         grid: {
+  //           top: "45",
+  //           left: "17%",
+  //           right: "5%",
+  //           bottom: "10",
+  //           containLabel: true,
+  //         },
+  //         tooltip: {
+  //           trigger: "axis",
+  //           axisPointer: {
+  //             type: "shadow",
+  //           },
+  //         },
+  //         legend: {
+  //           icon: "rect",
+  //           itemWidth: 14,
+  //           itemHeight: 10,
+  //           right: 0,
+  //           textStyle: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //           },
+  //         },
+  //         xAxis: {
+  //           nameLocation: "start",
+  //           type: "value",
+  //           name: "鍗曚綅tce",
+  //           nameTextStyle: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             fontSize: 14,
+  //             padding: [0, 0, 5, 0],
+  //           },
+  //           axisLine: {
+  //             show: false,
+  //           },
+  //           splitLine: {
+  //             show: true,
+  //             lineStyle: {
+  //               type: "dashed",
+  //               color:
+  //                 settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             },
+  //           },
+  //           axisTick: {
+  //             show: false,
+  //           },
+  //           splitArea: {
+  //             show: false,
+  //           },
+  //           axisLabel: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             fontSize: 14,
+  //             //   formatter: '{value} ml'
+  //           },
+  //         },
+  //         yAxis: {
+  //           type: "category",
+  //           axisPointer: {
+  //             type: "shadow",
+  //           },
+  //           axisLine: {
+  //             show: true,
+  //             lineStyle: {
+  //               color:
+  //                 settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             },
+  //           },
+  //           axisTick: {
+  //             show: false,
+  //           },
+  //           splitArea: {
+  //             show: false,
+  //           },
+  //           splitLine: {
+  //             show: false,
+  //           },
+  //           axisLabel: {
+  //             color:
+  //               settingsStore.sideTheme == "theme-dark" ? "#FFFFFF" : "#222222",
+  //             fontSize: 14,
+  //             padding: [5, 0, 0, 0],
+  //             //   formatter: '{value} ml'
+  //           },
+  //           data: xdata.splice(0, 6),
+  //         },
+  //         series: seriesdata,
+  //       });
+  //     }, 100);
+  //     window.addEventListener("resize", () => {
+  //       myChart2.resize();
+  //     },{passive: true});
+  //   }
+  // });
+}
+// 鑳借�楀姣斿垎鏋�-鎼滅储
+function handleQuery() {
+  getList();
+}
+// 鑳借�楀姣斿垎鏋�-閲嶇疆
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleTimeType(period.value[1].value);
+  queryParams.value.energyType = energyTypeList.value[0].enersno;
+  queryParams.value.enername = energyTypeList.value[0].enername;
+  queryParams.value.muid = energyTypeList.value[0].muid;
+  queryParams.value.analysisType = "MOM";
+  handleQuery();
+}
+// 鑳借�楀姣斿垎鏋�-瀵煎嚭
+function handleExport() {
+  proxy.download(
+    "consumptionanalysis/energyExport",
+    {
+      ...queryParams.value,
+      ...query.value,
+    },
+    `${queryParams.value.nodeName}-鍘傚尯鑳借�楀垎鏋恄${new Date().getTime()}.xlsx`
+  );
+}
+</script>
+<style scoped lang="scss">
+@import "@/assets/styles/page.scss";
+</style>
diff --git a/zhitan-vue/vite.config.js b/zhitan-vue/vite.config.js
index f1ee7d7..1357748 100644
--- a/zhitan-vue/vite.config.js
+++ b/zhitan-vue/vite.config.js
@@ -4,7 +4,9 @@
 
 // https://vitejs.dev/config/
 export default defineConfig(({ mode, command }) => {
+  mode='production'
   const env = loadEnv(mode, process.cwd())
+  console.log(mode,'==========env')
   const { VITE_APP_ENV } = env
   return {
     // 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�

--
Gitblit v1.9.3