From 349f1cfc5fa77fbc636d542df0d8050fddec48c2 Mon Sep 17 00:00:00 2001
From: liulingling.177216 <liulingling@halosee.com>
Date: 星期一, 26 八月 2024 20:36:38 +0800
Subject: [PATCH] fix bug

---
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelInfoMapper.java                                                           |   61 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/TimerActor.java                                                      |  121 
 energy_management_ui/src/views/benchmarking/realTimeBenchmarking/realTimeBenchmarking.vue                                                     |  104 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/workForceTreeObject.java                                             |   67 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnerclassController.java                                 |  123 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsVO.java                           |   26 
 energy_management_ui/src/api/policy/policySelete.js                                                                                           |   53 
 energy_management_server/src/main/resources/mybatis/electricityPrice/ElectricityPriceMapper.xml                                               |   89 
 energy_management_ui/src/api/system/config.js                                                                                                 |   61 
 energy_management_ui/src/views/basicsetting/limitType/index.vue                                                                               |  389 
 energy_management_ui/src/views/power-statistics-analyse/per-passu/index.vue                                                                   |  421 
 basic/src/main/java/com/dingzhuo/energy/framework/interceptor/annotation/RepeatSubmit.java                                                    |   23 
 energy_management_ui/src/store/modules/user.js                                                                                                |  114 
 energy_management_ui/src/views/system/dept/index.vue                                                                                          |  341 
 basic/src/main/java/com/dingzhuo/energy/common/enums/HttpMethod.java                                                                          |   36 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysRoleServiceImpl.java                                                   |  313 
 energy_management_ui/src/views/history/query/index.vue                                                                                        |   77 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/EnergyIndexMapper.java                                                         |   91 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IdailyWorkingProcedure.java                       |   18 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/ElectricityPrice.java                                   |  139 
 energy_management_ui/babel.config.js                                                                                                          |    5 
 energy_management_ui/src/api/basicsetting/deviceStorage.js                                                                                    |   35 
 energy_management_ui/src/api/keyEquipment/dailykeyEquipment/dailykeyEquipment.js                                                              |   32 
 basic-data/src/main/resources/mybatis/enerInfoManage/SysEnercoefficientMapper.xml                                                             |   93 
 basic-data/src/main/resources/mybatis/energy/EnergyProjectAnnexMapper.xml                                                                     |   97 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/monthlycomprehensiveController.java     |  207 
 energy_management_ui/src/utils/permission.js                                                                                                  |   24 
 energy_management_ui/src/views/energySaving/energyProject/energyAnnex.vue                                                                     |  293 
 basic/src/main/java/com/dingzhuo/energy/common/utils/html/HTMLFilter.java                                                                     |  569 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/CollectHistory.java                                   |   71 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/domain/ConglomeratePushLog.java                           |  106 
 energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/index.vue                                                           |  449 
 energy_management_server/src/main/resources/mybatis/electricityPrice/statisticsMapper.xml                                                     |  139 
 energy_management_ui/src/api/energy/energyAnnex.js                                                                                            |   53 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementController.java                                        |  172 
 energy_management_ui/src/assets/icons/svg/2020-03-23-a204691ac2cdafde1a9a405f9b5cf8ca.svg                                                     | 1204 
 energy_management_ui/src/views/keyEquipment/yearkeyEquipment/BarChart.vue                                                                     |  112 
 energy_management_ui/src/assets/icons/svg/tree-table.svg                                                                                      |    1 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/LoadIndexActor.java                                                  |  135 
 energy_management_server/src/main/resources/mybatis/energyEenchmarking/EnergyBenchmarkingMapper.xml                                           |   94 
 energy_management_ui/src/assets/styles/common-table-form.scss                                                                                 |   13 
 energy_management_ui/src/api/facility/annex.js                                                                                                |   53 
 energy_management_ui/src/views/power-statistics-analyse/func/merge-object.js                                                                  |   23 
 energy_management_server/src/main/resources/mybatis/energyBalance/EnergyPicMapper.xml                                                         |   88 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectAnnexMapper.java                                           |   61 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeServiceImpl.java                                |   95 
 energy_management_ui/src/views/policy/policyInsert/index.vue                                                                                  |  396 
 energy_management_ui/src/views/energyPlan/energyMonitoring/energyMonitoring.vue                                                               |  183 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysNotice.java                                                                  |  102 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IannualReportService.java                               |   17 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/ImonthlyWorkingProcedure.java                     |   19 
 energy_management_ui/src/utils/validate.js                                                                                                    |   88 
 energy_management_server/src/main/resources/mybatis/reportForm/reportFromMapper.xml                                                           |  115 
 energy_management_ui/.env.development                                                                                                         |    8 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyDayConsumeInputController.java         |  102 
 energy_management_ui/src/views/equipmentMonitor/history/historyIndex.vue                                                                      |  245 
 energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/LineChart.vue                                                         |  120 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTable.java                                                                 |  271 
 energy_management_ui/src/views/dataMonitoring/energyPercent/energyPercent.vue                                                                 |  381 
 basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileSizeLimitExceededException.java                                             |   16 
 compute-engine/.gitignore                                                                                                                     |   31 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlanEnergyService.java                              |   30 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnerclassMapper.java                                         |   71 
 energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/energyDayConsumeInput.vue                                              |  204 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyTable.java                                   |  101 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/yearComprehensiveServiceImpl.java     |   68 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/dailyComprehensiveServiceImpl.java    |   41 
 energy_management_ui/src/assets/home/wen.png                                                                                                  |    0 
 energy_management_ui/src/views/energyStatistics/energyConsumption/BarCharts.vue                                                               |  117 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPubVo.java                                       |   91 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProjectAnnex.java                                                 |  137 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnloadCalcIndexMessage.java                                      |   10 
 energy_management_ui/src/views/basicsetting/energyIndex/index.vue                                                                             |   76 
 energy_management_ui/src/assets/icons/svg/tool.svg                                                                                            |    1 
 energy_management_ui/src/views/energyExamine/assessmentIndex/index.vue                                                                        |   61 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusLiveServiceImpl.java                        |   92 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ServiceProvicer.java                                                           |   55 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/controller/HomeController.java                                        |  104 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/config/ExecutePrioMailBox.java                                                       |   16 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringShiftMapper.java                                            |   64 
 basic/src/main/java/com/dingzhuo/energy/project/common/CaptchaController.java                                                                 |   65 
 energy_management_ui/src/views/energyPlan/actualOutput/index.vue                                                                              |   58 
 energy_management_ui/vue.config.js                                                                                                            |  142 
 energy_management_ui/src/assets/styles/transition.scss                                                                                        |   48 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysEquipmentfileServiceImpl.java                   |   64 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DateTimeUtil.java                                                   |  399 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/dailyKeyEquipmentServiceImpl.java                |   48 
 energy_management_ui/src/api/reportForm/monthlyReport/monthlyReport.js                                                                        |   18 
 energy_management_ui/src/components/IconSelect/requireIcons.js                                                                                |   11 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/HistoryAlarmServiceImpl.java                             |   61 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/IStateTypeService.java                                                        |   62 
 energy_management_ui/src/api/energyBalance/energyBalance.js                                                                                   |   33 
 energy_management_ui/src/components/Pagination/index.vue                                                                                      |  101 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/consolidatedStatementsMapper.java                        |   61 
 energy_management_ui/src/layout/mixin/getHeight.js                                                                                            |   24 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/impl/DataItemPubServiceImpl.java                        |  117 
 data-monitoring/src/main/resources/mybatis/alarm/AlarmItemMapper.xml                                                                          |  217 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessStatus.java                                                      |   20 
 basic/src/main/java/com/dingzhuo/energy/framework/config/ServerConfig.java                                                                    |   32 
 energy_management_ui/src/assets/icons/svg/job.svg                                                                                             |    1 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excel.java                                                          |  113 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/processEnergyConsumptionController.java |   26 
 energy_management_ui/src/views/energyPlan/energyForecast/index.vue                                                                            |   58 
 energy_management_ui/src/views/equipmentMonitor/energyConsumption/lineChart.vue                                                               |  128 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringShift.java                                                  |  165 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/BaseEntity.java                                                                  |  168 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusHistoryServiceImpl.java                     |  105 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatusJudgeMessage.java                                         |   10 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndex.java                                                               |  213 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/TreeSelect.java                                                                  |   78 
 energy_management_ui/src/views/policy/policyInsert/importFileTable.vue                                                                        |  236 
 energy_management_ui/src/api/basicsetting/energyindex.js                                                                                      |   69 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/dailyKeyEquipment.java                                 |  323 
 energy_management_ui/src/api/keyEquipment/yearkeyEquipment/yearkeyEquipment.js                                                                |   17 
 energy_management_ui/src/views/energyPlan/energyEstablishment/index.vue                                                                       |   57 
 energy_management_ui/src/views/energyStatistics/energyConsumption/index.vue                                                                   |   55 
 energy_management_ui/src/views/system/menu/index.vue                                                                                          |  382 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringServiceImpl.java                                      |  115 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReport.java                                                       |   98 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/ModelNodeIndexInfor.java                                                    |   53 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/DataAuthService.java                                                          |   14 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportFormMapper.java                                    |   35 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectAnnexService.java                                        |   61 
 energy_management_ui/src/layout/components/index.js                                                                                           |    3 
 basic/src/main/java/com/dingzhuo/energy/common/core/text/CharsetKit.java                                                                      |   88 
 energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/BarChart.vue                                                        |  119 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/CacheService.java                                                              |  182 
 energy_management_ui/src/views/basicsetting/modelNode/modelNodeSetting.vue                                                                    |  397 
 energy_management_ui/src/views/meter/implement/index.vue                                                                                      |  727 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysNoticeServiceImpl.java                                                 |   91 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterAnnex.java                                                          |  107 
 energy_management_server/src/main/resources/mybatis/energyStatistics/energyStatisticsMapper.xml                                               |   78 
 energy_management_server/src/main/resources/mybatis/plannedOutput/PlanEnergyMapper.xml                                                        |  116 
 basic-data/src/main/resources/mybatis/meter/MeterAnnexMapper.xml                                                                              |   95 
 energy_management_ui/src/assets/icons/svg/dian.svg                                                                                            | 1204 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysOperlogController.java                                                  |   72 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCountIndex.java                                 |  425 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysRoleController.java                                                      |  160 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardCategoryService.java                        |   62 
 energy_management_ui/src/views/basicSetup/parameters/standard_statistic.vue                                                                   |  156 
 basic/src/main/java/com/dingzhuo/energy/framework/security/filter/JwtAuthenticationTokenFilter.java                                           |   46 
 energy_management_ui/src/assets/icons/svg/dashboard.svg                                                                                       |    1 
 energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/comprehensive.vue                                              |  419 
 energy_management_server/src/main/resources/vm/java/controller.java.vm                                                                        |  103 
 basic/src/main/resources/mybatis/system/SysRoleMenuMapper.xml                                                                                 |   27 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/IEnergyConsumeInputService.java                 |   51 
 energy_management_ui/src/api/demo/demo.js                                                                                                     |   53 
 energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/realTimeIndex.vue                                                       |  135 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataSourceAspect.java                                                               |   79 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexFormulaMapper.java                                                        |   18 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/RealtimeDeviceStatus.java                                     |   42 
 energy_management_ui/src/components/PanThumb/index.vue                                                                                        |  142 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportService.java                                              |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/IGxdhCountService.java                             |   71 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/UnloadAlarmMessage.java                                                |   26 
 energy_management_ui/src/views/alarm/index.vue                                                                                                |   70 
 energy_management_ui/src/views/alarmItem/index.vue                                                                                            |   79 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsService.java                                         |   64 
 basic/src/main/java/com/dingzhuo/energy/common/utils/reflect/ReflectUtils.java                                                                |  328 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportFormServiceImpl.java                         |   43 
 energy_management_ui/src/views/enerInfoManage/product/index.vue                                                                               |  470 
 energy_management_ui/src/views/reportForm/statements/BarChart.vue                                                                             |  110 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelNodeController.java                                                   |  370 
 energy_management_ui/src/assets/styles/index.scss                                                                                             |  191 
 energy_management_ui/src/views/index_bak.vue                                                                                                  |  150 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictTypeMapper.java                                                          |   85 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryAlarm.java                                              |  171 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardParametersService.java                      |   63 
 energy_management_server/pom.xml                                                                                                              |  149 
 energy_management_ui/src/api/home/home.js                                                                                                     |   73 
 basic-data/src/main/resources/mybatis/policy/PolicyRegulationsTranslateMapper.xml                                                             |   79 
 energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardCategoryMapper.xml                                                  |   95 
 compute-engine/mvnw                                                                                                                           |  310 
 data-model/src/main/resources/mybatis/basicsetting/IndexStorageMapper.xml                                                                     |   56 
 energy_management_ui/src/directive/permission/index.js                                                                                        |   15 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndexQuery.java                                                          |   52 
 energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/index.vue                                                      |   57 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringMapper.java                                                 |   71 
 energy_management_ui/src/api/onlineMonitoring/index.js                                                                                        |   61 
 basic/src/main/java/com/dingzhuo/energy/framework/config/GenConfig.java                                                                       |   66 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IdailyComprehensive.java                   |   17 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/monthlyKeyEquipment.java                               |  427 
 energy_management_ui/src/assets/icons/svg/404.svg                                                                                             |    1 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnlinkMessage.java                                               |   21 
 energy_management_ui/src/layout/RouteView.vue                                                                                                 |    3 
 energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/LineChart.vue                                                       |  122 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusLiveService.java                                |   63 
 energy_management_ui/src/views/dashboard/PanelGroup.vue                                                                                       |  181 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTableColumn.java                                                           |  370 
 basic-data/pom.xml                                                                                                                            |   22 
 energy_management_ui/src/assets/image/navbar/xiala.png                                                                                        |    0 
 energy_management_ui/src/components/shrink/index.vue                                                                                          |   39 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/LoadAlarmMessage.java                                                  |   26 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/StateTypeMapper.java                                                           |   62 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyAnnexServiceImpl.java                                       |   97 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/BenchmarkingManagementMapper.java                      |   65 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/BenchmarkingManagementServiceImpl.java           |  151 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/energyMonitoringController.java                   |   44 
 basic/src/main/java/com/dingzhuo/energy/common/utils/text/CharsetKit.java                                                                     |   87 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkHistoryAlarm.java                                            |  248 
 energy_management_ui/src/api/workforce/management.js                                                                                          |   60 
 energy_management_ui/src/components/SizeSelect/index.vue                                                                                      |   57 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/TimeTypeConst.java                                                  |   25 
 energy_management_server/src/main/resources/mybatis/keyEquipment/yearKeyEquipmentMapper.xml                                                   |   76 
 energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/LineChart.vue                                                        |  120 
 energy_management_ui/src/assets/home/electric06.png                                                                                           |    0 
 basic/src/main/java/com/dingzhuo/energy/framework/config/RtdbConfig.java                                                                      |   48 
 energy_management_ui/src/api/electricityPrice/price.js                                                                                        |   69 
 energy_management_server/.gitignore                                                                                                           |   43 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserRole.java                                                                |   46 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/processEnergyConsumptionService.java       |   11 
 energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEntry.vue                                                                  |  230 
 energy_management_ui/src/views/benchmarking/BenchmarkingManagement/index.vue                                                                  |   56 
 energy_management_ui/src/views/energyPlan/energyForecast/energyForecast.vue                                                                   |  268 
 energy_management_ui/.eslintrc.js                                                                                                             |  199 
 energy_management_ui/src/api/basicsetting/indexStorage.js                                                                                     |   38 
 energy_management_ui/src/layout/components/Sidebar/index.vue                                                                                  |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMExcel.java                    |   48 
 energy_management_ui/src/components/RuoYi/index.vue                                                                                           |   21 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityArchivesMapper.java                                           |   94 
 energy_management_ui/public/index.html                                                                                                        |  209 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityAnnexMapper.java                                              |   61 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnercoefficientController.java                           |  103 
 db/2022-03-17.sql                                                                                                                             |    7 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/mapper/energyStatisticsMapper.java                        |   10 
 energy_management_ui/src/assets/icons/svg/phone.svg                                                                                           |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardParametersMapper.java                         |   63 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringSchemeitem.java                                             |  168 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserRoleMapper.java                                                          |   62 
 energy_management_ui/src/views/basicsetting/nodeSetting/deviceSetting.vue                                                                     |  141 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelNodeMapper.java                                                           |  158 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusHistory.java                                      |  177 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysEquipmentfileService.java                           |   33 
 energy_management_ui/src/api/energyAlarm/realTimeAlarm/liveHistoryAssembly.js                                                                 |   33 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/SavePeriodActor.java                                                 |  145 
 energy_management_ui/src/api/energy/energyProject.js                                                                                          |   53 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringShiftService.java                                         |   66 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysProductController.java                                   |  128 
 energy_management_ui/src/views/tool/build/index.vue                                                                                           |    5 
 basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableSupport.java                                                                  |   49 
 data-model/src/main/resources/mybatis/basicsetting/ModelInfoMapper.xml                                                                        |   72 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/impl/EnergyConsumeInputServiceImpl.java         |  101 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ComprehensiveReportsController.java                  |   75 
 energy_management_ui/src/views/basicSetup/equipmentfile/trendLineChart.vue                                                                    |  376 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/DaqTemplate.java                                                               |   93 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/dto/EnergyIndexMonitorDTO.java                                                 |   47 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DaqTemplateServiceImpl.java                                              |   99 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/controller/HistoryDataController.java                            |   31 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringScheme.java                                                 |  143 
 energy_management_ui/src/assets/icons/svg/list.svg                                                                                            |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlannedOutputController.java                      |  113 
 energy_management_ui/src/api/dataEntry/stagseDataEntry.js                                                                                     |   39 
 basic/src/main/java/com/dingzhuo/energy/framework/manager/factory/AsyncFactory.java                                                           |  101 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysMenuMapper.java                                                              |  108 
 energy_management_ui/src/assets/icons/svg/tab.svg                                                                                             |    1 
 energy_management_ui/src/views/energyBalance/energyLoss/PieChart.vue                                                                          |  150 
 energy_management_server/src/main/resources/application-prod.yml                                                                              |   37 
 energy_management_ui/src/views/login.vue                                                                                                      |  228 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/RouterVo.java                                                                |  145 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/Rostering.java                                                       |  202 
 energy_management_ui/src/directive/permission/hasPermi.js                                                                                     |   28 
 energy_management_server/src/main/resources/mybatis/statisticalData/GxdhCountMapper.xml                                                       |  236 
 energy_management_ui/src/api/benchmarking/BenchmarkingManagement.js                                                                           |   53 
 energy_management_ui/src/api/energy/reportAnnex.js                                                                                            |   53 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/yearComperhensive.java                      |  215 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/InitCallback.java                                    |   88 
 energy_management_ui/src/api/policy/policyInsert.js                                                                                           |   53 
 energy_management_ui/src/assets/icons/svg/download.svg                                                                                        |    1 
 energy_management_ui/src/layout/components/Navbar.vue                                                                                         |  186 
 energy_management_ui/src/assets/icons/index.js                                                                                                |    9 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaServiceImpl.java                           |  171 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/ComprehensiveReportsServiceImpl.java               |  347 
 energy_management_ui/src/views/monitor/job/index.vue                                                                                          |    5 
 energy_management_ui/src/views/energyBalance/energyPic/energyPic.vue                                                                          |  190 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictData.java                                                                |  179 
 energy_management_ui/src/assets/logo/toray_group_icon.png                                                                                     |    0 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnerclassServiceImpl.java                              |  113 
 energy_management_ui/src/api/basicSetup/category.js                                                                                           |   53 
 energy_management_ui/src/views/comreport/frreport/reportiframe.vue                                                                            |   47 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/EnergyIndexController.java                                                 |  203 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IconsolidatedStatementsService.java                     |   61 
 energy_management_ui/src/api/reportSet/index.js                                                                                               |   37 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/TimePeriodPriceServiceImpl.java                   |  129 
 energy_management_server/src/main/resources/mybatis/plannedOutput/PlannedOutputMapper.xml                                                     |  146 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusTimerActor.java                                             |   78 
 energy_management_ui/src/views/system/dict/data.vue                                                                                           |  375 
 energy_management_ui/src/views/system/user/profile/userAvatar.vue                                                                             |  138 
 basic/src/main/java/com/dingzhuo/energy/common/utils/Arith.java                                                                               |  114 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMenuMapper.java                                                          |   36 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/dto/HistoricalDataDTO.java                             |   63 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnercoefficientMapper.java                                   |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCount.java                                      |  107 
 energy_management_ui/src/api/electricityPrice/statistics.js                                                                                   |   25 
 energy_management_ui/src/views/benchmarking/realTimeBenchmarking/index.vue                                                                    |   56 
 energy_management_ui/src/views/equipmentMonitor/keyEquipment/index.vue                                                                        |   55 
 energy_management_ui/src/directive/permission/hasRole.js                                                                                      |   28 
 energy_management_ui/src/components/Editor/index.vue                                                                                          |  226 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/HomePageIndexController.java                         |   35 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringDutyServiceImpl.java                                  |   96 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyConsumptionRatioVO.java                           |   42 
 energy_management_ui/src/views/energyStatistics/energyConsumption/PieChart.vue                                                                |  150 
 basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUtils.java                                                                      |  175 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictDataController.java                                                  |  115 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysUserOnline.java                                                             |  113 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IyearKeyEquipmentService.java                         |   18 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringService.java                                              |   76 
 energy_management_ui/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js                                             |   17 
 energy_management_ui/src/components/Screenfull/index.vue                                                                                      |   60 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectServiceImpl.java                                     |   99 
 energy_management_ui/src/views/index_dev.vue                                                                                                  |   10 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/data/InfluxDb.java                                                                 |  201 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysPostMapper.java                                                              |   99 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/config/EngineArgOption.java                                                          |   47 
 energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/index.vue                                                              |   65 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormulaParam.java                                       |   76 
 energy_management_ui/src/api/monitor/logininfor.js                                                                                            |   35 
 energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/stagseDataEntryEdit.vue                                                          |  203 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/StringUtil.java                                                     |   69 
 energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/stateTable.vue                                                             |   88 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysPriceController.java                                     |  104 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaMapper.java                                      |   76 
 basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeType.java                                                                       |   33 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/HttpUtil.java                                             |   66 
 energy_management_ui/src/views/monitor/server/index.vue                                                                                       |  210 
 data-model/src/main/resources/mybatis/basicsetting/StateTypeMapper.xml                                                                        |   83 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsTranslateServiceImpl.java                        |   96 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/IEnergyIndexService.java                                                      |  101 
 compute-engine/.mvn/wrapper/MavenWrapperDownloader.java                                                                                       |  118 
 energy_management_ui/src/views/equipmentMonitor/energyConsumption/curve.vue                                                                   |  291 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Cpu.java                                                                  |  101 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/EnergyMonthConsumeInputController.java       |  106 
 energy_management_ui/src/assets/icons/svg/documentation.svg                                                                                   |    1 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/DataItem.java                                                               |  169 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/TimePeriodPriceMapper.java                              |   65 
 energy_management_ui/src/views/equipmentMonitor/parameters/modelMonitorSetting.vue                                                            |  169 
 energy_management_ui/src/assets/icons/svg/pdf.svg                                                                                             |    1 
 basic/pom.xml                                                                                                                                 |   22 
 energy_management_ui/src/views/energyBalance/energyBalance/energyBalance.vue                                                                  |  205 
 energy_management_ui/src/views/meter/implement/importIndexTable.vue                                                                           |  168 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalcMessageExtractor.java                                                     |   33 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeitemMapper.java                                       |   61 
 energy_management_ui/src/views/energyAlarm/historicalAlarm/LChart.vue                                                                         |  138 
 energy_management_ui/src/assets/icons/svg/swagger.svg                                                                                         |    1 
 energy_management_ui/src/views/energyPlan/energyEstablishment/energyEstablishment.vue                                                         |  213 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/annualReportMapper.java                                  |   24 
 energy_management_ui/src/assets/home/haozhengqi.svg                                                                                           |   23 
 energy_management_ui/src/views/tool/gen/basicInfoForm.vue                                                                                     |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IComprehensiveReportsService.java                       |   49 
 energy_management_ui/src/api/energyAlarm/realTimeAlarm/realTimeAlarm.js                                                                       |   53 
 energy_management_ui/src/views/error/404.vue                                                                                                  |  233 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/statisticsController.java                           |  137 
 basic/src/main/java/com/dingzhuo/energy/framework/redis/RedisCache.java                                                                       |  207 
 basic/src/main/resources/mybatis/system/SysDictDataMapper.xml                                                                                 |  124 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/PeriodAlarmActor.java                                                    |   68 
 energy_management_ui/src/views/basicsetting/modelNode/index.vue                                                                               |  100 
 energy_management_ui/src/views/electricityPrice/statistics/pieChart.vue                                                                       |  100 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticResult.java                                                        |  190 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysOperLogServiceImpl.java                                               |   75 
 energy_management_ui/src/views/monitor/druid/index.vue                                                                                        |   26 
 energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/LineChart.vue                                                            |  120 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessType.java                                                        |   59 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/monthlyReportServiceImpl.java                      |   30 
 energy_management_ui/src/views/basicSetup/parameters/index.vue                                                                                |  298 
 energy_management_ui/src/views/dataMonitoring/historyDataTrend/historyMonitoringSetting.vue                                                   |  347 
 compute-engine/.mvn/wrapper/maven-wrapper.jar                                                                                                 |    0 
 energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/energyYearConsumeInput.vue                                            |  208 
 basic/src/main/resources/mybatis/system/SysRoleDeptMapper.xml                                                                                 |   34 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableService.java                                                        |  101 
 energy_management_ui/src/api/system/user.js                                                                                                   |  127 
 energy_management_ui/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js                                                   |   17 
 energy_management_ui/src/views/basicsetting/device/deviceTabSetting.vue                                                                       |   70 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyAnnexService.java                                               |   61 
 energy_management_ui/src/views/demo/index.vue                                                                                                 |  297 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysProductService.java                                        |   66 
 basic/src/main/java/com/dingzhuo/energy/common/utils/MessageUtils.java                                                                        |   27 
 basic/src/main/java/com/dingzhuo/energy/framework/web/exception/GlobalExceptionHandler.java                                                   |  117 
 basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserException.java                                                              |   18 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/IEnergyShareAnalysisService.java               |   20 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/ICalcFunctionService.java                                                     |   61 
 energy_management_ui/src/assets/icons/svg/chart.svg                                                                                           |    1 
 energy_management_server/src/main/resources/application.yml                                                                                   |  187 
 energy_management_ui/src/views/energyExamine/assessmentResults/index.vue                                                                      |   58 
 energy_management_ui/src/views/reportForm/monthlyReport/index.vue                                                                             |  246 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementCountMapper.java                                           |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/EnergyPicServiceImpl.java                       |   86 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/dailyComprehensive.java                     |   79 
 energy_management_ui/src/api/dataAuth/authSetting.js                                                                                          |   16 
 energy_management_ui/src/views/reportForm/index.vue                                                                                           |  281 
 basic/src/main/java/com/dingzhuo/energy/framework/config/FastJson2JsonRedisSerializer.java                                                    |   70 
 energy_management_ui/src/views/tool/gen/editTable.vue                                                                                         |  204 
 energy_management_ui/src/views/system/post/index.vue                                                                                          |  360 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/FastDB.java                                                          |  340 
 energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/mixins/resize.js                                                        |   52 
 energy_management_ui/src/views/index.vue                                                                                                      |  773 
 energy_management_server/src/main/resources/vm/vue/index.vue.vm                                                                               |  439 
 energy_management_ui/src/api/statisticalData/gxdhcount.js                                                                                     |   62 
 compute-engine/src/main/resources/akka.conf                                                                                                   |   37 
 energy_management_ui/upload/政策法规行政附件.doc                                                                                                      |    0 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/yearKeyEquipment.java                                  |  201 
 energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/monthlyComprehensiveMapper.xml                                    |  101 
 energy_management_server/src/main/resources/mybatis/keyEquipment/monthlyKeyEquipmentMapper.xml                                                |   95 
 energy_management_ui/.eslintignore                                                                                                            |   10 
 basic/src/main/resources/mybatis/system/SysPostMapper.xml                                                                                     |  123 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleMenu.java                                                                |   46 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IRealtimeAlarmService.java                                    |   42 
 energy_management_ui/src/assets/styles/element-variables.scss                                                                                 |   31 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/monthlyWorkingProcedureController.java         |  115 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/mapper/EnergyConsumeInputMapper.java                    |   52 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusLive.java                                         |  133 
 energy_management_ui/src/assets/icons/svg/component.svg                                                                                       |    1 
 energy_management_ui/src/views/energyStatistics/energyConsumption/consumption.vue                                                             |  419 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/PhaseBenchmarking.java                                 |   97 
 energy_management_ui/src/views/stage/alarm/alarmIndex.vue                                                                                     |  569 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmItem.java                                                 |  182 
 energy_management_ui/src/views/equipmentMonitor/keyEquipment/LineChart.vue                                                                    |  154 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/stagseDataEntry.java                                      |   53 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDeptController.java                                                      |  135 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYVO.java                       |   42 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysProductServiceImpl.java                                |  123 
 basic/src/main/java/com/dingzhuo/energy/common/utils/security/Md5Utils.java                                                                   |   67 
 energy_management_ui/src/views/dataMonitoring/realTimeTrend/trendSetting.vue                                                                  |  281 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleDeptMapper.java                                                          |   44 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/domain/EnergyBenchmarking.java                          |  146 
 basic-data/src/main/resources/mybatis/facility/FacilityAnnexMapper.xml                                                                        |   95 
 energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementServletInitializer.java                                            |   18 
 basic/src/main/java/com/dingzhuo/energy/common/utils/sql/SqlUtil.java                                                                         |   36 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/HistoryAlarmMapper.java                                        |   39 
 energy_management_ui/public/toray_group_icon.png                                                                                              |    0 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusActor.java                                                  |   90 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexFormulaServiceImpl.java                                             |   55 
 energy_management_ui/src/assets/icons/svg/password.svg                                                                                        |    1 
 energy_management_server/src/main/resources/mybatis/workingProcedure/yearWorkingProcedureMapper.xml                                           |   74 
 energy_management_ui/src/views/energyExamine/assessmentIndex/create_index.vue                                                                 |  393 
 energy_management_ui/src/layout/components/AppMain.vue                                                                                        |   58 
 energy_management_ui/src/views/basicSetup/parameters/basicIndex.vue                                                                           |  344 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/ConglomeratePushTask.java                                 |   46 
 energy_management_ui/src/views/benchmarking/BenchmarkingManagement/benchmarking.vue                                                           |  204 
 energy_management_ui/src/api/workforce/scheme.js                                                                                              |   53 
 energy_management_ui/src/views/components/icons/element-icons.js                                                                              |   74 
 energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/index.vue                                                               |   55 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/BaseAlarmActor.java                                                      |  158 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DataAuthController.java                                                    |   52 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/yearComprehensiveController.java        |  154 
 energy_management_ui/src/views/energyPlan/energyForecast/LineChart.vue                                                                        |  140 
 energy_management_ui/src/views/workforce/management/scheme.vue                                                                                |  374 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDept.java                                                                    |  205 
 basic-data/src/main/resources/mybatis/enerInfoManage/SysEnerclassMapper.xml                                                                   |   84 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricity.java                                        |  125 
 energy_management_ui/src/assets/icons/svg/nested.svg                                                                                          |    1 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnercoefficient.java                                         |  171 
 energy_management_ui/src/utils/auth.js                                                                                                        |   15 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectAnnexServiceImpl.java                                |   97 
 energy_management_ui/src/views/workforce/management/schemeItem.vue                                                                            |  361 
 energy_management_ui/src/assets/image/rectangle.png                                                                                           |    0 
 basic/src/main/java/com/dingzhuo/energy/common/utils/sign/Base64.java                                                                         |  291 
 energy_management_ui/src/api/system/post.js                                                                                                   |   53 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/ImonthlyReportService.java                              |   17 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmStatus.java                                                       |   25 
 energy_management_ui/src/views/facility/querycount/index.vue                                                                                  |  668 
 basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileException.java                                                              |   19 
 basic/src/main/java/com/dingzhuo/energy/framework/config/ApplicationConfig.java                                                               |   30 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysLogininforServiceImpl.java                                            |   65 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewaySettingService.java                                |   81 
 energy_management_ui/src/views/benchmarking/phaseBenchmarking/index.vue                                                                       |   56 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDeptMapper.java                                                              |  109 
 energy_management_ui/src/views/energySaving/emissionReduction/emissionReduction.vue                                                           |  131 
 energy_management_ui/src/views/system/user/index.vue                                                                                          |  742 
 basic/src/main/java/com/dingzhuo/energy/framework/config/DruidConfig.java                                                                     |  130 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityInitializer.java                                                        |   35 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/ElectricityPriceMapper.java                             |   67 
 compute-engine/pom.xml                                                                                                                        |  155 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/JtZhnhExcel.java                                         |  207 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/PhaseBenchmarkingMapper.java                           |   28 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportAnnexMapper.java                                            |   61 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcPeriod.java                                                                |   34 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/ISvgTrendService.java                                     |   15 
 data-monitoring/src/main/resources/mybatis/alarm/RealtimeAlarmMapper.xml                                                                      |  198 
 energy_management_ui/src/assets/styles/sidebar.scss                                                                                           |  212 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/Recalc.java                                                               |   34 
 energy_management_ui/src/api/energy/report.js                                                                                                 |   53 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/dailyKeyEquipmentMapper.java                           |   31 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/dailyWorkingProcedure.java                         |  322 
 energy_management_ui/src/api/workingProcedure/dailyComprehensive/dailyComprehensive.js                                                        |   17 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableMapper.java                                                           |   78 
 basic/src/main/resources/mybatis/system/SysUserMapper.xml                                                                                     |  226 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/controller/DataItemController.java                               |  144 
 energy_management_ui/src/assets/home/electric05.png                                                                                           |    0 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelInfoService.java                                                        |   71 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/dailyWorkingProcedureMapper.java                   |   29 
 energy_management_ui/src/main.js                                                                                                              |  107 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/EquipmentMeasuringPointParameters.java                        |   72 
 energy_management_ui/src/assets/icons/svg/skill.svg                                                                                           |    1 
 energy_management_ui/src/views/meter/implementCount/importFileTable.vue                                                                       |  195 
 energy_management_ui/src/views/benchmarking/realTimeBenchmarking/LineChart.vue                                                                |  130 
 energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/importAnnexTable.vue                                                        |  138 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/IIndexStorageService.java                                                     |   23 
 energy_management_ui/src/views/energyStatistics/mixins/resize.js                                                                              |   52 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysOperLogMapper.java                                                          |   50 
 energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardParametersMapper.xml                                                |  126 
 energy_management_ui/src/views/benchmarking/phaseBenchmarking/LineChart.vue                                                                   |  130 
 energy_management_ui/src/views/energyBalance/energyBalance/pie_chart.vue                                                                      |  103 
 basic/src/main/java/com/dingzhuo/energy/framework/config/RuoYiConfig.java                                                                     |  117 
 energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/index.vue                                                             |  366 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysPriceService.java                                          |   62 
 basic/src/main/resources/mybatis/monitor/SysOperLogMapper.xml                                                                                 |   82 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/service/PeriodDataService.java                                                     |  305 
 energy_management_ui/src/utils/vueToPdf/htmlToPdf.js                                                                                          |   32 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/comprehensiveStatisticsMapper.java          |   20 
 energy_management_ui/src/assets/icons/svg/log.svg                                                                                             |    1 
 basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeManager.java                                                                    |  148 
 energy_management_ui/src/views/dashboard/BarChart.vue                                                                                         |  159 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectService.java                                             |   61 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaParamMapper.java                                 |   76 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictDataServiceImpl.java                                               |  116 
 basic/src/main/java/com/dingzhuo/energy/framework/security/handle/AuthenticationEntryPointImpl.java                                           |   34 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/CommonConst.java                                                    |  145 
 energy_management_ui/src/views/reportForm/consolidatedStatements/index.vue                                                                    |  324 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/LimitTypeServiceImpl.java                                                |   96 
 basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaExpireException.java                                                     |   16 
 energy_management_ui/src/store/index.js                                                                                                       |   23 
 energy_management_ui/src/api/system/dept.js                                                                                                   |   60 
 energy_management_ui/src/views/redirect.vue                                                                                                   |   12 
 energy_management_ui/src/assets/icons/svg/people.svg                                                                                          |    1 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementCountService.java                                        |   61 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/PeriodDataServiceImpl.java                                            |  614 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/processEnergyConsumptionImp.java      |   31 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/monthlyWorkingProcedure.java                       |  415 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmJudgeMessage.java                                                 |   10 
 energy_management_ui/src/layout/components/Sidebar/SidebarItem.vue                                                                            |  128 
 energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart.vue                                                                     |  118 
 data-monitoring/src/main/resources/mybatis/device/DeviceFormulaMapper.xml                                                                     |   93 
 basic/src/main/java/com/dingzhuo/energy/framework/security/service/UserDetailsServiceImpl.java                                                |   60 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataSource.java                                                     |   26 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictTypeServiceImpl.java                                               |  141 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/AuthType.java                                                                  |    6 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringDutyController.java                                     |  105 
 energy_management_ui/src/assets/icons/svg/table.svg                                                                                           |    1 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserOnlineServiceImpl.java                                             |   97 
 energy_management_ui/src/views/energyBalance/energyLoss/energyLoss.vue                                                                        |  211 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlanEnergyController.java                         |   89 
 energy_management_ui/src/assets/404_images/404.png                                                                                            |    0 
 energy_management_server/src/main/resources/mybatis/conglomeratepush/ConglomeratePushLogMapper.xml                                            |   38 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IComprehensiveStatisticsService.java       |   22 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/monthlyReportMapper.java                                 |   26 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersExcel.java                         |   70 
 basic/src/main/java/com/dingzhuo/energy/common/xss/XssFilter.java                                                                             |   99 
 energy_management_ui/src/views/power-statistics-analyse/func/columns.js                                                                       |   62 
 basic/src/main/java/com/dingzhuo/energy/framework/config/properties/DruidProperties.java                                                      |   77 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysLogininforMapper.java                                                       |   42 
 energy_management_ui/src/assets/home/shi.png                                                                                                  |    0 
 data-monitoring/src/main/resources/mybatis/device/DeviceFormulaParamMapper.xml                                                                |   85 
 energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/index.vue                                                                  |   55 
 energy_management_ui/src/assets/styles/btn.scss                                                                                               |   99 
 energy_management_ui/src/views/equipmentMonitor/parameters/index.vue                                                                          |   55 
 energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/LineChart.vue                                                           |  120 
 energy_management_ui/src/components/IconSelect/index.vue                                                                                      |   69 
 energy_management_ui/src/views/index copy.vue                                                                                                 |  688 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveUnitConsumptionChartVO.java              |   37 
 compute-engine/src/main/resources/application.yml                                                                                             |  182 
 energy_management_ui/src/views/enerInfoManage/price/index.vue                                                                                 |  320 
 energy_management_ui/src/views/energyAlarm/realTimeAlarm/index.vue                                                                            |   76 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/IHistoryDataService.java                                 |   12 
 energy_management_ui/src/views/workforce/dutyManagement/rostering_duty.vue                                                                    |  303 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/mapper/AssessmentIndexMapper.java                                       |   77 
 energy_management_ui/src/components/Breadcrumb/index.vue                                                                                      |   81 
 energy_management_server/src/main/resources/mybatis/govReports/DataItemPubMapper.xml                                                          |  276 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Mem.java                                                                  |   61 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysPriceServiceImpl.java                                  |   94 
 energy_management_server/src/main/resources/vm/java/mapper.java.vm                                                                            |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/impl/energyStatisticsServiceImpl.java             |   52 
 energy_management_ui/src/views/energyMonitoring/eMonitoring/svgView/index.vue                                                                 |  185 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabase.java                                                      |   88 
 energy_management_ui/src/views/workforce/rosteringManagement/scheduling_basis.vue                                                             |  361 
 energy_management_ui/src/views/components/icons/svg-icons.js                                                                                  |   10 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/HistoryDeviceStatus.java                                      |   60 
 energy_management_ui/.editorconfig                                                                                                            |   22 
 energy_management_ui/src/api/benchmarking/phaseBenchmarking.js                                                                                |   19 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/CalcFunctionController.java                                                |  115 
 energy_management_ui/src/assets/home/electric04.png                                                                                           |    0 
 energy_management_ui/src/views/dashboard/LineChart.vue                                                                                        |  135 
 energy_management_ui/src/views/reportForm/annualReport/index.vue                                                                              |  168 
 energy_management_ui/src/views/statisticalData/gxdhcount/index.vue                                                                            |  329 
 energy_management_ui/src/views/reportSet/cjdIndex.vue                                                                                         |  271 
 basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaException.java                                                           |   16 
 basic/src/main/resources/mybatis/system/SysDictTypeMapper.xml                                                                                 |  105 
 energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/comprehensiveStatisticsMapper.xml                                 |  172 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictType.java                                                                |   97 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/TimePeriodPrice.java                                    |  123 
 energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/index.vue                                                                        |   53 
 energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/benchmarkingMonitoring.vue                                           |  136 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterTimeMessage.java                                               |   34 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveConsumptionRatioVO.java                  |   42 
 energy_management_ui/src/views/energyStatistics/energyStructure/index.vue                                                                     |   56 
 energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/index.vue                                                                   |  484 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterType.java                                                      |   12 
 basic/src/main/java/com/dingzhuo/energy/common/utils/ip/IpUtils.java                                                                          |  189 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelNodeService.java                                                        |  151 
 energy_management_server/src/main/resources/mybatis/reportForm/reportSetMapper.xml                                                            |  101 
 energy_management_ui/src/views/workforce/shiftManagement/index.vue                                                                            |  144 
 energy_management_ui/src/api/energyEenchmarking/energyEenchmarking.js                                                                         |   53 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsServiceImpl.java                                 |  101 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewayHbtLogServiceImpl.java                         |   93 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/yearKeyEquipmentServiceImpl.java                 |   38 
 META-INF/MANIFEST.MF                                                                                                                          |    3 
 energy_management_ui/src/assets/home/electric02.png                                                                                           |    0 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IElectricityPriceService.java                          |   75 
 basic/src/main/resources/mybatis/tool/GenTableMapper.xml                                                                                      |  172 
 energy_management_ui/src/views/energyBalance/energyBalance/LineChart.vue                                                                      |  110 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringDutyMapper.java                                             |   61 
 energy_management_ui/src/views/reportInfo/index.vue                                                                                           |  384 
 basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysPermissionService.java                                                  |   66 
 basic/src/main/java/com/dingzhuo/energy/framework/security/LoginUser.java                                                                     |  228 
 energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmView.vue                                                                 |  162 
 energy_management_ui/src/assets/icons/svg/code.svg                                                                                            |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyDetectionChart.java                               |   53 
 energy_management_ui/src/views/dataMonitoring/energyPercent/waterPercent.vue                                                                  |  423 
 energy_management_ui/src/views/dataMonitoring/realTimeTrend/index.vue                                                                         |   92 
 energy_management_ui/src/api/system/role.js                                                                                                   |   75 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardParametersServiceImpl.java              |  106 
 energy_management_ui/.gitignore                                                                                                               |   23 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/GenUtils.java                                                                   |  241 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/dataTimeSVG.java                                   |  169 
 basic/src/main/java/com/dingzhuo/energy/common/utils/http/HttpUtils.java                                                                      |  249 
 energy_management_ui/src/assets/icons/svg/exit-fullscreen.svg                                                                                 |    1 
 data-monitoring/pom.xml                                                                                                                       |   37 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementCountServiceImpl.java                                |   96 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterAnnexController.java                                            |  190 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/SaveAlarmActor.java                                                      |   57 
 energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart copy.vue                                                                |  107 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/EnergyIndexServiceImpl.java                                              |  271 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserOnlineService.java                                                     |   50 
 energy_management_ui/src/api/basicSetup/equipmentfile.js                                                                                      |   40 
 energy_management_ui/src/assets/icons/svg/star.svg                                                                                            |    1 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/RealtimeAlarmServiceImpl.java                            |   61 
 basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSourceContextHolder.java                                              |   45 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleDept.java                                                                |   46 
 energy_management_ui/src/api/system/dict/data.js                                                                                              |   61 
 energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/index.vue                                                            |   65 
 energy_management_server/src/main/resources/vm/sql/sql.vm                                                                                     |   22 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/domain/AssessmentIndex.java                                             |  210 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityArchivesServiceImpl.java                                |  285 
 basic/src/main/java/com/dingzhuo/energy/framework/interceptor/impl/SameUrlDataInterceptor.java                                                |   90 
 basic/src/main/resources/mybatis/system/SysNoticeMapper.xml                                                                                   |   89 
 energy_management_ui/src/api/dataMonitoring/svgTrend/svgTrendView.js                                                                          |   10 
 energy_management_ui/src/assets/icons/svg/logininfor.svg                                                                                      |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/dataEntry.java                                            |  111 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementMapper.java                                                |   86 
 basic/src/main/java/com/dingzhuo/energy/framework/manager/AsyncManager.java                                                                   |   55 
 energy_management_ui/src/views/energyStatistics/energyConsumption/BarChart.vue                                                                |  145 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/RealtimeDatabaseServiceImpl.java                                      |   76 
 energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/index.vue                                                                |  330 
 energy_management_ui/src/assets/home/electric03.png                                                                                           |    0 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormula.java                                            |  130 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/TimePeriodPriceController.java                      |  128 
 basic-data/src/main/resources/mybatis/enerInfoManage/SysPriceMapper.xml                                                                       |   93 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlannedOutput.java                                    |  181 
 energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/index.vue                                                               |  651 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/impl/StatisticalAnalysisServiceImpl.java       |  315 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/dailyWorkingProcedureController.java           |   82 
 energy_management_server/src/main/resources/mybatis/processEnergyConsumption/processEnergyConsumptionMapper.xml                               |  110 
 basic/src/main/resources/mybatis/system/SysConfigMapper.xml                                                                                   |  112 
 energy_management_ui/src/views/basicsetting/nodeSetting/productSetting.vue                                                                    |   76 
 basic-data/src/main/resources/mybatis/workforce/RosteringMapper.xml                                                                           |  175 
 energy_management_server/src/main/resources/mybatis/gateway/GatewaySettingMapper.xml                                                          |  107 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyYearConsumeInputController.java        |  102 
 energy_management_ui/src/api/dataMonitoring/realTimeTrend/realTimeTrend.js                                                                    |   36 
 energy_management_ui/src/views/energySaving/report/index.vue                                                                                  |  330 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysPost.java                                                                    |  127 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlanEnergyMapper.java                                 |   26 
 energy_management_ui/src/views/comprehensiveStatistics/processEnergy/processEnergy.vue                                                        |  164 
 energy_management_ui/src/views/equipmentMonitor/keyEquipment/pieChart.vue                                                                     |   86 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetRequestModel.java                               |   22 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysPostService.java                                                           |  100 
 energy_management_ui/src/views/alarmItem/zbIndex.vue                                                                                          |  598 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpGetWithEntity.java                                              |   34 
 energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/parametersTable.vue                                                        |  160 
 energy_management_ui/src/assets/icons/svg/server.svg                                                                                          |    1 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/RealtimeDeviceStatusImpl.java                           |   13 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/controller/GenController.java                                                        |  192 
 energy_management_ui/src/assets/image/login-background1.png                                                                                   |    0 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplement.java                                                      |  266 
 energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/BarChart.vue                                                         |  112 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringActorProducer.java                                                       |   29 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringCopy.java                                                   |  126 
 energy_management_ui/src/views/reportForm/statements/index.vue                                                                                |  327 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/QueryType.java                                                       |   45 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/impl/SvgTrendServicelmpl.java                             |   26 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/mapper/SvgTrendMapper.java                                        |   15 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysEquipmentfile.java                                    |   50 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysMenu.java                                                                    |  231 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/CalculateMessage.java                                            |   47 
 energy_management_ui/src/views/basicsetting/stateIndex/index.vue                                                                              |   68 
 energy_management_ui/src/views/keyEquipment/dailykeyEquipment/LineChart.vue                                                                   |  120 
 basic/src/main/java/com/dingzhuo/energy/common/utils/StringUtils.java                                                                         |  453 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserPostMapper.java                                                          |   44 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaService.java                                   |   92 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Log.java                                                            |   41 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewaySetting.java                                         |  118 
 data-monitoring/src/main/resources/mybatis/device/DeviceStatusHistoryMapper.xml                                                               |  177 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/controller/AssessmentIndexController.java                               |  142 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysOperLogService.java                                                       |   48 
 energy_management_ui/src/api/basicsetting/state.js                                                                                            |   12 
 energy_management_ui/src/views/energyBalance/energyPic/index.vue                                                                              |   58 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityAnnexServiceImpl.java                                   |   96 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/RealtimeAlarmMapper.java                                       |   79 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeOutdoorTemperatureVO.java                               |   23 
 energy_management_ui/src/views/basicsetting/function/index.vue                                                                                |  252 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormula.java                                                              |   45 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/statisticsMapper.java                                   |   30 
 energy_management_ui/src/views/energySaving/report/importReportFile.vue                                                                       |  205 
 energy_management_ui/src/assets/home/electric01.png                                                                                           |    0 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementCountController.java                                   |  103 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelNodeServiceImpl.java                                                |  331 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityAnnexService.java                                           |   61 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/AlarmItemMapper.java                                           |  128 
 energy_management_ui/src/assets/image/login-background.png                                                                                    |    0 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringDuty.java                                                   |  119 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeMapper.java                                           |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/consolidatedStatements.java                              |  554 
 basic/src/main/java/com/dingzhuo/energy/project/common/CommonController.java                                                                  |  123 
 energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/monitorAlarmSetting.vue                                                    |  296 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysPostController.java                                                      |  136 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DataAuthMapper.java                                                            |   17 
 energy_management_ui/src/assets/icons/svg/druid.svg                                                                                           |    1 
 energy_management_ui/src/views/power-statistics-analyse/pari-passu/index.vue                                                                  |  421 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputEntity.java                |   32 
 energy_management_ui/src/assets/icons/svg/system.svg                                                                                          |    2 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMVO.java                       |   42 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysUserOnlineController.java                                               |  100 
 basic/src/main/java/com/dingzhuo/energy/common/utils/VerifyCodeUtils.java                                                                     |  226 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricitTable.java                                    |   26 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlanEnergy.java                                       |  246 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeService.java                                        |   61 
 energy_management_ui/src/api/keyEquipment/monthlykeyEquipment/monthlykeyEquipment.js                                                          |   17 
 energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/index.vue                                                            |  486 
 energy_management_ui/src/views/facility/archives/importAnnexTable.vue                                                                         |  205 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricityDataItem.java                                |  161 
 energy_management_ui/src/views/system/dict/index.vue                                                                                          |  376 
 basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUploadUtils.java                                                                |  296 
 energy_management_ui/src/assets/icons/svg/date.svg                                                                                            |    1 
 energy_management_ui/src/assets/icons/svg/example.svg                                                                                         |    1 
 basic/src/main/java/com/dingzhuo/energy/framework/config/MyBatisConfig.java                                                                   |  105 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementServiceImpl.java                                     |  250 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensive.java                          |  385 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/dailyKeyEquipmenteController.java                  |  122 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/reportFormController.java                            |  112 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcFunction.java                                                              |   87 
 energy_management_ui/src/assets/icons/svg/excel.svg                                                                                           |    1 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/RtdbResult.java                                                      |   70 
 energy_management_ui/src/views/stage/alarm/index.vue                                                                                          |   70 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnercoefficientService.java                                |   61 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/OperatorType.java                                                        |   24 
 energy_management_ui/src/views/power-statistics-analyse/pari-passu/LineChart.vue                                                              |  152 
 energy_management_server/src/main/resources/mybatis/plannedOutput/energyMonitoringMapper.xml                                                  |   46 
 basic-data/src/main/resources/mybatis/energy/EnergyReportAnnexMapper.xml                                                                      |   94 
 basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserPasswordNotMatchException.java                                              |   16 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/AjaxResult.java                                                                  |  148 
 energy_management_ui/src/utils/zipdownload.js                                                                                                 |   40 
 energy_management_ui/src/views/monitor/logininfor/index.vue                                                                                   |  260 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlannedOutputService.java                           |   39 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineRunner.java                                                             |   94 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyBalanceService.java                           |   25 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/ServerController.java                                                      |   31 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPub.java                                         |  151 
 energy_management_ui/src/assets/icons/svg/message.svg                                                                                         |    1 
 energy_management_ui/src/views/alarmItem/modelWarnSetting.vue                                                                                 |  119 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/monthlyKeyEquipmentController.java                 |  133 
 energy_management_ui/src/api/monitor/online.js                                                                                                |   18 
 energy_management_server/src/main/resources/mybatis/EnergyConsumeInput/EnergyConsumeInputMapper.xml                                           |   86 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyPicService.java                               |   24 
 energy_management_ui/src/views/facility/querycount/importAnnexTable.vue                                                                       |  205 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableColumnService.java                                                  |   44 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysEquipmentfileMapper.java                              |   24 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/LimitType.java                                                                 |  119 
 energy_management_ui/src/api/enerInfoManage/energy.js                                                                                         |   74 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/energyMonitoring.java                                 |  132 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataVO.java                               |   77 
 energy_management_ui/src/assets/icons/svg/eye-open.svg                                                                                        |    1 
 energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/BarChart.vue                                                          |  112 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysConfigService.java                                                         |   76 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysNoticeMapper.java                                                            |   60 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMapper.java                                                              |  107 
 data-model/src/main/resources/mybatis/energyindex/EnergyIndexMapper.xml                                                                       |  332 
 energy_management_ui/src/views/energyStatistics/energyAnalysis/index.vue                                                                      |   55 
 energy_management_ui/src/views/equipmentMonitor/keyEquipment/equipmentView.vue                                                                |  358 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/ApplicationConfiguration.java                                                        |   40 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mapper/ConglomeratePushLogMapper.java                     |   17 
 energy_management_ui/src/assets/logo/logo-page-left.png                                                                                       |    0 
 energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmTable.vue                                                                |  198 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/LoadDeviceStatusActor.java                                              |  110 
 energy_management_server/src/main/resources/logback.xml                                                                                       |   93 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysProduct.java                                                 |  238 
 basic/src/main/java/com/dingzhuo/energy/common/core/lang/UUID.java                                                                            |  483 
 energy_management_server/src/main/resources/mybatis/workingProcedure/monthlyWorkingProcedureMapper.xml                                        |   93 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportSetService.java                                  |   48 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProject.java                                                      |  179 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReportAnnex.java                                                  |  111 
 energy_management_ui/src/assets/icons/svg/eye.svg                                                                                             |    1 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/IndexStorageController.java                                                |  156 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/LoadAlarmActor.java                                                      |  161 
 energy_management_ui/src/assets/401_images/401.gif                                                                                            |    0 
 energy_management_ui/src/api/basicsetting/modelNode.js                                                                                        |  185 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IstatisticsService.java                                |   37 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcParamsModel.java                           |   24 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/dto/DataAnalysisMoMDTO.java                     |   49 
 basic-data/src/main/resources/mybatis/policy/PolicyRegulationsMapper.xml                                                                      |   79 
 energy_management_ui/src/utils/ruoyi.js                                                                                                       |  133 
 energy_management_ui/src/views/meter/implementCount/importIndexTable.vue                                                                      |  168 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/dailycomprehensiveController.java       |   93 
 energy_management_ui/src/api/plannedOutput/energyMonitoring.js                                                                                |   10 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/ILimitTypeService.java                                                        |   61 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictTypeController.java                                                  |  125 
 package-lock.json                                                                                                                             |    3 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportFormService.java                                 |   22 
 energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/reportForm.vue                                                          |  212 
 compute-engine/mvnw.cmd                                                                                                                       |  182 
 energy_management_ui/src/views/electricityPrice/statistics/electricityIndex.vue                                                               |  234 
 basic/src/main/resources/mybatis/system/SysMenuMapper.xml                                                                                     |  162 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/IDaqTemplateService.java                                                      |   72 
 energy_management_ui/src/views/electricityPrice/statistics/index.vue                                                                          |   55 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardParameters.java                               |  124 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/monthlyReportController.java                         |  201 
 energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/BarChart.vue                                                             |  112 
 energy_management_ui/src/utils/scroll-to.js                                                                                                   |   58 
 pom.xml                                                                                                                                       |   91 
 basic/src/main/java/com/dingzhuo/energy/framework/security/handle/LogoutSuccessHandlerImpl.java                                               |   55 
 energy_management_ui/src/views/energyExamine/assessmentIndex/addIndexTable.vue                                                                |  121 
 energy_management_ui/src/views/system/user/profile/resetPwd.vue                                                                               |   76 
 basic/src/main/java/com/dingzhuo/energy/common/constant/GenConstants.java                                                                     |   94 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementService.java                                             |   95 
 energy_management_ui/src/assets/image/navbar/exit.png                                                                                         |    0 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnergyServiceImpl.java                                 |  183 
 data-model/src/main/resources/mybatis/basicsetting/CalcFunctionMapper.xml                                                                     |   70 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/AlarmItemServiceImpl.java                                |  198 
 basic/src/main/java/com/dingzhuo/energy/common/exception/BaseException.java                                                                   |   97 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/IStatisticalAnalysisService.java               |   49 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/SysFile.java                                                              |  114 
 energy_management_ui/src/api/energyAssistInput/energyYearConsumeInput.js                                                                      |   18 
 energy_management_ui/src/assets/home/haoqi.svg                                                                                                |   22 
 energy_management_ui/src/assets/icons/svg/search.svg                                                                                          |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/controller/energyBalanceController.java                      |  124 
 energy_management_ui/src/assets/icons/svg/icon.svg                                                                                            |    1 
 energy_management_ui/src/api/powerAnalyse/index.js                                                                                            |   88 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewaySettingController.java                           |  135 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/GovReportsTask.java                                             |   95 
 energy_management_ui/src/api/tool/gen.js                                                                                                      |   59 
 energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/index.vue                                                         |  442 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulations.java                                                  |  117 
 energy_management_ui/src/utils/jsencrypt.js                                                                                                   |   30 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/BenchmarkingManagementController.java              |  149 
 basic/src/main/java/com/dingzhuo/energy/framework/config/SwaggerConfig.java                                                                   |  113 
 basic/src/main/resources/mybatis/system/SysDeptMapper.xml                                                                                     |  173 
 energy_management_ui/src/views/basicSetup/equipmentfile/dataList.vue                                                                          |  121 
 energy_management_ui/src/views/alarm/LiChart.vue                                                                                              |  119 
 energy_management_ui/src/assets/home/cost.png                                                                                                 |    0 
 data-model/src/main/resources/mybatis/basicsetting/LimitTypeMapper.xml                                                                        |   92 
 energy_management_ui/src/assets/icons/svg/qq.svg                                                                                              |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/energyMonitoringMapper.java                           |   22 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/LogAspect.java                                                                      |  224 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/ElectricityPriceController.java                     |  137 
 basic/src/main/java/com/dingzhuo/energy/common/utils/file/MimeTypeUtils.java                                                                  |   55 
 energy_management_server/src/main/resources/mybatis/reportForm/monthlyReportMapper.xml                                                        |   72 
 energy_management_ui/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js                                                 |   17 
 energy_management_server/src/main/resources/vm/java/domain.java.vm                                                                            |   76 
 energy_management_server/src/main/resources/mybatis/electricityPrice/TimePeriodPriceMapper.xml                                                |   86 
 data-model/src/main/resources/mybatis/dataAuth/DataAuthMapper.xml                                                                             |   38 
 basic-data/src/main/resources/mybatis/workforce/RosteringSchemeMapper.xml                                                                     |  100 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardCategoryController.java                   |  103 
 energy_management_server/src/main/resources/mybatis/dataEntry/DataItemMapper.xml                                                              |  112 
 energy_management_ui/src/api/basicsetting/model.js                                                                                            |   53 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Jvm.java                                                                  |  122 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/monthlyWorkingProcedureServiceImpl.java      |   39 
 energy_management_ui/src/views/energyStatistics/energyConsumption/pieChartCost.vue                                                            |  161 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/controller/GxdhCountController.java                        |  117 
 energy_management_ui/src/views/energyPlan/actualOutput/EnergyActual.vue                                                                       |  152 
 energy_management_ui/src/views/benchmarking/phaseBenchmarking/phaseBenchmarking.vue                                                           |  182 
 energy_management_ui/src/assets/styles/element-ui.scss                                                                                        |   79 
 energy_management_ui/src/views/basicsetting/template/index.vue                                                                                |  437 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityArchivesController.java                                   |  177 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/CalcFunctionMapper.java                                                        |   62 
 energy_management_ui/src/views/enerInfoManage/enerclass/index.vue                                                                             |  359 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelInfoController.java                                                   |  116 
 energy_management_ui/src/utils/request.js                                                                                                     |   65 
 energy_management_ui/src/components/RightPanel/index.vue                                                                                      |  149 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkRealTimeAlarmList.java                                       |  208 
 energy_management_ui/src/store/modules/permission.js                                                                                          |   61 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/controller/SvgTrendView.java                                      |   74 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataScopeAspect.java                                                                |  164 
 energy_management_ui/src/views/policy/policySelete/index.vue                                                                                  |  368 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlannedOutputServiceImpl.java                   |  116 
 energy_management_ui/src/views/system/user/profile/index.vue                                                                                  |  106 
 energy_management_ui/src/views/costaccounting/frreport/reportiframe.vue                                                                       |   42 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDeptService.java                                                           |  103 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewayHbtLogMapper.java                                    |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/annualReport.java                                        |  206 
 energy_management_ui/src/views/enerInfoManage/energy/index.vue                                                                                |  629 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysMenuController.java                                                      |  131 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/PointDataVO.java                                                            |   36 
 energy_management_ui/src/api/alarmItem/alarmItem.js                                                                                           |  106 
 energy_management_ui/src/utils/index.js                                                                                                       |  317 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStorageController.java                              |  115 
 energy_management_ui/src/api/energyAssistInput/energyMonthConsumeInput.js                                                                     |   18 
 energy_management_ui/src/components/SvgIcon/index.vue                                                                                         |   61 
 energy_management_ui/src/views/reportForm/dailyReport/index.vue                                                                               |  175 
 energy_management_ui/src/api/workingProcedure/yearComprehensive/yearComprehensive.js                                                          |   18 
 basic-data/src/main/resources/mybatis/enerInfoManage/SysEnergyMapper.xml                                                                      |  209 
 energy_management_ui/src/views/basicsetting/nodeSetting/energySetting.vue                                                                     |   70 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlannedOutputMapper.java                              |   46 
 energy_management_ui/src/assets/icons/svg/link.svg                                                                                            |    1 
 energy_management_ui/src/views/system/notice/index.vue                                                                                        |  376 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LoadCalcIndexMessage.java                                        |   26 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/controller/HistoryDataTrend.java                              |  225 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetDataModel.java                                  |   20 
 energy_management_ui/src/views/basicsetting/energyIndex/indexStorage.vue                                                                      |  209 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnergyController.java                                    |  218 
 data-monitoring/src/main/resources/mybatis/trend/SvgTrendMapper.xml                                                                           |   36 
 energy_management_ui/src/views/basicSetup/equipmentfile/index.vue                                                                             |   70 
 basic/src/main/java/com/dingzhuo/energy/framework/config/ResourcesConfig.java                                                                 |   42 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/monthlyKeyEquipmentServiceImpl.java              |   39 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excels.java                                                         |   18 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewaySettingMapper.java                                   |   81 
 energy_management_ui/src/views/system/log/index.vue                                                                                           |    3 
 data-model/src/main/resources/mybatis/basicsetting/IndexFormulaMapper.xml                                                                     |   46 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IAlarmItemService.java                                        |  105 
 energy_management_ui/src/views/policy/policySelete/importFileTable.vue                                                                        |  227 
 energy_management_ui/src/assets/icons/svg/bug.svg                                                                                             |    1 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysConfig.java                                                                  |  114 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IHistoryAlarmService.java                                     |   33 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportSetServiceImpl.java                          |  120 
 energy_management_ui/src/api/statement/index.js                                                                                               |   35 
 energy_management_ui/src/views/energyPlan/energyMonitoring/index.vue                                                                          |   57 
 energy_management_ui/src/views/energySaving/energyProject/index.vue                                                                           |  435 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/ExecuteType.java                                                             |   12 
 energy_management_ui/src/api/comprehensiveStatistics/comprehensive.js                                                                         |   70 
 energy_management_ui/src/views/energyAlarm/historicalAlarm/historyAlarmNote.vue                                                               |  323 
 energy_management_ui/src/views/workforce/shiftManagement/rostering_shift.vue                                                                  |  342 
 energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementApplication.java                                                   |   18 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTConnect.java                                     |  136 
 energy_management_ui/src/views/system/config/index.vue                                                                                        |  381 
 energy_management_ui/build/index.js                                                                                                           |   35 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelInfoServiceImpl.java                                                |  158 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/impl/AssessmentIndexServiceImpl.java                            |  115 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/Server.java                                                                      |  245 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/mapper/EnergyBenchmarkingMapper.java                    |   61 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelNode.java                                                                 |  142 
 energy_management_ui/src/assets/icons/svg/zip.svg                                                                                             |    1 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/Quality.java                                                                |   12 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/ImonthlyKeyEquipmentService.java                      |   19 
 energy_management_ui/src/assets/icons/svgo.yml                                                                                                |   22 
 energy_management_ui/src/views/alarm/collectionIndex.vue                                                                                      |  315 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/energyBalanceServiceImpl.java                   |   36 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/PeriodDataController.java                                               |   31 
 energy_management_ui/package.json                                                                                                             |  106 
 energy_management_ui/src/views/basicsetting/dataAuthSetting/index.vue                                                                         |   66 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryTable.java                                              |   84 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/energyMonitoringService.java                         |   25 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/TreeObject.java                                                                |   66 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/ITimePeriodPriceService.java                           |   65 
 energy_management_ui/src/api/workforce/rosteringManagement.js                                                                                 |   64 
 energy_management_ui/src/api/basicsetting/template.js                                                                                         |   53 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnergyMapper.java                                            |  104 
 energy_management_ui/src/api/meter/implementCount.js                                                                                          |   53 
 energy_management_server/src/main/resources/banner.txt                                                                                        |    2 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeitemController.java                               |  112 
 energy_management_ui/src/assets/icons/svg/theme.svg                                                                                           |    1 
 basic/src/main/java/com/dingzhuo/energy/framework/web/controller/BaseController.java                                                          |   85 
 energy_management_ui/src/api/policy/annex.js                                                                                                  |   53 
 basic/src/main/java/com/dingzhuo/energy/common/constant/UserConstants.java                                                                    |   39 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/controller/DataItemPubController.java                           |  102 
 energy_management_ui/public/favicon.ico                                                                                                       |    0 
 energy_management_ui/src/views/energySaving/policiesRegulations/index.vue                                                                     |  179 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/function/FunctionEngine.java                                                         |   27 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/dailyReportController.java                           |  216 
 energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/BarChart.vue                                                                  |  112 
 basic/src/main/java/com/dingzhuo/energy/framework/web/page/PageDomain.java                                                                    |   69 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserService.java                                                           |  167 
 energy_management_ui/src/api/system/menu.js                                                                                                   |   60 
 energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/BarChart.vue                                                   |  112 
 basic-data/src/main/resources/mybatis/workforce/RosteringSchemeitemMapper.xml                                                                 |   96 
 energy_management_ui/src/assets/icons/svg/size.svg                                                                                            |    1 
 energy_management_ui/src/api/basicsetting/historyAlarm.js                                                                                     |   35 
 energy_management_ui/src/views/alarm/indexCollectionSetting.vue                                                                               |  324 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/monthlyComprehensiveMapper.java             |   30 
 energy_management_ui/src/views/basicsetting/statetype/index.vue                                                                               |  308 
 basic/src/main/java/com/dingzhuo/energy/common/utils/SecurityUtils.java                                                                       |   89 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysSvgInfo.java                                          |   32 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/monthlyKeyEquipmentMapper.java                         |   29 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/ElectricityPriceServiceImpl.java                  |  129 
 basic/src/main/java/com/dingzhuo/energy/common/xss/XssHttpServletRequestWrapper.java                                                          |  109 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DataAuthServiceImpl.java                                                 |   34 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/IEnergyStatisticsService.java                     |   21 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterAnnexMapper.java                                                    |   61 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeitemService.java                                    |   61 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportAnnexServiceImpl.java                                 |   96 
 energy_management_ui/src/views/reportSet/zbIndex.vue                                                                                          |  443 
 energy_management_ui/src/views/energyBalance/energyBalance/index.vue                                                                          |   57 
 basic-data/src/main/resources/mybatis/policy/PolicyAnnexMapper.xml                                                                            |   91 
 energy_management_ui/src/api/basicsetting/statetype.js                                                                                        |   53 
 energy_management_ui/src/api/reportForm/consolidatedStatements.js                                                                             |   53 
 energy_management_ui/src/views/energyStatistics/energyStructure/EnergyIndex.vue                                                               |  347 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringAkkaExtension.java                                                       |   23 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IRealtimeDeviceStatus.java                                   |    9 
 energy_management_ui/src/views/basicSetup/equipmentfile/configure.vue                                                                         |  205 
 parent/pom.xml                                                                                                                                |  285 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyAnalysisController.java                  |   83 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewayHbtLogService.java                                 |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dailyReport.java                                         |  326 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringController.java                                         |  204 
 energy_management_ui/src/views/tool/gen/genInfoForm.vue                                                                                       |  154 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensiveStatistics.java                |  185 
 energy_management_ui/src/layout/mixin/ResizeHandler.js                                                                                        |   45 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/PhaseBenchmarkingServiceImpl.java                |   49 
 energy_management_ui/src/assets/home/zonghe.svg                                                                                               |   21 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnercoefficientServiceImpl.java                        |   93 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRole.java                                                                    |  201 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IdailyKeyEquipmentService.java                        |   21 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/UnloadDeviceStatusMessage.java                                        |   23 
 basic-data/src/main/resources/mybatis/energy/EnergyProjectMapper.xml                                                                          |  107 
 energy_management_ui/src/api/monitor/server.js                                                                                                |    9 
 energy_management_ui/src/views/electricityPrice/statistics/mixins/resize.js                                                                   |   52 
 energy_management_ui/src/views/basicsetting/model/index.vue                                                                                   |  216 
 basic/src/main/java/com/dingzhuo/energy/common/constant/HttpStatus.java                                                                       |   89 
 basic/src/main/java/com/dingzhuo/energy/common/utils/text/StrFormatter.java                                                                   |   93 
 basic/src/main/java/com/dingzhuo/energy/framework/config/SecurityConfig.java                                                                  |  126 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/LimitTypeMapper.java                                                           |   61 
 energy_management_ui/src/views/energySaving/projectManagement/index.vue                                                                       |  186 
 energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/yearComprehensiveMapper.xml                                       |   81 
 energy_management_ui/src/assets/icons/svg/drag.svg                                                                                            |    1 
 energy_management_ui/src/api/enerInfoManage/enercoefficient.js                                                                                |   53 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ReportSetController.java                             |   99 
 energy_management_ui/src/views/power-statistics-analyse/pari-passu/BarChart.vue                                                               |  220 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IdailyReportService.java                                |   22 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysProductMapper.java                                           |   67 
 basic/src/main/java/com/dingzhuo/energy/common/constant/Constants.java                                                                        |  101 
 energy_management_ui/src/views/basicSetup/parameters/standard.vue                                                                             |   94 
 energy_management_ui/src/assets/icons/svg/peoples.svg                                                                                         |    1 
 energy_management_ui/src/views/monitor/operlog/index.vue                                                                                      |  356 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelInfo.java                                                                 |   75 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorage.java                                                              |   82 
 basic-data/src/main/resources/mybatis/facility/FacilityArchivesMapper.xml                                                                     |  183 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/CollectionModes.java                                                        |   10 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaParamServiceImpl.java                      |   93 
 energy_management_ui/src/api/reportForm/annualReport/annualReport.js                                                                          |   18 
 energy_management_ui/src/store/modules/app.js                                                                                                 |   56 
 energy_management_ui/src/api/plannedOutput/planEnergy.js                                                                                      |   18 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DaqTemplateController.java                                                 |  109 
 basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Sys.java                                                                  |   84 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/CalculationController.java                                                |   60 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportServiceImpl.java                                      |   96 
 energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/LineChart.vue                                                                 |  120 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/BenchmarkingManagement.java                            |  200 
 energy_management_ui/src/assets/icons/svg/language.svg                                                                                        |    1 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyAnnexMapper.java                                                  |   61 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnerclassService.java                                      |   69 
 energy_management_ui/src/views/energyStatistics/energyStructure/lineChart.vue                                                                 |  146 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementExcel.java                                                 |  223 
 energy_management_ui/src/views/monitor/online/index.vue                                                                                       |  128 
 basic/src/main/java/com/dingzhuo/energy/common/utils/poi/ExcelUtil.java                                                                       |  934 
 energy_management_ui/src/views/basicSetup/equipmentfile/tableDialog.vue                                                                       |   98 
 basic/src/main/java/com/dingzhuo/energy/project/tool/swagger/TestController.java                                                              |  178 
 energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/lineChart.vue                                                           |  136 
 basic/src/main/java/com/dingzhuo/energy/common/exception/CustomException.java                                                                 |   43 
 energy_management_ui/src/views/energyAlarm/historicalAlarm/realIndex.vue                                                                      |  375 
 energy_management_ui/src/assets/icons/svg/post.svg                                                                                            |    1 
 energy_management_ui/src/views/basicsetting/energyIndex/indexNodeSetting.vue                                                                  |  290 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeController.java                                   |  112 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportMapper.java                                                 |   61 
 basic/src/main/resources/mybatis/system/SysUserRoleMapper.xml                                                                                 |   44 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValueResult.java                                                         |   89 
 basic-data/src/main/resources/mybatis/meter/MeterImplementCountMapper.xml                                                                     |  143 
 energy_management_ui/src/components/common/basic-container.vue                                                                                |   98 
 basic/src/main/java/com/dingzhuo/energy/common/enums/UserStatus.java                                                                          |   30 
 energy_management_ui/src/views/electricityPrice/electricity/history.vue                                                                       |  123 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysProfileController.java                                                   |  116 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataExcel.java                            |   70 
 energy_management_ui/src/views/energyExamine/assessmentIndex/assessmentIndex.vue                                                              |  171 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/AlarmItemController.java                                   |  139 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYExcel.java                    |   48 
 energy_management_ui/src/assets/icons/svg/fullscreen.svg                                                                                      |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewaySettingServiceImpl.java                        |  126 
 energy_management_ui/src/views/energyExamine/assessmentResults/assessmentResults.vue                                                          |  226 
 energy_management_ui/src/views/energyPlan/energyMonitoring/LineChart.vue                                                                      |  130 
 energy_management_ui/src/views/system/user/profile/userInfo.vue                                                                               |   80 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusHistoryMapper.java                                |   71 
 energy_management_ui/src/assets/icons/svg/validCode.svg                                                                                       |    1 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/RealtimeAlarmActor.java                                                  |   62 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/ImonthlyComprehensive.java                 |   18 
 energy_management_ui/src/App.vue                                                                                                              |   11 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/CalculationIndexActor.java                                           |  128 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringShiftController.java                                    |  116 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnergy.java                                                  |  298 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnerclass.java                                               |  122 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTListener.java                                    |   51 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyUnitConsumptionChartVO.java                       |   37 
 energy_management_ui/src/views/energyAlarm/realTimeAlarm/LineChart.vue                                                                        |  144 
 energy_management_ui/src/views/equipmentMonitor/energyConsumption/index.vue                                                                   |   61 
 energy_management_ui/src/views/energySaving/energyAnnex/energyAnnex.vue                                                                       |  443 
 basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableDataInfo.java                                                                 |   85 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyStatisticsVO.java                                 |   32 
 energy_management_ui/src/assets/icons/svg/lock.svg                                                                                            |    1 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/LoadDeviceStatusMessage.java                                          |   23 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/yearWorkingProcedureMapper.java                    |   29 
 energy_management_ui/src/assets/home/haodian.svg                                                                                              |   20 
 energy_management_ui/src/views/energyBalance/energyLoss/index.vue                                                                             |   57 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexStorageServiceImpl.java                                             |  104 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/comprehensiveStatisticsImp.java       |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcRespModel.java                             |   18 
 energy_management_ui/src/views/energyAlarm/realTimeAlarm/modelRealTimeAlarmSetting.vue                                                        |  281 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IyearComprehensive.java                    |   19 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardCategoryMapper.java                           |   61 
 energy_management_ui/src/assets/icons/svg/wechat.svg                                                                                          |    1 
 energy_management_server/src/main/resources/vm/java/serviceImpl.java.vm                                                                       |  109 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/vo/EnergyAnalysisVO.java                        |   34 
 basic-data/src/main/resources/mybatis/workforce/RosteringShiftMapper.xml                                                                      |  119 
 energy_management_ui/src/api/comprehensiveStatistics/processEnergyConsumption.js                                                              |   19 
 energy_management_ui/src/views/reportSet/modelWarnSetting.vue                                                                                 |   67 
 energy_management_ui/src/assets/icons/svg/guide.svg                                                                                           |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardParametersController.java                 |  174 
 basic/src/main/java/com/dingzhuo/energy/common/utils/DateUtils.java                                                                           |  155 
 energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/dailyComprehensiveMapper.xml                                      |   93 
 basic/src/main/java/com/dingzhuo/energy/common/utils/Threads.java                                                                             |   99 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ActorUtil.java                                                                 |   64 
 energy_management_ui/src/views/tool/gen/importTable.vue                                                                                       |  114 
 energy_management_ui/src/api/basicSetup/parameters.js                                                                                         |   59 
 energy_management_ui/src/views/basicsetting/dataAuthSetting/userSelect.vue                                                                    |   69 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/RetrievalModes.java                                                         |   10 
 basic/src/main/java/com/dingzhuo/energy/common/utils/ServletUtils.java                                                                        |  132 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/monthlyComprehensive.java                   |  415 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/processEnergyConsumptionMapper.java         |    6 
 energy_management_ui/README.md                                                                                                                |   30 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IPhaseBenchmarkingService.java                        |   28 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabaseService.java                                               |  114 
 energy_management_ui/src/assets/home/haoshui.svg                                                                                              |   22 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/controller/StatisticalAnalysisController.java          |  132 
 energy_management_ui/src/views/system/role/index.vue                                                                                          |  597 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsTranslateService.java                                |   63 
 basic/src/main/java/com/dingzhuo/energy/framework/config/RedisConfig.java                                                                     |   43 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusHistoryController.java                        |  143 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/PhaseBenchmarkingController.java                   |   52 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorageParam.java                                                         |   23 
 energy_management_ui/src/views/keyEquipment/dailykeyEquipment/BarChart.vue                                                                    |  112 
 basic/src/main/java/com/dingzhuo/energy/common/utils/LogUtils.java                                                                            |   18 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterAnnexServiceImpl.java                                         |   96 
 energy_management_server/src/main/resources/mybatis/reportForm/annualReportMapper.xml                                                         |   54 
 energy_management_ui/src/assets/icons/svg/monitor.svg                                                                                         |    2 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexType.java                                                                 |   12 
 energy_management_server/src/main/resources/mybatis/reportForm/dailyReportMapper.xml                                                          |  100 
 basic/src/main/java/com/dingzhuo/energy/framework/interceptor/RepeatSubmitInterceptor.java                                                    |   57 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsMapper.java                                            |   65 
 energy_management_ui/src/api/basicsetting/alarm.js                                                                                            |    9 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/RealTimeTrend.java                                    |   51 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysPrice.java                                                   |  173 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/StateType.java                                                                 |   84 
 data-monitoring/src/main/resources/mybatis/alarm/HistoryAlarmMapper.xml                                                                       |  274 
 energy_management_ui/src/views/electricityPrice/electricity/index.vue                                                                         |  461 
 basic/src/main/java/com/dingzhuo/energy/common/utils/text/Convert.java                                                                        |  999 
 energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/index.vue                                                               |  325 
 energy_management_server/src/main/resources/mybatis/mybatis-config.xml                                                                        |   15 
 energy_management_ui/.env.production                                                                                                          |    5 
 data-model/src/main/resources/mybatis/basicsetting/ModelNodeMapper.xml                                                                        |  344 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/impl/EnergyBenchmarkingServiceImpl.java         |   93 
 energy_management_ui/src/api/meter/implement.js                                                                                               |   60 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityAnnex.java                                                    |  107 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/yearKeyEquipmentController.java                    |   84 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IHistoryDeviceStatus.java                                    |   13 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/energybalanceMapper.java                              |   24 
 energy_management_ui/src/views/basicSetup/equipmentfile/configureChart.vue                                                                    |  112 
 energy_management_ui/src/api/basicsetting/limitType.js                                                                                        |   53 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityArchives.java                                                 |  301 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/IndexFormulaService.java                                                      |   10 
 energy_management_ui/src/components/HeaderSearch/index.vue                                                                                    |  180 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringDutyService.java                                          |   61 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusHistoryService.java                             |   72 
 basic/src/main/java/com/dingzhuo/energy/framework/security/service/PermissionService.java                                                     |  170 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysOperLog.java                                                                |  256 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/IDataItemService.java                                    |   59 
 energy_management_ui/src/views/meter/implement/importFileTable.vue                                                                            |  205 
 energy_management_ui/src/assets/icons/svg/shopping.svg                                                                                        |    1 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysNoticeController.java                                                    |   98 
 basic/src/main/java/com/dingzhuo/energy/common/utils/html/EscapeUtil.java                                                                     |  152 
 energy_management_ui/src/assets/icons/svg/tree.svg                                                                                            |    1 
 energy_management_ui/src/layout/components/Sidebar/Link.vue                                                                                   |   47 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/consolidatedStatementsServiceImpl.java             |   96 
 energy_management_ui/src/views/basicsetting/nodeSetting/collectIndexSetting.vue                                                               |  126 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysMenuServiceImpl.java                                                   |  361 
 energy_management_ui/src/api/workingProcedure/monthlyComprehensive/monthlyComprehensive.js                                                    |   17 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticType.java                                                          |    5 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/HistoryAlarmController.java                                |  178 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/MetaVo.java                                                                  |   49 
 energy_management_ui/src/assets/image/touxiang.png                                                                                            |    0 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeitemServiceImpl.java                            |   95 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcType.java                                                                  |   16 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/statisticsServiceImpl.java                        |   78 
 energy_management_ui/src/views/basicsetting/stateIndex/stateIndex.vue                                                                         |  193 
 energy_management_ui/src/api/energyStatistics/statistics.js                                                                                   |  127 
 energy_management_ui/src/api/plannedOutput/plannedOutput.js                                                                                   |   53 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityUtils.java                                                              |  283 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityArchivesService.java                                        |  104 
 energy_management_ui/src/views/stage/alarm/LinChart.vue                                                                                       |  125 
 energy_management_ui/src/api/workforce/schemeItem.js                                                                                          |   60 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/mapper/DataItemMapper.java                                       |   55 
 energy_management_server/src/main/resources/mybatis/gateway/GatewayHbtLogMapper.xml                                                           |   66 
 energy_management_ui/src/api/login.js                                                                                                         |   40 
 energy_management_ui/src/views/keyEquipment/yearkeyEquipment/LineChart.vue                                                                    |  120 
 energy_management_ui/src/views/indexInfo.vue                                                                                                  |   26 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportAnnexController.java                                    |  148 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/annualReportController.java                          |  180 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/CalcFunctionServiceImpl.java                                             |   93 
 energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/index.vue                                                                |   60 
 energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/enchmarking.vue                                                          |  441 
 basic-data/src/main/resources/mybatis/energyExamine/AssessmentIndexMapper.xml                                                                 |  150 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusLiveController.java                           |  166 
 energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/workshop.vue                                                   |  133 
 energy_management_server/src/main/resources/vm/xml/mapper.xml.vm                                                                              |   95 
 energy_management_ui/src/api/reportForm/reportForm.js                                                                                         |   28 
 basic/src/main/resources/mybatis/system/SysRoleMapper.xml                                                                                     |  146 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/impl/EnergyShareAnalysisServiceImpl.java       |  136 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyAnnex.java                                                        |  131 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/mapper/DataItemPubMapper.java                                   |   84 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/data/RealtimeDatabaseManager.java                                                  |  153 
 data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/StateTypeServiceImpl.java                                                |   96 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/DecodeInstant.java                                                   |   15 
 energy_management_ui/src/api/meter/annex.js                                                                                                   |   63 
 energy_management_ui/src/assets/icons/svg/build.svg                                                                                           |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/dailyComprehensiveMapper.java               |   30 
 energy_management_ui/src/api/energyExamine/assessmentIndex.js                                                                                 |   61 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatus.java                                                     |   25 
 basic/src/main/java/com/dingzhuo/energy/common/exception/UtilException.java                                                                   |   26 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUser.java                                                                    |  328 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictDataService.java                                                       |   77 
 energy_management_ui/src/assets/styles/mixin.scss                                                                                             |   66 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IyearWorkingProcedure.java                        |   18 
 basic/src/main/java/com/dingzhuo/energy/framework/config/SystemConfig.java                                                                    |   23 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/impl/HistoryDataServiceImpl.java                         |   15 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalculationConfig.java                                                        |   22 
 energy_management_ui/src/assets/icons/svg/clipboard.svg                                                                                       |    1 
 energy_management_ui/src/views/energySaving/emissionReduction/index.vue                                                                       |   58 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmRegisterMessage.java                                              |   48 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/EnergyPicMapper.java                                  |   23 
 energy_management_ui/src/assets/image/configureChart.png                                                                                      |    0 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewayHbtLog.java                                          |   80 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/HistoryDeviceStatusImpl.java                            |   21 
 energy_management_ui/src/api/enerInfoManage/product.js                                                                                        |   59 
 energy_management_ui/src/views/history/query/historyIndex.vue                                                                                 |  317 
 energy_management_ui/src/views/meter/implementCount/index.vue                                                                                 |  808 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/impl/ConglomeratePushLogServiceImpl.java          |   93 
 energy_management_ui/src/views/dashboard/mixins/resize.js                                                                                     |   52 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardCategory.java                                 |  153 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyAnalysis.java                                |   54 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataScope.java                                                      |   28 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/EnergyConsumption.java                             |   72 
 basic-data/src/main/resources/mybatis/workforce/RosteringDutyMapper.xml                                                                       |   98 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysConfigServiceImpl.java                                                 |  129 
 energy_management_ui/src/layout/components/Sidebar/Item.vue                                                                                   |   29 
 basic/src/main/java/com/dingzhuo/energy/common/utils/spring/SpringUtils.java                                                                  |  114 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/IHomeService.java                                             |   63 
 energy_management_ui/src/api/energyAssistInput/energyDayConsumeInput.js                                                                       |   18 
 basic/src/main/java/com/dingzhuo/energy/framework/manager/ShutdownManager.java                                                                |   39 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysNoticeService.java                                                         |   60 
 energy_management_ui/src/views/basicSetup/parameters/index1.vue                                                                               |  555 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableServiceImpl.java                                                     |  341 
 energy_management_ui/src/store/modules/tagsView.js                                                                                            |  165 
 energy_management_ui/src/layout/components/Sidebar/Logo.vue                                                                                   |   98 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/monthlyComprehensiveServiceImpl.java  |   41 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementCount.java                                                 |  244 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysLogininforService.java                                                    |   40 
 energy_management_ui/src/views/basicsetting/device/index.vue                                                                                  |   59 
 energy_management_ui/src/assets/icons/svg/edit.svg                                                                                            |    1 
 energy_management_ui/src/views/basicsetting/device/devicestartstop.vue                                                                        |  191 
 energy_management_ui/src/assets/icons/svg/email.svg                                                                                           |    1 
 energy_management_ui/src/api/system/dict/type.js                                                                                              |   61 
 energy_management_ui/src/api/index.js                                                                                                         |   10 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportAnnexService.java                                         |   61 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmType.java                                                         |   12 
 basic/src/main/resources/mybatis/system/SysUserPostMapper.xml                                                                                 |   34 
 energy_management_ui/src/views/tool/swagger/index.vue                                                                                         |   26 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysPriceMapper.java                                             |   62 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysPostServiceImpl.java                                                   |  177 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/impl/DataItemServiceImpl.java                            |   77 
 compute-engine/src/main/resources/application-prod.yml                                                                                        |   18 
 energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/index.vue                                                            |   58 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulationsTranslate.java                                         |  108 
 energy_management_ui/src/api/workforce/duty_management.js                                                                                     |   53 
 energy_management_ui/src/assets/icons/svg/money.svg                                                                                           |    1 
 energy_management_ui/src/views/error/401.vue                                                                                                  |   88 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/controller/EnergyShareAnalysisController.java          |   37 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LinkMessage.java                                                 |   21 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/IConglomeratePushLogService.java                  |   16 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/IDataItemPubService.java                                |   84 
 energy_management_ui/src/store/getters.js                                                                                                     |   15 
 energy_management_ui/src/api/dataMonitoring/historyDataTrend/historyDataTrend.js                                                              |   35 
 energy_management_ui/src/assets/icons/svg/dict.svg                                                                                            |    1 
 basic/src/main/resources/mybatis/monitor/SysLogininforMapper.xml                                                                              |   56 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dto/ComprehensiveReportsDTO.java                         |   39 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSet.java                                           |   71 
 energy_management_ui/src/views/energyAlarm/historicalAlarm/index.vue                                                                          |   77 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyTypeVO.java                                       |   25 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/IEnergyBenchmarkingService.java                 |   61 
 energy_management_ui/src/views/facility/archives/index.vue                                                                                    |  805 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexStorageMapper.java                                                        |   25 
 basic/src/main/java/com/dingzhuo/energy/common/exception/file/InvalidExtensionException.java                                                  |   71 
 energy_management_ui/src/views/energyPlan/plannedOutput/EnergyPlan.vue                                                                        |  186 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/domain/EnergyPic.java                                        |  453 
 energy_management_ui/src/assets/logo/logo2.png                                                                                                |    0 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusLiveMapper.java                                   |   63 
 energy_management_ui/src/views/dataMonitoring/historyDataTrend/index.vue                                                                      |   96 
 energy_management_ui/src/views/energyPlan/plannedOutput/index.vue                                                                             |   57 
 energy_management_ui/src/permission.js                                                                                                        |   91 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/StateTypeController.java                                                   |  106 
 basic/src/main/java/com/dingzhuo/energy/common/core/text/StrFormatter.java                                                                    |   93 
 energy_management_ui/src/assets/home/tan.svg                                                                                                  |   91 
 energy_management_ui/src/views/equipmentMonitor/history/index.vue                                                                             |   59 
 basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/DataSourceType.java                                                      |   19 
 energy_management_ui/src/api/enerInfoManage/price.js                                                                                          |   53 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectController.java                                        |  110 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/AlarmTimerActor.java                                                     |  122 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/yearWorkingProcedureServiceImpl.java         |   38 
 energy_management_ui/src/views/energyMonitoring/e-gasMonitoring/index.vue                                                                     |  205 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportSetMapper.java                                     |   73 
 energy_management_ui/src/assets/404_images/404_cloud.png                                                                                      |    0 
 energy_management_ui/src/views/dataEntry/stagseDataEntry/index.vue                                                                            |   84 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsController.java                                    |  117 
 energy_management_server/src/main/resources/vm/js/api.js.vm                                                                                   |   53 
 energy_management_ui/src/assets/styles/ruoyi.scss                                                                                             |  299 
 energy_management_ui/src/views/energyMonitoring/waterMonitoring/svgView/index.vue                                                             |  192 
 basic/src/main/java/com/dingzhuo/energy/common/utils/IdUtils.java                                                                             |   51 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsItem.java                         |   41 
 energy_management_ui/src/assets/icons/svg/user.svg                                                                                            |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysEquipmentfileController.java                      |  105 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersVO.java                            |   77 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/yearComprehensiveMapper.java                |   29 
 energy_management_ui/src/views/tool/gen/index.vue                                                                                             |  287 
 energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEdit.vue                                                                   |  192 
 energy_management_server/src/main/resources/vm/java/service.java.vm                                                                           |   61 
 energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/index.vue                                                             |   65 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyMonitoringHistogramVO.java                        |   41 
 energy_management_ui/src/layout/components/Sidebar/FixiOSBug.js                                                                               |   25 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsTranslateMapper.java                                   |   61 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/impl/GxdhCountServiceImpl.java                     |  279 
 basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileNameLengthLimitExceededException.java                                       |   16 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableColumnMapper.java                                                     |   52 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/statistics.java                                         |   77 
 basic/src/main/java/com/dingzhuo/energy/common/utils/ip/AddressUtils.java                                                                     |   42 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/dto/EnergyAnalysisDTO.java                      |   49 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsTranslateController.java                           |  103 
 data-service/pom.xml                                                                                                                          |   27 
 energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/BarChart.vue                                                      |  112 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysConfigMapper.java                                                            |   68 
 energy_management_ui/src/layout/index.vue                                                                                                     |  103 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysRoleService.java                                                           |  131 
 energy_management_ui/src/api/facility/archives.js                                                                                             |   69 
 energy_management_ui/src/views/basicSetup/equipmentfile/view.vue                                                                              |  117 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectMapper.java                                                |   61 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/mapper/PeriodDataMapper.java                                                       |   96 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/mapper/GxdhCountMapper.java                                |   71 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/comprehensiveStatisticsController.java  |  172 
 energy_management_ui/src/views/reportSet/index.vue                                                                                            |   79 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmSaveMessage.java                                                  |   13 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/RealtimeDataController.java                                             |   60 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDeptServiceImpl.java                                                   |  297 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserServiceImpl.java                                                   |  457 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/yearWorkingProcedureController.java            |   74 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/function/CustomFunction.java                                                         |  201 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/save/SaveMessage.java                                                        |   53 
 energy_management_ui/src/api/equipmentMonitor/historyMonitoring/historyMonitoring.js                                                          |   71 
 energy_management_ui/src/views/basicsetting/stateIndex/indexStateSetting.vue                                                                  |  247 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineApplication.java                                                        |   18 
 energy_management_ui/src/api/dataMonitoring/energyPercent/index.js                                                                            |   10 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportForm.java                                          |  276 
 energy_management_ui/src/views/alarmItem/cjdIndex.vue                                                                                         |  685 
 energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/importAnnexTable.vue                                                    |  138 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysMenuService.java                                                           |  129 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/EnergyConsumeInput.java                          |   80 
 energy_management_ui/src/api/reportForm/dailyReport/dailyReport.js                                                                            |   35 
 energy_management_server/src/main/resources/mybatis/energyBalance/energyBalanceMapper.xml                                                     |   50 
 energy_management_ui/src/assets/home/statistic.png                                                                                            |    0 
 data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DaqTemplateMapper.java                                                         |   66 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/yearKeyEquipmentMapper.java                            |   29 
 energy_management_server/ry.sh                                                                                                                |   86 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyCostRatioVO.java                                  |   32 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlanEnergyServiceImpl.java                      |   99 
 energy_management_ui/src/views/basicsetting/device/deviceStorage.vue                                                                          |  194 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictDataMapper.java                                                          |   95 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IBenchmarkingManagementService.java                   |   64 
 energy_management_ui/src/api/menu.js                                                                                                          |    9 
 energy_management_ui/src/views/enerInfoManage/enercoefficient/index.vue                                                                       |  330 
 energy_management_ui/src/assets/styles/variables.scss                                                                                         |   37 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyAnnexController.java                                          |  178 
 energy_management_ui/src/components/Hamburger/index.vue                                                                                       |   45 
 energy_management_ui/src/views/energyAlarm/realTimeAlarm/liveAlarmView.vue                                                                    |  112 
 basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysLoginService.java                                                       |   88 
 data-service/src/main/resources/mybatis/dataService/PeriodDataMapper.xml                                                                      |  444 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysLoginController.java                                                     |  100 
 energy_management_ui/src/views/basicsetting/dataAuthSetting/roleSelect.vue                                                                    |   67 
 basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictTypeService.java                                                       |   83 
 energy_management_ui/src/api/basicsetting/function.js                                                                                         |   53 
 basic/src/main/java/com/dingzhuo/energy/framework/security/service/TokenService.java                                                          |  220 
 energy_management_ui/src/assets/home/count.png                                                                                                |    0 
 energy_management_ui/src/views/energyStatistics/energyAnalysis/energyAnalysis.vue                                                             |  161 
 basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSource.java                                                           |   26 
 basic/src/main/java/com/dingzhuo/energy/common/utils/poi/Comprehensive.java                                                                   |  387 
 compute-engine/src/main/resources/logback.xml                                                                                                 |   73 
 energy_management_ui/src/api/meter/index.js                                                                                                   |   36 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnergyService.java                                         |  104 
 energy_management_server/src/main/resources/mybatis/benchmarking/PhaseBenchmarkingMapper.xml                                                  |   55 
 energy_management_ui/src/api/reportInfo/index.js                                                                                              |    9 
 energy_management_ui/src/views/dashboard/PieChart.vue                                                                                         |  118 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysLogininforController.java                                               |   73 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardCategoryServiceImpl.java                |  102 
 energy_management_ui/src/api/monitor/operlog.js                                                                                               |   35 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmJudgeDirection.java                                       |   47 
 energy_management_ui/src/api/energyExamine/addIndex.js                                                                                        |   29 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/data/VirtualRtdb.java                                                              |  166 
 energy_management_server/src/main/resources/mybatis/keyEquipment/dailyKeyEquipmentMapper.xml                                                  |   93 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewayHbtLogController.java                            |   92 
 energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/LineChart.vue                                                  |  120 
 energy_management_ui/src/views/login/auth-redirect.vue                                                                                        |   15 
 data-model/src/main/java/com/dingzhuo/energy/data/model/controller/LimitTypeController.java                                                   |  126 
 energy_management_ui/src/views/basicsetting/nodeSetting/statisticIndexSetting.vue                                                             |  169 
 energy_management_ui/src/store/modules/settings.js                                                                                            |   34 
 energy_management_ui/src/assets/icons/svg/international.svg                                                                                   |    1 
 energy_management_ui/src/views/statisticalData/gxdhcount/gxdhcountindex.vue                                                                   |  185 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/controller/EnergyBenchmarkingController.java            |  103 
 energy_management_ui/src/views/workforce/rosteringManagement/index.vue                                                                        |  121 
 compute-engine/.mvn/wrapper/maven-wrapper.properties                                                                                          |    2 
 energy_management_ui/src/views/energyStatistics/energyConsumption/consumptionCost.vue                                                         |  156 
 energy_management_ui/src/views/login/components/SocialSignin.vue                                                                              |   72 
 energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/energyMonthConsumeInput.vue                                          |  204 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringShiftServiceImpl.java                                 |  129 
 data-model/pom.xml                                                                                                                            |   27 
 energy_management_server/src/main/resources/mybatis/basicSetup/SysEquipmentfileMapper.xml                                                     |   48 
 basic-data/src/main/resources/mybatis/enerInfoManage/SysProductMapper.xml                                                                     |  130 
 basic-data/src/main/resources/mybatis/meter/MeterImplementMapper.xml                                                                          |  201 
 energy_management_ui/src/api/system/notice.js                                                                                                 |   44 
 energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/index.vue                                                                     |  404 
 basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableColumnServiceImpl.java                                               |   68 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/controller/RealTimeTrend.java                                |  335 
 energy_management_ui/src/assets/icons/svg/form.svg                                                                                            |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/impl/HomeServiceImpl.java                                     |  369 
 basic/src/main/java/com/dingzhuo/energy/framework/config/FilterConfig.java                                                                    |   46 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/message/BaseActorMessage.java                                                        |   21 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DoubleUtil.java                                                     |   82 
 energy_management_ui/src/settings.js                                                                                                          |   31 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/dailyReportMapper.java                                   |   36 
 data-monitoring/src/main/resources/mybatis/device/DeviceStatusLiveMapper.xml                                                                  |   81 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputModel.java                 |   20 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityAnnexController.java                                      |  189 
 basic/src/main/java/com/dingzhuo/energy/common/exception/DemoModeException.java                                                               |   15 
 basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserPost.java                                                                |   46 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysConfigController.java                                                    |  127 
 data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValue.java                                                               |   98 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/dailyReportServiceImpl.java                        |   45 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsCurveController.java           |   77 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/AnnualReportFormServiceImpl.java                   |   30 
 energy_management_ui/src/assets/styles/left-right-layout.scss                                                                                 |    8 
 basic/src/main/resources/mybatis/tool/GenTableColumnMapper.xml                                                                                |  154 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/dailyWorkingProcedureServiceImpl.java        |   38 
 energy_management_ui/src/assets/icons/svg/education.svg                                                                                       |    1 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpClientUtil.java                                                 |   44 
 energy_management_server/src/main/resources/mybatis/reportForm/consolidatedStatementsMapper.xml                                               |  221 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/RealTimeAlarmController.java                               |   94 
 energy_management_ui/src/api/electricityPrice/electricity.js                                                                                  |   69 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsController.java                |  280 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/monthlyReport.java                                       |  406 
 energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/index.vue                                                                  |   66 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/common/IntegerUtil.java                                                    |   24 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/consolidatedStatementsController.java                |  127 
 energy_management_ui/src/router/index.js                                                                                                      |  174 
 energy_management_ui/src/views/dashboard/RaddarChart.vue                                                                                      |  116 
 db/2022-04-15.sql                                                                                                                             |   57 
 energy_management_ui/src/views/components/icons/index.vue                                                                                     |   87 
 energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/LineChart.vue                                                     |  120 
 energy_management_ui/src/views/basicsetting/energyIndex/energyIndex.vue                                                                       |  546 
 energy_management_ui/src/views/basicsetting/modelNode/modelNode.vue                                                                           |  439 
 energy_management_server/src/main/resources/mybatis/workingProcedure/dailyWorkingProcedureMapper.xml                                          |   85 
 energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/BarChart.vue                                                            |  112 
 data-model/src/main/resources/mybatis/basicsetting/DaqTemplateMapper.xml                                                                      |   90 
 energy_management_ui/src/components/ThemePicker/index.vue                                                                                     |  198 
 energy_management_server/src/main/resources/mybatis/benchmarking/BenchmarkingManagementMapper.xml                                             |  160 
 energy_management_ui/src/api/equipmentMonitor/realTimeMonitoring/realTimeMonitoring.js                                                        |   62 
 basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysUserController.java                                                      |  206 
 energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/EnergyIndex.vue                                                         |  307 
 energy_management_ui/src/views/comprehensiveStatistics/processEnergy/index.vue                                                                |   57 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/energyMonitoringServiceImpl.java                |   43 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/monthlyWorkingProcedureMapper.java                 |   29 
 energy_management_ui/.env.staging                                                                                                             |    7 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaParamService.java                              |   61 
 basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserMapper.java                                                              |  113 
 energy_management_server/src/main/resources/i18n/messages.properties                                                                          |   36 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportController.java                                         |  108 
 energy_management_ui/src/assets/icons/svg/online.svg                                                                                          |    1 
 energy_management_ui/src/views/basicsetting/dataAuthSetting/dataAuthModelNode.vue                                                             |  214 
 energy_management_ui/src/views/energyBalance/energyBalance/PieChart.vue                                                                       |  139 
 basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysLogininfor.java                                                             |  145 
 basic-data/src/main/resources/mybatis/energy/EnergyReportMapper.xml                                                                           |   87 
 compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/monitor/RecastDataActor.java                                                   |  172 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectAnnexController.java                                   |  180 
 energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/yearWorkingProcedure.java                          |  200 
 energy_management_ui/src/api/enerInfoManage/enerclass.js                                                                                      |   53 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementExcel.java                                                 |    4 
 basic/src/main/java/com/dingzhuo/energy/framework/config/ThreadPoolConfig.java                                                                |   62 
 energy_management_ui/src/views/keyEquipment/yearkeyEquipment/index.vue                                                                        |  376 
 energy_management_ui/src/api/energyBalance/energyPic.js                                                                                       |    9 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/IAssessmentIndexService.java                                    |   77 
 data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormulaParam.java                                                         |   50 
 basic/src/main/java/com/dingzhuo/energy/common/core/text/Convert.java                                                                         | 1001 
 data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/RealTimeAlarm.java                                             |  177 
 basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterAnnexService.java                                                 |   61 
 energy_management_ui/src/views/keyEquipment/dailykeyEquipment/index.vue                                                                       |  342 
 1,509 files changed, 172,444 insertions(+), 0 deletions(-)

diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..57e1ec5
--- /dev/null
+++ b/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: com.dingzhuo.energy.EnergyManagementApplication
+
diff --git a/basic-data/pom.xml b/basic-data/pom.xml
new file mode 100644
index 0000000..90ea352
--- /dev/null
+++ b/basic-data/pom.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>basic-data</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>basic</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+
+</project>
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnerclassController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnerclassController.java
new file mode 100644
index 0000000..9d72b86
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnerclassController.java
@@ -0,0 +1,123 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnerclass;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysEnerclassService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 鑳芥簮鍝佺璁剧疆Controller
+ *
+ * @author ruoyi
+ * @date 2020-02-10
+ */
+@RestController
+@RequestMapping("/enerInfoManage/enerclass")
+public class SysEnerclassController extends BaseController
+{
+    @Autowired
+    private ISysEnerclassService sysEnerclassService;
+
+    /**
+     * 鏌ヨ鑳芥簮鍝佺璁剧疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enerclass:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysEnerclass sysEnerclass)
+    {
+        startPage();
+        List<SysEnerclass> list = sysEnerclassService.selectSysEnerclassList(sysEnerclass);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鑳芥簮鍝佺璁剧疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enerclass:export')")
+    @Log(title = "鑳芥簮鍝佺璁剧疆", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysEnerclass sysEnerclass)
+    {
+        List<SysEnerclass> list = sysEnerclassService.selectSysEnerclassList(sysEnerclass);
+        ExcelUtil<SysEnerclass> util = new ExcelUtil<SysEnerclass>(SysEnerclass.class);
+        return util.exportExcel(list, "enerclass");
+    }
+
+    /**
+     * 鑾峰彇鑳芥簮鍝佺璁剧疆璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enerclass:query')")
+    @GetMapping(value = "/{enerclassid}")
+    public AjaxResult getInfo(@PathVariable("enerclassid") Integer enerclassid)
+    {
+        return AjaxResult.success(sysEnerclassService.selectSysEnerclassById(enerclassid));
+    }
+
+    /**
+     * 鏂板鑳芥簮鍝佺璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enerclass:add')")
+    @Log(title = "鑳芥簮鍝佺璁剧疆", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysEnerclass sysEnerclass) {
+        //闈炵┖鏍¢獙
+        String name = sysEnerclass.getEnerclassname();
+        if(name.length()>10){
+            return AjaxResult.error("鏂板澶辫触锛岃兘婧愬悕绉拌秴闀匡紒");
+        }
+        Integer nameNum = sysEnerclassService.selectSameEnergyNameNum(name);
+        if (nameNum==0){
+            return toAjax(sysEnerclassService.insertSysEnerclass(sysEnerclass));
+        }
+        return AjaxResult.error("鏂板澶辫触锛岃妫�鏌ヨ兘婧愬悕绉版槸鍚﹂噸澶嶏紒");
+    }
+
+    /**
+     * 淇敼鑳芥簮鍝佺璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enerclass:edit')")
+    @Log(title = "鑳芥簮鍝佺璁剧疆", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysEnerclass sysEnerclass) {
+        //鍞竴鏍¢獙
+        Integer id = sysEnerclass.getEnerclassid();
+        String enerName = sysEnerclass.getEnerclassname();
+        if(enerName.length()>10){
+            return AjaxResult.error("淇敼澶辫触锛岃兘婧愬悕绉拌秴闀匡紒");
+        }
+        //  閫氳繃瑕佹敼鐨勮兘婧愬悕绉版煡宸叉湁涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓�                  濡傛灉绛変簬1灏辫閫氳繃id鍒ゆ柇鏄笉鏄敼鑷繁
+        if(sysEnerclassService.selectSameEnergyNameNum(enerName)==1&&id.equals(sysEnerclassService.selectIdByName(enerName))){
+            return toAjax(sysEnerclassService.updateSysEnerclass(sysEnerclass));
+        //                  濡傛灉=0 灏辫鏄庤繖涓兘婧愬悕绉板彲鏀�
+        }else if(sysEnerclassService.selectSameEnergyNameNum(enerName)==0){
+            return toAjax(sysEnerclassService.updateSysEnerclass(sysEnerclass));
+        }
+        return AjaxResult.error("淇敼澶辫触锛岃兘婧愬悕绉伴噸澶嶏紒");
+    }
+
+    /**
+     * 鍒犻櫎鑳芥簮鍝佺璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enerclass:remove')")
+    @Log(title = "鑳芥簮鍝佺璁剧疆", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{enerclassids}")
+    public AjaxResult remove(@PathVariable Integer[] enerclassids)
+    {
+        return toAjax(sysEnerclassService.deleteSysEnerclassByIds(enerclassids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnercoefficientController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnercoefficientController.java
new file mode 100644
index 0000000..4d20fe9
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnercoefficientController.java
@@ -0,0 +1,103 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnercoefficient;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysEnercoefficientService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 鑳芥簮鎶樻爣绯绘暟Controller
+ * 
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/enerInfoManage/enercoefficient")
+public class SysEnercoefficientController extends BaseController
+{
+    @Autowired
+    private ISysEnercoefficientService sysEnercoefficientService;
+
+    /**
+     * 鏌ヨ鑳芥簮鎶樻爣绯绘暟鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enercoefficient:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysEnercoefficient sysEnercoefficient)
+    {
+        startPage();
+        List<SysEnercoefficient> list = sysEnercoefficientService.selectSysEnercoefficientList(sysEnercoefficient);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鑳芥簮鎶樻爣绯绘暟鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enercoefficient:export')")
+    @Log(title = "鑳芥簮鎶樻爣绯绘暟", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysEnercoefficient sysEnercoefficient)
+    {
+        List<SysEnercoefficient> list = sysEnercoefficientService.selectSysEnercoefficientList(sysEnercoefficient);
+        ExcelUtil<SysEnercoefficient> util = new ExcelUtil<SysEnercoefficient>(SysEnercoefficient.class);
+        return util.exportExcel(list, "enercoefficient");
+    }
+
+    /**
+     * 鑾峰彇鑳芥簮鎶樻爣绯绘暟璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enercoefficient:query')")
+    @GetMapping(value = "/{ecid}")
+    public AjaxResult getInfo(@PathVariable("ecid") Integer ecid)
+    {
+        return AjaxResult.success(sysEnercoefficientService.selectSysEnercoefficientById(ecid));
+    }
+
+    /**
+     * 鏂板鑳芥簮鎶樻爣绯绘暟
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enercoefficient:add')")
+    @Log(title = "鑳芥簮鎶樻爣绯绘暟", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysEnercoefficient sysEnercoefficient)
+    {
+        return toAjax(sysEnercoefficientService.insertSysEnercoefficient(sysEnercoefficient));
+    }
+
+    /**
+     * 淇敼鑳芥簮鎶樻爣绯绘暟
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enercoefficient:edit')")
+    @Log(title = "鑳芥簮鎶樻爣绯绘暟", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysEnercoefficient sysEnercoefficient)
+    {
+        return toAjax(sysEnercoefficientService.updateSysEnercoefficient(sysEnercoefficient));
+    }
+
+    /**
+     * 鍒犻櫎鑳芥簮鎶樻爣绯绘暟
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:enercoefficient:remove')")
+    @Log(title = "鑳芥簮鎶樻爣绯绘暟", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ecids}")
+    public AjaxResult remove(@PathVariable Integer[] ecids)
+    {
+        return toAjax(sysEnercoefficientService.deleteSysEnercoefficientByIds(ecids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnergyController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnergyController.java
new file mode 100644
index 0000000..c78d23e
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysEnergyController.java
@@ -0,0 +1,218 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.controller;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnerclass;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysEnergyService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * energyController
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+@RestController
+@RequestMapping("/enerInfoManage/energy")
+public class SysEnergyController extends BaseController
+{
+    @Autowired
+    private ISysEnergyService sysEnergyService;
+
+    /**
+     * 鏌ヨenerclassname鑳芥簮绫诲瀷鍚嶇О涓嬫媺妗�
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:getenerclassname')")
+    @GetMapping("/getenerclassname")
+    public AjaxResult list()
+    {
+        List<SysEnerclass> s = sysEnergyService.getenerclassname();
+        return AjaxResult.success(s);
+    }
+
+    /**
+     * 鏌ヨenergy鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysEnergy sysEnergy)
+    {
+        startPage();
+        List<SysEnergy> list = sysEnergyService.selectSysEnergyList(sysEnergy);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭energy鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:export')")
+    @Log(title = "energy", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysEnergy sysEnergy)
+    {
+        List<SysEnergy> list = sysEnergyService.selectSysEnergyList(sysEnergy);
+        ExcelUtil<SysEnergy> util = new ExcelUtil<SysEnergy>(SysEnergy.class);
+        return util.exportExcel(list, "energy");
+    }
+
+    /**
+     * 鑾峰彇energy璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:query')")
+    @GetMapping(value = "/{enerid}")
+    public AjaxResult getInfo(@PathVariable("enerid") Integer enerid)
+    {
+        SysEnergy sysEnergy = sysEnergyService.selectSysEnergyById(enerid);
+        if(sysEnergy.getIsstorage()==0){
+            sysEnergy.setIsstorageString("鏄�");
+        }else{
+            sysEnergy.setIsstorageString("鍚�");
+        }
+        return AjaxResult.success(sysEnergy);
+    }
+
+    /**
+     * 鏂板energy
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:add')")
+    @Log(title = "energy", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysEnergy sysEnergy)
+    {
+        String a = sysEnergy.getIsstorageString();
+        if(a.equals("鏄�")){
+            sysEnergy.setIsstorage(0);
+        }else {
+            sysEnergy.setIsstorage(1);
+        }
+        String d = sysEnergy.getEnerclassname();
+        Integer enerclassid = sysEnergyService.getEnerClassid(d);
+        sysEnergy.setEnerclassid(enerclassid);
+        //闈炵┖鏍¢獙
+        String name = sysEnergy.getEnername();
+        if(name.length()>10){
+            return AjaxResult.error("鏂板澶辫触锛岃兘婧愬悕绉拌秴闀匡紒");
+        }
+        Integer nameNum = sysEnergyService.selectSameEnergyNameNum(name);
+        if (nameNum==0){
+            return toAjax(sysEnergyService.insertSysEnergy(sysEnergy));
+        }
+        return AjaxResult.error("鏂板澶辫触锛岃妫�鏌ヨ兘婧愬悕绉版槸鍚﹂噸澶嶏紒");
+    }
+
+    /**
+     * 淇敼energy
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:edit')")
+    @Log(title = "energy", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysEnergy sysEnergy)
+    {
+        String a = sysEnergy.getIsstorageString();
+        if(a.equals("鏄�")){
+            sysEnergy.setIsstorage(0);
+        }else {
+            sysEnergy.setIsstorage(1);
+        }
+        String d = sysEnergy.getEnerclassname();
+        Integer enerclassid = sysEnergyService.getEnerClassid(d);
+        sysEnergy.setEnerclassid(enerclassid);
+        //鍞竴鏍¢獙
+        Integer id = sysEnergy.getEnerid();
+        String enerName = sysEnergy.getEnerclassname();
+        if(enerName.length()>10){
+            return AjaxResult.error("淇敼澶辫触锛岃兘婧愬悕绉拌秴闀匡紒");
+        }
+        //  閫氳繃瑕佹敼鐨勮兘婧愬悕绉版煡宸叉湁涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓�                  濡傛灉绛変簬1灏辫閫氳繃id鍒ゆ柇鏄笉鏄敼鑷繁
+        if(sysEnergyService.selectSameEnergyNameNum(enerName)==1&&id.equals(sysEnergyService.selectIdByName(enerName))){
+            return toAjax(sysEnergyService.updateSysEnergy(sysEnergy));
+            //                  濡傛灉=0 灏辫鏄庤繖涓兘婧愬悕绉板彲鏀�
+        }else if(sysEnergyService.selectSameEnergyNameNum(enerName)==0){
+            return toAjax(sysEnergyService.updateSysEnergy(sysEnergy));
+        }
+        return AjaxResult.error("淇敼澶辫触锛岃兘婧愬悕绉伴噸澶嶏紒");
+    }
+    /**
+     * 淇濆瓨鑳芥簮鍗曚环璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:updateEnergyPrice')")
+    @Log(title = "energy", businessType = BusinessType.UPDATE)
+    @PutMapping("/updateEnergyPrice")
+    public AjaxResult updateEnergyPrice(@RequestBody(required = false) SysEnergy sysEnergy) throws ParseException {
+        Integer enerid = sysEnergy.getEnerid();
+        if(sysEnergy.getExecdate()==null){
+            return AjaxResult.error("鎵ц鏃ユ湡涓嶈兘涓虹┖锛�");
+        }
+        Date date = new Date();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(date);
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        Date now = df.parse(dateString);
+        if(sysEnergy.getExecdate().before(now)){
+            return AjaxResult.error("鎵ц鏃ユ湡浠ヨ繃锛�");
+        }
+        if((sysEnergyService.getPriceCountByEnerid(sysEnergy))==0){
+            return toAjax(sysEnergyService.insertEnergyPrice(sysEnergy));
+        }else if((sysEnergyService.getPriceCountByEnerid(sysEnergy))==1){
+            return toAjax(sysEnergyService.updateEnergyPrice(sysEnergy));
+        }
+            return AjaxResult.error("淇濆瓨澶辫触锛�");
+    }
+    /**
+     * 淇濆瓨鑳芥簮鎶樻爣绯绘暟璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:updateEnergyCoefficient')")
+    @Log(title = "energy", businessType = BusinessType.UPDATE)
+    @PutMapping("/updateEnergyCoefficient")
+    public AjaxResult updateEnergyCoefficient(@RequestBody(required = false) SysEnergy sysEnergy) throws ParseException {
+        Integer enerid = sysEnergy.getEnerid();
+        if(sysEnergy.getCoefficientexecdate()==null){
+            return AjaxResult.error("鎵ц鏃ユ湡涓嶈兘涓虹┖锛�");
+        }
+        Date date = new Date();
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        String dateString = formatter.format(date);
+        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        Date now = df.parse(dateString);
+        if(sysEnergy.getCoefficientexecdate().before(now)){
+            return AjaxResult.error("鎵ц鏃ユ湡浠ヨ繃锛�");
+        }
+        Integer count = sysEnergyService.getCoefficientCountByEnerid(enerid);
+        if(count==0){
+            return toAjax(sysEnergyService.insertEnergyCoefficient(sysEnergy));
+        }else if(count==1){
+            return toAjax(sysEnergyService.updateEnergyCoefficient(sysEnergy));
+        }
+        return AjaxResult.error("淇濆瓨澶辫触锛�");
+    }
+
+    /**
+     * 鍒犻櫎energy
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:energy:remove')")
+    @Log(title = "energy", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{enerids}")
+    public AjaxResult remove(@PathVariable Integer[] enerids)
+    {
+        return toAjax(sysEnergyService.deleteSysEnergyByIds(enerids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysPriceController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysPriceController.java
new file mode 100644
index 0000000..35b86ee
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysPriceController.java
@@ -0,0 +1,104 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysPrice;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysPriceService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 鍗曚环璁剧疆Controller
+ *
+ * @author ruoyi
+ * @date 2020-02-15
+ */
+@RestController
+@RequestMapping("/price/price")
+public class SysPriceController extends BaseController
+{
+    @Autowired
+    private ISysPriceService sysPriceService;
+
+    /**
+     * 鏌ヨ鍗曚环璁剧疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('price:price:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysPrice sysPrice)
+    {
+        startPage();
+        List<SysPrice> list = sysPriceService.selectSysPriceList(sysPrice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鍗曚环璁剧疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('price:price:export')")
+    @Log(title = "鍗曚环璁剧疆", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysPrice sysPrice)
+    {
+        List<SysPrice> list = sysPriceService.selectSysPriceList(sysPrice);
+        ExcelUtil<SysPrice> util = new ExcelUtil<SysPrice>(SysPrice.class);
+        return util.exportExcel(list, "price");
+    }
+
+    /**
+     * 鑾峰彇鍗曚环璁剧疆璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('price:price:query')")
+    @GetMapping(value = "/{priceid}")
+    public AjaxResult getInfo(@PathVariable("priceid") Integer priceid)
+    {
+        return AjaxResult.success(sysPriceService.selectSysPriceById(priceid));
+    }
+
+    /**
+     * 鏂板鍗曚环璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('price:price:add')")
+    @Log(title = "鍗曚环璁剧疆", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysPrice sysPrice)
+    {
+        return toAjax(sysPriceService.insertSysPrice(sysPrice));
+    }
+
+    /**
+     * 淇敼鍗曚环璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('price:price:edit')")
+    @Log(title = "鍗曚环璁剧疆", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysPrice sysPrice)
+    {
+        return toAjax(sysPriceService.updateSysPrice(sysPrice));
+    }
+
+    /**
+     * 鍒犻櫎鍗曚环璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('price:price:remove')")
+    @Log(title = "鍗曚环璁剧疆", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{priceids}")
+    public AjaxResult remove(@PathVariable Integer[] priceids)
+    {
+        return toAjax(sysPriceService.deleteSysPriceByIds(priceids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysProductController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysProductController.java
new file mode 100644
index 0000000..ed98c5b
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/controller/SysProductController.java
@@ -0,0 +1,128 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysProductService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 浜у搧Controller
+ *
+ * @author sys
+ * @date 2020-02-19
+ */
+@RestController
+@RequestMapping("/enerInfoManage/product")
+public class SysProductController extends BaseController
+{
+    @Autowired
+    private ISysProductService sysProductService;
+
+    /**
+     * 鏌ヨ浜у搧鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:product:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysProduct sysProduct)
+    {
+        startPage();
+        List<SysProduct> list = sysProductService.selectSysProductList(sysProduct);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭浜у搧鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:product:export')")
+    @Log(title = "浜у搧", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysProduct sysProduct)
+    {
+        List<SysProduct> list = sysProductService.selectSysProductList(sysProduct);
+        ExcelUtil<SysProduct> util = new ExcelUtil<SysProduct>(SysProduct.class);
+        return util.exportExcel(list, "product");
+    }
+
+    /**
+     * 鑾峰彇浜у搧璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:product:query')")
+    @GetMapping(value = "/{productid}")
+    public AjaxResult getInfo(@PathVariable("productid") Integer productid)
+    {
+        return AjaxResult.success(sysProductService.selectSysProductById(productid));
+    }
+
+    /**
+     * 鏂板浜у搧
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:product:add')")
+    @Log(title = "浜у搧", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysProduct sysProduct) {
+        Integer sameNameNum = sysProductService.selectCountByName(sysProduct);
+        Integer sameNoNum = sysProductService.selectCountByNo(sysProduct);
+        if(sameNameNum==sameNoNum){
+            if(sameNameNum==0){
+                return toAjax(sysProductService.insertSysProduct(sysProduct));
+            }
+        }
+        return AjaxResult.error("鏂板澶辫触锛屼骇鍝佸悕绉版垨浜у搧缂栧彿閲嶅锛�");
+    }
+
+    /**
+     * 淇敼浜у搧
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:product:edit')")
+    @Log(title = "浜у搧", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysProduct sysProduct)
+    {
+        Integer id = sysProduct.getProductid();
+        Integer sameNameNum = sysProductService.selectCountByName(sysProduct);
+        Integer sameNoNum = sysProductService.selectCountByNo(sysProduct);
+        if(sameNameNum==sameNoNum){
+            if(sameNameNum==0){
+                return toAjax(sysProductService.updateSysProduct(sysProduct));
+            }
+        }
+        boolean s = id==sysProductService.selectIdByName(sysProduct);
+        boolean a = id==sysProductService.selectIdByNo(sysProduct);
+        if(sameNameNum==1&&sameNoNum==1){
+            if(a&&s){
+                return toAjax(sysProductService.updateSysProduct(sysProduct));
+            }
+        }else if(sameNameNum==1&&sameNoNum==0&&s){
+            return toAjax(sysProductService.updateSysProduct(sysProduct));
+        }else if(sameNoNum==1&&sameNameNum==0&&a){
+            return toAjax(sysProductService.updateSysProduct(sysProduct));
+        }
+        return AjaxResult.error("淇敼澶辫触锛屼骇鍝佸悕绉版垨浜у搧缂栧彿閲嶅锛�");
+    }
+
+    /**
+     * 鍒犻櫎浜у搧
+     */
+    @PreAuthorize("@ss.hasPermi('enerInfoManage:product:remove')")
+    @Log(title = "浜у搧", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{productids}")
+    public AjaxResult remove(@PathVariable Integer[] productids)
+    {
+        return toAjax(sysProductService.deleteSysProductByIds(productids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnerclass.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnerclass.java
new file mode 100644
index 0000000..28f895d
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnerclass.java
@@ -0,0 +1,122 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 鑳芥簮鍝佺璁剧疆瀵硅薄 sys_enerclass
+ * 
+ * @author ruoyi
+ * @date 2020-02-10
+ */
+public class SysEnerclass extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鑳芥簮绫诲埆ID */
+    private Integer enerclassid;
+
+    /** 鑳芥簮绫诲埆鍚嶇О */
+    @Excel(name = "鑳芥簮绫诲埆鍚嶇О")
+    private String enerclassname;
+
+    /** 鎿嶄綔浜� */
+    @Excel(name = "鎿嶄綔浜�")
+    private String oprMan;
+
+    /** 鎿嶄綔鏃堕棿 */
+    @Excel(name = "鎿嶄綔鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date oprTime;
+
+    /** 鏇存柊浜� */
+    @Excel(name = "鏇存柊浜�")
+    private String modMan;
+
+    /** 鏇存柊鏃堕棿 */
+    @Excel(name = "鏇存柊鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date modTime;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String note;
+
+    public void setEnerclassid(Integer enerclassid) 
+    {
+        this.enerclassid = enerclassid;
+    }
+
+    public Integer getEnerclassid() 
+    {
+        return enerclassid;
+    }
+    public void setEnerclassname(String enerclassname) 
+    {
+        this.enerclassname = enerclassname;
+    }
+
+    public String getEnerclassname() 
+    {
+        return enerclassname;
+    }
+    public void setOprMan(String oprMan) 
+    {
+        this.oprMan = oprMan;
+    }
+
+    public String getOprMan() 
+    {
+        return oprMan;
+    }
+    public void setOprTime(Date oprTime) 
+    {
+        this.oprTime = oprTime;
+    }
+
+    public Date getOprTime() 
+    {
+        return oprTime;
+    }
+    public void setModMan(String modMan) 
+    {
+        this.modMan = modMan;
+    }
+
+    public String getModMan() 
+    {
+        return modMan;
+    }
+    public void setModTime(Date modTime) 
+    {
+        this.modTime = modTime;
+    }
+
+    public Date getModTime() 
+    {
+        return modTime;
+    }
+    public void setNote(String note) 
+    {
+        this.note = note;
+    }
+
+    public String getNote() 
+    {
+        return note;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("enerclassid", getEnerclassid())
+            .append("enerclassname", getEnerclassname())
+            .append("oprMan", getOprMan())
+            .append("oprTime", getOprTime())
+            .append("modMan", getModMan())
+            .append("modTime", getModTime())
+            .append("note", getNote())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnercoefficient.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnercoefficient.java
new file mode 100644
index 0000000..1e901db
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnercoefficient.java
@@ -0,0 +1,171 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 鑳芥簮鎶樻爣绯绘暟瀵硅薄 sys_enercoefficient
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public class SysEnercoefficient extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鎶樻爣绯绘暟ID */
+    private Integer ecid;
+
+    /** 鑳芥簮ID */
+    @Excel(name = "鑳芥簮ID")
+    private Integer enerid;
+
+    /** 绛変环鎶樻爣绯绘暟 */
+    @Excel(name = "绛変环鎶樻爣绯绘暟")
+    private double coefficient;
+
+    /** 褰撻噺鎶樻爣绯绘暟 */
+    @Excel(name = "褰撻噺鎶樻爣绯绘暟")
+    private double coefficient2;
+
+    /** 鎵ц鏃ユ湡 */
+    @Excel(name = "鎵ц鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date execdate;
+
+    /** 鎿嶄綔浜� */
+    private String oprMan;
+
+    /** 鎿嶄綔鏃堕棿 */
+    private Date oprTime;
+
+    /** 鏇存柊浜� */
+    private String modMan;
+
+    /** 鏇存柊鏃堕棿 */
+    private Date modTime;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String note;
+
+    //  鑳芥簮鍚嶇О
+    private String enername;
+
+    public String getEnername() {
+        return enername;
+    }
+
+    public void setEnername(String enername) {
+        this.enername = enername;
+    }
+
+    public void setEcid(Integer ecid)
+    {
+        this.ecid = ecid;
+    }
+
+    public Integer getEcid()
+    {
+        return ecid;
+    }
+    public void setEnerid(Integer enerid)
+    {
+        this.enerid = enerid;
+    }
+
+    public Integer getEnerid()
+    {
+        return enerid;
+    }
+    public void setCoefficient(double coefficient)
+    {
+        this.coefficient = coefficient;
+    }
+
+    public double getCoefficient()
+    {
+        return coefficient;
+    }
+    public void setCoefficient2(double coefficient2)
+    {
+        this.coefficient2 = coefficient2;
+    }
+
+    public double getCoefficient2()
+    {
+        return coefficient2;
+    }
+    public void setExecdate(Date execdate)
+    {
+        this.execdate = execdate;
+    }
+
+    public Date getExecdate()
+    {
+        return execdate;
+    }
+    public void setOprMan(String oprMan)
+    {
+        this.oprMan = oprMan;
+    }
+
+    public String getOprMan()
+    {
+        return oprMan;
+    }
+    public void setOprTime(Date oprTime)
+    {
+        this.oprTime = oprTime;
+    }
+
+    public Date getOprTime()
+    {
+        return oprTime;
+    }
+    public void setModMan(String modMan)
+    {
+        this.modMan = modMan;
+    }
+
+    public String getModMan()
+    {
+        return modMan;
+    }
+    public void setModTime(Date modTime)
+    {
+        this.modTime = modTime;
+    }
+
+    public Date getModTime()
+    {
+        return modTime;
+    }
+    public void setNote(String note)
+    {
+        this.note = note;
+    }
+
+    public String getNote()
+    {
+        return note;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("ecid", getEcid())
+            .append("enerid", getEnerid())
+            .append("coefficient", getCoefficient())
+            .append("coefficient2", getCoefficient2())
+            .append("execdate", getExecdate())
+            .append("oprMan", getOprMan())
+            .append("oprTime", getOprTime())
+            .append("modMan", getModMan())
+            .append("modTime", getModTime())
+            .append("note", getNote())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnergy.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnergy.java
new file mode 100644
index 0000000..2eab4e8
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysEnergy.java
@@ -0,0 +1,298 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * energy瀵硅薄 sys_energy
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public class SysEnergy extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鎿嶄綔浜� */
+    @Excel(name = "鎿嶄綔浜�")
+    private String oprMan;
+
+    /** 鎿嶄綔鏃堕棿 */
+    @Excel(name = "鎿嶄綔鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date oprTime;
+
+    /** 淇敼浜� */
+    @Excel(name = "淇敼浜�")
+    private String modMan;
+
+    /** 淇敼鏃堕棿 */
+    @Excel(name = "淇敼鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date modTime;
+
+    /** 鑳芥簮ID */
+    private Integer enerid;
+
+    /** 鑳芥簮鍚嶇О */
+    @Excel(name = "鑳芥簮鍚嶇О")
+    private String enername;
+
+    /** 璁¢噺鍗曚綅ID */
+    private Integer muid;
+
+    /** 鑳芥簮绫诲埆ID */
+    private Integer enerclassid;
+
+    /** 鑳芥簮缂栧彿 */
+    @Excel(name = "鑳芥簮缂栧彿")
+    private String enersno;
+
+    /** 鏄惁瀛樺偍 */
+    @Excel(name = "鏄惁瀛樺偍")
+    private Integer isstorage;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String note;
+
+    /** 鑳芥簮绫诲瀷 */
+    @Excel(name = "鑳芥簮绫诲瀷")
+    private String enerclassname;
+
+    /** 鏄惁鍌ㄥ瓨锛堝瓧绗︿覆锛� */
+    private String isstorageString;
+
+    /** 鍗曚环*/
+    private double price;
+
+    /** 鎵ц鏃ユ湡 */
+    @Excel(name = "淇敼鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date execdate;
+
+    /** 浠锋牸澶囨敞 */
+    private String pricenote;
+
+    private Integer muidString;
+
+    public String getMuidName() {
+        return muidName;
+    }
+
+    public void setMuidName(String muidName) {
+        this.muidName = muidName;
+    }
+
+    private String muidName;
+
+    //绛変环鎶樻爣绯绘暟
+    private double coefficient;
+
+    //褰撻噺鎶樻爣绯绘暟
+    private double coefficient2;
+
+    //鎶樻爣绯绘暟note
+    private String coefficientnote;
+
+    /** 鎶樻爣绯绘暟鎵ц鏃ユ湡 */
+    @Excel(name = "淇敼鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date coefficientexecdate;
+
+    public double getCoefficient() {
+        return coefficient;
+    }
+
+    public void setCoefficient(double coefficient) {
+        this.coefficient = coefficient;
+    }
+
+    public double getCoefficient2() {
+        return coefficient2;
+    }
+
+    public void setCoefficient2(double coefficient2) {
+        this.coefficient2 = coefficient2;
+    }
+
+    public String getCoefficientnote() {
+        return coefficientnote;
+    }
+
+    public void setCoefficientnote(String coefficientnote) {
+        this.coefficientnote = coefficientnote;
+    }
+
+    public Date getCoefficientexecdate() {
+        return coefficientexecdate;
+    }
+
+    public void setCoefficientexecdate(Date coefficientexecdate) {
+        this.coefficientexecdate = coefficientexecdate;
+    }
+
+    public Integer getMuidString() {
+        return muidString;
+    }
+
+    public void setMuidString(Integer muidString) {
+        this.muidString = muidString;
+    }
+
+    public double getPrice() {
+        return price;
+    }
+
+    public void setPrice(double price) {
+        this.price = price;
+    }
+
+    public Date getExecdate() {
+        return execdate;
+    }
+
+    public void setExecdate(Date execdate) {
+        this.execdate = execdate;
+    }
+
+    public String getPricenote() {
+        return pricenote;
+    }
+
+    public void setPricenote(String pricenote) {
+        this.pricenote = pricenote;
+    }
+
+    public String getIsstorageString() {
+        return isstorageString;
+    }
+
+    public void setIsstorageString(String isstorageString) {
+        this.isstorageString = isstorageString;
+    }
+
+    public String getEnerclassname() {
+        return enerclassname;
+    }
+
+    public void setEnerclassname(String enerclassname) {
+        this.enerclassname = enerclassname;
+    }
+
+    public void setOprMan(String oprMan)
+    {
+        this.oprMan = oprMan;
+    }
+
+    public String getOprMan()
+    {
+        return oprMan;
+    }
+    public void setOprTime(Date oprTime)
+    {
+        this.oprTime = oprTime;
+    }
+
+    public Date getOprTime()
+    {
+        return oprTime;
+    }
+    public void setModMan(String modMan)
+    {
+        this.modMan = modMan;
+    }
+
+    public String getModMan()
+    {
+        return modMan;
+    }
+    public void setModTime(Date modTime)
+    {
+        this.modTime = modTime;
+    }
+
+    public Date getModTime()
+    {
+        return modTime;
+    }
+    public void setEnerid(Integer enerid)
+    {
+        this.enerid = enerid;
+    }
+
+    public Integer getEnerid()
+    {
+        return enerid;
+    }
+    public void setEnername(String enername)
+    {
+        this.enername = enername;
+    }
+
+    public String getEnername()
+    {
+        return enername;
+    }
+    public void setMuid(Integer muid)
+    {
+        this.muid = muid;
+    }
+
+    public Integer getMuid()
+    {
+        return muid;
+    }
+    public void setEnerclassid(Integer enerclassid)
+    {
+        this.enerclassid = enerclassid;
+    }
+
+    public Integer getEnerclassid()
+    {
+        return enerclassid;
+    }
+    public void setEnersno(String enersno)
+    {
+        this.enersno = enersno;
+    }
+
+    public String getEnersno()
+    {
+        return enersno;
+    }
+    public void setIsstorage(Integer isstorage)
+    {
+        this.isstorage = isstorage;
+    }
+
+    public Integer getIsstorage()
+    {
+        return isstorage;
+    }
+    public void setNote(String note)
+    {
+        this.note = note;
+    }
+
+    public String getNote()
+    {
+        return note;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("oprMan", getOprMan())
+            .append("oprTime", getOprTime())
+            .append("modMan", getModMan())
+            .append("modTime", getModTime())
+            .append("enerid", getEnerid())
+            .append("enername", getEnername())
+            .append("muid", getMuid())
+            .append("enerclassid", getEnerclassid())
+            .append("enersno", getEnersno())
+            .append("isstorage", getIsstorage())
+            .append("note", getNote())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysPrice.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysPrice.java
new file mode 100644
index 0000000..a8a6f62
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysPrice.java
@@ -0,0 +1,173 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 鍗曚环璁剧疆瀵硅薄 sys_price
+ *
+ * @author ruoyi
+ * @date 2020-02-15
+ */
+public class SysPrice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鍗曚环ID */
+    private Integer priceid;
+
+    /** ObjectID_瀵硅薄ID锛�
+銆�銆�鑳芥簮ID銆佸師鏂橧D鎴栦骇鍝両D
+ */
+    @Excel(name = "ObjectID_瀵硅薄ID锛� 鑳芥簮ID銆佸師鏂橧D鎴栦骇鍝両D ")
+    private Integer objectid;
+
+    /** ObjectType_瀵硅薄绫诲瀷
+銆�銆�1=鑳芥簮(Energy琛�)锛�2=鍘熸枡(Material琛�)锛�3=浜у搧(Product琛�) */
+    private Integer objecttype;
+
+    /** 鍗曚环 */
+    @Excel(name = "鍗曚环")
+    private Double price;
+
+    /** 鎵ц鏃ユ湡 */
+    @Excel(name = "鎵ц鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date execdate;
+
+    /** 鎿嶄綔浜� */
+    private String oprMan;
+
+    /** 鎿嶄綔鏃堕棿 */
+    private Date oprTime;
+
+    /** 鏇存柊浜� */
+    private String modMan;
+
+    /** 鏇存柊鏃堕棿 */
+    private Date modTime;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String note;
+
+    //鑳芥簮鍚�
+    private String enername;
+
+    public String getEnername() {
+        return enername;
+    }
+
+    public void setEnername(String enername) {
+        this.enername = enername;
+    }
+
+    public void setPriceid(Integer priceid)
+    {
+        this.priceid = priceid;
+    }
+
+    public Integer getPriceid()
+    {
+        return priceid;
+    }
+    public void setObjectid(Integer objectid)
+    {
+        this.objectid = objectid;
+    }
+
+    public Integer getObjectid()
+    {
+        return objectid;
+    }
+    public void setObjecttype(Integer objecttype)
+    {
+        this.objecttype = objecttype;
+    }
+
+    public Integer getObjecttype()
+    {
+        return objecttype;
+    }
+    public void setPrice(Double price)
+    {
+        this.price = price;
+    }
+
+    public Double getPrice()
+    {
+        return price;
+    }
+    public void setExecdate(Date execdate)
+    {
+        this.execdate = execdate;
+    }
+
+    public Date getExecdate()
+    {
+        return execdate;
+    }
+    public void setOprMan(String oprMan)
+    {
+        this.oprMan = oprMan;
+    }
+
+    public String getOprMan()
+    {
+        return oprMan;
+    }
+    public void setOprTime(Date oprTime)
+    {
+        this.oprTime = oprTime;
+    }
+
+    public Date getOprTime()
+    {
+        return oprTime;
+    }
+    public void setModMan(String modMan)
+    {
+        this.modMan = modMan;
+    }
+
+    public String getModMan()
+    {
+        return modMan;
+    }
+    public void setModTime(Date modTime)
+    {
+        this.modTime = modTime;
+    }
+
+    public Date getModTime()
+    {
+        return modTime;
+    }
+    public void setNote(String note)
+    {
+        this.note = note;
+    }
+
+    public String getNote()
+    {
+        return note;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("priceid", getPriceid())
+            .append("objectid", getObjectid())
+            .append("objecttype", getObjecttype())
+            .append("price", getPrice())
+            .append("execdate", getExecdate())
+            .append("oprMan", getOprMan())
+            .append("oprTime", getOprTime())
+            .append("modMan", getModMan())
+            .append("modTime", getModTime())
+            .append("note", getNote())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysProduct.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysProduct.java
new file mode 100644
index 0000000..43d9ef7
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/domain/SysProduct.java
@@ -0,0 +1,238 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 浜у搧瀵硅薄 sys_product
+ *
+ * @author sys
+ * @date 2020-02-19
+ */
+public class SysProduct extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 浜у搧ID */
+    private Integer productid;
+
+    /** 浜у搧鍚嶇О */
+    @Excel(name = "浜у搧鍚嶇О")
+    private String productname;
+
+    /** 浜у搧缂栧彿 */
+    @Excel(name = "浜у搧缂栧彿")
+    private String productsno;
+
+    /** 璁¢噺鍗曚綅 */
+    @Excel(name = "璁¢噺鍗曚綅")
+    private String muid;
+
+    /** 鐖剁骇浜у搧ID */
+    @Excel(name = "鐖剁骇浜у搧ID")
+    private Integer superid;
+
+    /** 鏄惁涓哄瓙绾� */
+    @Excel(name = "鏄惁涓哄瓙绾�")
+    private String issub;
+
+    /** 鎶樼畻绯绘暟 */
+    @Excel(name = "鎶樼畻绯绘暟")
+    private Double procofficient;
+
+    /** 鏄惁鏄剧ず */
+    @Excel(name = "鏄惁鏄剧ず")
+    private String isshow;
+
+    /** 鏄惁涓昏浜у搧 */
+    @Excel(name = "鏄惁涓昏浜у搧")
+    private String iscpnyproduct;
+
+    /** 鎿嶄綔浜� */
+    private String oprMan;
+
+    /** 鎿嶄綔鏃堕棿 */
+    private Date oprTime;
+
+    /** 鏇存柊浜� */
+    private String modMan;
+
+    /** 鏇存柊鏃堕棿 */
+    private Date modTime;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String note;
+    //浠锋牸
+    private double price;
+
+    private String superidname;
+
+    public String getSuperidname() {
+        return superidname;
+    }
+
+    public void setSuperidname(String superidname) {
+        this.superidname = superidname;
+    }
+
+    public double getPrice() {
+        return price;
+    }
+
+    public void setPrice(double price) {
+        this.price = price;
+    }
+
+
+
+    public void setProductid(Integer productid)
+    {
+        this.productid = productid;
+    }
+
+    public Integer getProductid()
+    {
+        return productid;
+    }
+    public void setProductname(String productname)
+    {
+        this.productname = productname;
+    }
+
+    public String getProductname()
+    {
+        return productname;
+    }
+    public void setProductsno(String productsno)
+    {
+        this.productsno = productsno;
+    }
+
+    public String getProductsno()
+    {
+        return productsno;
+    }
+    public void setMuid(String muid)
+    {
+        this.muid = muid;
+    }
+
+    public String getMuid()
+    {
+        return muid;
+    }
+    public void setSuperid(Integer superid)
+    {
+        this.superid = superid;
+    }
+
+    public Integer getSuperid()
+    {
+        return superid;
+    }
+    public void setIssub(String issub)
+    {
+        this.issub = issub;
+    }
+
+    public String getIssub()
+    {
+        return issub;
+    }
+    public void setProcofficient(Double procofficient)
+    {
+        this.procofficient = procofficient;
+    }
+
+    public Double getProcofficient()
+    {
+        return procofficient;
+    }
+    public void setIsshow(String isshow)
+    {
+        this.isshow = isshow;
+    }
+
+    public String getIsshow()
+    {
+        return isshow;
+    }
+    public void setIscpnyproduct(String iscpnyproduct)
+    {
+        this.iscpnyproduct = iscpnyproduct;
+    }
+
+    public String getIscpnyproduct()
+    {
+        return iscpnyproduct;
+    }
+    public void setOprMan(String oprMan)
+    {
+        this.oprMan = oprMan;
+    }
+
+    public String getOprMan()
+    {
+        return oprMan;
+    }
+    public void setOprTime(Date oprTime)
+    {
+        this.oprTime = oprTime;
+    }
+
+    public Date getOprTime()
+    {
+        return oprTime;
+    }
+    public void setModMan(String modMan)
+    {
+        this.modMan = modMan;
+    }
+
+    public String getModMan()
+    {
+        return modMan;
+    }
+    public void setModTime(Date modTime)
+    {
+        this.modTime = modTime;
+    }
+
+    public Date getModTime()
+    {
+        return modTime;
+    }
+    public void setNote(String note)
+    {
+        this.note = note;
+    }
+
+    public String getNote()
+    {
+        return note;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("productid", getProductid())
+            .append("productname", getProductname())
+            .append("productsno", getProductsno())
+            .append("muid", getMuid())
+            .append("superid", getSuperid())
+            .append("issub", getIssub())
+            .append("procofficient", getProcofficient())
+            .append("isshow", getIsshow())
+            .append("iscpnyproduct", getIscpnyproduct())
+            .append("oprMan", getOprMan())
+            .append("oprTime", getOprTime())
+            .append("modMan", getModMan())
+            .append("modTime", getModTime())
+            .append("note", getNote())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnerclassMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnerclassMapper.java
new file mode 100644
index 0000000..195ec84
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnerclassMapper.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.mapper;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnerclass;
+import io.swagger.models.auth.In;
+
+import java.util.List;
+
+/**
+ * 鑳芥簮鍝佺璁剧疆Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-10
+ */
+public interface SysEnerclassMapper
+{
+    /**
+     * 鏌ヨ鑳芥簮鍝佺璁剧疆
+     *
+     * @param enerclassid 鑳芥簮鍝佺璁剧疆ID
+     * @return 鑳芥簮鍝佺璁剧疆
+     */
+    public SysEnerclass selectSysEnerclassById(Integer enerclassid);
+
+    /**
+     * 鏌ヨ鑳芥簮鍝佺璁剧疆鍒楄〃
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 鑳芥簮鍝佺璁剧疆闆嗗悎
+     */
+    public List<SysEnerclass> selectSysEnerclassList(SysEnerclass sysEnerclass);
+
+    /**
+     * 鏂板鑳芥簮鍝佺璁剧疆
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 缁撴灉
+     */
+    public int insertSysEnerclass(SysEnerclass sysEnerclass);
+
+    /**
+     * 淇敼鑳芥簮鍝佺璁剧疆
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 缁撴灉
+     */
+    public int updateSysEnerclass(SysEnerclass sysEnerclass);
+
+    /**
+     * 鍒犻櫎鑳芥簮鍝佺璁剧疆
+     *
+     * @param enerclassid 鑳芥簮鍝佺璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnerclassById(Integer enerclassid);
+
+    /**
+     * 鎵归噺鍒犻櫎鑳芥簮鍝佺璁剧疆
+     *
+     * @param enerclassids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnerclassByIds(Integer[] enerclassids);
+    /**
+     * 鏌ヨ涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓� 鑳芥簮鍚嶇О鍞竴鏍¢獙
+     */
+    int selectSameEnergyNameNum(String enerclassname);
+    /**
+     * 淇敼鐨勬椂鍊欐煡璇竴鏍疯兘婧愬悕绉扮殑id
+     */
+    Integer selectIdByName(String enerclassname);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnercoefficientMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnercoefficientMapper.java
new file mode 100644
index 0000000..d4ebadd
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnercoefficientMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.mapper;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnercoefficient;
+import java.util.List;
+
+/**
+ * 鑳芥簮鎶樻爣绯绘暟Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-02-18
+ */
+public interface SysEnercoefficientMapper 
+{
+    /**
+     * 鏌ヨ鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param ecid 鑳芥簮鎶樻爣绯绘暟ID
+     * @return 鑳芥簮鎶樻爣绯绘暟
+     */
+    public SysEnercoefficient selectSysEnercoefficientById(Integer ecid);
+
+    /**
+     * 鏌ヨ鑳芥簮鎶樻爣绯绘暟鍒楄〃
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 鑳芥簮鎶樻爣绯绘暟闆嗗悎
+     */
+    public List<SysEnercoefficient> selectSysEnercoefficientList(SysEnercoefficient sysEnercoefficient);
+
+    /**
+     * 鏂板鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 缁撴灉
+     */
+    public int insertSysEnercoefficient(SysEnercoefficient sysEnercoefficient);
+
+    /**
+     * 淇敼鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 缁撴灉
+     */
+    public int updateSysEnercoefficient(SysEnercoefficient sysEnercoefficient);
+
+    /**
+     * 鍒犻櫎鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param ecid 鑳芥簮鎶樻爣绯绘暟ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnercoefficientById(Integer ecid);
+
+    /**
+     * 鎵归噺鍒犻櫎鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param ecids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnercoefficientByIds(Integer[] ecids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnergyMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnergyMapper.java
new file mode 100644
index 0000000..a57f5e4
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysEnergyMapper.java
@@ -0,0 +1,104 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.mapper;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy;
+import java.util.List;
+
+/**
+ * energyMapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public interface SysEnergyMapper
+{
+    /**
+     * 鏌ヨ鑳芥簮绫诲瀷涓嬫媺妗�
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    List getenerclassname();
+    /**
+     * 鏌ヨenergy
+     *
+     * @param
+     * @return energy
+     */
+    public SysEnergy selectSysEnergyById(Integer enerid);
+
+    /**
+     * 鏌ヨenergy鍒楄〃
+     *
+     * @param sysEnergy energy
+     * @return energy闆嗗悎
+     */
+    public List<SysEnergy> selectSysEnergyList(SysEnergy sysEnergy);
+
+    /**
+     * 鏂板energy
+     *
+     * @param sysEnergy energy
+     * @return 缁撴灉
+     */
+    public int insertSysEnergy(SysEnergy sysEnergy);
+
+    /**
+     * 淇敼energy
+     *
+     * @param sysEnergy energy
+     * @return 缁撴灉
+     */
+    public int updateSysEnergy(SysEnergy sysEnergy);
+
+    /**
+     * 鍒犻櫎energy
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    public int deleteSysEnergyById(Integer enerid);
+
+    /**
+     * 鎵归噺鍒犻櫎energy
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    public int deleteSysEnergyByIds(Integer[] enerids);
+    /**
+     * 閫氳繃鑳芥簮绫诲瀷鍚嶇О鏌ヨ 鑳芥簮绫诲瀷id
+     */
+    Integer getEnerClassid(String enerclassname);
+    /**
+     * 鏌ヨ涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓� 鑳芥簮鍚嶇О鍞竴鏍¢獙
+     */
+    int selectSameEnergyNameNum(String enername);
+    /**
+     * 淇敼鐨勬椂鍊欐煡璇竴鏍疯兘婧愬悕绉扮殑id
+     */
+    Integer selectIdByName(String enername);
+    /**
+     * 閫氳繃鑳芥簮id鏌ヨ鍗曚环淇℃伅
+     */
+    Integer getPriceCountByEnerid(SysEnergy sysEnergy);
+    /**
+     * 澧炲姞鍗曚环淇℃伅
+     */
+    Integer insertEnergyPrice(SysEnergy sysEnergy);
+    /**
+     * 淇敼鍗曚环淇℃伅
+     */
+    Integer updateEnergyPrice(SysEnergy sysEnergy);
+    /**
+     * 閫氳繃鑳芥簮id鏌ユ姌鏍囩郴鏁皀um
+     */
+    Integer getCoefficientCountByEnerid(Integer enerid);
+    /**
+     * 澧炲姞鎶樻爣绯绘暟淇℃伅
+     */
+    Integer insertEnergyCoefficient(SysEnergy sysEnergy);
+    /**
+     * 淇敼鎶樻爣绯绘暟淇℃伅
+     */
+    Integer updateEnergyCoefficient(SysEnergy sysEnergy);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysPriceMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysPriceMapper.java
new file mode 100644
index 0000000..bca85a1
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysPriceMapper.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.mapper;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysPrice;
+
+import java.util.List;
+
+/**
+ * 鍗曚环璁剧疆Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-15
+ */
+public interface SysPriceMapper
+{
+    /**
+     * 鏌ヨ鍗曚环璁剧疆
+     *
+     * @param priceid 鍗曚环璁剧疆ID
+     * @return 鍗曚环璁剧疆
+     */
+    public SysPrice selectSysPriceById(Integer priceid);
+
+    /**
+     * 鏌ヨ鍗曚环璁剧疆鍒楄〃
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 鍗曚环璁剧疆闆嗗悎
+     */
+    public List<SysPrice> selectSysPriceList(SysPrice sysPrice);
+
+    /**
+     * 鏂板鍗曚环璁剧疆
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 缁撴灉
+     */
+    public int insertSysPrice(SysPrice sysPrice);
+
+    /**
+     * 淇敼鍗曚环璁剧疆
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 缁撴灉
+     */
+    public int updateSysPrice(SysPrice sysPrice);
+
+    /**
+     * 鍒犻櫎鍗曚环璁剧疆
+     *
+     * @param priceid 鍗曚环璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteSysPriceById(Integer priceid);
+
+    /**
+     * 鎵归噺鍒犻櫎鍗曚环璁剧疆
+     *
+     * @param priceids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteSysPriceByIds(Integer[] priceids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysProductMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysProductMapper.java
new file mode 100644
index 0000000..fee1d58
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/mapper/SysProductMapper.java
@@ -0,0 +1,67 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.mapper;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import java.util.List;
+
+/**
+ * 浜у搧Mapper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-19
+ */
+public interface SysProductMapper
+{
+    /**
+     * 鏌ヨ浜у搧
+     *
+     * @param productid 浜у搧ID
+     * @return 浜у搧
+     */
+    public SysProduct selectSysProductById(Integer productid);
+
+    /**
+     * 鏌ヨ浜у搧鍒楄〃
+     *
+     * @param sysProduct 浜у搧
+     * @return 浜у搧闆嗗悎
+     */
+    public List<SysProduct> selectSysProductList(SysProduct sysProduct);
+
+    /**
+     * 鏂板浜у搧
+     *
+     * @param sysProduct 浜у搧
+     * @return 缁撴灉
+     */
+    public int insertSysProduct(SysProduct sysProduct);
+
+    /**
+     * 淇敼浜у搧
+     *
+     * @param sysProduct 浜у搧
+     * @return 缁撴灉
+     */
+    public int updateSysProduct(SysProduct sysProduct);
+
+    /**
+     * 鍒犻櫎浜у搧
+     *
+     * @param productid 浜у搧ID
+     * @return 缁撴灉
+     */
+    public int deleteSysProductById(Integer productid);
+
+    /**
+     * 鎵归噺鍒犻櫎浜у搧
+     *
+     * @param productids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteSysProductByIds(Integer[] productids);
+
+    //鏍¢獙no鍜宯ame 鍞竴
+    Integer selectCountByName(SysProduct sysProduct);
+    Integer selectCountByNo(SysProduct sysProduct);
+    Integer selectIdByName(SysProduct sysProduct);
+    Integer selectIdByNo(SysProduct sysProduct);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnerclassService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnerclassService.java
new file mode 100644
index 0000000..427dc99
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnerclassService.java
@@ -0,0 +1,69 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnerclass;
+import java.util.List;
+
+/**
+ * 鑳芥簮鍝佺璁剧疆Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-10
+ */
+public interface ISysEnerclassService
+{
+    /**
+     * 鏌ヨ鑳芥簮鍝佺璁剧疆
+     *
+     * @param enerclassid 鑳芥簮鍝佺璁剧疆ID
+     * @return 鑳芥簮鍝佺璁剧疆
+     */
+    public SysEnerclass selectSysEnerclassById(Integer enerclassid);
+
+    /**
+     * 鏌ヨ鑳芥簮鍝佺璁剧疆鍒楄〃
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 鑳芥簮鍝佺璁剧疆闆嗗悎
+     */
+    public List<SysEnerclass> selectSysEnerclassList(SysEnerclass sysEnerclass);
+
+    /**
+     * 鏂板鑳芥簮鍝佺璁剧疆
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 缁撴灉
+     */
+    public int insertSysEnerclass(SysEnerclass sysEnerclass);
+
+    /**
+     * 淇敼鑳芥簮鍝佺璁剧疆
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 缁撴灉
+     */
+    public int updateSysEnerclass(SysEnerclass sysEnerclass);
+
+    /**
+     * 鎵归噺鍒犻櫎鑳芥簮鍝佺璁剧疆
+     *
+     * @param enerclassids 闇�瑕佸垹闄ょ殑鑳芥簮鍝佺璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnerclassByIds(Integer[] enerclassids);
+
+    /**
+     * 鍒犻櫎鑳芥簮鍝佺璁剧疆淇℃伅
+     *
+     * @param enerclassid 鑳芥簮鍝佺璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnerclassById(Integer enerclassid);
+    /**
+     * 鏌ヨ涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓� 鑳芥簮鍚嶇О鍞竴鏍¢獙
+     */
+    int selectSameEnergyNameNum(String enerclassname);
+    /**
+     * 淇敼鐨勬椂鍊欐煡璇竴鏍疯兘婧愬悕绉扮殑id
+     */
+    Integer selectIdByName(String enerclassname);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnercoefficientService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnercoefficientService.java
new file mode 100644
index 0000000..0905e68
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnercoefficientService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnercoefficient;
+import java.util.List;
+
+/**
+ * 鑳芥簮鎶樻爣绯绘暟Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-02-18
+ */
+public interface ISysEnercoefficientService 
+{
+    /**
+     * 鏌ヨ鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param ecid 鑳芥簮鎶樻爣绯绘暟ID
+     * @return 鑳芥簮鎶樻爣绯绘暟
+     */
+    public SysEnercoefficient selectSysEnercoefficientById(Integer ecid);
+
+    /**
+     * 鏌ヨ鑳芥簮鎶樻爣绯绘暟鍒楄〃
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 鑳芥簮鎶樻爣绯绘暟闆嗗悎
+     */
+    public List<SysEnercoefficient> selectSysEnercoefficientList(SysEnercoefficient sysEnercoefficient);
+
+    /**
+     * 鏂板鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 缁撴灉
+     */
+    public int insertSysEnercoefficient(SysEnercoefficient sysEnercoefficient);
+
+    /**
+     * 淇敼鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 缁撴灉
+     */
+    public int updateSysEnercoefficient(SysEnercoefficient sysEnercoefficient);
+
+    /**
+     * 鎵归噺鍒犻櫎鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param ecids 闇�瑕佸垹闄ょ殑鑳芥簮鎶樻爣绯绘暟ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnercoefficientByIds(Integer[] ecids);
+
+    /**
+     * 鍒犻櫎鑳芥簮鎶樻爣绯绘暟淇℃伅
+     * 
+     * @param ecid 鑳芥簮鎶樻爣绯绘暟ID
+     * @return 缁撴灉
+     */
+    public int deleteSysEnercoefficientById(Integer ecid);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnergyService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnergyService.java
new file mode 100644
index 0000000..ff16724
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysEnergyService.java
@@ -0,0 +1,104 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy;
+import java.util.List;
+
+/**
+ * energyService鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public interface ISysEnergyService
+{
+    /**
+     * 鏌ヨenergy
+     *
+     * @param
+     * @return energy
+     */
+    public SysEnergy selectSysEnergyById(Integer enerid);
+
+    /**
+     * 鏌ヨenergy鍒楄〃
+     *
+     * @param sysEnergy energy
+     * @return energy闆嗗悎
+     */
+    public List<SysEnergy> selectSysEnergyList(SysEnergy sysEnergy);
+
+    /**
+     * 鏂板energy
+     *
+     * @param sysEnergy energy
+     * @return 缁撴灉
+     */
+    public int insertSysEnergy(SysEnergy sysEnergy);
+
+    /**
+     * 淇敼energy
+     *
+     * @param sysEnergy energy
+     * @return 缁撴灉
+     */
+    public int updateSysEnergy(SysEnergy sysEnergy);
+
+    /**
+     * 鎵归噺鍒犻櫎energy
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    public int deleteSysEnergyByIds(Integer[] enerids);
+
+    /**
+     * 鍒犻櫎energy淇℃伅
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    public int deleteSysEnergyById(Integer enerid);
+    /**
+     * 鏌ヨ鑳芥簮绫诲瀷涓嬫媺妗�
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    public List getenerclassname();
+    /**
+     * 鏌ヨ鑳芥簮绫诲瀷id by enerclassname
+     */
+    Integer getEnerClassid(String enerclassname);
+    /**
+     * 鏌ヨ涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓� 鑳芥簮鍚嶇О鍞竴鏍¢獙
+     */
+    int selectSameEnergyNameNum(String enername);
+    /**
+     * 淇敼鐨勬椂鍊欐煡璇竴鏍疯兘婧愬悕绉扮殑id
+     */
+    Integer selectIdByName(String enername);
+    /**
+     * 閫氳繃鑳芥簮id鏌ヨ鍗曚环淇℃伅
+     */
+    Integer getPriceCountByEnerid(SysEnergy sysEnergy);
+    /**
+     * 澧炲姞鍗曚环淇℃伅
+     */
+    Integer insertEnergyPrice(SysEnergy sysEnergy);
+    /**
+     * 淇敼鍗曚环淇℃伅
+     */
+    Integer updateEnergyPrice(SysEnergy sysEnergy);
+    /**
+     * 閫氳繃鑳芥簮id鏌ユ姌鏍囩郴鏁皀um
+     */
+    Integer getCoefficientCountByEnerid(Integer enerid);
+    /**
+     * 澧炲姞鎶樻爣绯绘暟淇℃伅
+     */
+    Integer insertEnergyCoefficient(SysEnergy sysEnergy);
+    /**
+     * 淇敼鎶樻爣绯绘暟淇℃伅
+     */
+    Integer updateEnergyCoefficient(SysEnergy sysEnergy);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysPriceService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysPriceService.java
new file mode 100644
index 0000000..89b8fe2
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysPriceService.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysPrice;
+
+import java.util.List;
+
+/**
+ * 鍗曚环璁剧疆Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-15
+ */
+public interface ISysPriceService
+{
+    /**
+     * 鏌ヨ鍗曚环璁剧疆
+     *
+     * @param priceid 鍗曚环璁剧疆ID
+     * @return 鍗曚环璁剧疆
+     */
+    public Object selectSysPriceById(Integer priceid);
+
+    /**
+     * 鏌ヨ鍗曚环璁剧疆鍒楄〃
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 鍗曚环璁剧疆闆嗗悎
+     */
+    public List<SysPrice> selectSysPriceList(SysPrice sysPrice);
+
+    /**
+     * 鏂板鍗曚环璁剧疆
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 缁撴灉
+     */
+    public int insertSysPrice(SysPrice sysPrice);
+
+    /**
+     * 淇敼鍗曚环璁剧疆
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 缁撴灉
+     */
+    public int updateSysPrice(SysPrice sysPrice);
+
+    /**
+     * 鎵归噺鍒犻櫎鍗曚环璁剧疆
+     *
+     * @param priceids 闇�瑕佸垹闄ょ殑鍗曚环璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteSysPriceByIds(Integer[] priceids);
+
+    /**
+     * 鍒犻櫎鍗曚环璁剧疆淇℃伅
+     *
+     * @param priceid 鍗曚环璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteSysPriceById(Integer priceid);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysProductService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysProductService.java
new file mode 100644
index 0000000..7ee0d40
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/ISysProductService.java
@@ -0,0 +1,66 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import java.util.List;
+
+/**
+ * 浜у搧Service鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-19
+ */
+public interface ISysProductService
+{
+    /**
+     * 鏌ヨ浜у搧
+     *
+     * @param productid 浜у搧ID
+     * @return 浜у搧
+     */
+    public SysProduct selectSysProductById(Integer productid);
+
+    /**
+     * 鏌ヨ浜у搧鍒楄〃
+     *
+     * @param sysProduct 浜у搧
+     * @return 浜у搧闆嗗悎
+     */
+    public List<SysProduct> selectSysProductList(SysProduct sysProduct);
+
+    /**
+     * 鏂板浜у搧
+     *
+     * @param sysProduct 浜у搧
+     * @return 缁撴灉
+     */
+    public int insertSysProduct(SysProduct sysProduct);
+
+    /**
+     * 淇敼浜у搧
+     *
+     * @param sysProduct 浜у搧
+     * @return 缁撴灉
+     */
+    public int updateSysProduct(SysProduct sysProduct);
+
+    /**
+     * 鎵归噺鍒犻櫎浜у搧
+     *
+     * @param productids 闇�瑕佸垹闄ょ殑浜у搧ID
+     * @return 缁撴灉
+     */
+    public int deleteSysProductByIds(Integer[] productids);
+
+    /**
+     * 鍒犻櫎浜у搧淇℃伅
+     *
+     * @param productid 浜у搧ID
+     * @return 缁撴灉
+     */
+    public int deleteSysProductById(Integer productid);
+    //鏍¢獙no鍜宯ame 鍞竴
+    Integer selectCountByName(SysProduct sysProduct);
+    Integer selectCountByNo(SysProduct sysProduct);
+    Integer selectIdByName(SysProduct sysProduct);
+    Integer selectIdByNo(SysProduct sysProduct);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnerclassServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnerclassServiceImpl.java
new file mode 100644
index 0000000..aa0b3e4
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnerclassServiceImpl.java
@@ -0,0 +1,113 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service.impl;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysEnerclassMapper;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnerclass;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysEnerclassService;
+
+/**
+ * 鑳芥簮鍝佺璁剧疆Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-10
+ */
+@Service
+public class SysEnerclassServiceImpl implements ISysEnerclassService
+{
+    @Autowired
+    private SysEnerclassMapper sysEnerclassMapper;
+
+    /**
+     * 鏌ヨ鑳芥簮鍝佺璁剧疆
+     *
+     * @param enerclassid 鑳芥簮鍝佺璁剧疆ID
+     * @return 鑳芥簮鍝佺璁剧疆
+     */
+    @Override
+    public SysEnerclass selectSysEnerclassById(Integer enerclassid)
+    {
+        return sysEnerclassMapper.selectSysEnerclassById(enerclassid);
+    }
+
+    /**
+     * 鏌ヨ鑳芥簮鍝佺璁剧疆鍒楄〃
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 鑳芥簮鍝佺璁剧疆
+     */
+    @Override
+    public List<SysEnerclass> selectSysEnerclassList(SysEnerclass sysEnerclass)
+    {
+        return sysEnerclassMapper.selectSysEnerclassList(sysEnerclass);
+    }
+
+    /**
+     * 鏂板鑳芥簮鍝佺璁剧疆
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysEnerclass(SysEnerclass sysEnerclass) {
+        //鑾峰彇褰撳墠鐧诲綍浜�
+        String nowMan = SecurityUtils.getUsername();
+        sysEnerclass.setModMan(nowMan);
+        sysEnerclass.setOprMan(nowMan);
+        return sysEnerclassMapper.insertSysEnerclass(sysEnerclass);
+    }
+
+    /**
+     * 淇敼鑳芥簮鍝佺璁剧疆
+     *
+     * @param sysEnerclass 鑳芥簮鍝佺璁剧疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysEnerclass(SysEnerclass sysEnerclass) {
+        String nowMan = SecurityUtils.getUsername();
+        sysEnerclass.setModMan(nowMan);
+        return sysEnerclassMapper.updateSysEnerclass(sysEnerclass);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鑳芥簮鍝佺璁剧疆
+     *
+     * @param enerclassids 闇�瑕佸垹闄ょ殑鑳芥簮鍝佺璁剧疆ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysEnerclassByIds(Integer[] enerclassids)
+    {
+        return sysEnerclassMapper.deleteSysEnerclassByIds(enerclassids);
+    }
+
+    /**
+     * 鍒犻櫎鑳芥簮鍝佺璁剧疆淇℃伅
+     *
+     * @param enerclassid 鑳芥簮鍝佺璁剧疆ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysEnerclassById(Integer enerclassid)
+    {
+        return sysEnerclassMapper.deleteSysEnerclassById(enerclassid);
+    }
+    /**
+     * 鏌ヨ涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓� 鑳芥簮鍚嶇О鍞竴鏍¢獙
+     */
+    @Override
+    public int selectSameEnergyNameNum(String enerclassname) {
+        return sysEnerclassMapper.selectSameEnergyNameNum(enerclassname);
+    }
+    /**
+     * 淇敼鐨勬椂鍊欐煡璇竴鏍疯兘婧愬悕绉扮殑id
+     */
+    @Override
+    public Integer selectIdByName(String enerclassname) {
+        return sysEnerclassMapper.selectIdByName(enerclassname);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnercoefficientServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnercoefficientServiceImpl.java
new file mode 100644
index 0000000..16d57e9
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnercoefficientServiceImpl.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysEnercoefficientMapper;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnercoefficient;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysEnercoefficientService;
+
+/**
+ * 鑳芥簮鎶樻爣绯绘暟Service涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-02-18
+ */
+@Service
+public class SysEnercoefficientServiceImpl implements ISysEnercoefficientService 
+{
+    @Autowired
+    private SysEnercoefficientMapper sysEnercoefficientMapper;
+
+    /**
+     * 鏌ヨ鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param ecid 鑳芥簮鎶樻爣绯绘暟ID
+     * @return 鑳芥簮鎶樻爣绯绘暟
+     */
+    @Override
+    public SysEnercoefficient selectSysEnercoefficientById(Integer ecid)
+    {
+        return sysEnercoefficientMapper.selectSysEnercoefficientById(ecid);
+    }
+
+    /**
+     * 鏌ヨ鑳芥簮鎶樻爣绯绘暟鍒楄〃
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 鑳芥簮鎶樻爣绯绘暟
+     */
+    @Override
+    public List<SysEnercoefficient> selectSysEnercoefficientList(SysEnercoefficient sysEnercoefficient)
+    {
+        return sysEnercoefficientMapper.selectSysEnercoefficientList(sysEnercoefficient);
+    }
+
+    /**
+     * 鏂板鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysEnercoefficient(SysEnercoefficient sysEnercoefficient)
+    {
+        return sysEnercoefficientMapper.insertSysEnercoefficient(sysEnercoefficient);
+    }
+
+    /**
+     * 淇敼鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param sysEnercoefficient 鑳芥簮鎶樻爣绯绘暟
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysEnercoefficient(SysEnercoefficient sysEnercoefficient)
+    {
+        return sysEnercoefficientMapper.updateSysEnercoefficient(sysEnercoefficient);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鑳芥簮鎶樻爣绯绘暟
+     * 
+     * @param ecids 闇�瑕佸垹闄ょ殑鑳芥簮鎶樻爣绯绘暟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysEnercoefficientByIds(Integer[] ecids)
+    {
+        return sysEnercoefficientMapper.deleteSysEnercoefficientByIds(ecids);
+    }
+
+    /**
+     * 鍒犻櫎鑳芥簮鎶樻爣绯绘暟淇℃伅
+     * 
+     * @param ecid 鑳芥簮鎶樻爣绯绘暟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysEnercoefficientById(Integer ecid)
+    {
+        return sysEnercoefficientMapper.deleteSysEnercoefficientById(ecid);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnergyServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnergyServiceImpl.java
new file mode 100644
index 0000000..f36ea0f
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysEnergyServiceImpl.java
@@ -0,0 +1,183 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service.impl;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysEnergyMapper;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysEnergyService;
+
+/**
+ * energyService涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+@Service
+public class SysEnergyServiceImpl implements ISysEnergyService
+{
+    @Autowired
+    private SysEnergyMapper sysEnergyMapper;
+
+    /**
+     * 鏌ヨenergy
+     *
+     * @param
+     * @return energy
+     */
+    @Override
+    public SysEnergy selectSysEnergyById(Integer enerid)
+    {
+        return sysEnergyMapper.selectSysEnergyById(enerid);
+    }
+
+    /**
+     * 鏌ヨenergy鍒楄〃
+     *
+     * @param sysEnergy energy
+     * @return energy
+     */
+    @Override
+    public List<SysEnergy> selectSysEnergyList(SysEnergy sysEnergy)
+    {
+        String s = "1";
+        //鏀惧叆  鏄惁鍌ㄥ瓨锛堝瓧绗︿覆锛�
+        List<SysEnergy> list = sysEnergyMapper.selectSysEnergyList(sysEnergy);
+        for (SysEnergy energy : list) {
+            if (energy.getIsstorage() == 0) {
+                energy.setIsstorageString("鏄�");
+            }else {
+                energy.setIsstorageString("鍚�");
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 鏂板energy
+     *
+     * @param sysEnergy energy
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysEnergy(SysEnergy sysEnergy)
+    {
+        //鑾峰彇褰撳墠鐧诲綍浜�
+        String nowMan = SecurityUtils.getUsername();
+        sysEnergy.setModMan(nowMan);
+        sysEnergy.setOprMan(nowMan);
+        return sysEnergyMapper.insertSysEnergy(sysEnergy);
+    }
+
+    /**
+     * 淇敼energy
+     *
+     * @param sysEnergy energy
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysEnergy(SysEnergy sysEnergy)
+    {
+        String nowMan = SecurityUtils.getUsername();
+        sysEnergy.setModMan(nowMan);
+        return sysEnergyMapper.updateSysEnergy(sysEnergy);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎energy
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysEnergyByIds(Integer[] enerids)
+    {
+        return sysEnergyMapper.deleteSysEnergyByIds(enerids);
+    }
+
+    /**
+     * 鍒犻櫎energy淇℃伅
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysEnergyById(Integer enerid)
+    {
+        return sysEnergyMapper.deleteSysEnergyById(enerid);
+    }
+    /**
+     * 鏌ヨ鑳芥簮绫诲瀷涓嬫媺妗�
+     *
+     * @param
+     * @return 缁撴灉
+     */
+    @Override
+    public List getenerclassname() {
+        return sysEnergyMapper.getenerclassname();
+    }
+
+    @Override
+    public Integer getEnerClassid(String enerclassname) {
+        return sysEnergyMapper.getEnerClassid(enerclassname);
+    }
+
+    /**
+     * 鏌ヨ涓�鏍风殑鑳芥簮鍚嶇О鏈夊嚑涓� 鑳芥簮鍚嶇О鍞竴鏍¢獙
+     */
+    @Override
+    public int selectSameEnergyNameNum(String enername) {
+        return sysEnergyMapper.selectSameEnergyNameNum(enername);
+    }
+    /**
+     * 淇敼鐨勬椂鍊欐煡璇竴鏍疯兘婧愬悕绉扮殑id
+     */
+    @Override
+    public Integer selectIdByName(String enername) {
+        return sysEnergyMapper.selectIdByName(enername);
+    }
+
+    @Override
+    public Integer getPriceCountByEnerid(SysEnergy sysEnergy) {
+        return sysEnergyMapper.getPriceCountByEnerid(sysEnergy);
+    }
+
+    @Override
+    public Integer insertEnergyPrice(SysEnergy sysEnergy) {
+        //鑾峰彇褰撳墠鐧诲綍浜�
+        String nowMan = SecurityUtils.getUsername();
+        sysEnergy.setModMan(nowMan);
+        sysEnergy.setOprMan(nowMan);
+        return sysEnergyMapper.insertEnergyPrice(sysEnergy);
+    }
+
+    @Override
+    public Integer updateEnergyPrice(SysEnergy sysEnergy) {
+        String nowMan = SecurityUtils.getUsername();
+        sysEnergy.setModMan(nowMan);
+        return sysEnergyMapper.updateEnergyPrice(sysEnergy);
+    }
+
+    @Override
+    public Integer getCoefficientCountByEnerid(Integer enerid) {
+        return sysEnergyMapper.getCoefficientCountByEnerid(enerid);
+    }
+
+    @Override
+    public Integer insertEnergyCoefficient(SysEnergy sysEnergy) {
+        //鑾峰彇褰撳墠鐧诲綍浜�
+        String nowMan = SecurityUtils.getUsername();
+        sysEnergy.setModMan(nowMan);
+        sysEnergy.setOprMan(nowMan);
+        return sysEnergyMapper.insertEnergyCoefficient(sysEnergy);
+    }
+
+    @Override
+    public Integer updateEnergyCoefficient(SysEnergy sysEnergy) {
+        String nowMan = SecurityUtils.getUsername();
+        sysEnergy.setModMan(nowMan);
+        return sysEnergyMapper.updateEnergyCoefficient(sysEnergy);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysPriceServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysPriceServiceImpl.java
new file mode 100644
index 0000000..6319854
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysPriceServiceImpl.java
@@ -0,0 +1,94 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service.impl;
+
+import java.util.List;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysPrice;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysPriceMapper;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysPriceService;
+
+/**
+ * 鍗曚环璁剧疆Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-15
+ */
+@Service
+public class SysPriceServiceImpl implements ISysPriceService
+{
+    @Autowired
+    private SysPriceMapper sysPriceMapper;
+
+    /**
+     * 鏌ヨ鍗曚环璁剧疆
+     *
+     * @param priceid 鍗曚环璁剧疆ID
+     * @return 鍗曚环璁剧疆
+     */
+    @Override
+    public Object selectSysPriceById(Integer priceid)
+    {
+        return sysPriceMapper.selectSysPriceById(priceid);
+    }
+
+    /**
+     * 鏌ヨ鍗曚环璁剧疆鍒楄〃
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 鍗曚环璁剧疆
+     */
+    @Override
+    public List<SysPrice> selectSysPriceList(SysPrice sysPrice)
+    {
+        return sysPriceMapper.selectSysPriceList(sysPrice);
+    }
+
+    /**
+     * 鏂板鍗曚环璁剧疆
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysPrice(SysPrice sysPrice)
+    {
+        return sysPriceMapper.insertSysPrice(sysPrice);
+    }
+
+    /**
+     * 淇敼鍗曚环璁剧疆
+     *
+     * @param sysPrice 鍗曚环璁剧疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysPrice(SysPrice sysPrice)
+    {
+        return sysPriceMapper.updateSysPrice(sysPrice);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鍗曚环璁剧疆
+     *
+     * @param priceids 闇�瑕佸垹闄ょ殑鍗曚环璁剧疆ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysPriceByIds(Integer[] priceids)
+    {
+        return sysPriceMapper.deleteSysPriceByIds(priceids);
+    }
+
+    /**
+     * 鍒犻櫎鍗曚环璁剧疆淇℃伅
+     *
+     * @param priceid 鍗曚环璁剧疆ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysPriceById(Integer priceid)
+    {
+        return sysPriceMapper.deleteSysPriceById(priceid);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysProductServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysProductServiceImpl.java
new file mode 100644
index 0000000..3913853
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/enerInfoManage/service/impl/SysProductServiceImpl.java
@@ -0,0 +1,123 @@
+package com.dingzhuo.energy.basic.data.enerInfoManage.service.impl;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysProductMapper;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.basic.data.enerInfoManage.service.ISysProductService;
+
+/**
+ * 浜у搧Service涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-02-19
+ */
+@Service
+public class SysProductServiceImpl implements ISysProductService
+{
+    @Autowired
+    private SysProductMapper sysProductMapper;
+
+    /**
+     * 鏌ヨ浜у搧
+     *
+     * @param productid 浜у搧ID
+     * @return 浜у搧
+     */
+    @Override
+    public SysProduct selectSysProductById(Integer productid)
+    {
+        return sysProductMapper.selectSysProductById(productid);
+    }
+
+    /**
+     * 鏌ヨ浜у搧鍒楄〃
+     *
+     * @param sysProduct 浜у搧
+     * @return 浜у搧
+     */
+    @Override
+    public List<SysProduct> selectSysProductList(SysProduct sysProduct)
+    {
+        return sysProductMapper.selectSysProductList(sysProduct);
+    }
+
+    /**
+     * 鏂板浜у搧
+     *
+     * @param sysProduct 浜у搧
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysProduct(SysProduct sysProduct)
+    {
+        //鑾峰彇褰撳墠鐧诲綍浜�
+        String nowMan = SecurityUtils.getUsername();
+        sysProduct.setModMan(nowMan);
+        sysProduct.setOprMan(nowMan);
+        return sysProductMapper.insertSysProduct(sysProduct);
+    }
+
+    /**
+     * 淇敼浜у搧
+     *
+     * @param sysProduct 浜у搧
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysProduct(SysProduct sysProduct)
+    {
+        String nowMan = SecurityUtils.getUsername();
+        sysProduct.setModMan(nowMan);
+        return sysProductMapper.updateSysProduct(sysProduct);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎浜у搧
+     *
+     * @param productids 闇�瑕佸垹闄ょ殑浜у搧ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysProductByIds(Integer[] productids)
+    {
+        return sysProductMapper.deleteSysProductByIds(productids);
+    }
+
+    /**
+     * 鍒犻櫎浜у搧淇℃伅
+     *
+     * @param productid 浜у搧ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysProductById(Integer productid)
+    {
+        return sysProductMapper.deleteSysProductById(productid);
+    }
+
+
+    //鏍¢獙no鍜宯ame 鍞竴
+    @Override
+    public Integer selectCountByName(SysProduct sysProduct) {
+        return sysProductMapper.selectCountByName(sysProduct);
+    }
+
+    @Override
+    public Integer selectCountByNo(SysProduct sysProduct) {
+        return sysProductMapper.selectCountByNo(sysProduct);
+    }
+
+    @Override
+    public Integer selectIdByName(SysProduct sysProduct) {
+        return sysProductMapper.selectIdByName(sysProduct);
+    }
+
+    @Override
+    public Integer selectIdByNo(SysProduct sysProduct) {
+        return sysProductMapper.selectIdByNo(sysProduct);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectAnnexController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectAnnexController.java
new file mode 100644
index 0000000..0af7790
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectAnnexController.java
@@ -0,0 +1,180 @@
+package com.dingzhuo.energy.basic.data.energy.controller;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProjectAnnex;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyProjectAnnexService;
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.common.utils.file.FileUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊闄勪欢Controller
+ * 
+ * @author sys
+ * @date 2020-12-08
+ */
+@RestController
+@RequestMapping("/energy/energyAnnex")
+public class EnergyProjectAnnexController extends BaseController
+{
+    @Autowired
+    private IEnergyProjectAnnexService energyProjectAnnexService;
+    @Autowired
+    private TokenService tokenService;
+    private static final Logger log = LoggerFactory.getLogger(EnergyProjectAnnexController.class);
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(EnergyProjectAnnex energyProjectAnnex)
+    {
+        startPage();
+        List<EnergyProjectAnnex> list = energyProjectAnnexService.selectEnergyProjectAnnexList(energyProjectAnnex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:export')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊闄勪欢", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(EnergyProjectAnnex energyProjectAnnex)
+    {
+        List<EnergyProjectAnnex> list = energyProjectAnnexService.selectEnergyProjectAnnexList(energyProjectAnnex);
+        ExcelUtil<EnergyProjectAnnex> util = new ExcelUtil<EnergyProjectAnnex>(EnergyProjectAnnex.class);
+        return util.exportExcel(list, "energyAnnex");
+    }
+
+    /**
+     * 鑾峰彇鑺傝兘椤圭洰绠$悊闄勪欢璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(energyProjectAnnexService.selectEnergyProjectAnnexById(id));
+    }
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:add')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊闄勪欢", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody EnergyProjectAnnex energyProjectAnnex)
+    {
+        return toAjax(energyProjectAnnexService.insertEnergyProjectAnnex(energyProjectAnnex));
+    }
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:edit')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊闄勪欢", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody EnergyProjectAnnex energyProjectAnnex)
+    {
+        return toAjax(energyProjectAnnexService.updateEnergyProjectAnnex(energyProjectAnnex));
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:remove')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊闄勪欢", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(energyProjectAnnexService.deleteEnergyProjectAnnexByIds(ids));
+    }
+    /**
+     * 鑺傝兘璁″垝闄勪欢涓婁紶
+     */
+    @Log(title = "鑺傝兘璁″垝闄勪欢涓婁紶", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:fileImport')")
+    @PostMapping("/fileImport")
+    public AjaxResult importData(MultipartFile file, String projectId) throws Exception
+    {
+        if (!file.isEmpty())
+        {
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            //鑾峰彇閰嶇疆鐨勬枃浠朵笂浼犺矾寰�
+            String uploadPathDir = RuoYiConfig.getUploadPath();
+            //鑾峰彇鏂囦欢鍘熷鍚嶇О
+            String fileName = file.getOriginalFilename();
+            //鑾峰彇鏂囦欢鎵╁睍鍚�
+            String fileSuffix = FileUploadUtils.getExtension(file);
+//            System.out.println("implementId==="+implementId);
+//            System.out.println("filedir==="+uploadPathDir);
+//            System.out.println("fileName==="+fileName);
+//            System.out.println("fileSuffix==="+fileSuffix);
+            //鏂囦欢鏈�缁堜繚瀛樼殑缁濆璺緞
+            String filePath = FileUploadUtils.uploadAll(uploadPathDir, file);
+//            System.out.println("涓婁紶鏂囦欢鍦板潃:===>"+filePath);
+            EnergyProjectAnnex energyProjectAnnex=new EnergyProjectAnnex();
+            //璁剧疆涓婚敭UUID
+            energyProjectAnnex.setId(IdUtils.simpleUUID());
+            energyProjectAnnex.setFileName(fileName);
+            energyProjectAnnex.setFilePath(filePath);
+            energyProjectAnnex.setFileSuffix(fileSuffix);
+            energyProjectAnnex.setProjectId(projectId);
+            energyProjectAnnex.setCreateBy(loginUser.getUsername());
+            if (this.energyProjectAnnexService.insertEnergyProjectAnnex(energyProjectAnnex)>0)
+            {
+                return AjaxResult.success("闄勪欢涓婁紶瀹屾垚");
+            }
+        }
+        return AjaxResult.success("闄勪欢涓婁紶澶辫触");
+    }
+    /**
+     * 閫氱敤鎸囧畾鏂囦欢涓嬭浇璇锋眰
+     *
+     * @param showFileName 涓嬭浇灞曠ず鏂囦欢鍚嶇О
+    //     * @param filePath 涓嬭浇鏂囦欢缁濆璺緞 甯� 鏂囦欢鐪熷疄鍚嶅瓧鍙婅矾寰�
+     * @param delete 鏄惁鍒犻櫎/
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyAnnex:assignDownload')")
+    @PostMapping("/assignDownload")
+    public void fileAssignDownload(String showFileName, String filePath, Boolean delete, HttpServletResponse response, HttpServletRequest request)
+    {
+
+        try
+        {
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition",
+                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, showFileName));
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+//            if (delete)
+//            {
+//                FileUtils.deleteFile(filePath);
+//            }
+            log.error("涓嬭浇鎴愬姛", "aa");
+        }
+        catch (Exception e)
+        {
+            log.error("涓嬭浇鏂囦欢澶辫触", e);
+        }
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectController.java
new file mode 100644
index 0000000..0f18b32
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyProjectController.java
@@ -0,0 +1,110 @@
+package com.dingzhuo.energy.basic.data.energy.controller;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProject;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyProjectService;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊Controller
+ *
+ * @author sys
+ * @date 2020-12-07
+ */
+@RestController
+@RequestMapping("/energy/energyProject")
+@Api(value = "鑺傝兘椤圭洰绠$悊",tags = {"鑺傝兘椤圭洰绠$悊"})
+public class EnergyProjectController extends BaseController
+{
+    @Autowired
+    private IEnergyProjectService energyProjectService;
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyProject:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "鑺傝兘椤圭洰鍒楄〃")
+    public TableDataInfo list(EnergyProject energyProject)
+    {
+        startPage();
+        List<EnergyProject> list = energyProjectService.selectEnergyProjectList(energyProject);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鑺傝兘椤圭洰绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyProject:export')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation(value = "鑺傝兘椤圭洰瀵煎嚭")
+    public AjaxResult export(EnergyProject energyProject)
+    {
+        List<EnergyProject> list = energyProjectService.selectEnergyProjectList(energyProject);
+        ExcelUtil<EnergyProject> util = new ExcelUtil<EnergyProject>(EnergyProject.class);
+        return util.exportExcel(list, "energyProject");
+    }
+
+    /**
+     * 鑾峰彇鑺傝兘椤圭洰绠$悊璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyProject:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "鏍规嵁id鑾峰彇鑺傝兘椤圭洰璇︽儏")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(energyProjectService.selectEnergyProjectById(id));
+    }
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyProject:add')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "鏂板鑺傝兘椤圭洰")
+    public AjaxResult add(@RequestBody EnergyProject energyProject)
+    {
+        energyProject.setId(UUID.randomUUID().toString());
+        energyProject.setCreateOperator(SecurityUtils.getUsername());
+        return toAjax(energyProjectService.insertEnergyProject(energyProject));
+    }
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyProject:edit')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "缂栬緫鑺傝兘椤圭洰")
+    public AjaxResult edit(@RequestBody EnergyProject energyProject)
+    {
+        return toAjax(energyProjectService.updateEnergyProject(energyProject));
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('energy:energyProject:remove')")
+    @Log(title = "鑺傝兘椤圭洰绠$悊", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    @ApiOperation(value = "鍒犻櫎鑺傝兘椤圭洰")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(energyProjectService.deleteEnergyProjectByIds(ids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportAnnexController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportAnnexController.java
new file mode 100644
index 0000000..10d95ad
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportAnnexController.java
@@ -0,0 +1,148 @@
+package com.dingzhuo.energy.basic.data.energy.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProjectAnnex;
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReportAnnex;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyReportAnnexService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢Controller
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+@RestController
+@RequestMapping("/energy/reportAnnex")
+public class EnergyReportAnnexController extends BaseController
+{
+    @Autowired
+    private IEnergyReportAnnexService energyReportAnnexService;
+    @Autowired
+    private TokenService tokenService;
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:reportAnnex:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(EnergyReportAnnex energyReportAnnex)
+    {
+        startPage();
+        List<EnergyReportAnnex> list = energyReportAnnexService.selectEnergyReportAnnexList(energyReportAnnex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:reportAnnex:export')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(EnergyReportAnnex energyReportAnnex)
+    {
+        List<EnergyReportAnnex> list = energyReportAnnexService.selectEnergyReportAnnexList(energyReportAnnex);
+        ExcelUtil<EnergyReportAnnex> util = new ExcelUtil<EnergyReportAnnex>(EnergyReportAnnex.class);
+        return util.exportExcel(list, "reportAnnex");
+    }
+
+    /**
+     * 鑾峰彇鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('energy:reportAnnex:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(energyReportAnnexService.selectEnergyReportAnnexById(id));
+    }
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('energy:reportAnnex:add')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody EnergyReportAnnex energyReportAnnex)
+    {
+        return toAjax(energyReportAnnexService.insertEnergyReportAnnex(energyReportAnnex));
+    }
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('energy:reportAnnex:edit')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody EnergyReportAnnex energyReportAnnex)
+    {
+        return toAjax(energyReportAnnexService.updateEnergyReportAnnex(energyReportAnnex));
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('energy:reportAnnex:remove')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(energyReportAnnexService.deleteEnergyReportAnnexByIds(ids));
+    }
+
+    /**
+     * 鑺傝兘璁″垝闄勪欢涓婁紶
+     */
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢涓婁紶", businessType = BusinessType.IMPORT)
+    @PostMapping("/fileImport")
+    public AjaxResult importData(MultipartFile file, String reportId) throws Exception
+    {
+        if (!file.isEmpty())
+        {
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            //鑾峰彇閰嶇疆鐨勬枃浠朵笂浼犺矾寰�
+            String uploadPathDir = RuoYiConfig.getUploadPath();
+            //鑾峰彇鏂囦欢鍘熷鍚嶇О
+            String fileName = file.getOriginalFilename();
+            //鑾峰彇鏂囦欢鎵╁睍鍚�
+            String fileSuffix = FileUploadUtils.getExtension(file);
+            //鏂囦欢鏈�缁堜繚瀛樼殑缁濆璺緞
+            String filePath = FileUploadUtils.uploadAll(uploadPathDir, file);
+//            System.out.println("涓婁紶鏂囦欢鍦板潃:===>"+filePath);
+            EnergyReportAnnex energyReportAnnex=new EnergyReportAnnex();
+            //璁剧疆涓婚敭UUID
+            energyReportAnnex.setId(IdUtils.simpleUUID());
+            energyReportAnnex.setFileName(fileName);
+            energyReportAnnex.setFilePath(filePath);
+            energyReportAnnex.setFileSuffix(fileSuffix);
+            energyReportAnnex.setReportId(reportId);
+            energyReportAnnex.setCreateBy(loginUser.getUsername());
+            if (this.energyReportAnnexService.insertEnergyReportAnnex(energyReportAnnex)>0)
+            {
+                return AjaxResult.success("闄勪欢涓婁紶瀹屾垚");
+            }
+        }
+        return AjaxResult.success("闄勪欢涓婁紶澶辫触");
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportController.java
new file mode 100644
index 0000000..c640067
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/controller/EnergyReportController.java
@@ -0,0 +1,108 @@
+package com.dingzhuo.energy.basic.data.energy.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReport;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyReportService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊Controller
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+@RestController
+@RequestMapping("/energy/report")
+public class EnergyReportController extends BaseController
+{
+    @Autowired
+    private IEnergyReportService energyReportService;
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:report:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(EnergyReport energyReport)
+    {
+        startPage();
+        List<EnergyReport> list = energyReportService.selectEnergyReportList(energyReport);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鑺傝兘鍒嗘瀽鎶ュ憡绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energy:report:export')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(EnergyReport energyReport)
+    {
+        List<EnergyReport> list = energyReportService.selectEnergyReportList(energyReport);
+        ExcelUtil<EnergyReport> util = new ExcelUtil<EnergyReport>(EnergyReport.class);
+        return util.exportExcel(list, "report");
+    }
+
+    /**
+     * 鑾峰彇鑺傝兘鍒嗘瀽鎶ュ憡绠$悊璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('energy:report:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(energyReportService.selectEnergyReportById(id));
+    }
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('energy:report:add')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody EnergyReport energyReport)
+    {
+        energyReport.setId(UUID.randomUUID().toString());
+        energyReport.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(energyReportService.insertEnergyReport(energyReport));
+    }
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('energy:report:edit')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody EnergyReport energyReport)
+    {
+        return toAjax(energyReportService.updateEnergyReport(energyReport));
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('energy:report:remove')")
+    @Log(title = "鑺傝兘鍒嗘瀽鎶ュ憡绠$悊", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(energyReportService.deleteEnergyReportByIds(ids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProject.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProject.java
new file mode 100644
index 0000000..b6b2364
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProject.java
@@ -0,0 +1,179 @@
+package com.dingzhuo.energy.basic.data.energy.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊瀵硅薄 energy_project
+ *
+ * @author sys
+ * @date 2020-12-07
+ */
+@ApiModel(value = "鑺傝兘椤圭洰")
+public class EnergyProject extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    @ApiModelProperty(value = "id")
+    private String id;
+
+    /** 椤圭洰鍚嶇О */
+    @ApiModelProperty(value = "椤圭洰鍚嶇О")
+    @Excel(name = "椤圭洰鍚嶇О")
+    private String name;
+
+    /** 鑺傝兘璁″垝 */
+    @ApiModelProperty(value = "鑺傝兘璁″垝")
+    @Excel(name = "鑺傝兘璁″垝")
+    private String plan;
+
+    /** 鑺傝兘鐩爣 */
+    @ApiModelProperty(value = "鑺傝兘鐩爣")
+    @Excel(name = "鑺傝兘鐩爣")
+    private String target;
+
+    /** 寮�濮嬫椂闂� */
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @Excel(name = "寮�濮嬫椂闂�", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startTime;
+
+    /** 缁撴潫鏃堕棿 */
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @Excel(name = "缁撴潫鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date enddTime;
+
+    /** 璐熻矗浜� */
+    @ApiModelProperty(value = "璐熻矗浜�")
+    @Excel(name = "璐熻矗浜�")
+    private String people;
+
+    /** 鍒跺畾鏃舵 */
+    @ApiModelProperty(value = "鍒跺畾鏃舵")
+    @Excel(name = "鍒跺畾鏃舵", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date setTime;
+
+    /** 鍒涘缓浜� */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    @Excel(name = "鍒涘缓浜�")
+    private String createOperator;
+
+    /** 淇敼浜� */
+    @ApiModelProperty(value = "淇敼浜�")
+    @Excel(name = "淇敼浜�")
+    private String updateOperator;
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+    public void setPlan(String plan)
+    {
+        this.plan = plan;
+    }
+
+    public String getPlan()
+    {
+        return plan;
+    }
+    public void setTarget(String target)
+    {
+        this.target = target;
+    }
+
+    public String getTarget()
+    {
+        return target;
+    }
+    public void setStartTime(Date startTime)
+    {
+        this.startTime = startTime;
+    }
+
+    public Date getStartTime()
+    {
+        return startTime;
+    }
+    public void setEnddTime(Date enddTime)
+    {
+        this.enddTime = enddTime;
+    }
+
+    public Date getEnddTime()
+    {
+        return enddTime;
+    }
+    public void setPeople(String people)
+    {
+        this.people = people;
+    }
+
+    public String getPeople()
+    {
+        return people;
+    }
+    public void setSetTime(Date setTime)
+    {
+        this.setTime = setTime;
+    }
+
+    public Date getSetTime()
+    {
+        return setTime;
+    }
+    public void setCreateOperator(String createOperator)
+    {
+        this.createOperator = createOperator;
+    }
+
+    public String getCreateOperator()
+    {
+        return createOperator;
+    }
+    public void setUpdateOperator(String updateOperator)
+    {
+        this.updateOperator = updateOperator;
+    }
+
+    public String getUpdateOperator()
+    {
+        return updateOperator;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("plan", getPlan())
+            .append("target", getTarget())
+            .append("startTime", getStartTime())
+            .append("enddTime", getEnddTime())
+            .append("people", getPeople())
+            .append("setTime", getSetTime())
+            .append("createOperator", getCreateOperator())
+            .append("createTime", getCreateTime())
+            .append("updateOperator", getUpdateOperator())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProjectAnnex.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProjectAnnex.java
new file mode 100644
index 0000000..581df4d
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyProjectAnnex.java
@@ -0,0 +1,137 @@
+package com.dingzhuo.energy.basic.data.energy.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊闄勪欢瀵硅薄 energy_project_annex
+ * 
+ * @author sys
+ * @date 2020-12-08
+ */
+public class EnergyProjectAnnex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鍏宠仈鍏宠仈energy_project */
+    @Excel(name = "鍏宠仈energy_project")
+    private String projectId;
+
+    /** 鏂囦欢鍚� */
+    @Excel(name = "鏂囦欢鍚�")
+    private String fileName;
+
+    /** 鏂囦欢鍚庣紑 */
+    @Excel(name = "鏂囦欢鍚庣紑")
+    private String fileSuffix;
+
+    /** 鏂囦欢璺緞 */
+    @Excel(name = "鏂囦欢璺緞")
+    private String filePath;
+
+    /** 鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄� */
+    @Excel(name = "鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄�")
+    private String delFlage;
+
+    /** 寤虹珛浜� */
+    @Excel(name = "寤虹珛浜�")
+    private String createOperator;
+
+    /** 淇敼浜� */
+    @Excel(name = "淇敼浜�")
+    private String updateOperator;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setProjectId(String projectId) 
+    {
+        this.projectId = projectId;
+    }
+
+    public String getProjectId() 
+    {
+        return projectId;
+    }
+    public void setFileName(String fileName) 
+    {
+        this.fileName = fileName;
+    }
+
+    public String getFileName() 
+    {
+        return fileName;
+    }
+    public void setFileSuffix(String fileSuffix) 
+    {
+        this.fileSuffix = fileSuffix;
+    }
+
+    public String getFileSuffix() 
+    {
+        return fileSuffix;
+    }
+    public void setFilePath(String filePath) 
+    {
+        this.filePath = filePath;
+    }
+
+    public String getFilePath() 
+    {
+        return filePath;
+    }
+    public void setDelFlage(String delFlage) 
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage() 
+    {
+        return delFlage;
+    }
+    public void setCreateOperator(String createOperator) 
+    {
+        this.createOperator = createOperator;
+    }
+
+    public String getCreateOperator() 
+    {
+        return createOperator;
+    }
+    public void setUpdateOperator(String updateOperator) 
+    {
+        this.updateOperator = updateOperator;
+    }
+
+    public String getUpdateOperator() 
+    {
+        return updateOperator;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("projectId", getProjectId())
+            .append("fileName", getFileName())
+            .append("fileSuffix", getFileSuffix())
+            .append("filePath", getFilePath())
+            .append("delFlage", getDelFlage())
+            .append("createTime", getCreateTime())
+            .append("createOperator", getCreateOperator())
+            .append("updateTime", getUpdateTime())
+            .append("updateOperator", getUpdateOperator())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReport.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReport.java
new file mode 100644
index 0000000..650d1d0
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReport.java
@@ -0,0 +1,98 @@
+package com.dingzhuo.energy.basic.data.energy.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊瀵硅薄 energy_report
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+public class EnergyReport extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private String id;
+
+    /** 鎶ュ憡鍚嶇О */
+    @Excel(name = "鎶ュ憡鍚嶇О")
+    private String name;
+
+    /** 寮�濮嬫椂闂� */
+    @Excel(name = "寮�濮嬫椂闂�", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startTime;
+
+    /** 缁撴潫鏃堕棿 */
+    @Excel(name = "缁撴潫鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date enddTime;
+
+    /** 澶囨敞 */
+    @Excel(name = "澶囨敞")
+    private String bak;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setStartTime(Date startTime) 
+    {
+        this.startTime = startTime;
+    }
+
+    public Date getStartTime() 
+    {
+        return startTime;
+    }
+    public void setEnddTime(Date enddTime) 
+    {
+        this.enddTime = enddTime;
+    }
+
+    public Date getEnddTime() 
+    {
+        return enddTime;
+    }
+    public void setBak(String bak) 
+    {
+        this.bak = bak;
+    }
+
+    public String getBak() 
+    {
+        return bak;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("startTime", getStartTime())
+            .append("enddTime", getEnddTime())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("bak", getBak())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReportAnnex.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReportAnnex.java
new file mode 100644
index 0000000..9dd9564
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/domain/EnergyReportAnnex.java
@@ -0,0 +1,111 @@
+package com.dingzhuo.energy.basic.data.energy.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢瀵硅薄 energy_report_annex
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+public class EnergyReportAnnex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鍏宠仈energy_report.id */
+    @Excel(name = "鍏宠仈energy_report.id")
+    private String reportId;
+
+    /** 鏂囦欢鍚� */
+    @Excel(name = "鏂囦欢鍚�")
+    private String fileName;
+
+    /** 鏂囦欢鍚庣紑 */
+    @Excel(name = "鏂囦欢鍚庣紑")
+    private String fileSuffix;
+
+    /** 鏂囦欢璺緞 */
+    @Excel(name = "鏂囦欢璺緞")
+    private String filePath;
+
+    /** 鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄� */
+    @Excel(name = "鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄�")
+    private String delFlage;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setReportId(String reportId) 
+    {
+        this.reportId = reportId;
+    }
+
+    public String getReportId() 
+    {
+        return reportId;
+    }
+    public void setFileName(String fileName) 
+    {
+        this.fileName = fileName;
+    }
+
+    public String getFileName() 
+    {
+        return fileName;
+    }
+    public void setFileSuffix(String fileSuffix) 
+    {
+        this.fileSuffix = fileSuffix;
+    }
+
+    public String getFileSuffix() 
+    {
+        return fileSuffix;
+    }
+    public void setFilePath(String filePath) 
+    {
+        this.filePath = filePath;
+    }
+
+    public String getFilePath() 
+    {
+        return filePath;
+    }
+    public void setDelFlage(String delFlage) 
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage() 
+    {
+        return delFlage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("reportId", getReportId())
+            .append("fileName", getFileName())
+            .append("fileSuffix", getFileSuffix())
+            .append("filePath", getFilePath())
+            .append("delFlage", getDelFlage())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectAnnexMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectAnnexMapper.java
new file mode 100644
index 0000000..93b9013
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectAnnexMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.mapper;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProjectAnnex;
+import java.util.List;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊闄勪欢Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-08
+ */
+public interface EnergyProjectAnnexMapper 
+{
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 鑺傝兘椤圭洰绠$悊闄勪欢
+     */
+    public EnergyProjectAnnex selectEnergyProjectAnnexById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 鑺傝兘椤圭洰绠$悊闄勪欢闆嗗悎
+     */
+    public List<EnergyProjectAnnex> selectEnergyProjectAnnexList(EnergyProjectAnnex energyProjectAnnex);
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertEnergyProjectAnnex(EnergyProjectAnnex energyProjectAnnex);
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateEnergyProjectAnnex(EnergyProjectAnnex energyProjectAnnex);
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectAnnexById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectAnnexByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectMapper.java
new file mode 100644
index 0000000..99a1b55
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyProjectMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.mapper;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProject;
+import java.util.List;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-07
+ */
+public interface EnergyProjectMapper 
+{
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊ID
+     * @return 鑺傝兘椤圭洰绠$悊
+     */
+    public EnergyProject selectEnergyProjectById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊鍒楄〃
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 鑺傝兘椤圭洰绠$悊闆嗗悎
+     */
+    public List<EnergyProject> selectEnergyProjectList(EnergyProject energyProject);
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 缁撴灉
+     */
+    public int insertEnergyProject(EnergyProject energyProject);
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 缁撴灉
+     */
+    public int updateEnergyProject(EnergyProject energyProject);
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘椤圭洰绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportAnnexMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportAnnexMapper.java
new file mode 100644
index 0000000..e989c24
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportAnnexMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.mapper;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReportAnnex;
+import java.util.List;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢Mapper鎺ュ彛selectEnergyReportAnnexList
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+public interface EnergyReportAnnexMapper 
+{
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     */
+    public EnergyReportAnnex selectEnergyReportAnnexById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢鍒楄〃
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢闆嗗悎
+     */
+    public List<EnergyReportAnnex> selectEnergyReportAnnexList(EnergyReportAnnex energyReportAnnex);
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertEnergyReportAnnex(EnergyReportAnnex energyReportAnnex);
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateEnergyReportAnnex(EnergyReportAnnex energyReportAnnex);
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportAnnexById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportAnnexByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportMapper.java
new file mode 100644
index 0000000..f4fd823
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/mapper/EnergyReportMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.mapper;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReport;
+import java.util.List;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊Mapper鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+public interface EnergyReportMapper 
+{
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     */
+    public EnergyReport selectEnergyReportById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊鍒楄〃
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闆嗗悎
+     */
+    public List<EnergyReport> selectEnergyReportList(EnergyReport energyReport);
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 缁撴灉
+     */
+    public int insertEnergyReport(EnergyReport energyReport);
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 缁撴灉
+     */
+    public int updateEnergyReport(EnergyReport energyReport);
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectAnnexService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectAnnexService.java
new file mode 100644
index 0000000..cff6259
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectAnnexService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.service;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProjectAnnex;
+import java.util.List;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊闄勪欢Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-08
+ */
+public interface IEnergyProjectAnnexService 
+{
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 鑺傝兘椤圭洰绠$悊闄勪欢
+     */
+    public EnergyProjectAnnex selectEnergyProjectAnnexById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 鑺傝兘椤圭洰绠$悊闄勪欢闆嗗悎
+     */
+    public List<EnergyProjectAnnex> selectEnergyProjectAnnexList(EnergyProjectAnnex energyProjectAnnex);
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertEnergyProjectAnnex(EnergyProjectAnnex energyProjectAnnex);
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateEnergyProjectAnnex(EnergyProjectAnnex energyProjectAnnex);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectAnnexByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢淇℃伅
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectAnnexById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectService.java
new file mode 100644
index 0000000..fece34d
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyProjectService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.service;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProject;
+import java.util.List;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-07
+ */
+public interface IEnergyProjectService 
+{
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊ID
+     * @return 鑺傝兘椤圭洰绠$悊
+     */
+    public EnergyProject selectEnergyProjectById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊鍒楄〃
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 鑺傝兘椤圭洰绠$悊闆嗗悎
+     */
+    public List<EnergyProject> selectEnergyProjectList(EnergyProject energyProject);
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 缁撴灉
+     */
+    public int insertEnergyProject(EnergyProject energyProject);
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 缁撴灉
+     */
+    public int updateEnergyProject(EnergyProject energyProject);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘椤圭洰绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘椤圭洰绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊淇℃伅
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyProjectById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportAnnexService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportAnnexService.java
new file mode 100644
index 0000000..8c5160c
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportAnnexService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.service;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReportAnnex;
+import java.util.List;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢Service鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+public interface IEnergyReportAnnexService 
+{
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     */
+    public EnergyReportAnnex selectEnergyReportAnnexById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢鍒楄〃
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢闆嗗悎
+     */
+    public List<EnergyReportAnnex> selectEnergyReportAnnexList(EnergyReportAnnex energyReportAnnex);
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertEnergyReportAnnex(EnergyReportAnnex energyReportAnnex);
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateEnergyReportAnnex(EnergyReportAnnex energyReportAnnex);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportAnnexByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢淇℃伅
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportAnnexById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportService.java
new file mode 100644
index 0000000..3b250c6
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/IEnergyReportService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.energy.service;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReport;
+import java.util.List;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊Service鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+public interface IEnergyReportService 
+{
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     */
+    public EnergyReport selectEnergyReportById(String id);
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊鍒楄〃
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闆嗗悎
+     */
+    public List<EnergyReport> selectEnergyReportList(EnergyReport energyReport);
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 缁撴灉
+     */
+    public int insertEnergyReport(EnergyReport energyReport);
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 缁撴灉
+     */
+    public int updateEnergyReport(EnergyReport energyReport);
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊淇℃伅
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyReportById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectAnnexServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectAnnexServiceImpl.java
new file mode 100644
index 0000000..d5ae467
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectAnnexServiceImpl.java
@@ -0,0 +1,97 @@
+package com.dingzhuo.energy.basic.data.energy.service.impl;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProjectAnnex;
+import com.dingzhuo.energy.basic.data.energy.mapper.EnergyProjectAnnexMapper;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyProjectAnnexService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊闄勪欢Service涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-12-08
+ */
+@Service
+public class EnergyProjectAnnexServiceImpl implements IEnergyProjectAnnexService 
+{
+    @Autowired
+    private EnergyProjectAnnexMapper energyProjectAnnexMapper;
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 鑺傝兘椤圭洰绠$悊闄勪欢
+     */
+    @Override
+    public EnergyProjectAnnex selectEnergyProjectAnnexById(String id)
+    {
+        return energyProjectAnnexMapper.selectEnergyProjectAnnexById(id);
+    }
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 鑺傝兘椤圭洰绠$悊闄勪欢
+     */
+    @Override
+    public List<EnergyProjectAnnex> selectEnergyProjectAnnexList(EnergyProjectAnnex energyProjectAnnex)
+    {
+        return energyProjectAnnexMapper.selectEnergyProjectAnnexList(energyProjectAnnex);
+    }
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEnergyProjectAnnex(EnergyProjectAnnex energyProjectAnnex)
+    {
+        energyProjectAnnex.setCreateTime(DateUtils.getNowDate());
+        return energyProjectAnnexMapper.insertEnergyProjectAnnex(energyProjectAnnex);
+    }
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param energyProjectAnnex 鑺傝兘椤圭洰绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEnergyProjectAnnex(EnergyProjectAnnex energyProjectAnnex)
+    {
+        energyProjectAnnex.setUpdateTime(DateUtils.getNowDate());
+        return energyProjectAnnexMapper.updateEnergyProjectAnnex(energyProjectAnnex);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyProjectAnnexByIds(String[] ids)
+    {
+        return energyProjectAnnexMapper.deleteEnergyProjectAnnexByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢淇℃伅
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyProjectAnnexById(String id)
+    {
+        return energyProjectAnnexMapper.deleteEnergyProjectAnnexById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectServiceImpl.java
new file mode 100644
index 0000000..a2e0f25
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyProjectServiceImpl.java
@@ -0,0 +1,99 @@
+package com.dingzhuo.energy.basic.data.energy.service.impl;
+
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyProject;
+import com.dingzhuo.energy.basic.data.energy.mapper.EnergyProjectMapper;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyProjectService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 鑺傝兘椤圭洰绠$悊Service涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-12-07
+ */
+@Service
+public class EnergyProjectServiceImpl implements IEnergyProjectService 
+{
+    @Autowired
+    private EnergyProjectMapper energyProjectMapper;
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊ID
+     * @return 鑺傝兘椤圭洰绠$悊
+     */
+    @Override
+    public EnergyProject selectEnergyProjectById(String id)
+    {
+        return energyProjectMapper.selectEnergyProjectById(id);
+    }
+
+    /**
+     * 鏌ヨ鑺傝兘椤圭洰绠$悊鍒楄〃
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 鑺傝兘椤圭洰绠$悊
+     */
+    @Override
+    public List<EnergyProject> selectEnergyProjectList(EnergyProject energyProject)
+    {
+        return energyProjectMapper.selectEnergyProjectList(energyProject);
+    }
+
+    /**
+     * 鏂板鑺傝兘椤圭洰绠$悊
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEnergyProject(EnergyProject energyProject)
+    {
+        energyProject.setCreateTime(DateUtils.getNowDate());
+        return energyProjectMapper.insertEnergyProject(energyProject);
+    }
+
+    /**
+     * 淇敼鑺傝兘椤圭洰绠$悊
+     * 
+     * @param energyProject 鑺傝兘椤圭洰绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEnergyProject(EnergyProject energyProject)
+    {
+        energyProject.setUpdateTime(DateUtils.getNowDate());
+        energyProject.setUpdateOperator(SecurityUtils.getUsername());
+        return energyProjectMapper.updateEnergyProject(energyProject);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘椤圭洰绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘椤圭洰绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyProjectByIds(String[] ids)
+    {
+        return energyProjectMapper.deleteEnergyProjectByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘椤圭洰绠$悊淇℃伅
+     * 
+     * @param id 鑺傝兘椤圭洰绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyProjectById(String id)
+    {
+        return energyProjectMapper.deleteEnergyProjectById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportAnnexServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportAnnexServiceImpl.java
new file mode 100644
index 0000000..44c3e54
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportAnnexServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.basic.data.energy.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.energy.mapper.EnergyReportAnnexMapper;
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReportAnnex;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyReportAnnexService;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢Service涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+@Service
+public class EnergyReportAnnexServiceImpl implements IEnergyReportAnnexService 
+{
+    @Autowired
+    private EnergyReportAnnexMapper energyReportAnnexMapper;
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     */
+    @Override
+    public EnergyReportAnnex selectEnergyReportAnnexById(String id)
+    {
+        return energyReportAnnexMapper.selectEnergyReportAnnexById(id);
+    }
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢鍒楄〃
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     */
+    @Override
+    public List<EnergyReportAnnex> selectEnergyReportAnnexList(EnergyReportAnnex energyReportAnnex)
+    {
+        return energyReportAnnexMapper.selectEnergyReportAnnexList(energyReportAnnex);
+    }
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEnergyReportAnnex(EnergyReportAnnex energyReportAnnex)
+    {
+        energyReportAnnex.setCreateTime(DateUtils.getNowDate());
+        return energyReportAnnexMapper.insertEnergyReportAnnex(energyReportAnnex);
+    }
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param energyReportAnnex 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEnergyReportAnnex(EnergyReportAnnex energyReportAnnex)
+    {
+        energyReportAnnex.setUpdateTime(DateUtils.getNowDate());
+        return energyReportAnnexMapper.updateEnergyReportAnnex(energyReportAnnex);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyReportAnnexByIds(String[] ids)
+    {
+        return energyReportAnnexMapper.deleteEnergyReportAnnexByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢淇℃伅
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyReportAnnexById(String id)
+    {
+        return energyReportAnnexMapper.deleteEnergyReportAnnexById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportServiceImpl.java
new file mode 100644
index 0000000..691d0a6
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energy/service/impl/EnergyReportServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.basic.data.energy.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.energy.mapper.EnergyReportMapper;
+import com.dingzhuo.energy.basic.data.energy.domain.EnergyReport;
+import com.dingzhuo.energy.basic.data.energy.service.IEnergyReportService;
+
+/**
+ * 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊Service涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-12-21
+ */
+@Service
+public class EnergyReportServiceImpl implements IEnergyReportService 
+{
+    @Autowired
+    private EnergyReportMapper energyReportMapper;
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     */
+    @Override
+    public EnergyReport selectEnergyReportById(String id)
+    {
+        return energyReportMapper.selectEnergyReportById(id);
+    }
+
+    /**
+     * 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊鍒楄〃
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     */
+    @Override
+    public List<EnergyReport> selectEnergyReportList(EnergyReport energyReport)
+    {
+        return energyReportMapper.selectEnergyReportList(energyReport);
+    }
+
+    /**
+     * 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEnergyReport(EnergyReport energyReport)
+    {
+        energyReport.setCreateTime(DateUtils.getNowDate());
+        return energyReportMapper.insertEnergyReport(energyReport);
+    }
+
+    /**
+     * 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param energyReport 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEnergyReport(EnergyReport energyReport)
+    {
+        energyReport.setUpdateTime(DateUtils.getNowDate());
+        return energyReportMapper.updateEnergyReport(energyReport);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyReportByIds(String[] ids)
+    {
+        return energyReportMapper.deleteEnergyReportByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊淇℃伅
+     * 
+     * @param id 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyReportById(String id)
+    {
+        return energyReportMapper.deleteEnergyReportById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/controller/AssessmentIndexController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/controller/AssessmentIndexController.java
new file mode 100644
index 0000000..d1b5c44
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/controller/AssessmentIndexController.java
@@ -0,0 +1,142 @@
+package com.dingzhuo.energy.basic.data.energyExamine.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.energyExamine.domain.AssessmentIndex;
+import com.dingzhuo.energy.basic.data.energyExamine.service.IAssessmentIndexService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 鐢ㄨ兘鑰冩牳鏍囧噯Controller
+ * 
+ * @author zhaow
+ * @date 2020-12-22
+ */
+@RestController
+@RequestMapping("/energyExamine/assessmentIndex")
+public class AssessmentIndexController extends BaseController
+{
+    @Autowired
+    private IAssessmentIndexService assessmentIndexService;
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energyExamine:assessmentIndex:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(AssessmentIndex assessmentIndex)
+    {
+        startPage();
+        List<AssessmentIndex> list = assessmentIndexService.selectAssessmentIndexList(assessmentIndex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃鏍规嵁妯″瀷ID
+     */
+    @PreAuthorize("@ss.hasPermi('energyExamine:assessmentIndex:listindex')")
+    @GetMapping("/list/{modeNodeId}")
+    public TableDataInfo listindex(@PathVariable String modeNodeId,AssessmentIndex assessmentIndex)
+    {
+        assessmentIndex.setModeNodeId(modeNodeId);
+        startPage();
+        List<AssessmentIndex> list = assessmentIndexService.selectAssessmentIndexListByMode(assessmentIndex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energyExamine:assessmentIndex:export')")
+    @Log(title = "鐢ㄨ兘鑰冩牳鏍囧噯", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(AssessmentIndex assessmentIndex)
+    {
+        List<AssessmentIndex> list = assessmentIndexService.selectAssessmentIndexList(assessmentIndex);
+        ExcelUtil<AssessmentIndex> util = new ExcelUtil<AssessmentIndex>(AssessmentIndex.class);
+        return util.exportExcel(list, "assessmentIndex");
+    }
+
+    /**
+     * 鑾峰彇鐢ㄨ兘鑰冩牳鏍囧噯璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('energyExamine:assessmentIndex:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(assessmentIndexService.selectAssessmentIndexById(id));
+    }
+
+    /**
+     * 鏂板鐢ㄨ兘鑰冩牳鏍囧噯
+     */
+    @PreAuthorize("@ss.hasPermi('energyExamine:assessmentIndex:add')")
+    @Log(title = "鐢ㄨ兘鑰冩牳鏍囧噯", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody AssessmentIndex assessmentIndex)
+    {
+        return toAjax(assessmentIndexService.insertAssessmentIndex(assessmentIndex));
+    }
+
+    /**
+     * 淇敼鐢ㄨ兘鑰冩牳鏍囧噯
+     */
+    @PreAuthorize("@ss.hasPermi('energyExamine:assessmentIndex:edit')")
+    @Log(title = "鐢ㄨ兘鑰冩牳鏍囧噯", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody AssessmentIndex assessmentIndex)
+    {
+        return toAjax(assessmentIndexService.updateAssessmentIndex(assessmentIndex));
+    }
+
+    /**
+     * 鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯
+     */
+    @PreAuthorize("@ss.hasPermi('energyExamine:assessmentIndex:remove')")
+    @Log(title = "鐢ㄨ兘鑰冩牳鏍囧噯", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(assessmentIndexService.deleteAssessmentIndexByIds(ids));
+    }
+
+    /**
+     * 娣诲姞妯″瀷鑰冩牳鑺傜偣鐨勬寚鏍�
+     */
+    @Log(title = "娣诲姞妯″瀷鑰冩牳鑺傜偣鐨勬寚鏍�", businessType = BusinessType.INSERT)
+    @PostMapping(value = "/addIndex/{modeNodeId}")
+    public AjaxResult edit(@PathVariable String modeNodeId, @RequestBody String[] ids) {
+        List<AssessmentIndex> assessmentIndexList = new ArrayList<AssessmentIndex>();
+        if(ids!=null && modeNodeId!=null && modeNodeId.trim().length()>0)
+        {
+            for(String indexId:ids)
+            {
+                AssessmentIndex assessMentIdex = new AssessmentIndex();
+                assessMentIdex.setId(UUID.randomUUID().toString());
+                assessMentIdex.setIndexId(indexId);
+                assessMentIdex.setModeNodeId(modeNodeId);
+                assessmentIndexList.add(assessMentIdex);
+            }
+        }
+        AjaxResult ajax = toAjax(assessmentIndexService.batchAssessIndex(assessmentIndexList));
+        return ajax;
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/domain/AssessmentIndex.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/domain/AssessmentIndex.java
new file mode 100644
index 0000000..76fb96f
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/domain/AssessmentIndex.java
@@ -0,0 +1,210 @@
+package com.dingzhuo.energy.basic.data.energyExamine.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鐢ㄨ兘鑰冩牳鏍囧噯瀵硅薄 assessmentIndex
+ * 
+ * @author zhaow
+ * @date 2020-12-22
+ */
+public class AssessmentIndex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    private String id;
+
+    /** 妯″瀷鑺傜偣id */
+    private String modeNodeId;
+
+    /** 鎸囨爣id */
+    private String indexId;
+
+    /** 鏄惁鑳借�楄鍒� Y  N */
+    private boolean plan;
+
+    /** 鏄惁瀵规爣 Y  N */
+    private boolean benchmarking;
+
+    /** 鏍囨潌鑼冨洿瀛楀吀椤� */
+    private String benchRange;
+
+    /** 鏍囨潌绫诲瀷瀛楀吀椤� */
+    private String benchType;
+
+    /** 鏄惁鑳芥簮鍙屾帶 Y N */
+    private boolean dualControl;
+
+    /** 鏄惁鑷畾涔夋爣鍑� Y  N */
+    private boolean customStandard;
+
+    /** 鎸囧畾鑷畾涔夋爣鍑嗘暟鍊� */
+    private Double customVal;
+
+    /**妯″瀷鍚嶇О**/
+    private String modename;
+
+    /**鎸囨爣鍚嶇О**/
+    private String indexname;
+
+    /**璁¢噺鍗曚綅**/
+    private String jldw;
+    /**浣跨敤鐘舵�� Y浣跨敤  N鍋滅敤**/
+    private String state;
+    //鏌ヨ鏈骇銆佸叏閮ㄧ殑鏍囧織
+    private String eierarchyFlag;
+
+    public String getEierarchyFlag(){
+        return  this.eierarchyFlag;
+    }
+    public void setEierarchyFlag(String eierarchyFlag)
+    {
+        this.eierarchyFlag =eierarchyFlag;
+    }
+
+    public String getModename() {
+        return modename;
+    }
+
+    public void setModename(String modename) {
+        this.modename = modename;
+    }
+
+    public String getIndexname() {
+        return indexname;
+    }
+
+    public void setIndexname(String indexname) {
+        this.indexname = indexname;
+    }
+
+    public String getJldw() {
+        return jldw;
+    }
+
+    public void setJldw(String jldw) {
+        this.jldw = jldw;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public AssessmentIndex() {
+    }
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setModeNodeId(String modeNodeId) 
+    {
+        this.modeNodeId = modeNodeId;
+    }
+
+    public String getModeNodeId() 
+    {
+        return modeNodeId;
+    }
+    public void setIndexId(String indexId) 
+    {
+        this.indexId = indexId;
+    }
+
+    public String getIndexId() 
+    {
+        return indexId;
+    }
+    public void setPlan(boolean plan)
+    {
+        this.plan = plan;
+    }
+
+    public boolean getPlan()
+    {
+        return plan;
+    }
+    public void setBenchmarking(boolean benchmarking)
+    {
+        this.benchmarking = benchmarking;
+    }
+
+    public boolean getBenchmarking()
+    {
+        return benchmarking;
+    }
+    public void setBenchRange(String benchRange)
+    {
+        this.benchRange = benchRange;
+    }
+
+    public String getBenchRange()
+    {
+        return benchRange;
+    }
+    public void setBenchType(String benchType)
+    {
+        this.benchType = benchType;
+    }
+
+    public String getBenchType()
+    {
+        return benchType;
+    }
+    public void setDualControl(boolean dualControl)
+    {
+        this.dualControl = dualControl;
+    }
+
+    public boolean getDualControl()
+    {
+        return dualControl;
+    }
+    public void setCustomStandard(boolean customStandard)
+    {
+        this.customStandard = customStandard;
+    }
+
+    public boolean getCustomStandard()
+    {
+        return customStandard;
+    }
+    public void setCustomVal(Double customVal)
+    {
+        this.customVal = customVal;
+    }
+
+    public Double getCustomVal()
+    {
+        return customVal;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("modeNodeId", getModeNodeId())
+            .append("indexId", getIndexId())
+            .append("plan", getPlan())
+            .append("benchmarking", getBenchmarking())
+            .append("benchRange", getBenchRange())
+            .append("benchType", getBenchType())
+            .append("dualControl", getDualControl())
+            .append("customStandard", getCustomStandard())
+            .append("customVal", getCustomVal())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/mapper/AssessmentIndexMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/mapper/AssessmentIndexMapper.java
new file mode 100644
index 0000000..d89c46f
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/mapper/AssessmentIndexMapper.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.basic.data.energyExamine.mapper;
+
+import com.dingzhuo.energy.basic.data.energyExamine.domain.AssessmentIndex;
+import java.util.List;
+
+/**
+ * 鐢ㄨ兘鑰冩牳鏍囧噯Mapper鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-22
+ */
+public interface AssessmentIndexMapper 
+{
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param id 鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯
+     */
+    public AssessmentIndex selectAssessmentIndexById(String id);
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯闆嗗悎
+     */
+    public List<AssessmentIndex> selectAssessmentIndexList(AssessmentIndex assessmentIndex);
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃鏍规嵁妯″瀷ID
+     *
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯闆嗗悎
+     */
+    public List<AssessmentIndex> selectAssessmentIndexListByMode(AssessmentIndex assessmentIndex);
+
+    /**
+     * 鏂板鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 缁撴灉
+     */
+    public int insertAssessmentIndex(AssessmentIndex assessmentIndex);
+
+    /**
+     * 淇敼鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 缁撴灉
+     */
+    public int updateAssessmentIndex(AssessmentIndex assessmentIndex);
+
+    /**
+     * 鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param id 鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 缁撴灉
+     */
+    public int deleteAssessmentIndexById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteAssessmentIndexByIds(String[] ids);
+
+    /**
+     * 鎵归噺鏂板妯″瀷鑰冩牳鎸囨爣
+     *
+     * @param assessmentIndexList 鑰冩牳鎸囨爣鍒楄〃
+     * @return 缁撴灉
+     */
+    int batchAssessIndex(List<AssessmentIndex> assessmentIndexList);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/IAssessmentIndexService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/IAssessmentIndexService.java
new file mode 100644
index 0000000..c033cf7
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/IAssessmentIndexService.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.basic.data.energyExamine.service;
+
+import com.dingzhuo.energy.basic.data.energyExamine.domain.AssessmentIndex;
+import java.util.List;
+
+/**
+ * 鐢ㄨ兘鑰冩牳鏍囧噯Service鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-22
+ */
+public interface IAssessmentIndexService 
+{
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param id 鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯
+     */
+    public AssessmentIndex selectAssessmentIndexById(String id);
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯闆嗗悎
+     */
+    public List<AssessmentIndex> selectAssessmentIndexList(AssessmentIndex assessmentIndex);
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃鏍规嵁妯″瀷ID
+     *
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯闆嗗悎
+     */
+    public List<AssessmentIndex> selectAssessmentIndexListByMode(AssessmentIndex assessmentIndex);
+
+    /**
+     * 鏂板鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 缁撴灉
+     */
+    public int insertAssessmentIndex(AssessmentIndex assessmentIndex);
+
+    /**
+     * 淇敼鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 缁撴灉
+     */
+    public int updateAssessmentIndex(AssessmentIndex assessmentIndex);
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 缁撴灉
+     */
+    public int deleteAssessmentIndexByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯淇℃伅
+     * 
+     * @param id 鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 缁撴灉
+     */
+    public int deleteAssessmentIndexById(String id);
+
+    /**
+     * 鎵归噺鏂板妯″瀷鑰冩牳鎸囨爣
+     *
+     * @param assessmentIndexList 鑰冩牳鎸囨爣鍒楄〃
+     * @return 缁撴灉
+     */
+    public int batchAssessIndex(List<AssessmentIndex> assessmentIndexList);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/impl/AssessmentIndexServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/impl/AssessmentIndexServiceImpl.java
new file mode 100644
index 0000000..141259a
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/energyExamine/service/impl/AssessmentIndexServiceImpl.java
@@ -0,0 +1,115 @@
+package com.dingzhuo.energy.basic.data.energyExamine.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.energyExamine.mapper.AssessmentIndexMapper;
+import com.dingzhuo.energy.basic.data.energyExamine.domain.AssessmentIndex;
+import com.dingzhuo.energy.basic.data.energyExamine.service.IAssessmentIndexService;
+
+/**
+ * 鐢ㄨ兘鑰冩牳鏍囧噯Service涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-12-22
+ */
+@Service
+public class AssessmentIndexServiceImpl implements IAssessmentIndexService 
+{
+    @Autowired
+    private AssessmentIndexMapper assessmentIndexMapper;
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param id 鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯
+     */
+    @Override
+    public AssessmentIndex selectAssessmentIndexById(String id)
+    {
+        return assessmentIndexMapper.selectAssessmentIndexById(id);
+    }
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯
+     */
+    @Override
+    public List<AssessmentIndex> selectAssessmentIndexList(AssessmentIndex assessmentIndex)
+    {
+        return assessmentIndexMapper.selectAssessmentIndexList(assessmentIndex);
+    }
+
+    /**
+     * 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃鏍规嵁妯″瀷ID
+     *
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 鐢ㄨ兘鑰冩牳鏍囧噯闆嗗悎
+     */
+    public List<AssessmentIndex> selectAssessmentIndexListByMode(AssessmentIndex assessmentIndex)
+    {
+        return assessmentIndexMapper.selectAssessmentIndexListByMode(assessmentIndex);
+    }
+
+    /**
+     * 鏂板鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertAssessmentIndex(AssessmentIndex assessmentIndex)
+    {
+        return assessmentIndexMapper.insertAssessmentIndex(assessmentIndex);
+    }
+
+    /**
+     * 淇敼鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param assessmentIndex 鐢ㄨ兘鑰冩牳鏍囧噯
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateAssessmentIndex(AssessmentIndex assessmentIndex)
+    {
+        return assessmentIndexMapper.updateAssessmentIndex(assessmentIndex);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteAssessmentIndexByIds(String[] ids)
+    {
+        return assessmentIndexMapper.deleteAssessmentIndexByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯淇℃伅
+     * 
+     * @param id 鐢ㄨ兘鑰冩牳鏍囧噯ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteAssessmentIndexById(String id)
+    {
+        return assessmentIndexMapper.deleteAssessmentIndexById(id);
+    }
+
+    /**
+     * 鎵归噺鏂板妯″瀷鑰冩牳鎸囨爣
+     *
+     * @param assessmentIndexList 鑰冩牳鎸囨爣鍒楄〃
+     * @return 缁撴灉
+     */
+    @Override
+    public int batchAssessIndex(List<AssessmentIndex> assessmentIndexList){
+        return assessmentIndexMapper.batchAssessIndex(assessmentIndexList);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityAnnexController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityAnnexController.java
new file mode 100644
index 0000000..b2e9ea1
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityAnnexController.java
@@ -0,0 +1,189 @@
+package com.dingzhuo.energy.basic.data.facility.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.common.utils.file.FileUtils;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityAnnex;
+import com.dingzhuo.energy.basic.data.facility.service.IFacilityAnnexService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 璁惧妗f闄勪欢Controller
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+@RestController
+@RequestMapping("/facility/annex")
+public class FacilityAnnexController extends BaseController
+{
+    @Autowired
+    private IFacilityAnnexService facilityAnnexService;
+    @Autowired
+    private TokenService tokenService;
+
+    private static final Logger log = LoggerFactory.getLogger(FacilityAnnexController.class);
+    /**
+     * 鏌ヨ璁惧妗f闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('facility:annex:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FacilityAnnex facilityAnnex)
+    {
+        startPage();
+        List<FacilityAnnex> list = facilityAnnexService.selectFacilityAnnexList(facilityAnnex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁惧妗f闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('facility:annex:export')")
+    @Log(title = "璁惧妗f闄勪欢", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(FacilityAnnex facilityAnnex)
+    {
+        List<FacilityAnnex> list = facilityAnnexService.selectFacilityAnnexList(facilityAnnex);
+        ExcelUtil<FacilityAnnex> util = new ExcelUtil<FacilityAnnex>(FacilityAnnex.class);
+        return util.exportExcel(list, "annex");
+    }
+
+    /**
+     * 鑾峰彇璁惧妗f闄勪欢璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('facility:annex:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(facilityAnnexService.selectFacilityAnnexById(id));
+    }
+
+    /**
+     * 鏂板璁惧妗f闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('facility:annex:add')")
+    @Log(title = "璁惧妗f闄勪欢", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody FacilityAnnex facilityAnnex)
+    {
+        return toAjax(facilityAnnexService.insertFacilityAnnex(facilityAnnex));
+    }
+
+    /**
+     * 淇敼璁惧妗f闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('facility:annex:edit')")
+    @Log(title = "璁惧妗f闄勪欢", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody FacilityAnnex facilityAnnex)
+    {
+        return toAjax(facilityAnnexService.updateFacilityAnnex(facilityAnnex));
+    }
+
+    /**
+     * 鍒犻櫎璁惧妗f闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('facility:annex:remove')")
+    @Log(title = "璁惧妗f闄勪欢", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(facilityAnnexService.deleteFacilityAnnexByIds(ids));
+    }
+
+
+    /**
+     * 閫氱敤鎸囧畾鏂囦欢涓嬭浇璇锋眰
+     *
+     * @param showFileName 涓嬭浇灞曠ず鏂囦欢鍚嶇О
+    //     * @param filePath 涓嬭浇鏂囦欢缁濆璺緞 甯� 鏂囦欢鐪熷疄鍚嶅瓧鍙婅矾寰�
+     * @param delete 鏄惁鍒犻櫎/
+     */
+    @PreAuthorize("@ss.hasPermi('facility:annex:assignDownload')")
+    @PostMapping("/assignDownload")
+    public void fileAssignDownload(String showFileName, String filePath, Boolean delete, HttpServletResponse response, HttpServletRequest request)
+    {
+        try
+        {
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition",
+                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, showFileName));
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+//            if (delete)
+//            {
+//                FileUtils.deleteFile(filePath);
+//            }
+            log.error("涓嬭浇鎴愬姛", "aa");
+        }
+        catch (Exception e)
+        {
+            log.error("涓嬭浇鏂囦欢澶辫触", e);
+        }
+    }
+    @Log(title = "璁惧妗f闄勪欢涓婁紶", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('facility:annex:fileImport')")
+    @PostMapping("/fileImport")
+    public AjaxResult importData(MultipartFile file, String facilityId) throws Exception
+    {
+        if (!file.isEmpty())
+        {
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            //鑾峰彇閰嶇疆鐨勬枃浠朵笂浼犺矾寰�
+            String uploadPathDir = RuoYiConfig.getUploadPath();
+            //鑾峰彇鏂囦欢鍘熷鍚嶇О
+            String fileName = file.getOriginalFilename();
+            //鑾峰彇鏂囦欢鎵╁睍鍚�
+            String fileSuffix = FileUploadUtils.getExtension(file);
+//            System.out.println("implementId==="+implementId);
+//            System.out.println("filedir==="+uploadPathDir);
+//            System.out.println("fileName==="+fileName);
+//            System.out.println("fileSuffix==="+fileSuffix);
+            //鏂囦欢鏈�缁堜繚瀛樼殑缁濆璺緞
+            String filePath = FileUploadUtils.uploadAll(uploadPathDir, file);
+//            System.out.println("涓婁紶鏂囦欢鍦板潃:===>"+filePath);
+            FacilityAnnex facilityAnnex = new FacilityAnnex();
+            //璁剧疆涓婚敭UUID
+            facilityAnnex.setId(IdUtils.simpleUUID());
+            facilityAnnex.setFileName(fileName);
+            facilityAnnex.setFilePath(filePath);
+            facilityAnnex.setFilesuffix(fileSuffix);
+            facilityAnnex.setFacilityId(facilityId);
+            facilityAnnex.setCreateBy(loginUser.getUsername());
+
+            facilityAnnex.setCreateBy(loginUser.getUsername());
+            if (this.facilityAnnexService.insertFacilityAnnex(facilityAnnex)>0)
+            {
+                return AjaxResult.success("闄勪欢涓婁紶瀹屾垚");
+            }
+        }
+        return AjaxResult.success("闄勪欢涓婁紶澶辫触");
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityArchivesController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityArchivesController.java
new file mode 100644
index 0000000..70e9acc
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/controller/FacilityArchivesController.java
@@ -0,0 +1,177 @@
+package com.dingzhuo.energy.basic.data.facility.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+//import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+//import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementExcel;
+//import com.sun.org.glassfish.external.statistics.annotations.Reset;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.basic.data.facility.service.IFacilityArchivesService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 璁惧妗fController
+ *
+ * @author zhaowei
+ * @date 2020-02-24
+ */
+@RestController
+@RequestMapping("/facility/archives")
+@Api(value = "璁惧妗fcontroller",tags = {"璁惧妗f绠$悊"})
+public class FacilityArchivesController extends BaseController
+{
+    @Autowired
+    private IFacilityArchivesService facilityArchivesService;
+    @Autowired
+    private TokenService tokenService;
+    /**
+     * 鏌ヨ璁惧妗f鍒楄〃
+     */
+    @ApiOperation(value = "璁惧妗f鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('facility:archives:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(FacilityArchives facilityArchives)
+    {
+        startPage();
+        List<FacilityArchives> list = facilityArchivesService.selectFacilityArchivesList(facilityArchives);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁惧妗f鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('facility:archives:export')")
+    @Log(title = "璁惧妗f", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation("璁惧妗f鍒楄〃瀵煎嚭")
+    public AjaxResult export(FacilityArchives facilityArchives)
+    {
+        List<FacilityArchives> list = facilityArchivesService.excelFacilityArchivesList(facilityArchives);
+        ExcelUtil<FacilityArchives> util = new ExcelUtil<FacilityArchives>(FacilityArchives.class);
+        return util.exportExcel(list, "archives");
+    }
+
+    /**
+     * 鑾峰彇璁惧妗f璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('facility:archives:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "鏍规嵁id鑾峰彇璁惧妗f璇︾粏淇℃伅")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(facilityArchivesService.selectFacilityArchivesById(id));
+    }
+
+    /**
+     * 鏂板璁惧妗f
+     */
+    @PreAuthorize("@ss.hasPermi('facility:archives:add')")
+    @Log(title = "璁惧妗f", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "鏂板璁惧妗f")
+    public AjaxResult add(@RequestBody FacilityArchives facilityArchives)
+    {
+        FacilityArchives check = facilityArchivesService.selectFacilityArchivesByCode(facilityArchives);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        //缂栧彿鍞竴鎬ф娴�
+        if(check!=null && check.getCode()!=null && check.getCode().length()>0)
+        {
+            return  AjaxResult.error(check.getCode()+"缂栫爜宸插瓨鍦�!");
+        }else
+        {
+            facilityArchives.setId(UUID.randomUUID().toString());
+            facilityArchives.setCreateBy(loginUser.getUsername());
+            return toAjax(facilityArchivesService.insertFacilityArchives(facilityArchives));
+        }
+    }
+
+    /**
+     * 淇敼璁惧妗f
+     */
+    @PreAuthorize("@ss.hasPermi('facility:archives:edit')")
+    @Log(title = "璁惧妗f", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "缂栬緫璁惧妗f")
+    public AjaxResult edit(@RequestBody FacilityArchives facilityArchives)
+    {
+        //鏇存柊鏃剁殑缂栫爜 鍞竴绾︽潫 瑕佸垽鏂� id涓嶇瓑浜庤嚜宸憋紝涓� code瀛樺湪閲嶅鐨勶紝瑕佸厛鍘绘帀鑷繁锛屽惁鍒� 鑷繁鐨勪慨鏀逛篃鎶ラ敊
+        FacilityArchives check = facilityArchivesService.selectFacilityArchivesByCode(facilityArchives);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        //缂栧彿鍞竴鎬ф娴�
+        if(check!=null && check.getCode()!=null && check.getCode().length()>0)
+        {
+            return  AjaxResult.error(check.getCode()+"缂栫爜宸插瓨鍦�!");
+        }else
+        {
+            facilityArchives.setUpdateBy(loginUser.getUsername());
+            return toAjax(facilityArchivesService.updateFacilityArchives(facilityArchives));
+        }
+
+    }
+
+    /**
+     * 鍒犻櫎璁惧妗f
+     */
+    @PreAuthorize("@ss.hasPermi('facility:archives:remove')")/**/
+    @Log(title = "璁惧妗f", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    @ApiOperation(value = "鍒犻櫎璁惧妗f")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(facilityArchivesService.deleteFacilityArchivesByIds(ids));
+    }
+  /**
+     * 妫�瀹氭仮澶�
+     */
+    @PreAuthorize("@ss.hasPermi('facility:archives:reset')")
+    @Log(title = "璁惧妗f", businessType = BusinessType.UPDATE)
+    @PostMapping ("/{ids}")
+    @ApiOperation(value = "璁惧妗f妫�瀹氭仮澶�")
+    public AjaxResult reset(@PathVariable String[] ids)
+    {
+        return toAjax(facilityArchivesService.resetFacilityArchivesByIds(ids));
+    }
+
+
+    @Log(title = "璁惧妗f缁存姢瀵煎叆", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('facility:archives:import')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<FacilityArchives> util = new ExcelUtil<FacilityArchives>(FacilityArchives.class);
+        List<FacilityArchives> facilityList = util.importExcel(file.getInputStream());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String message = facilityArchivesService.excelImpSave(facilityList,loginUser);
+        return AjaxResult.success(message);
+    }
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<FacilityArchives> util = new ExcelUtil<FacilityArchives>(FacilityArchives.class);
+        return util.importTemplateExcel("璁惧妗f鏁版嵁");
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityAnnex.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityAnnex.java
new file mode 100644
index 0000000..284e5cb
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityAnnex.java
@@ -0,0 +1,107 @@
+package com.dingzhuo.energy.basic.data.facility.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 璁惧妗f闄勪欢瀵硅薄 facility_annex
+ * 
+ * @author sys
+ * @date 2020-02-24
+ */
+public class FacilityAnnex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    private String id;
+
+    /** 璁惧妗fid */
+    private String facilityId;
+
+    /** 鏂囦欢鍚� */
+    @Excel(name = "鏂囦欢鍚�")
+    private String fileName;
+
+    /** 鏂囦欢鍚庣紑 */
+    private String filesuffix;
+
+    /** 鏂囦欢璺緞 */
+    private String filePath;
+
+    /** 鍒犻櫎鏍囧織 */
+    private String delFlage;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setFacilityId(String facilityId) 
+    {
+        this.facilityId = facilityId;
+    }
+
+    public String getFacilityId() 
+    {
+        return facilityId;
+    }
+    public void setFileName(String fileName) 
+    {
+        this.fileName = fileName;
+    }
+
+    public String getFileName() 
+    {
+        return fileName;
+    }
+    public void setFilesuffix(String filesuffix) 
+    {
+        this.filesuffix = filesuffix;
+    }
+
+    public String getFilesuffix() 
+    {
+        return filesuffix;
+    }
+    public void setFilePath(String filePath) 
+    {
+        this.filePath = filePath;
+    }
+
+    public String getFilePath() 
+    {
+        return filePath;
+    }
+    public void setDelFlage(String delFlage) 
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage() 
+    {
+        return delFlage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .append("id", getId())
+            .append("facilityId", getFacilityId())
+            .append("fileName", getFileName())
+            .append("filesuffix", getFilesuffix())
+            .append("filePath", getFilePath())
+            .append("delFlage", getDelFlage())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityArchives.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityArchives.java
new file mode 100644
index 0000000..1606fcc
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/domain/FacilityArchives.java
@@ -0,0 +1,301 @@
+package com.dingzhuo.energy.basic.data.facility.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * 璁惧妗f瀵硅薄 facility_archives
+ *
+ * @author zhaowei
+ * @date 2020-02-24
+ */
+@ApiModel(value = "璁惧妗f")
+public class FacilityArchives extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    @ApiModelProperty(value = "涓婚敭id")
+    private String id;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    @ApiModelProperty(value = "缂栫爜")
+    private String code;
+
+    /** 璁惧鍚嶇О */
+    @Excel(name = "璁惧鍚嶇О")
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String facilityName;
+
+    /** 璁惧绫诲瀷 */
+    @Excel(name = "璁惧绫诲瀷")
+    @ApiModelProperty(value = "璁惧绫诲瀷")
+    private String facilityType;
+
+    /** 浣跨敤鍒嗗巶 */
+    @Excel(name = "浣跨敤鍒嗗巶")
+    @ApiModelProperty(value = "浣跨敤鍒嗗巶")
+    private String branchFactory;
+
+    /** 鐗╃悊浣嶇疆 */
+    @Excel(name = "鐗╃悊浣嶇疆")
+    @ApiModelProperty(value = "鐗╃悊浣嶇疆")
+    private String istallationLocationn;
+
+    /** 鑳借�楃瓑绾� */
+    @Excel(name = "鑳借�楃瓑绾�")
+    @ApiModelProperty(value = "鑳借�楃瓑绾�")
+    private String facilityGrade;
+
+    /** 棰濆畾鍔熺巼 */
+    @Excel(name = "棰濆畾鍔熺巼")
+    @ApiModelProperty(value = "棰濆畾鍔熺巼")
+    private String ratedPower;
+
+    /** 鐢熶骇鏃ユ湡 */
+    @Excel(name = "鐢熶骇鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "鐢熶骇鏃ユ湡")
+    private Date productionDate;
+
+    /** 鎶曡繍鏃ユ湡 */
+    @Excel(name = "鎶曡繍鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "鎶曡繍鏃ユ湡")
+    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date putrunDate;
+
+    /** 鐢熶骇鍘傚 */
+    @Excel(name = "鐢熶骇鍘傚")
+    @ApiModelProperty(value = "鐢熶骇鍘傚")
+    private String manufacturer;
+
+    /** 璐熻矗浜� */
+    @Excel(name = "璐熻矗浜�")
+    @ApiModelProperty(value = "璐熻矗浜�")
+    private String personCharge;
+
+    /** 鎶�鏈弬鏁� */
+    @Excel(name = "鎶�鏈弬鏁�")
+    @ApiModelProperty(value = "鎶�鏈弬鏁�")
+    private String technicalData;
+
+    /** 璧峰鏃堕棿 */
+    @Excel(name = "璧峰鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    @ApiModelProperty(value = "璧峰鏃堕棿")
+    private Date startTime;
+
+    /** 妫�瀹氬懆鏈� */
+    @Excel(name = "妫�瀹氬懆鏈�")
+    @ApiModelProperty(value = "妫�瀹氬懆鏈�")
+    private Integer checkCycle;
+
+    /** 鎻愰啋鍛ㄦ湡 */
+    @Excel(name = "鎻愰啋鍛ㄦ湡")
+    @ApiModelProperty(value = "鎻愰啋鍛ㄦ湡")
+    private Integer reminderCycle;
+    /** 鏄惁閲嶇偣璁惧 */
+    @Excel(name = "鏄惁閲嶇偣璁惧")
+    @ApiModelProperty(value = "鏄惁閲嶇偣璁惧")
+    private String pointFlag;
+
+    private boolean txflage;
+
+    public void setTxflage(boolean txflage)
+    {
+        this.txflage = txflage;
+    }
+    public boolean getTxflage()
+    {
+        return this.txflage;
+    }
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+    public void setFacilityName(String facilityName)
+    {
+        this.facilityName = facilityName;
+    }
+
+    public String getFacilityName()
+    {
+        return facilityName;
+    }
+    public void setFacilityType(String facilityType)
+    {
+        this.facilityType = facilityType;
+    }
+
+    public String getFacilityType()
+    {
+        return facilityType;
+    }
+    public void setBranchFactory(String branchFactory)
+    {
+        this.branchFactory = branchFactory;
+    }
+
+    public String getBranchFactory()
+    {
+        return branchFactory;
+    }
+    public void setIstallationLocationn(String istallationLocationn)
+    {
+        this.istallationLocationn = istallationLocationn;
+    }
+
+    public String getIstallationLocationn()
+    {
+        return istallationLocationn;
+    }
+    public void setFacilityGrade(String facilityGrade)
+    {
+        this.facilityGrade = facilityGrade;
+    }
+
+    public String getFacilityGrade()
+    {
+        return facilityGrade;
+    }
+    public void setRatedPower(String ratedPower)
+    {
+        this.ratedPower = ratedPower;
+    }
+
+    public String getRatedPower()
+    {
+        return ratedPower;
+    }
+    public void setProductionDate(Date productionDate)
+    {
+        this.productionDate = productionDate;
+    }
+
+    public Date getProductionDate()
+    {
+        return productionDate;
+    }
+    public void setPutrunDate(Date putrunDate)
+    {
+        this.putrunDate = putrunDate;
+    }
+
+    public Date getPutrunDate()
+    {
+        return putrunDate;
+    }
+    public void setManufacturer(String manufacturer)
+    {
+        this.manufacturer = manufacturer;
+    }
+
+    public String getManufacturer()
+    {
+        return manufacturer;
+    }
+    public void setPersonCharge(String personCharge)
+    {
+        this.personCharge = personCharge;
+    }
+
+    public String getPersonCharge()
+    {
+        return personCharge;
+    }
+    public void setTechnicalData(String technicalData)
+    {
+        this.technicalData = technicalData;
+    }
+
+    public String getTechnicalData()
+    {
+        return technicalData;
+    }
+    public void setStartTime(Date startTime)
+    {
+        this.startTime = startTime;
+    }
+
+    public Date getStartTime()
+    {
+        return startTime;
+    }
+    public void setCheckCycle(Integer checkCycle)
+    {
+        this.checkCycle = checkCycle;
+    }
+
+    public Integer getCheckCycle()
+    {
+        return checkCycle;
+    }
+    public void setReminderCycle(Integer reminderCycle)
+    {
+        this.reminderCycle = reminderCycle;
+    }
+
+    public Integer getReminderCycle()
+    {
+        return reminderCycle;
+    }
+
+    public String getPointFlag() {
+        return pointFlag;
+    }
+
+    public void setPointFlag(String pointFlag) {
+        this.pointFlag = pointFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("facilityName", getFacilityName())
+            .append("facilityType", getFacilityType())
+            .append("branchFactory", getBranchFactory())
+            .append("istallationLocationn", getIstallationLocationn())
+            .append("facilityGrade", getFacilityGrade())
+            .append("ratedPower", getRatedPower())
+            .append("productionDate", getProductionDate())
+            .append("putrunDate", getPutrunDate())
+            .append("manufacturer", getManufacturer())
+            .append("personCharge", getPersonCharge())
+            .append("technicalData", getTechnicalData())
+            .append("startTime", getStartTime())
+            .append("checkCycle", getCheckCycle())
+            .append("reminderCycle", getReminderCycle())
+            .append("remark", getRemark())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+                .append("txflage", getTxflage())
+                .append("pointFlag", getPointFlag())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityAnnexMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityAnnexMapper.java
new file mode 100644
index 0000000..e67f354
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityAnnexMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.facility.mapper;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityAnnex;
+import java.util.List;
+
+/**
+ * 璁惧妗f闄勪欢Mapper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+public interface FacilityAnnexMapper
+{
+    /**
+     * 鏌ヨ璁惧妗f闄勪欢
+     *
+     * @param id 璁惧妗f闄勪欢ID
+     * @return 璁惧妗f闄勪欢
+     */
+    public FacilityAnnex selectFacilityAnnexById(String  id);
+
+    /**
+     * 鏌ヨ璁惧妗f闄勪欢鍒楄〃
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 璁惧妗f闄勪欢闆嗗悎
+     */
+    public List<FacilityAnnex> selectFacilityAnnexList(FacilityAnnex facilityAnnex);
+
+    /**
+     * 鏂板璁惧妗f闄勪欢
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertFacilityAnnex(FacilityAnnex facilityAnnex);
+
+    /**
+     * 淇敼璁惧妗f闄勪欢
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateFacilityAnnex(FacilityAnnex facilityAnnex);
+
+    /**
+     * 鍒犻櫎璁惧妗f闄勪欢
+     *
+     * @param id 璁惧妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityAnnexById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧妗f闄勪欢
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityAnnexByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityArchivesMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityArchivesMapper.java
new file mode 100644
index 0000000..b767430
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/mapper/FacilityArchivesMapper.java
@@ -0,0 +1,94 @@
+package com.dingzhuo.energy.basic.data.facility.mapper;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import java.util.List;
+
+/**
+ * 璁惧妗fMapper鎺ュ彛
+ *
+ * @author zhaowei
+ * @date 2020-02-24
+ */
+public interface FacilityArchivesMapper
+{
+    /**
+     * 鏌ヨ璁惧妗f
+     *
+     * @param id 璁惧妗fID
+     * @return 璁惧妗f
+     */
+    public FacilityArchives selectFacilityArchivesById(String id);
+
+    /**
+     * 鏌ヨ璁惧妗f鐨刢ode鏄惁瀛樺湪
+     *
+     * @param facilityArchives 璁惧妗ffacilityArchives
+     * @return 璁惧妗f
+     */
+    public FacilityArchives selectFacilityArchivesByCode(FacilityArchives facilityArchives);
+    /**
+     * 鏌ヨ璁惧妗f鍒楄〃
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 璁惧妗f闆嗗悎
+     */
+    public List<FacilityArchives> selectFacilityArchivesList(FacilityArchives facilityArchives);
+    /**
+     * 鏌ヨ璁惧妗f瀵煎嚭鍒楄〃
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 璁惧妗f闆嗗悎
+     */
+    public List<FacilityArchives> excelFacilityArchivesList(FacilityArchives facilityArchives);
+
+    /**
+     * 鏂板璁惧妗f
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 缁撴灉
+     */
+    public int insertFacilityArchives(FacilityArchives facilityArchives);
+
+    /**
+     * 淇敼璁惧妗f
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 缁撴灉
+     */
+    public int updateFacilityArchives(FacilityArchives facilityArchives);
+
+    /**
+     * 鍒犻櫎璁惧妗f
+     *
+     * @param id 璁惧妗fID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityArchivesById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧妗f
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityArchivesByIds(String[] ids);
+
+
+
+/*
+    *
+     * 妫�瀹氭仮澶嶈澶囨。妗�
+     *
+     * @param id 璁惧妗fID
+     * @return 缁撴灉
+    public int resetFacilityArchivesById(String[] id);
+*/
+
+    /**
+     * 鎵归噺妫�瀹氭仮澶嶈澶囨。妗�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int resetFacilityArchivesByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityAnnexService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityAnnexService.java
new file mode 100644
index 0000000..19e6491
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityAnnexService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.facility.service;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityAnnex;
+import java.util.List;
+
+/**
+ * 璁惧妗f闄勪欢Service鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+public interface IFacilityAnnexService
+{
+    /**
+     * 鏌ヨ璁惧妗f闄勪欢
+     *
+     * @param id 璁惧妗f闄勪欢ID
+     * @return 璁惧妗f闄勪欢
+     */
+    public FacilityAnnex selectFacilityAnnexById(String id);
+
+    /**
+     * 鏌ヨ璁惧妗f闄勪欢鍒楄〃
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 璁惧妗f闄勪欢闆嗗悎
+     */
+    public List<FacilityAnnex> selectFacilityAnnexList(FacilityAnnex facilityAnnex);
+
+    /**
+     * 鏂板璁惧妗f闄勪欢
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertFacilityAnnex(FacilityAnnex facilityAnnex);
+
+    /**
+     * 淇敼璁惧妗f闄勪欢
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateFacilityAnnex(FacilityAnnex facilityAnnex);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧妗f闄勪欢
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityAnnexByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁惧妗f闄勪欢淇℃伅
+     *
+     * @param id 璁惧妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityAnnexById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityArchivesService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityArchivesService.java
new file mode 100644
index 0000000..007d7f1
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/IFacilityArchivesService.java
@@ -0,0 +1,104 @@
+package com.dingzhuo.energy.basic.data.facility.service;
+
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+
+import java.util.List;
+
+/**
+ * 璁惧妗fService鎺ュ彛
+ *
+ * @author zhaowei
+ * @date 2020-02-24
+ */
+public interface IFacilityArchivesService
+{
+    /**
+     * 鏌ヨ璁惧妗f
+     *
+     * @param id 璁惧妗fID
+     * @return 璁惧妗f
+     */
+    public FacilityArchives selectFacilityArchivesById(String id);
+
+    /**
+     * 鏌ヨ璁惧妗fcode
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 璁惧妗f
+     */
+    public FacilityArchives selectFacilityArchivesByCode(FacilityArchives facilityArchives);
+
+    /**
+     * 鏌ヨ璁惧妗f鍒楄〃
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 璁惧妗f闆嗗悎
+     */
+    public List<FacilityArchives> selectFacilityArchivesList(FacilityArchives facilityArchives);
+    /**
+     * 鏌ヨ璁惧妗f鍒楄〃瀵煎嚭鍒楄〃
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 璁惧妗f闆嗗悎
+     */
+    public List<FacilityArchives> excelFacilityArchivesList(FacilityArchives facilityArchives);
+
+    /**
+     * 鏂板璁惧妗f
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 缁撴灉
+     */
+    public int insertFacilityArchives(FacilityArchives facilityArchives);
+
+    /**
+     * 淇敼璁惧妗f
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 缁撴灉
+     */
+    public int updateFacilityArchives(FacilityArchives facilityArchives);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧妗f
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧妗fID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityArchivesByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁惧妗f淇℃伅
+     *
+     * @param id 璁惧妗fID
+     * @return 缁撴灉
+     */
+    public int deleteFacilityArchivesById(String id);
+
+
+    /**
+     * 鎵归噺妫�瀹氭仮澶嶈澶囨。妗�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧妗fID
+     * @return 缁撴灉
+     */
+    public int resetFacilityArchivesByIds(String[] ids);
+
+   /* *//**
+     * 妫�瀹氭仮澶嶈澶囨。妗堜俊鎭�
+     *
+     * @param id 璁惧妗fID
+     * @return 缁撴灉
+     *//*
+    public int resetFacilityArchivesById(String[] id);*/
+
+    /**
+     * Excel瀵煎叆 璁惧妗f缁存姢淇℃伅
+     *
+     * @param facilityArchivesList  瑕佸鍏ョ殑璁惧妗f闆嗗悎
+     * @param loginUser 鐧诲綍鐢ㄦ埛瀵硅薄
+     * @return 缁撴灉
+     */
+    public String excelImpSave(List<FacilityArchives> facilityArchivesList, LoginUser loginUser);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityAnnexServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityAnnexServiceImpl.java
new file mode 100644
index 0000000..210a556
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityAnnexServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.basic.data.facility.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.facility.mapper.FacilityAnnexMapper;
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityAnnex;
+import com.dingzhuo.energy.basic.data.facility.service.IFacilityAnnexService;
+
+/**
+ * 璁惧妗f闄勪欢Service涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+@Service
+public class FacilityAnnexServiceImpl implements IFacilityAnnexService
+{
+    @Autowired
+    private FacilityAnnexMapper facilityAnnexMapper;
+
+    /**
+     * 鏌ヨ璁惧妗f闄勪欢
+     *
+     * @param id 璁惧妗f闄勪欢ID
+     * @return 璁惧妗f闄勪欢
+     */
+    @Override
+    public FacilityAnnex selectFacilityAnnexById(String id)
+    {
+        return facilityAnnexMapper.selectFacilityAnnexById(id);
+    }
+
+    /**
+     * 鏌ヨ璁惧妗f闄勪欢鍒楄〃
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 璁惧妗f闄勪欢
+     */
+    @Override
+    public List<FacilityAnnex> selectFacilityAnnexList(FacilityAnnex facilityAnnex)
+    {
+        return facilityAnnexMapper.selectFacilityAnnexList(facilityAnnex);
+    }
+
+    /**
+     * 鏂板璁惧妗f闄勪欢
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertFacilityAnnex(FacilityAnnex facilityAnnex)
+    {
+        facilityAnnex.setCreateTime(DateUtils.getNowDate());
+        return facilityAnnexMapper.insertFacilityAnnex(facilityAnnex);
+    }
+
+    /**
+     * 淇敼璁惧妗f闄勪欢
+     *
+     * @param facilityAnnex 璁惧妗f闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateFacilityAnnex(FacilityAnnex facilityAnnex)
+    {
+        facilityAnnex.setUpdateTime(DateUtils.getNowDate());
+        return facilityAnnexMapper.updateFacilityAnnex(facilityAnnex);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧妗f闄勪欢
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteFacilityAnnexByIds(String[] ids)
+    {
+        return facilityAnnexMapper.deleteFacilityAnnexByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璁惧妗f闄勪欢淇℃伅
+     *
+     * @param id 璁惧妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteFacilityAnnexById(String id)
+    {
+        return facilityAnnexMapper.deleteFacilityAnnexById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityArchivesServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityArchivesServiceImpl.java
new file mode 100644
index 0000000..0bff6a7
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/facility/service/impl/FacilityArchivesServiceImpl.java
@@ -0,0 +1,285 @@
+package com.dingzhuo.energy.basic.data.facility.service.impl;
+
+import java.util.*;
+
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.mapper.SysDictDataMapper;
+import com.dingzhuo.energy.project.system.service.impl.SysUserServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.facility.mapper.FacilityArchivesMapper;
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.basic.data.facility.service.IFacilityArchivesService;
+
+/**
+ * 璁惧妗fService涓氬姟灞傚鐞�
+ *
+ * @author zhaowei
+ * @date 2020-02-24
+ */
+@Service
+public class FacilityArchivesServiceImpl implements IFacilityArchivesService
+{
+    @Autowired
+    private FacilityArchivesMapper facilityArchivesMapper;
+
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+
+    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
+
+
+    /**
+     * 鏌ヨ璁惧妗f
+     *
+     * @param id 璁惧妗fID
+     * @return 璁惧妗f
+     */
+    @Override
+    public FacilityArchives selectFacilityArchivesById(String id)
+    {
+        return facilityArchivesMapper.selectFacilityArchivesById(id);
+    }
+
+    /**
+     * 鏌ヨ璁惧妗f鏍规嵁code
+     *
+     * @param facilityArchives 璁惧妗fcode
+     * @return 璁惧妗f
+     */
+    @Override
+    public FacilityArchives selectFacilityArchivesByCode(FacilityArchives facilityArchives)
+    {
+        return facilityArchivesMapper.selectFacilityArchivesByCode(facilityArchives);
+    }
+
+    /**
+     * 鏌ヨ璁惧妗f鍒楄〃
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 璁惧妗f
+     */
+    @Override
+    public List<FacilityArchives> selectFacilityArchivesList(FacilityArchives facilityArchives)
+    {
+        return facilityArchivesMapper.selectFacilityArchivesList(facilityArchives);
+    }
+
+    /**
+     * 鏌ヨ璁惧妗f鍒楄〃瀵煎嚭鍒楄〃
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 璁惧妗f
+     */
+    @Override
+    public List<FacilityArchives> excelFacilityArchivesList(FacilityArchives facilityArchives)
+    {
+        return facilityArchivesMapper.excelFacilityArchivesList(facilityArchives);
+    }
+
+    /**
+     * 鏂板璁惧妗f
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertFacilityArchives(FacilityArchives facilityArchives)
+    {
+        facilityArchives.setCreateTime(DateUtils.getNowDate());
+        return facilityArchivesMapper.insertFacilityArchives(facilityArchives);
+    }
+
+    /**
+     * 淇敼璁惧妗f
+     *
+     * @param facilityArchives 璁惧妗f
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateFacilityArchives(FacilityArchives facilityArchives)
+    {
+        facilityArchives.setUpdateTime(DateUtils.getNowDate());
+        return facilityArchivesMapper.updateFacilityArchives(facilityArchives);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧妗f
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧妗fID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteFacilityArchivesByIds(String[] ids)
+    {
+        return facilityArchivesMapper.deleteFacilityArchivesByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璁惧妗f淇℃伅
+     *
+     * @param id 璁惧妗fID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteFacilityArchivesById(String id)
+    {
+        return facilityArchivesMapper.deleteFacilityArchivesById(id);
+    }
+
+
+    /**
+     * 鎵归噺妫�瀹氭仮澶嶈澶囨。妗�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧妗fID
+     * @return 缁撴灉
+     */
+    @Override
+    public int resetFacilityArchivesByIds(String[] ids)
+    {
+        return facilityArchivesMapper.resetFacilityArchivesByIds(ids);
+    }
+
+   /* *//**
+     * 妫�瀹氭仮澶嶈澶囨。妗堜俊鎭�
+     *
+     * @param id 璁惧妗fID
+     * @return 缁撴灉
+     *//*
+    @Override
+    public int resetFacilityArchivesById(String[] id)
+    {
+        return facilityArchivesMapper.resetFacilityArchivesById(id);
+    }
+*/
+    /**
+     * Excel瀵煎叆 璁惧妗f缁存姢淇℃伅
+     *
+     * @param facilityArchivesList  瑕佸鍏ョ殑璁惧妗f闆嗗悎
+     * @param loginUser 鐧诲綍鐢ㄦ埛瀵硅薄
+     * @return 缁撴灉
+     */
+    @Override
+    public String excelImpSave(List<FacilityArchives> facilityArchivesList, LoginUser loginUser)
+    {
+
+        if (StringUtils.isNull(facilityArchivesList) || facilityArchivesList.size() == 0)
+        {
+            throw new CustomException("瀵煎叆璁惧妗f涓嶈兘涓虹┖锛�");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        //1銆佸瓧鍏告暟鎹炕璇�
+        // 璁惧绫诲瀷
+        List<SysDictData> facilityTypeList = dictDataMapper.selectDictDataByType("facility_type");
+        Map<String,String> facilityTypeMap = this.initDictMap(facilityTypeList);
+        // 浣跨敤鍒嗗巶
+        List<SysDictData> facilityBranchList = dictDataMapper.selectDictDataByType(
+                "branch_factory");
+        Map<String,String> facilityBranchMap = this.initDictMap(facilityBranchList);
+        //鑳借�楃瓑绾�
+        List<SysDictData> facilityGradeList = dictDataMapper.selectDictDataByType(
+                "facility_grade");
+        Map<String,String> facilityGradeMap = this.initDictMap(facilityGradeList);
+        for (FacilityArchives facilityArchives : facilityArchivesList)
+        {
+            try
+            {
+
+                //  妫�瀹氬懆鏈熴�佹彁閱掑懆鏈� 瀹氫箟鐨処nteger绫诲瀷锛屽鏋滄暟鎹笉鍖归厤浼氶粯璁や负0
+                facilityArchives.setCheckCycle(facilityArchives.getCheckCycle()==null?1:facilityArchives.getCheckCycle());
+                facilityArchives.setReminderCycle(facilityArchives.getReminderCycle()==null?1:facilityArchives.getReminderCycle());
+                // 2楠岃瘉 缂栫爜鏄惁瀛樺湪
+                FacilityArchives chekcFacilityImplement = facilityArchivesMapper.selectFacilityArchivesByCode(facilityArchives);
+                if (StringUtils.isNull(chekcFacilityImplement))
+                {
+                    //璁剧疆涓婚敭
+                    facilityArchives.setId(UUID.randomUUID().toString());
+                    //缈昏瘧 璁惧绫诲瀷 鏃犳垨鑰呭�间笉瀵瑰垯璁剧疆涓虹┖瀛楃涓�
+                    String facilityType= StringUtils.nvl(facilityTypeMap.get(facilityArchives.getFacilityType()+""),"");
+                    //鍒ゆ柇鐘舵�佹槸鍚︽纭�
+                    if(StringUtils.isEmpty(facilityType))
+                    {
+                        failureNum++;
+                        failureMsg.append("<br/>" + failureNum + "銆佺紪鍙� " + facilityArchives.getCode() + " 鐨勮澶囩被鍨嬮敊璇�");
+                        continue;
+                    }
+                    facilityArchives.setFacilityType(facilityType+"");
+                    //缈昏瘧 浣跨敤鍒嗗巶  鏃犳垨鑰呭�间笉瀵瑰垯璁剧疆涓虹┖瀛楃涓�
+                    String branchFactory= StringUtils.nvl(facilityBranchMap.get(facilityArchives.getBranchFactory()+""),"");
+                    if(StringUtils.isEmpty(branchFactory))
+                    {
+                        failureNum++;
+                        failureMsg.append("<br/>" + failureNum + "銆佺紪鍙� " + facilityArchives.getCode() + " 鐨勪娇鐢ㄥ垎鍘傞敊璇�");
+                        continue;
+                    }
+                    facilityArchives.setBranchFactory(branchFactory);
+
+                    //缈昏瘧 鑳借�楃瓑绾�  鏃犳垨鑰呭�间笉瀵瑰垯璁剧疆涓虹┖瀛楃涓�
+                    String facilityGrade= StringUtils.nvl(facilityGradeMap.get(facilityArchives.getFacilityGrade()+""),"");
+                    if(StringUtils.isEmpty(facilityGrade))
+                    {
+                        failureNum++;
+                        failureMsg.append("<br/>" + failureNum + "銆佺紪鍙� " + facilityArchives.getCode() + " 鐨勮兘鑰楃瓑绾ч敊璇�");
+                        continue;
+                    }
+                    facilityArchives.setFacilityGrade(facilityGrade);
+
+                    //璁剧疆寤虹珛浜哄拰寤虹珛鏃堕棿
+                    facilityArchives.setCreateBy(loginUser.getUsername());
+                    facilityArchives.setCreateTime(new Date());
+                    //瀛樺偍涓�鏉℃暟鎹�
+                    this.insertFacilityArchives(facilityArchives);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "銆佺紪鍙� " + facilityArchives.getCode() + " 瀵煎叆鎴愬姛");
+                }
+                else
+                {
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "銆佺紪鍙� " + facilityArchives.getCode() + " 宸插瓨鍦�");
+                }
+            }
+            catch (Exception e)
+            {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "銆佺紪鍙� " + facilityArchives.getCode() + " 瀵煎叆澶辫触锛�";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細");
+            throw new CustomException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏� " + successNum + " 鏉★紝鏁版嵁濡備笅锛�");
+        }
+        return successMsg.toString();
+    }
+
+    /**
+     * 灏嗗瓧鍏哥被鍨� 瀵瑰簲鐨� 瀛楀吀闆嗗悎  瀛樺叆map涓娇鐢�
+     * @param sysDictDataList
+     * @return
+     */
+    public Map initDictMap(List<SysDictData> sysDictDataList)
+    {
+        Map<String,String> map = new HashMap<String,String>();
+        for(SysDictData sysDictData : sysDictDataList)
+        {
+            //瀛樻斁 key=鏍囩鍚嶅瓧  value鏄� 璁剧疆鍊�
+            map.put(sysDictData.getDictLabel(),sysDictData.getDictValue());
+        }
+        return map;
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterAnnexController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterAnnexController.java
new file mode 100644
index 0000000..4e61ede
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterAnnexController.java
@@ -0,0 +1,190 @@
+package com.dingzhuo.energy.basic.data.meter.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.common.utils.file.FileUtils;
+import com.dingzhuo.energy.common.utils.text.Convert;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.project.common.CommonController;
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterAnnex;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterAnnexService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f闄勪欢Controller
+ * 
+ * @author zhaowei
+ * @date 2020-02-14
+ */
+@RestController
+@RequestMapping("/meter/annex")
+public class MeterAnnexController extends BaseController
+{
+    @Autowired
+    private IMeterAnnexService meterAnnexService;
+    @Autowired
+    private TokenService tokenService;
+
+    private static final Logger log = LoggerFactory.getLogger(MeterAnnexController.class);
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('meter:annex:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(MeterAnnex meterAnnex)
+    {
+        startPage();
+        List<MeterAnnex> list = meterAnnexService.selectMeterAnnexList(meterAnnex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁¢噺鍣ㄥ叿妗f闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('meter:annex:export')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f闄勪欢", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(MeterAnnex meterAnnex)
+    {
+        List<MeterAnnex> list = meterAnnexService.selectMeterAnnexList(meterAnnex);
+        ExcelUtil<MeterAnnex> util = new ExcelUtil<MeterAnnex>(MeterAnnex.class);
+        return util.exportExcel(list, "annex");
+    }
+
+    /**
+     * 鑾峰彇璁¢噺鍣ㄥ叿妗f闄勪欢璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('meter:annex:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(meterAnnexService.selectMeterAnnexById(id));
+    }
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('meter:annex:add')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f闄勪欢", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody MeterAnnex meterAnnex)
+    {
+        return toAjax(meterAnnexService.insertMeterAnnex(meterAnnex));
+    }
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('meter:annex:edit')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f闄勪欢", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody MeterAnnex meterAnnex)
+    {
+        return toAjax(meterAnnexService.updateMeterAnnex(meterAnnex));
+    }
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('meter:annex:remove')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f闄勪欢", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(meterAnnexService.deleteMeterAnnexByIds(ids));
+    }
+
+    /**
+     * 閫氱敤鎸囧畾鏂囦欢涓嬭浇璇锋眰
+     *
+     * @param showFileName 涓嬭浇灞曠ず鏂囦欢鍚嶇О
+//     * @param filePath 涓嬭浇鏂囦欢缁濆璺緞 甯� 鏂囦欢鐪熷疄鍚嶅瓧鍙婅矾寰�
+     * @param delete 鏄惁鍒犻櫎/
+     */
+    @PreAuthorize("@ss.hasPermi('meter:annex:assignDownload')")
+    @PostMapping("/assignDownload")
+    public void fileAssignDownload(String showFileName, String filePath,Boolean delete, HttpServletResponse response, HttpServletRequest request)
+    {
+        try
+        {
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition",
+                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, showFileName));
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+//            if (delete)
+//            {
+//                FileUtils.deleteFile(filePath);
+//            }
+            log.error("涓嬭浇鎴愬姛", "aa");
+        }
+        catch (Exception e)
+        {
+            log.error("涓嬭浇鏂囦欢澶辫触", e);
+        }
+    }
+    @Log(title = "璁¢噺鍣ㄥ叿妗f闄勪欢涓婁紶", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('meter:annex:fileImport')")
+    @PostMapping("/fileImport")
+    public AjaxResult importData(MultipartFile file, String implementId) throws Exception
+    {
+        if (!file.isEmpty())
+        {
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            //鑾峰彇閰嶇疆鐨勬枃浠朵笂浼犺矾寰�
+            String uploadPathDir = RuoYiConfig.getUploadPath();
+            //鑾峰彇鏂囦欢鍘熷鍚嶇О
+            String fileName = file.getOriginalFilename();
+            //鑾峰彇鏂囦欢鎵╁睍鍚�
+            String fileSuffix = FileUploadUtils.getExtension(file);
+//            System.out.println("implementId==="+implementId);
+//            System.out.println("filedir==="+uploadPathDir);
+//            System.out.println("fileName==="+fileName);
+//            System.out.println("fileSuffix==="+fileSuffix);
+            //鏂囦欢鏈�缁堜繚瀛樼殑缁濆璺緞
+            String filePath = FileUploadUtils.uploadAll(uploadPathDir, file);
+//            System.out.println("涓婁紶鏂囦欢鍦板潃:===>"+filePath);
+            MeterAnnex meterAnnex = new MeterAnnex();
+            //璁剧疆涓婚敭UUID
+            meterAnnex.setId(IdUtils.simpleUUID());
+            meterAnnex.setFileName(fileName);
+            meterAnnex.setFilePath(filePath);
+            meterAnnex.setFileSuffix(fileSuffix);
+            meterAnnex.setImplementId(implementId);
+            meterAnnex.setCreateBy(loginUser.getUsername());
+            if (this.meterAnnexService.insertMeterAnnex(meterAnnex)>0)
+            {
+                return AjaxResult.success("闄勪欢涓婁紶瀹屾垚");
+            }
+        }
+        return AjaxResult.success("闄勪欢涓婁紶澶辫触");
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementController.java
new file mode 100644
index 0000000..af01dc7
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementController.java
@@ -0,0 +1,172 @@
+package com.dingzhuo.energy.basic.data.meter.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementExcel;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import com.dingzhuo.energy.project.system.service.ISysDictDataService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f缁存姢Controller
+ *
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+@RestController
+@RequestMapping("/meter/implement")
+@Api(value = "璁¢噺鍣ㄥ叿绠$悊",tags = {"璁¢噺鍣ㄥ叿绠$悊"})
+public class MeterImplementController extends BaseController
+{
+    @Autowired
+    private IMeterImplementService meterImplementService;
+
+    @Autowired
+    private TokenService tokenService;
+
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implement:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "璁¢噺鍣ㄥ叿鍒楄〃")
+    public TableDataInfo list(MeterImplement meterImplement)
+    {
+        startPage();
+        List<MeterImplement> list = meterImplementService.selectMeterImplementList(meterImplement);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implement:export')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f缁存姢", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation(value = "璁¢噺鍣ㄥ叿鍒楄〃瀵煎嚭")
+    public AjaxResult export(MeterImplement meterImplement)
+    {
+//        List<MeterImplement> list = meterImplementService.selectMeterImplementList(meterImplement);
+        //浣跨敤涓撶敤鐨勫鍑鸿皟鐢ㄦ柟娉曪紝杩欓噷闈㈠皢 鏁版嵁杩涜杞寲锛� 鐘舵�併�佺绫� 杞崲鎴� 涓枃锛岀敤鍑芥暟瀹炵幇   閫氳繃鏁版嵁瀛楀吀杞崲
+        //MeterImplementExcel  瀵煎嚭 Excel涓撶敤瀵硅薄
+        List<MeterImplementExcel> list = meterImplementService.exectMeterImplementList(meterImplement);
+        ExcelUtil<MeterImplementExcel> util = new ExcelUtil<MeterImplementExcel>(MeterImplementExcel.class);
+        return util.exportExcel(list, "implement");
+    }
+
+    /**
+     * 鑾峰彇璁¢噺鍣ㄥ叿妗f缁存姢璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implement:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "鏍规嵁id鑾峰彇璁¢噺鍣ㄥ叿鐩镐俊淇℃伅")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(meterImplementService.selectMeterImplementById(id));
+    }
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implement:add')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f缁存姢", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "鏂板璁¢噺鍣ㄥ叿")
+    public AjaxResult add(@RequestBody MeterImplement meterImplement)
+    {
+        MeterImplement check = meterImplementService.selectMeterImplementByCode(meterImplement);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        //缂栧彿鍞竴鎬ф娴�
+        if(check!=null && check.getCode()!=null && check.getCode().length()>0)
+        {
+           return  AjaxResult.error(check.getCode()+"缂栫爜宸插瓨鍦�!");
+        }else
+        {
+            meterImplement.setId(UUID.randomUUID().toString());
+            meterImplement.setCreateBy(loginUser.getUsername());
+           return toAjax(meterImplementService.insertMeterImplement(meterImplement));
+        }
+    }
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implement:edit')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f缁存姢", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "缂栬緫璁¢噺鍣ㄥ叿")
+    public AjaxResult edit(@RequestBody MeterImplement meterImplement)
+    {
+        //鏇存柊鏃剁殑缂栫爜 鍞竴绾︽潫 瑕佸垽鏂� id涓嶇瓑浜庤嚜宸憋紝涓� code瀛樺湪閲嶅鐨勶紝瑕佸厛鍘绘帀鑷繁锛屽惁鍒� 鑷繁鐨勪慨鏀逛篃鎶ラ敊
+        MeterImplement check = meterImplementService.selectMeterImplementByCode(meterImplement);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        //缂栧彿鍞竴鎬ф娴�
+        if(check!=null && check.getCode()!=null && check.getCode().length()>0)
+        {
+            return  AjaxResult.error(check.getCode()+"缂栫爜宸插瓨鍦�!");
+        }else
+        {
+            meterImplement.setUpdateBy(loginUser.getUsername());
+            return  toAjax(meterImplementService.updateMeterImplement(meterImplement));
+        }
+    }
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implement:remove')")
+    @Log(title = "璁¢噺鍣ㄥ叿妗f缁存姢", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    @ApiOperation(value = "鍒犻櫎璁¢噺鍣ㄥ叿")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(meterImplementService.deleteMeterImplementByIds(ids));
+    }
+
+    @Log(title = "璁¢噺鍣ㄥ叿妗f缁存姢", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('meter:implement:import')")
+    @PostMapping("/importData")
+    @ApiOperation(value = "璁¢噺鍣ㄥ叿瀵煎叆")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<MeterImplement> util = new ExcelUtil<MeterImplement>(MeterImplement.class);
+        List<MeterImplement> meterList = util.importExcel(file.getInputStream());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String message = meterImplementService.excelImpSave(meterList,loginUser);
+        return AjaxResult.success(message);
+    }
+
+    @GetMapping("/importTemplate")
+    @ApiOperation(value = "璁¢噺鍣ㄥ叿瀵煎嚭妯℃澘")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<MeterImplementExcel> util = new ExcelUtil<MeterImplementExcel>(MeterImplementExcel.class);
+        return util.importTemplateExcel("璁¢噺鍣ㄥ叿妗f鏁版嵁");
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementCountController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementCountController.java
new file mode 100644
index 0000000..3b5f3a5
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/controller/MeterImplementCountController.java
@@ -0,0 +1,103 @@
+package com.dingzhuo.energy.basic.data.meter.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementCount;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementCountService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 璁¢噺鍣ㄥ叿缁熻鏌ヨController
+ * 
+ * @author zhaowei
+ * @date 2020-02-21
+ */
+@RestController
+@RequestMapping("/meter/implementCount")
+public class MeterImplementCountController extends BaseController
+{
+    @Autowired
+    private IMeterImplementCountService meterImplementCountService;
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implementCount:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(MeterImplementCount meterImplementCount)
+    {
+        startPage();
+        List<MeterImplementCount> list = meterImplementCountService.selectMeterImplementCountList(meterImplementCount);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁¢噺鍣ㄥ叿缁熻鏌ヨ鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implementCount:export')")
+    @Log(title = "璁¢噺鍣ㄥ叿缁熻鏌ヨ", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(MeterImplementCount meterImplementCount)
+    {
+        List<MeterImplementCount> list = meterImplementCountService.selectMeterImplementCountList(meterImplementCount);
+        ExcelUtil<MeterImplementCount> util = new ExcelUtil<MeterImplementCount>(MeterImplementCount.class);
+        return util.exportExcel(list, "implementCount");
+    }
+
+    /**
+     * 鑾峰彇璁¢噺鍣ㄥ叿缁熻鏌ヨ璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implementCount:query')")
+    @GetMapping(value = "/{code}")
+    public AjaxResult getInfo(@PathVariable("code") String code)
+    {
+        return AjaxResult.success(meterImplementCountService.selectMeterImplementCountById(code));
+    }
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implementCount:add')")
+    @Log(title = "璁¢噺鍣ㄥ叿缁熻鏌ヨ", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody MeterImplementCount meterImplementCount)
+    {
+        return toAjax(meterImplementCountService.insertMeterImplementCount(meterImplementCount));
+    }
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implementCount:edit')")
+    @Log(title = "璁¢噺鍣ㄥ叿缁熻鏌ヨ", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody MeterImplementCount meterImplementCount)
+    {
+        return toAjax(meterImplementCountService.updateMeterImplementCount(meterImplementCount));
+    }
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('meter:implementCount:remove')")
+    @Log(title = "璁¢噺鍣ㄥ叿缁熻鏌ヨ", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{codes}")
+    public AjaxResult remove(@PathVariable String[] codes)
+    {
+        return toAjax(meterImplementCountService.deleteMeterImplementCountByIds(codes));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterAnnex.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterAnnex.java
new file mode 100644
index 0000000..639a849
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterAnnex.java
@@ -0,0 +1,107 @@
+package com.dingzhuo.energy.basic.data.meter.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f闄勪欢瀵硅薄 meter_annex
+ * 
+ * @author zhaowei
+ * @date 2020-02-14
+ */
+public class MeterAnnex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鍏宠仈meter_implement.id */
+    private String implementId;
+
+    /** 鏂囦欢鍚� */
+    @Excel(name = "鏂囦欢鍚�")
+    private String fileName;
+
+    /** 鏂囦欢鍚庣紑 */
+    private String fileSuffix;
+
+    /** 鏂囦欢璺緞 */
+    private String filePath;
+
+    /** 鍒犻櫎鏍囧織Y 鍒犻櫎  N鏈垹闄� */
+    private String delFlage;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setImplementId(String implementId) 
+    {
+        this.implementId = implementId;
+    }
+
+    public String getImplementId() 
+    {
+        return implementId;
+    }
+    public void setFileName(String fileName) 
+    {
+        this.fileName = fileName;
+    }
+
+    public String getFileName() 
+    {
+        return fileName;
+    }
+    public void setFileSuffix(String fileSuffix) 
+    {
+        this.fileSuffix = fileSuffix;
+    }
+
+    public String getFileSuffix() 
+    {
+        return fileSuffix;
+    }
+    public void setFilePath(String filePath) 
+    {
+        this.filePath = filePath;
+    }
+
+    public String getFilePath() 
+    {
+        return filePath;
+    }
+    public void setDelFlage(String delFlage) 
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage() 
+    {
+        return delFlage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("implementId", getImplementId())
+            .append("fileName", getFileName())
+            .append("fileSuffix", getFileSuffix())
+            .append("filePath", getFilePath())
+            .append("delFlage", getDelFlage())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplement.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplement.java
new file mode 100644
index 0000000..6478a6a
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplement.java
@@ -0,0 +1,266 @@
+package com.dingzhuo.energy.basic.data.meter.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f缁存姢瀵硅薄 meter_implement
+ *
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+@ApiModel(value = "璁¢噺鍣ㄥ叿")
+public class MeterImplement extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    @ApiModelProperty(value = "缂栫爜")
+    private String code;
+
+    /** 鍣ㄥ叿鍚嶇О */
+    @Excel(name = "鍣ㄥ叿鍚嶇О")
+    @ApiModelProperty(value = "鍣ㄥ叿鍚嶇О")
+    private String meterName;
+
+    /** 绉嶇被 */
+    @Excel(name = "绉嶇被")
+    @ApiModelProperty(value = "绉嶇被")
+    private String meterType;
+
+    /** 瑙勬牸鍨嬪彿 */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String modelNumber;
+
+    /** 娴嬮噺鑼冨洿 */
+    @Excel(name = "娴嬮噺鑼冨洿")
+    @ApiModelProperty(value = "娴嬮噺鑼冨洿")
+    private String measureRange;
+
+    /** 鐢熶骇鍘傚晢 */
+    @Excel(name = "鐢熶骇鍘傚晢")
+    @ApiModelProperty(value = "鐢熶骇鍘傚晢")
+    private String manufacturer;
+
+    /** 璐熻矗浜� */
+    @Excel(name = "璐熻矗浜�")
+    @ApiModelProperty(value = "")
+    private String personCharge;
+
+    /** 瀹夎浣嶇疆 */
+    @Excel(name = "瀹夎浣嶇疆")
+    @ApiModelProperty(value = "瀹夎浣嶇疆")
+    private String installactionLocation;
+
+    /** 璧峰鏃堕棿 */
+    @Excel(name = "璧峰鏃堕棿")
+    @ApiModelProperty(value = "璧峰鏃堕棿")
+    private Date startTime;
+
+    /** 鎶曡繍鏃堕棿 */
+    @Excel(name = "鎶曡繍鏃堕棿")
+    @ApiModelProperty(value = "鎶曡繍鏃堕棿")
+    private Date putrunTime;
+
+    /** 妫�瀹氬懆鏈� */
+    @Excel(name = "妫�瀹氬懆鏈�")
+    @ApiModelProperty(value = "妫�瀹氬懆鏈�")
+    private Integer checkCycle;
+
+    /** 鎻愰啋鍛ㄦ湡 */
+    @Excel(name = "鎻愰啋鍛ㄦ湡")
+    @ApiModelProperty(value = "鎻愰啋鍛ㄦ湡")
+    private Integer reminderCycle;
+
+    /** 鐘舵�� */
+    @Excel(name = "鐘舵��")
+    @ApiModelProperty(value = "鐘舵��")
+    private String meterStatus;
+
+    /** 閫昏緫鍒犻櫎鏍囧織,Y宸插垹闄�,N鏈垹闄� */
+    @ApiModelProperty(value = "閫昏緫鍒犻櫎鏍囧織,Y宸插垹闄�,N鏈垹闄�")
+    private String delFlage;
+    /** 妫�瀹氭彁閱掓爣蹇�  true 鎻愰啋 false涓嶉渶瑕佹彁閱� */
+    @ApiModelProperty(value = "妫�瀹氭彁閱掓爣蹇�  true 鎻愰啋 false涓嶉渶瑕佹彁閱�")
+    private boolean txflage;
+
+    public void setTxflage(boolean txflage)
+    {
+        this.txflage = txflage;
+    }
+    public boolean getTxflage()
+    {
+        return this.txflage;
+    }
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+    public void setMeterName(String meterName)
+    {
+        this.meterName = meterName;
+    }
+
+    public String getMeterName()
+    {
+        return meterName;
+    }
+    public void setMeterType(String meterType)
+    {
+        this.meterType = meterType;
+    }
+
+    public String getMeterType()
+    {
+        return meterType;
+    }
+    public void setModelNumber(String modelNumber)
+    {
+        this.modelNumber = modelNumber;
+    }
+
+    public String getModelNumber()
+    {
+        return modelNumber;
+    }
+    public void setMeasureRange(String measureRange)
+    {
+        this.measureRange = measureRange;
+    }
+
+    public String getMeasureRange()
+    {
+        return measureRange;
+    }
+    public void setManufacturer(String manufacturer)
+    {
+        this.manufacturer = manufacturer;
+    }
+
+    public String getManufacturer()
+    {
+        return manufacturer;
+    }
+    public void setPersonCharge(String personCharge)
+    {
+        this.personCharge = personCharge;
+    }
+
+    public String getPersonCharge()
+    {
+        return personCharge;
+    }
+    public void setInstallactionLocation(String installactionLocation)
+    {
+        this.installactionLocation = installactionLocation;
+    }
+
+    public String getInstallactionLocation()
+    {
+        return installactionLocation;
+    }
+    public void setStartTime(Date startTime)
+    {
+        this.startTime = startTime;
+    }
+
+    public Date getStartTime()
+    {
+        return startTime;
+    }
+    public void setCheckCycle(Integer checkCycle)
+    {
+        this.checkCycle = checkCycle;
+    }
+
+    public Integer getCheckCycle()
+    {
+        return checkCycle;
+    }
+    public void setReminderCycle(Integer reminderCycle)
+    {
+        this.reminderCycle = reminderCycle;
+    }
+
+    public Integer getReminderCycle()
+    {
+        return reminderCycle;
+    }
+    public void setMeterStatus(String meterStatus)
+    {
+        this.meterStatus = meterStatus;
+    }
+
+    public String getMeterStatus()
+    {
+        return meterStatus;
+    }
+    public void setDelFlage(String delFlage)
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage()
+    {
+        return delFlage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("meterName", getMeterName())
+            .append("meterType", getMeterType())
+            .append("modelNumber", getModelNumber())
+            .append("measureRange", getMeasureRange())
+            .append("manufacturer", getManufacturer())
+            .append("personCharge", getPersonCharge())
+            .append("installactionLocation", getInstallactionLocation())
+            .append("startTime", getStartTime())
+            .append("checkCycle", getCheckCycle())
+            .append("reminderCycle", getReminderCycle())
+            .append("meterStatus", getMeterStatus())
+            .append("delFlage", getDelFlage())
+            .append("remark", getRemark())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .append("txflage", getTxflage())
+            .toString();
+    }
+
+    public Date getPutrunTime() {
+        return putrunTime;
+    }
+
+    public void setPutrunTime(Date putrunTime) {
+        this.putrunTime = putrunTime;
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementCount.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementCount.java
new file mode 100644
index 0000000..8d807ce
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementCount.java
@@ -0,0 +1,244 @@
+package com.dingzhuo.energy.basic.data.meter.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 璁¢噺鍣ㄥ叿缁熻鏌ヨ瀵硅薄 meter_implement
+ * 
+ * @author zhaowei
+ * @date 2020-02-21
+ */
+public class MeterImplementCount extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    private String code;
+
+    /** 鍣ㄥ叿鍚嶇О */
+    @Excel(name = "鍣ㄥ叿鍚嶇О")
+    private String meterName;
+
+    /** 绉嶇被 */
+    @Excel(name = "绉嶇被")
+    private String meterType;
+
+    /** 瑙勬牸鍨嬪彿 */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    private String modelNumber;
+
+    /** 娴嬮噺鑼冨洿 */
+    @Excel(name = "娴嬮噺鑼冨洿")
+    private String measureRange;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鐢熶骇鍘傚晢 */
+    @Excel(name = "鐢熶骇鍘傚晢")
+    private String manufacturer;
+
+    /** 璐熻矗浜� */
+    private String personCharge;
+
+    /** 瀹夎浣嶇疆 */
+    @Excel(name = "瀹夎浣嶇疆")
+    private String installactionLocation;
+
+    /** 璧峰鏃堕棿 */
+    private Date startTime;
+
+    /** 鎶曡繍鏃堕棿 */
+    @Excel(name = "鎶曡繍鏃堕棿")
+    private Date putrunTime;
+
+
+    /** 妫�瀹氬懆鏈� */
+    private Integer checkCycle;
+
+    /** 鎻愰啋鍛ㄦ湡 */
+    private Integer reminderCycle;
+
+    /** 鐘舵�� */
+    @Excel(name = "鐘舵��")
+    private String meterStatus;
+
+    /** 閫昏緫鍒犻櫎鏍囧織,Y宸插垹闄�,N鏈垹闄� */
+    private String delFlage;
+
+    private boolean txflage;
+
+    public void setTxflage(boolean txflage)
+    {
+        this.txflage = txflage;
+    }
+    public boolean getTxflage()
+    {
+        return this.txflage;
+    }
+
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+
+    public String getCode() 
+    {
+        return code;
+    }
+    public void setMeterName(String meterName) 
+    {
+        this.meterName = meterName;
+    }
+
+    public String getMeterName() 
+    {
+        return meterName;
+    }
+    public void setMeterType(String meterType) 
+    {
+        this.meterType = meterType;
+    }
+
+    public String getMeterType() 
+    {
+        return meterType;
+    }
+    public void setModelNumber(String modelNumber) 
+    {
+        this.modelNumber = modelNumber;
+    }
+
+    public String getModelNumber() 
+    {
+        return modelNumber;
+    }
+    public void setMeasureRange(String measureRange) 
+    {
+        this.measureRange = measureRange;
+    }
+
+    public String getMeasureRange() 
+    {
+        return measureRange;
+    }
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setManufacturer(String manufacturer) 
+    {
+        this.manufacturer = manufacturer;
+    }
+
+    public String getManufacturer() 
+    {
+        return manufacturer;
+    }
+    public void setPersonCharge(String personCharge) 
+    {
+        this.personCharge = personCharge;
+    }
+
+    public String getPersonCharge() 
+    {
+        return personCharge;
+    }
+    public void setInstallactionLocation(String installactionLocation) 
+    {
+        this.installactionLocation = installactionLocation;
+    }
+
+    public String getInstallactionLocation() 
+    {
+        return installactionLocation;
+    }
+    public void setStartTime(Date startTime) 
+    {
+        this.startTime = startTime;
+    }
+
+    public Date getStartTime() 
+    {
+        return startTime;
+    }
+    public void setCheckCycle(Integer checkCycle) 
+    {
+        this.checkCycle = checkCycle;
+    }
+
+    public Integer getCheckCycle() 
+    {
+        return checkCycle;
+    }
+    public void setReminderCycle(Integer reminderCycle) 
+    {
+        this.reminderCycle = reminderCycle;
+    }
+
+    public Integer getReminderCycle() 
+    {
+        return reminderCycle;
+    }
+    public void setMeterStatus(String meterStatus) 
+    {
+        this.meterStatus = meterStatus;
+    }
+
+    public String getMeterStatus() 
+    {
+        return meterStatus;
+    }
+    public void setDelFlage(String delFlage) 
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage() 
+    {
+        return delFlage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("code", getCode())
+            .append("meterName", getMeterName())
+            .append("meterType", getMeterType())
+            .append("modelNumber", getModelNumber())
+            .append("measureRange", getMeasureRange())
+            .append("id", getId())
+            .append("manufacturer", getManufacturer())
+            .append("personCharge", getPersonCharge())
+            .append("installactionLocation", getInstallactionLocation())
+            .append("startTime", getStartTime())
+            .append("checkCycle", getCheckCycle())
+            .append("reminderCycle", getReminderCycle())
+            .append("meterStatus", getMeterStatus())
+            .append("delFlage", getDelFlage())
+            .append("remark", getRemark())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+                .append("txflage", getTxflage())
+            .toString();
+    }
+    public Date getPutrunTime() {
+        return putrunTime;
+    }
+
+    public void setPutrunTime(Date putrunTime) {
+        this.putrunTime = putrunTime;
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementExcel.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementExcel.java
new file mode 100644
index 0000000..3931cfa
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/domain/MeterImplementExcel.java
@@ -0,0 +1,223 @@
+package com.dingzhuo.energy.basic.data.meter.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f缁存姢 瀵煎嚭 Excel涓撶敤瀵硅薄 meter_implement
+ * 
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+public class MeterImplementExcel extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    private String code;
+
+    /** 鍣ㄥ叿鍚嶇О */
+    @Excel(name = "鍣ㄥ叿鍚嶇О")
+    private String meterName;
+
+    /** 绉嶇被 */
+    @Excel(name = "绉嶇被")
+    private String meterType;
+
+    /** 瑙勬牸鍨嬪彿 */
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    private String modelNumber;
+
+    /** 娴嬮噺鑼冨洿 */
+    @Excel(name = "娴嬮噺鑼冨洿")
+    private String measureRange;
+
+    /** 鐢熶骇鍘傚晢 */
+    @Excel(name = "鐢熶骇鍘傚晢")
+    private String manufacturer;
+
+    /** 璐熻矗浜� */
+    @Excel(name = "璐熻矗浜�")
+    private String personCharge;
+
+    /** 瀹夎浣嶇疆 */
+    @Excel(name = "瀹夎浣嶇疆")
+    private String installactionLocation;
+
+    /** 璧峰鏃堕棿 */
+    @Excel(name = "璧峰鏃堕棿")
+    private String startTime;
+
+    /** 妫�瀹氬懆鏈� */
+    @Excel(name = "妫�瀹氬懆鏈�")
+    private Integer checkCycle;
+
+    /** 鎻愰啋鍛ㄦ湡 */
+    @Excel(name = "鎻愰啋鍛ㄦ湡")
+    private Integer reminderCycle;
+
+    /** 鐘舵�� */
+    @Excel(name = "鐘舵��")
+    private String meterStatus;
+
+    /** 閫昏緫鍒犻櫎鏍囧織,Y宸插垹闄�,N鏈垹闄� */
+    private String delFlage;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+
+    public String getCode() 
+    {
+        return code;
+    }
+    public void setMeterName(String meterName) 
+    {
+        this.meterName = meterName;
+    }
+
+    public String getMeterName() 
+    {
+        return meterName;
+    }
+    public void setMeterType(String meterType) 
+    {
+        this.meterType = meterType;
+    }
+
+    public String getMeterType() 
+    {
+        return meterType;
+    }
+    public void setModelNumber(String modelNumber) 
+    {
+        this.modelNumber = modelNumber;
+    }
+
+    public String getModelNumber() 
+    {
+        return modelNumber;
+    }
+    public void setMeasureRange(String measureRange) 
+    {
+        this.measureRange = measureRange;
+    }
+
+    public String getMeasureRange() 
+    {
+        return measureRange;
+    }
+    public void setManufacturer(String manufacturer) 
+    {
+        this.manufacturer = manufacturer;
+    }
+
+    public String getManufacturer() 
+    {
+        return manufacturer;
+    }
+    public void setPersonCharge(String personCharge) 
+    {
+        this.personCharge = personCharge;
+    }
+
+    public String getPersonCharge() 
+    {
+        return personCharge;
+    }
+    public void setInstallactionLocation(String installactionLocation) 
+    {
+        this.installactionLocation = installactionLocation;
+    }
+
+    public String getInstallactionLocation() 
+    {
+        return installactionLocation;
+    }
+    public void setStartTime(String startTime)
+    {
+        this.startTime = startTime;
+    }
+
+    public String getStartTime()
+    {
+        return startTime;
+    }
+    public void setCheckCycle(Integer checkCycle) 
+    {
+        this.checkCycle = checkCycle;
+    }
+
+    public Integer getCheckCycle() 
+    {
+        return checkCycle;
+    }
+    public void setReminderCycle(Integer reminderCycle) 
+    {
+        this.reminderCycle = reminderCycle;
+    }
+
+    public Integer getReminderCycle() 
+    {
+        return reminderCycle;
+    }
+    public void setMeterStatus(String meterStatus) 
+    {
+        this.meterStatus = meterStatus;
+    }
+
+    public String getMeterStatus() 
+    {
+        return meterStatus;
+    }
+    public void setDelFlage(String delFlage) 
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage() 
+    {
+        return delFlage;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("meterName", getMeterName())
+            .append("meterType", getMeterType())
+            .append("modelNumber", getModelNumber())
+            .append("measureRange", getMeasureRange())
+            .append("manufacturer", getManufacturer())
+            .append("personCharge", getPersonCharge())
+            .append("installactionLocation", getInstallactionLocation())
+            .append("startTime", getStartTime())
+            .append("checkCycle", getCheckCycle())
+            .append("reminderCycle", getReminderCycle())
+            .append("meterStatus", getMeterStatus())
+            .append("delFlage", getDelFlage())
+            .append("remark", getRemark())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterAnnexMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterAnnexMapper.java
new file mode 100644
index 0000000..ff8a062
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterAnnexMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.meter.mapper;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterAnnex;
+import java.util.List;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f闄勪欢Mapper鎺ュ彛
+ * 
+ * @author zhaowei
+ * @date 2020-02-14
+ */
+public interface MeterAnnexMapper 
+{
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 璁¢噺鍣ㄥ叿妗f闄勪欢
+     */
+    public MeterAnnex selectMeterAnnexById(String id);
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢鍒楄〃
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 璁¢噺鍣ㄥ叿妗f闄勪欢闆嗗悎
+     */
+    public List<MeterAnnex> selectMeterAnnexList(MeterAnnex meterAnnex);
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertMeterAnnex(MeterAnnex meterAnnex);
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateMeterAnnex(MeterAnnex meterAnnex);
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterAnnexById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterAnnexByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementCountMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementCountMapper.java
new file mode 100644
index 0000000..3b5d932
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementCountMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.meter.mapper;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementCount;
+import java.util.List;
+
+/**
+ * 璁¢噺鍣ㄥ叿缁熻鏌ヨMapper鎺ュ彛
+ * 
+ * @author zhaowei
+ * @date 2020-02-21
+ */
+public interface MeterImplementCountMapper 
+{
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param code 璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     */
+    public MeterImplementCount selectMeterImplementCountById(String code);
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ鍒楄〃
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 璁¢噺鍣ㄥ叿缁熻鏌ヨ闆嗗悎
+     */
+    public List<MeterImplementCount> selectMeterImplementCountList(MeterImplementCount meterImplementCount);
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 缁撴灉
+     */
+    public int insertMeterImplementCount(MeterImplementCount meterImplementCount);
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 缁撴灉
+     */
+    public int updateMeterImplementCount(MeterImplementCount meterImplementCount);
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param code 璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementCountById(String code);
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param codes 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementCountByIds(String[] codes);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementExcel.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementExcel.java
new file mode 100644
index 0000000..db9f973
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementExcel.java
@@ -0,0 +1,4 @@
+package com.dingzhuo.energy.basic.data.meter.mapper;
+
+public class MeterImplementExcel {
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementMapper.java
new file mode 100644
index 0000000..28eb5a4
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/mapper/MeterImplementMapper.java
@@ -0,0 +1,86 @@
+package com.dingzhuo.energy.basic.data.meter.mapper;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementExcel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f缁存姢Mapper鎺ュ彛
+ * 
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+public interface MeterImplementMapper 
+{
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    public MeterImplement selectMeterImplementById(String id);
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢
+     *
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢缂栧彿
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    public MeterImplement selectMeterImplementByCode(MeterImplement meterImplement);
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢闆嗗悎
+     */
+    public List<MeterImplement> selectMeterImplementList(MeterImplement meterImplement);
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢瀵煎嚭鍒楄〃锛屽叾涓瓧鍏稿瓧娈靛湪SQL涓繘琛岀炕璇�
+     *
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢闆嗗悎
+     */
+    public List<MeterImplementExcel> exectMeterImplementList(MeterImplement meterImplement);
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 缁撴灉
+     */
+    public int insertMeterImplement(MeterImplement meterImplement);
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 缁撴灉
+     */
+    public int updateMeterImplement(MeterImplement meterImplement);
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementByIds(String[] ids);
+
+    /**
+     * 鏍规嵁id闆嗗悎鏌ヨ璁¢噺鍣ㄥ叿淇℃伅
+     *
+     * @param meterIdList   璁¢噺鍣ㄥ叿id
+     * @return
+     */
+    List<MeterImplement> listMeterImplementByIds(@Param("meterIdList") List<String> meterIdList);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterAnnexService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterAnnexService.java
new file mode 100644
index 0000000..6c2e3db
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterAnnexService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.meter.service;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterAnnex;
+import java.util.List;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f闄勪欢Service鎺ュ彛
+ * 
+ * @author zhaowei
+ * @date 2020-02-14
+ */
+public interface IMeterAnnexService 
+{
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 璁¢噺鍣ㄥ叿妗f闄勪欢
+     */
+    public MeterAnnex selectMeterAnnexById(String id);
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢鍒楄〃
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 璁¢噺鍣ㄥ叿妗f闄勪欢闆嗗悎
+     */
+    public List<MeterAnnex> selectMeterAnnexList(MeterAnnex meterAnnex);
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertMeterAnnex(MeterAnnex meterAnnex);
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 缁撴灉
+     */
+    public int updateMeterAnnex(MeterAnnex meterAnnex);
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterAnnexByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢淇℃伅
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterAnnexById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementCountService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementCountService.java
new file mode 100644
index 0000000..30fd995
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementCountService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.meter.service;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementCount;
+import java.util.List;
+
+/**
+ * 璁¢噺鍣ㄥ叿缁熻鏌ヨService鎺ュ彛
+ * 
+ * @author zhaowei
+ * @date 2020-02-21
+ */
+public interface IMeterImplementCountService 
+{
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param code 璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     */
+    public MeterImplementCount selectMeterImplementCountById(String code);
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ鍒楄〃
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 璁¢噺鍣ㄥ叿缁熻鏌ヨ闆嗗悎
+     */
+    public List<MeterImplementCount> selectMeterImplementCountList(MeterImplementCount meterImplementCount);
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 缁撴灉
+     */
+    public int insertMeterImplementCount(MeterImplementCount meterImplementCount);
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 缁撴灉
+     */
+    public int updateMeterImplementCount(MeterImplementCount meterImplementCount);
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param codes 闇�瑕佸垹闄ょ殑璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementCountByIds(String[] codes);
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ淇℃伅
+     * 
+     * @param code 璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementCountById(String code);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementService.java
new file mode 100644
index 0000000..388b437
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/IMeterImplementService.java
@@ -0,0 +1,95 @@
+package com.dingzhuo.energy.basic.data.meter.service;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementExcel;
+import com.dingzhuo.energy.framework.security.LoginUser;
+
+import java.util.List;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f缁存姢Service鎺ュ彛
+ * 
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+public interface IMeterImplementService 
+{
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    public MeterImplement selectMeterImplementById(String id);
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢
+     *
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢缂栧彿
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    public MeterImplement selectMeterImplementByCode(MeterImplement meterImplement);
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢闆嗗悎
+     */
+    public List<MeterImplement> selectMeterImplementList(MeterImplement meterImplement);
+
+    /**
+     * 瀵煎嚭璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     *
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢闆嗗悎
+     */
+    public List<MeterImplementExcel> exectMeterImplementList(MeterImplement meterImplement);
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 缁撴灉
+     */
+    public int insertMeterImplement(MeterImplement meterImplement);
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 缁撴灉
+     */
+    public int updateMeterImplement(MeterImplement meterImplement);
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢淇℃伅
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 缁撴灉
+     */
+    public int deleteMeterImplementById(String id);
+
+    /**
+     * Excel瀵煎叆 璁¢噺鍣ㄥ叿妗f缁存姢淇℃伅
+     *
+     * @param meterImplementList 瑕佸鍏ョ殑璁¢噺鍣ㄥ叿妗f闆嗗悎
+     * @param loginUser          鐧诲綍鐢ㄦ埛瀵硅薄
+     * @return 缁撴灉
+     */
+    public String excelImpSave(List<MeterImplement> meterImplementList, LoginUser loginUser);
+
+    /**
+     * 鏍规嵁id闆嗗悎鏌ヨ璁¢噺鍣ㄥ叿淇℃伅
+     *
+     * @param meterIdList
+     * @return
+     */
+    List<MeterImplement> listMeterImplementByIds(List<String> meterIdList);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterAnnexServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterAnnexServiceImpl.java
new file mode 100644
index 0000000..4976cf4
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterAnnexServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.basic.data.meter.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.meter.mapper.MeterAnnexMapper;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterAnnex;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterAnnexService;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f闄勪欢Service涓氬姟灞傚鐞�
+ * 
+ * @author zhaowei
+ * @date 2020-02-14
+ */
+@Service
+public class MeterAnnexServiceImpl implements IMeterAnnexService 
+{
+    @Autowired
+    private MeterAnnexMapper meterAnnexMapper;
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 璁¢噺鍣ㄥ叿妗f闄勪欢
+     */
+    @Override
+    public MeterAnnex selectMeterAnnexById(String id)
+    {
+        return meterAnnexMapper.selectMeterAnnexById(id);
+    }
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢鍒楄〃
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 璁¢噺鍣ㄥ叿妗f闄勪欢
+     */
+    @Override
+    public List<MeterAnnex> selectMeterAnnexList(MeterAnnex meterAnnex)
+    {
+        return meterAnnexMapper.selectMeterAnnexList(meterAnnex);
+    }
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertMeterAnnex(MeterAnnex meterAnnex)
+    {
+        meterAnnex.setCreateTime(DateUtils.getNowDate());
+        return meterAnnexMapper.insertMeterAnnex(meterAnnex);
+    }
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param meterAnnex 璁¢噺鍣ㄥ叿妗f闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateMeterAnnex(MeterAnnex meterAnnex)
+    {
+        meterAnnex.setUpdateTime(DateUtils.getNowDate());
+        return meterAnnexMapper.updateMeterAnnex(meterAnnex);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteMeterAnnexByIds(String[] ids)
+    {
+        return meterAnnexMapper.deleteMeterAnnexByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢淇℃伅
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteMeterAnnexById(String id)
+    {
+        return meterAnnexMapper.deleteMeterAnnexById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementCountServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementCountServiceImpl.java
new file mode 100644
index 0000000..dbc5aed
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementCountServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.basic.data.meter.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.meter.mapper.MeterImplementCountMapper;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementCount;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementCountService;
+
+/**
+ * 璁¢噺鍣ㄥ叿缁熻鏌ヨService涓氬姟灞傚鐞�
+ * 
+ * @author zhaowei
+ * @date 2020-02-21
+ */
+@Service
+public class MeterImplementCountServiceImpl implements IMeterImplementCountService 
+{
+    @Autowired
+    private MeterImplementCountMapper meterImplementCountMapper;
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param code 璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     */
+    @Override
+    public MeterImplementCount selectMeterImplementCountById(String code)
+    {
+        return meterImplementCountMapper.selectMeterImplementCountById(code);
+    }
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ鍒楄〃
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     */
+    @Override
+    public List<MeterImplementCount> selectMeterImplementCountList(MeterImplementCount meterImplementCount)
+    {
+        return meterImplementCountMapper.selectMeterImplementCountList(meterImplementCount);
+    }
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertMeterImplementCount(MeterImplementCount meterImplementCount)
+    {
+        meterImplementCount.setCreateTime(DateUtils.getNowDate());
+        return meterImplementCountMapper.insertMeterImplementCount(meterImplementCount);
+    }
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param meterImplementCount 璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateMeterImplementCount(MeterImplementCount meterImplementCount)
+    {
+        meterImplementCount.setUpdateTime(DateUtils.getNowDate());
+        return meterImplementCountMapper.updateMeterImplementCount(meterImplementCount);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ
+     * 
+     * @param codes 闇�瑕佸垹闄ょ殑璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteMeterImplementCountByIds(String[] codes)
+    {
+        return meterImplementCountMapper.deleteMeterImplementCountByIds(codes);
+    }
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ淇℃伅
+     * 
+     * @param code 璁¢噺鍣ㄥ叿缁熻鏌ヨID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteMeterImplementCountById(String code)
+    {
+        return meterImplementCountMapper.deleteMeterImplementCountById(code);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementServiceImpl.java
new file mode 100644
index 0000000..249e95f
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/meter/service/impl/MeterImplementServiceImpl.java
@@ -0,0 +1,250 @@
+package com.dingzhuo.energy.basic.data.meter.service.impl;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementExcel;
+import com.dingzhuo.energy.basic.data.meter.mapper.MeterImplementMapper;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementService;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.mapper.SysDictDataMapper;
+import com.dingzhuo.energy.project.system.service.impl.SysUserServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * 璁¢噺鍣ㄥ叿妗f缁存姢Service涓氬姟灞傚鐞�
+ * 
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+@Service
+public class MeterImplementServiceImpl implements IMeterImplementService 
+{
+    @Autowired
+    private MeterImplementMapper meterImplementMapper;
+
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+
+    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    @Override
+    public MeterImplement selectMeterImplementById(String id)
+    {
+        return meterImplementMapper.selectMeterImplementById(id);
+    }
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢
+     *
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢 缂栧彿
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    @Override
+    public MeterImplement selectMeterImplementByCode(MeterImplement meterImplement) {
+        return meterImplementMapper.selectMeterImplementByCode(meterImplement);
+    }
+
+    /**
+     * 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    @Override
+    public List<MeterImplement> selectMeterImplementList(MeterImplement meterImplement)
+    {
+        return meterImplementMapper.selectMeterImplementList(meterImplement);
+    }
+    /**
+     * 瀵煎嚭璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     *
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 璁¢噺鍣ㄥ叿妗f缁存姢
+     */
+    @Override
+    public List<MeterImplementExcel> exectMeterImplementList(MeterImplement meterImplement)
+    {
+        return meterImplementMapper.exectMeterImplementList(meterImplement);
+    }
+
+    /**
+     * 鏂板璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertMeterImplement(MeterImplement meterImplement)
+    {
+        meterImplement.setCreateTime(DateUtils.getNowDate());
+        return meterImplementMapper.insertMeterImplement(meterImplement);
+    }
+
+    /**
+     * 淇敼璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param meterImplement 璁¢噺鍣ㄥ叿妗f缁存姢
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateMeterImplement(MeterImplement meterImplement)
+    {
+        meterImplement.setUpdateTime(DateUtils.getNowDate());
+        return meterImplementMapper.updateMeterImplement(meterImplement);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteMeterImplementByIds(String[] ids)
+    {
+        return meterImplementMapper.deleteMeterImplementByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢淇℃伅
+     * 
+     * @param id 璁¢噺鍣ㄥ叿妗f缁存姢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteMeterImplementById(String id)
+    {
+        return meterImplementMapper.deleteMeterImplementById(id);
+    }
+
+    /**
+     * Excel瀵煎叆 璁¢噺鍣ㄥ叿妗f缁存姢淇℃伅
+     *
+     * @param meterImplementList  瑕佸鍏ョ殑璁¢噺鍣ㄥ叿妗f闆嗗悎
+     * @param loginUser 鐧诲綍鐢ㄦ埛瀵硅薄
+     * @return 缁撴灉
+     */
+    @Override
+    public String excelImpSave(List<MeterImplement> meterImplementList, LoginUser loginUser)
+    {
+
+        if (StringUtils.isNull(meterImplementList) || meterImplementList.size() == 0)
+        {
+            throw new CustomException("瀵煎叆璁¢噺鍣ㄥ叿妗f涓嶈兘涓虹┖锛�");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        //1銆佸瓧鍏告暟鎹炕璇�
+        //璁¢噺鍣ㄥ叿鐘舵��
+        List<SysDictData> meterStatusList = dictDataMapper.selectDictDataByType("meter_status");
+        Map<String,String> meterStatusMap = this.initDictMap(meterStatusList);
+        //璁¢噺鍣ㄥ叿绫诲瀷
+        List<SysDictData> meterTypeList = dictDataMapper.selectDictDataByType(
+                "sys_device_type");
+        Map<String,String> meterTypeMap = this.initDictMap(meterTypeList);
+
+        for (MeterImplement meterImplement : meterImplementList)
+        {
+            try
+            {
+                //  妫�瀹氬懆鏈熴�佹彁閱掑懆鏈� 瀹氫箟鐨処nteger绫诲瀷锛屽鏋滄暟鎹笉鍖归厤浼氶粯璁や负0
+                meterImplement.setCheckCycle(meterImplement.getCheckCycle()==null?1:meterImplement.getCheckCycle());
+                meterImplement.setReminderCycle(meterImplement.getReminderCycle()==null?1:meterImplement.getReminderCycle());
+                // 2楠岃瘉 缂栫爜鏄惁瀛樺湪
+                MeterImplement chekcMeterImplement = meterImplementMapper.selectMeterImplementByCode(meterImplement);
+                if (StringUtils.isNull(chekcMeterImplement))
+                {
+                    //璁剧疆涓婚敭
+                    meterImplement.setId(UUID.randomUUID().toString());
+                    //缈昏瘧鍣ㄥ叿鐘舵�� 鏃犳垨鑰呭�间笉瀵瑰垯璁剧疆涓虹┖瀛楃涓�
+                    String meterStatus= StringUtils.nvl(meterStatusMap.get(meterImplement.getMeterStatus()+""),"");
+                    //鍒ゆ柇鐘舵�佹槸鍚︽纭�
+                    if(StringUtils.isEmpty(meterStatus))
+                    {
+                        failureNum++;
+                        failureMsg.append("<br/>" + failureNum + "銆佺紪鍙� " + meterImplement.getCode() + " 鐨勭姸鎬侀敊璇�");
+                        continue;
+                    }
+                    meterImplement.setMeterStatus(meterStatus);
+                    //缈昏瘧鍣ㄥ叿绉嶇被  鏃犳垨鑰呭�间笉瀵瑰垯璁剧疆涓虹┖瀛楃涓�
+                    String meterType= StringUtils.nvl(meterTypeMap.get(meterImplement.getMeterType()+""),"");
+                    if(StringUtils.isEmpty(meterType))
+                    {
+                        failureNum++;
+                        failureMsg.append("<br/>" + failureNum + "銆佺紪鍙� " + meterImplement.getCode() + " 鐨勭绫婚敊璇�");
+                        continue;
+                    }
+                    meterImplement.setMeterType(meterType);
+                    //璁剧疆寤虹珛浜哄拰寤虹珛鏃堕棿
+                    meterImplement.setCreateBy(loginUser.getUsername());
+                    meterImplement.setCreateTime(new Date());
+                    //瀛樺偍涓�鏉℃暟鎹�
+                    this.insertMeterImplement(meterImplement);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "銆佺紪鍙� " + meterImplement.getCode() + " 瀵煎叆鎴愬姛");
+                }
+                else
+                {
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "銆佺紪鍙� " + meterImplement.getCode() + " 宸插瓨鍦�");
+                }
+            }
+            catch (Exception e)
+            {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "銆佺紪鍙� " + meterImplement.getCode() + " 瀵煎叆澶辫触锛�";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0) {
+            failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細");
+            throw new CustomException(failureMsg.toString());
+        } else {
+            successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏� " + successNum + " 鏉★紝鏁版嵁濡備笅锛�");
+        }
+        return successMsg.toString();
+    }
+
+    /**
+     * 鏍规嵁id闆嗗悎鏌ヨ璁¢噺鍣ㄥ叿淇℃伅
+     *
+     * @param meterIdList 璁¢噺鍣ㄥ叿id
+     * @return
+     */
+    @Override
+    public List<MeterImplement> listMeterImplementByIds(List<String> meterIdList) {
+        return meterImplementMapper.listMeterImplementByIds(meterIdList);
+    }
+
+    /**
+     * 灏嗗瓧鍏哥被鍨� 瀵瑰簲鐨� 瀛楀吀闆嗗悎  瀛樺叆map涓娇鐢�
+     *
+     * @param sysDictDataList
+     * @return
+     */
+    public Map initDictMap(List<SysDictData> sysDictDataList) {
+        Map<String, String> map = new HashMap<String, String>();
+        for (SysDictData sysDictData : sysDictDataList) {
+            //瀛樻斁 key=鏍囩鍚嶅瓧  value鏄� 璁剧疆鍊�
+            map.put(sysDictData.getDictLabel(), sysDictData.getDictValue());
+        }
+        return map;
+    }
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyAnnexController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyAnnexController.java
new file mode 100644
index 0000000..d369de2
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyAnnexController.java
@@ -0,0 +1,178 @@
+package com.dingzhuo.energy.basic.data.policy.controller;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyAnnex;
+import com.dingzhuo.energy.basic.data.policy.service.IPolicyAnnexService;
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.common.utils.file.FileUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡闄勪欢Controller
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+@RestController
+@RequestMapping("/policy/annex")
+public class PolicyAnnexController extends BaseController
+{
+    @Autowired
+    private IPolicyAnnexService policyAnnexService;
+    @Autowired
+    private TokenService tokenService;
+    private static final Logger log = LoggerFactory.getLogger(PolicyAnnexController.class);
+    /**
+     * 鏌ヨ鏀跨瓥娉曡闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('policy:annex:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(PolicyAnnex policyAnnex)
+    {
+        startPage();
+        List<PolicyAnnex> list = policyAnnexService.selectPolicyAnnexList(policyAnnex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鏀跨瓥娉曡闄勪欢鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('policy:annex:export')")
+    @Log(title = "鏀跨瓥娉曡闄勪欢", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(PolicyAnnex policyAnnex)
+    {
+        List<PolicyAnnex> list = policyAnnexService.selectPolicyAnnexList(policyAnnex);
+        ExcelUtil<PolicyAnnex> util = new ExcelUtil<PolicyAnnex>(PolicyAnnex.class);
+        return util.exportExcel(list, "annex");
+    }
+
+    /**
+     * 鑾峰彇鏀跨瓥娉曡闄勪欢璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('policy:annex:query')")
+    @GetMapping(value = "/{filePath}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(policyAnnexService.selectPolicyAnnexById(id));
+    }
+
+    /**
+     * 鏂板鏀跨瓥娉曡闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('policy:annex:add')")
+    @Log(title = "鏀跨瓥娉曡闄勪欢", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody PolicyAnnex policyAnnex)
+    {
+        return toAjax(policyAnnexService.insertPolicyAnnex(policyAnnex));
+    }
+
+    /**
+     * 淇敼鏀跨瓥娉曡闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('policy:annex:edit')")
+    @Log(title = "鏀跨瓥娉曡闄勪欢", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody PolicyAnnex policyAnnex)
+    {
+        return toAjax(policyAnnexService.updatePolicyAnnex(policyAnnex));
+    }
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡闄勪欢
+     */
+    @PreAuthorize("@ss.hasPermi('policy:annex:remove')")
+    @Log(title = "鏀跨瓥娉曡闄勪欢", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(policyAnnexService.deletePolicyAnnexByIds(ids));
+    }
+
+    @Log(title = "鏀跨瓥娉曡闄勪欢涓婁紶", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('policy:annex:fileImport')")
+    @PostMapping("/fileImport")
+    public AjaxResult importData(MultipartFile file, String regulations_id) throws Exception
+    {
+        if (!file.isEmpty())
+        {
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            //鑾峰彇閰嶇疆鐨勬枃浠朵笂浼犺矾寰�
+            String uploadPathDir = RuoYiConfig.getUploadPath();
+            //鑾峰彇鏂囦欢鍘熷鍚嶇О
+            String fileName = file.getOriginalFilename();
+            //鑾峰彇鏂囦欢鎵╁睍鍚�
+            String fileSuffix = FileUploadUtils.getExtension(file);
+//            System.out.println("implementId==="+implementId);
+//            System.out.println("filedir==="+uploadPathDir);
+//            System.out.println("fileName==="+fileName);
+//            System.out.println("fileSuffix==="+fileSuffix);
+            //鏂囦欢鏈�缁堜繚瀛樼殑缁濆璺緞
+            String filePath = FileUploadUtils.uploadAll(uploadPathDir, file);
+//            System.out.println("涓婁紶鏂囦欢鍦板潃:===>"+filePath);
+            PolicyAnnex policyAnnex=new PolicyAnnex();
+            //璁剧疆涓婚敭UUID
+            policyAnnex.setId(IdUtils.simpleUUID());
+            policyAnnex.setFileName(fileName);
+            policyAnnex.setFilePath(filePath);
+            policyAnnex.setFileSuffix(fileSuffix);
+            policyAnnex.setRegulationsId(regulations_id);
+            policyAnnex.setCreateBy(loginUser.getUsername());
+            if (this.policyAnnexService.insertPolicyAnnex(policyAnnex)>0)
+            {
+                return AjaxResult.success("闄勪欢涓婁紶瀹屾垚");
+            }
+        }
+        return AjaxResult.success("闄勪欢涓婁紶澶辫触");
+    }
+    /**
+     * 閫氱敤鎸囧畾鏂囦欢涓嬭浇璇锋眰
+     *
+     * @param showFileName 涓嬭浇灞曠ず鏂囦欢鍚嶇О
+    //     * @param filePath 涓嬭浇鏂囦欢缁濆璺緞 甯� 鏂囦欢鐪熷疄鍚嶅瓧鍙婅矾寰�
+     * @param delete 鏄惁鍒犻櫎/
+     */
+    @PreAuthorize("@ss.hasPermi('policy:annex:assignDownload')")
+    @PostMapping("/assignDownload")
+    public void fileAssignDownload(String showFileName, String filePath, Boolean delete, HttpServletResponse response, HttpServletRequest request)
+    {
+
+        try
+        {
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition",
+                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, showFileName));
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+//            if (delete)
+//            {
+//                FileUtils.deleteFile(filePath);
+//            }
+            log.error("涓嬭浇鎴愬姛", "aa");
+        }
+        catch (Exception e)
+        {
+            log.error("涓嬭浇鏂囦欢澶辫触", e);
+        }
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsController.java
new file mode 100644
index 0000000..1290c27
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsController.java
@@ -0,0 +1,117 @@
+package com.dingzhuo.energy.basic.data.policy.controller;
+
+
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulations;
+import com.dingzhuo.energy.basic.data.policy.service.IPolicyRegulationsService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 鏀跨瓥娉曡缁存姢Controller
+ *
+ * @author liuli
+ * @date 2020-04-23
+ */
+@RestController
+@RequestMapping("/policy/policyInsert")
+@Api(value = "鏀跨瓥娉曡绠$悊",tags = {"鏀跨瓥娉曡绠$悊"})
+public class PolicyRegulationsController extends BaseController
+{
+    @Autowired
+    private IPolicyRegulationsService policyRegulationsService;
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡缁存姢鍒楄〃
+     */
+    @ApiOperation(value = "鏀跨瓥娉曡鍒楄〃")
+    @PreAuthorize("@ss.hasPermi('policy:policyInsert:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(PolicyRegulations policyRegulations)
+    {
+        startPage();
+        List<PolicyRegulations> list = policyRegulationsService.selectPolicyRegulationsList(policyRegulations);
+        return getDataTable(list);
+    }
+    /**
+     * 瀵煎嚭璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+     */
+    @ApiOperation(value = "鏀跨瓥娉曡鍒楄〃瀵煎嚭")
+    @PreAuthorize("@ss.hasPermi('policy:policyInsert:export')")
+    @Log(title = "鏀跨瓥娉曡鏌ヨ", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(PolicyRegulations policyRegulations)
+    {
+        List<PolicyRegulations> list = policyRegulationsService.selectPolicyRegulationsList(policyRegulations);
+        ExcelUtil<PolicyRegulations> util = new ExcelUtil<PolicyRegulations>(PolicyRegulations.class);
+        return util.exportExcel(list, "implement");
+    }
+    /**
+     * 鑾峰彇鏀跨瓥娉曡缁存姢璇︾粏淇℃伅
+     */
+    @ApiOperation(value = "鏍规嵁id鑾峰彇鏀跨瓥娉曡璇︽儏")
+    @PreAuthorize("@ss.hasPermi('policy:policyInsert:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(policyRegulationsService.selectPolicyRegulationsById(id));
+    }
+
+    /**
+     * 鏂板鏀跨瓥娉曡缁存姢
+     */
+    @ApiOperation(value = "鏂板鏀跨瓥娉曡")
+    @PreAuthorize("@ss.hasPermi('policy:policyInsert:add')")
+    @Log(title = "鏀跨瓥娉曡缁存姢", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody PolicyRegulations policyRegulations)
+    {
+        policyRegulations.setId(UUID.randomUUID().toString());
+        policyRegulations.setOperator(SecurityUtils.getUsername());
+        policyRegulations.setCreationTime(DateUtils.getNowDate());
+        return toAjax(policyRegulationsService.insertPolicyRegulations(policyRegulations));
+    }
+
+    /**
+     * 淇敼鏀跨瓥娉曡缁存姢
+     */
+    @ApiOperation(value = "缂栬緫鏀跨瓥娉曡")
+    @PreAuthorize("@ss.hasPermi('policy:policyInsert:edit')")
+    @Log(title = "鏀跨瓥娉曡缁存姢", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody PolicyRegulations policyRegulations)
+    {
+        return toAjax(policyRegulationsService.updatePolicyRegulations(policyRegulations));
+    }
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡缁存姢
+     */
+    @ApiOperation(value = "鍒犻櫎鏀跨瓥娉曡")
+    @PreAuthorize("@ss.hasPermi('policy:policyInsert:remove')")
+    @Log(title = "鏀跨瓥娉曡缁存姢", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(policyRegulationsService.deletePolicyRegulationsByIds(ids));
+    }
+
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsTranslateController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsTranslateController.java
new file mode 100644
index 0000000..75d72ac
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/controller/PolicyRegulationsTranslateController.java
@@ -0,0 +1,103 @@
+package com.dingzhuo.energy.basic.data.policy.controller;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulationsTranslate;
+import com.dingzhuo.energy.basic.data.policy.service.IPolicyRegulationsTranslateService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 鏀跨瓥娉曡鏌ヨController
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+@RestController
+@RequestMapping("/policy/policyselete")
+public class PolicyRegulationsTranslateController extends BaseController
+{
+    @Autowired
+    private IPolicyRegulationsTranslateService policyRegulationsTranslateService;
+    /**
+     * 鏌ヨ鏀跨瓥娉曡鏌ヨ鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('policy:policyselete:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(PolicyRegulationsTranslate policyRegulationsTranslate)
+    {
+        startPage();
+        List<PolicyRegulationsTranslate> list = policyRegulationsTranslateService.selectPolicyRegulationsTranslateList(policyRegulationsTranslate);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鏀跨瓥娉曡鏌ヨ鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('policy:policyselete:export')")
+    @Log(title = "鏀跨瓥娉曡鏌ヨ", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(PolicyRegulationsTranslate policyRegulationsTranslate)
+    {
+        List<PolicyRegulationsTranslate> list = policyRegulationsTranslateService.selectPolicyRegulationsTranslateList(policyRegulationsTranslate);
+        ExcelUtil<PolicyRegulationsTranslate> util = new ExcelUtil<PolicyRegulationsTranslate>(PolicyRegulationsTranslate.class);
+        return util.exportExcel(list, "policyselete");
+
+    }
+
+    /**
+     * 鑾峰彇鏀跨瓥娉曡鏌ヨ璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('policy:policyselete:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(policyRegulationsTranslateService.selectPolicyRegulationsTranslateById(id));
+    }
+
+    /**
+     * 鏂板鏀跨瓥娉曡鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('policy:policyselete:add')")
+    @Log(title = "鏀跨瓥娉曡鏌ヨ", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody PolicyRegulationsTranslate policyRegulationsTranslate)
+    {
+        policyRegulationsTranslate.setId(UUID.randomUUID().toString());
+        policyRegulationsTranslate.setOperator(SecurityUtils.getUsername());
+        policyRegulationsTranslate.setCreationTime(DateUtils.getNowDate());
+        return toAjax(policyRegulationsTranslateService.insertPolicyRegulationsTranslate(policyRegulationsTranslate));
+    }
+
+    /**
+     * 淇敼鏀跨瓥娉曡鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('policy:policyselete:edit')")
+    @Log(title = "鏀跨瓥娉曡鏌ヨ", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody PolicyRegulationsTranslate policyRegulationsTranslate)
+    {
+        return toAjax(policyRegulationsTranslateService.updatePolicyRegulationsTranslate(policyRegulationsTranslate));
+    }
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('policy:policyselete:remove')")
+    @Log(title = "鏀跨瓥娉曡鏌ヨ", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(policyRegulationsTranslateService.deletePolicyRegulationsTranslateByIds(ids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyAnnex.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyAnnex.java
new file mode 100644
index 0000000..70e78ee
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyAnnex.java
@@ -0,0 +1,131 @@
+package com.dingzhuo.energy.basic.data.policy.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鏀跨瓥娉曡闄勪欢瀵硅薄 policy_annex
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+public class PolicyAnnex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鏂囦欢璺緞 */
+    private String filePath;
+
+    /** 鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄� */
+    private String delFlage;
+
+    /** 寤虹珛浜� */
+    private String createOperator;
+
+    /** 淇敼浜� */
+    private String updateOperator;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鍏宠仈policy_regulations */
+    private String regulationsId;
+
+    /** 鏂囦欢鍚� */
+    @Excel(name = "鏂囦欢鍚�")
+    private String fileName;
+
+    /** 鏂囦欢鍚庣紑 */
+    private String fileSuffix;
+
+    public void setFilePath(String filePath) 
+    {
+        this.filePath = filePath;
+    }
+
+    public String getFilePath() 
+    {
+        return filePath;
+    }
+    public void setDelFlage(String delFlage) 
+    {
+        this.delFlage = delFlage;
+    }
+
+    public String getDelFlage() 
+    {
+        return delFlage;
+    }
+    public void setCreateOperator(String createOperator) 
+    {
+        this.createOperator = createOperator;
+    }
+
+    public String getCreateOperator() 
+    {
+        return createOperator;
+    }
+    public void setUpdateOperator(String updateOperator) 
+    {
+        this.updateOperator = updateOperator;
+    }
+
+    public String getUpdateOperator() 
+    {
+        return updateOperator;
+    }
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setRegulationsId(String regulationsId) 
+    {
+        this.regulationsId = regulationsId;
+    }
+
+    public String getRegulationsId() 
+    {
+        return regulationsId;
+    }
+    public void setFileName(String fileName) 
+    {
+        this.fileName = fileName;
+    }
+
+    public String getFileName() 
+    {
+        return fileName;
+    }
+    public void setFileSuffix(String fileSuffix) 
+    {
+        this.fileSuffix = fileSuffix;
+    }
+
+    public String getFileSuffix() 
+    {
+        return fileSuffix;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("filePath", getFilePath())
+            .append("delFlage", getDelFlage())
+            .append("createTime", getCreateTime())
+            .append("createOperator", getCreateOperator())
+            .append("updateTime", getUpdateTime())
+            .append("updateOperator", getUpdateOperator())
+            .append("id", getId())
+            .append("regulationsId", getRegulationsId())
+            .append("fileName", getFileName())
+            .append("fileSuffix", getFileSuffix())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulations.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulations.java
new file mode 100644
index 0000000..92ed43b
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulations.java
@@ -0,0 +1,117 @@
+package com.dingzhuo.energy.basic.data.policy.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 鏀跨瓥娉曡缁存姢瀵硅薄 policy_regulations
+ *
+ * @author liuli
+ * @date 2020-04-23
+ */
+@ApiModel(value = "鏀跨瓥娉曡")
+public class PolicyRegulations extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 搴忓彿 */
+    @ApiModelProperty(value = "搴忓彿")
+    private String id;
+
+    /** 鏍囬 */
+    @Excel(name = "鏍囬")
+    @ApiModelProperty(value = "鏍囬")
+    private String titleName;
+
+    /** 鍐呭 */
+    @Excel(name = "鍐呭")
+    @ApiModelProperty(value = "鍐呭")
+    private String content;
+
+    /** 鍒嗙被 */
+    @Excel(name = "鍒嗙被")
+    @ApiModelProperty(value = "鍒嗙被")
+    private String sort;
+
+    /** 鍒涘缓鏃堕棿 */
+    @Excel(name = "鍒涘缓鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    private Date creationTime;
+
+    /** 鎿嶄綔浜哄憳 */
+    @Excel(name = "鎿嶄綔浜哄憳")
+    @ApiModelProperty(value = "鎿嶄綔浜哄憳")
+    private String operator;
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setTitleName(String titleName)
+    {
+        this.titleName = titleName;
+    }
+
+    public String getTitleName()
+    {
+        return titleName;
+    }
+    public void setContent(String content)
+    {
+        this.content = content;
+    }
+
+    public String getContent()
+    {
+        return content;
+    }
+    public void setSort(String sort)
+    {
+        this.sort = sort;
+    }
+
+    public String getSort()
+    {
+        return sort;
+    }
+    public void setCreationTime(Date creationTime)
+    {
+        this.creationTime = creationTime;
+    }
+
+    public Date getCreationTime()
+    {
+        return creationTime;
+    }
+    public void setOperator(String operator)
+    {
+        this.operator = operator;
+    }
+
+    public String getOperator()
+    {
+        return operator;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("titleName", getTitleName())
+            .append("content", getContent())
+            .append("sort", getSort())
+            .append("creationTime", getCreationTime())
+            .append("operator", getOperator())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulationsTranslate.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulationsTranslate.java
new file mode 100644
index 0000000..cff69ab
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/domain/PolicyRegulationsTranslate.java
@@ -0,0 +1,108 @@
+package com.dingzhuo.energy.basic.data.policy.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 鏀跨瓥娉曡鏌ヨ瀵硅薄 policy_regulations
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+public class PolicyRegulationsTranslate extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 搴忓彿 */
+    private String id;
+
+    /** 鏍囬 */
+    @Excel(name = "鏍囬")
+    private String titleName;
+
+    /** 鍐呭 */
+    @Excel(name = "鍐呭")
+    private String content;
+
+    /** 鍒嗙被 */
+    @Excel(name = "鍒嗙被")
+    private String sort;
+
+    /** 鍒涘缓鏃堕棿 */
+    @Excel(name = "鍒涘缓鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date creationTime;
+
+    /** 鎿嶄綔浜哄憳 */
+    @Excel(name = "鎿嶄綔浜哄憳")
+    private String operator;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setTitleName(String titleName) 
+    {
+        this.titleName = titleName;
+    }
+
+    public String getTitleName() 
+    {
+        return titleName;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+    public void setSort(String sort) 
+    {
+        this.sort = sort;
+    }
+
+    public String getSort() 
+    {
+        return sort;
+    }
+    public void setCreationTime(Date creationTime) 
+    {
+        this.creationTime = creationTime;
+    }
+
+    public Date getCreationTime() 
+    {
+        return creationTime;
+    }
+    public void setOperator(String operator) 
+    {
+        this.operator = operator;
+    }
+
+    public String getOperator() 
+    {
+        return operator;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("titleName", getTitleName())
+            .append("content", getContent())
+            .append("sort", getSort())
+            .append("creationTime", getCreationTime())
+            .append("operator", getOperator())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyAnnexMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyAnnexMapper.java
new file mode 100644
index 0000000..01f451e
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyAnnexMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.policy.mapper;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyAnnex;
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡闄勪欢Mapper鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+public interface PolicyAnnexMapper 
+{
+    /**
+     * 鏌ヨ鏀跨瓥娉曡闄勪欢
+     * 
+     * @param id 鏀跨瓥娉曡闄勪欢ID
+     * @return 鏀跨瓥娉曡闄勪欢
+     */
+    public PolicyAnnex selectPolicyAnnexById(String id);
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡闄勪欢鍒楄〃
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 鏀跨瓥娉曡闄勪欢闆嗗悎
+     */
+    public List<PolicyAnnex> selectPolicyAnnexList(PolicyAnnex policyAnnex);
+
+    /**
+     * 鏂板鏀跨瓥娉曡闄勪欢
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertPolicyAnnex(PolicyAnnex policyAnnex);
+
+    /**
+     * 淇敼鏀跨瓥娉曡闄勪欢
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 缁撴灉
+     */
+    public int updatePolicyAnnex(PolicyAnnex policyAnnex);
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡闄勪欢
+     * 
+     * @param id 鏀跨瓥娉曡闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyAnnexById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyAnnexByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsMapper.java
new file mode 100644
index 0000000..f9e9620
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsMapper.java
@@ -0,0 +1,65 @@
+package com.dingzhuo.energy.basic.data.policy.mapper;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplementExcel;
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulations;
+
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡缁存姢Mapper鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-04-23
+ */
+public interface PolicyRegulationsMapper 
+{
+    /**
+     * 鏌ヨ鏀跨瓥娉曡缁存姢
+     * 
+     * @param id 鏀跨瓥娉曡缁存姢ID
+     * @return 鏀跨瓥娉曡缁存姢
+     */
+    public PolicyRegulations selectPolicyRegulationsById(String id);
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡缁存姢鍒楄〃
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 鏀跨瓥娉曡缁存姢闆嗗悎
+     */
+    public List<PolicyRegulations> selectPolicyRegulationsList(PolicyRegulations policyRegulations);
+
+    /**
+     * 鏂板鏀跨瓥娉曡缁存姢
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 缁撴灉
+     */
+    public int insertPolicyRegulations(PolicyRegulations policyRegulations);
+
+    /**
+     * 淇敼鏀跨瓥娉曡缁存姢
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 缁撴灉
+     */
+    public int updatePolicyRegulations(PolicyRegulations policyRegulations);
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡缁存姢
+     * 
+     * @param id 鏀跨瓥娉曡缁存姢ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡缁存姢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsByIds(String[] ids);
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsTranslateMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsTranslateMapper.java
new file mode 100644
index 0000000..8cfaecd
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/mapper/PolicyRegulationsTranslateMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.policy.mapper;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulationsTranslate;
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡鏌ヨMapper鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+public interface PolicyRegulationsTranslateMapper 
+{
+    /**
+     * 鏌ヨ鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param id 鏀跨瓥娉曡鏌ヨID
+     * @return 鏀跨瓥娉曡鏌ヨ
+     */
+    public PolicyRegulationsTranslate selectPolicyRegulationsTranslateById(String id);
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡鏌ヨ鍒楄〃
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 鏀跨瓥娉曡鏌ヨ闆嗗悎
+     */
+    public List<PolicyRegulationsTranslate> selectPolicyRegulationsTranslateList(PolicyRegulationsTranslate policyRegulationsTranslate);
+
+    /**
+     * 鏂板鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 缁撴灉
+     */
+    public int insertPolicyRegulationsTranslate(PolicyRegulationsTranslate policyRegulationsTranslate);
+
+    /**
+     * 淇敼鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 缁撴灉
+     */
+    public int updatePolicyRegulationsTranslate(PolicyRegulationsTranslate policyRegulationsTranslate);
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param id 鏀跨瓥娉曡鏌ヨID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsTranslateById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsTranslateByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyAnnexService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyAnnexService.java
new file mode 100644
index 0000000..a4513ad
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyAnnexService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.policy.service;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyAnnex;
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡闄勪欢Service鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+public interface IPolicyAnnexService 
+{
+    /**
+     * 鏌ヨ鏀跨瓥娉曡闄勪欢
+     * 
+     * @param id 鏀跨瓥娉曡闄勪欢ID
+     * @return 鏀跨瓥娉曡闄勪欢
+     */
+    public PolicyAnnex selectPolicyAnnexById(String id);
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡闄勪欢鍒楄〃
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 鏀跨瓥娉曡闄勪欢闆嗗悎
+     */
+    public List<PolicyAnnex> selectPolicyAnnexList(PolicyAnnex policyAnnex);
+
+    /**
+     * 鏂板鏀跨瓥娉曡闄勪欢
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 缁撴灉
+     */
+    public int insertPolicyAnnex(PolicyAnnex policyAnnex);
+
+    /**
+     * 淇敼鏀跨瓥娉曡闄勪欢
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 缁撴灉
+     */
+    public int updatePolicyAnnex(PolicyAnnex policyAnnex);
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏀跨瓥娉曡闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyAnnexByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡闄勪欢淇℃伅
+     * 
+     * @param id 鏀跨瓥娉曡闄勪欢ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyAnnexById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsService.java
new file mode 100644
index 0000000..45070a0
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsService.java
@@ -0,0 +1,64 @@
+package com.dingzhuo.energy.basic.data.policy.service;
+
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulations;
+
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡缁存姢Service鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-04-23
+ */
+public interface IPolicyRegulationsService 
+{
+    /**
+     * 鏌ヨ鏀跨瓥娉曡缁存姢
+     * 
+     * @param id 鏀跨瓥娉曡缁存姢ID
+     * @return 鏀跨瓥娉曡缁存姢
+     */
+    public PolicyRegulations selectPolicyRegulationsById(String id);
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡缁存姢鍒楄〃
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 鏀跨瓥娉曡缁存姢闆嗗悎
+     */
+    public List<PolicyRegulations> selectPolicyRegulationsList(PolicyRegulations policyRegulations);
+
+    /**
+     * 鏂板鏀跨瓥娉曡缁存姢
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 缁撴灉
+     */
+    public int insertPolicyRegulations(PolicyRegulations policyRegulations);
+
+    /**
+     * 淇敼鏀跨瓥娉曡缁存姢
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 缁撴灉
+     */
+    public int updatePolicyRegulations(PolicyRegulations policyRegulations);
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡缁存姢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏀跨瓥娉曡缁存姢ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡缁存姢淇℃伅
+     * 
+     * @param id 鏀跨瓥娉曡缁存姢ID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsById(String id);
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsTranslateService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsTranslateService.java
new file mode 100644
index 0000000..6f0aa86
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/IPolicyRegulationsTranslateService.java
@@ -0,0 +1,63 @@
+package com.dingzhuo.energy.basic.data.policy.service;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulationsTranslate;
+
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡鏌ヨService鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+public interface IPolicyRegulationsTranslateService 
+{
+    /**
+     * 鏌ヨ鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param id 鏀跨瓥娉曡鏌ヨID
+     * @return 鏀跨瓥娉曡鏌ヨ
+     */
+    public PolicyRegulationsTranslate selectPolicyRegulationsTranslateById(String id);
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡鏌ヨ鍒楄〃
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 鏀跨瓥娉曡鏌ヨ闆嗗悎
+     */
+    public List<PolicyRegulationsTranslate> selectPolicyRegulationsTranslateList(PolicyRegulationsTranslate policyRegulationsTranslate);
+
+    /**
+     * 鏂板鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 缁撴灉
+     */
+    public int insertPolicyRegulationsTranslate(PolicyRegulationsTranslate policyRegulationsTranslate);
+
+    /**
+     * 淇敼鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 缁撴灉
+     */
+    public int updatePolicyRegulationsTranslate(PolicyRegulationsTranslate policyRegulationsTranslate);
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏀跨瓥娉曡鏌ヨID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsTranslateByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡鏌ヨ淇℃伅
+     * 
+     * @param id 鏀跨瓥娉曡鏌ヨID
+     * @return 缁撴灉
+     */
+    public int deletePolicyRegulationsTranslateById(String id);
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyAnnexServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyAnnexServiceImpl.java
new file mode 100644
index 0000000..be8234e
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyAnnexServiceImpl.java
@@ -0,0 +1,97 @@
+package com.dingzhuo.energy.basic.data.policy.service.impl;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyAnnex;
+import com.dingzhuo.energy.basic.data.policy.mapper.PolicyAnnexMapper;
+import com.dingzhuo.energy.basic.data.policy.service.IPolicyAnnexService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡闄勪欢Service涓氬姟灞傚鐞�
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+@Service
+public class PolicyAnnexServiceImpl implements IPolicyAnnexService 
+{
+    @Autowired
+    private PolicyAnnexMapper policyAnnexMapper;
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡闄勪欢
+     * 
+     * @param id 鏀跨瓥娉曡闄勪欢ID
+     * @return 鏀跨瓥娉曡闄勪欢
+     */
+    @Override
+    public PolicyAnnex selectPolicyAnnexById(String id)
+    {
+        return policyAnnexMapper.selectPolicyAnnexById(id);
+    }
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡闄勪欢鍒楄〃
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 鏀跨瓥娉曡闄勪欢
+     */
+    @Override
+    public List<PolicyAnnex> selectPolicyAnnexList(PolicyAnnex policyAnnex)
+    {
+        return policyAnnexMapper.selectPolicyAnnexList(policyAnnex);
+    }
+
+    /**
+     * 鏂板鏀跨瓥娉曡闄勪欢
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertPolicyAnnex(PolicyAnnex policyAnnex)
+    {
+        policyAnnex.setCreateTime(DateUtils.getNowDate());
+        return policyAnnexMapper.insertPolicyAnnex(policyAnnex);
+    }
+
+    /**
+     * 淇敼鏀跨瓥娉曡闄勪欢
+     * 
+     * @param policyAnnex 鏀跨瓥娉曡闄勪欢
+     * @return 缁撴灉
+     */
+    @Override
+    public int updatePolicyAnnex(PolicyAnnex policyAnnex)
+    {
+        policyAnnex.setUpdateTime(DateUtils.getNowDate());
+        return policyAnnexMapper.updatePolicyAnnex(policyAnnex);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡闄勪欢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏀跨瓥娉曡闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deletePolicyAnnexByIds(String[] ids)
+    {
+        return policyAnnexMapper.deletePolicyAnnexByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡闄勪欢淇℃伅
+     * 
+     * @param id 鏀跨瓥娉曡闄勪欢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deletePolicyAnnexById(String id)
+    {
+        return policyAnnexMapper.deletePolicyAnnexById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsServiceImpl.java
new file mode 100644
index 0000000..858f1a2
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsServiceImpl.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.basic.data.policy.service.impl;
+
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulations;
+import com.dingzhuo.energy.basic.data.policy.mapper.PolicyRegulationsMapper;
+import com.dingzhuo.energy.basic.data.policy.service.IPolicyRegulationsService;
+import com.dingzhuo.energy.project.system.mapper.SysDictDataMapper;
+import com.dingzhuo.energy.project.system.service.impl.SysUserServiceImpl;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡缁存姢Service涓氬姟灞傚鐞�
+ * 
+ * @author liuli
+ * @date 2020-04-23
+ */
+@Service
+public class PolicyRegulationsServiceImpl implements IPolicyRegulationsService 
+{
+    @Autowired
+    private PolicyRegulationsMapper policyRegulationsMapper;
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+
+    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
+    /**
+     * 鏌ヨ鏀跨瓥娉曡缁存姢
+     * 
+     * @param id 鏀跨瓥娉曡缁存姢ID
+     * @return 鏀跨瓥娉曡缁存姢
+     */
+    @Override
+    public PolicyRegulations selectPolicyRegulationsById(String id)
+    {
+        return policyRegulationsMapper.selectPolicyRegulationsById(id);
+    }
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡缁存姢鍒楄〃
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 鏀跨瓥娉曡缁存姢
+     */
+    @Override
+    public List<PolicyRegulations> selectPolicyRegulationsList(PolicyRegulations policyRegulations)
+    {
+        return policyRegulationsMapper.selectPolicyRegulationsList(policyRegulations);
+    }
+    /**
+     * 鏂板鏀跨瓥娉曡缁存姢
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertPolicyRegulations(PolicyRegulations policyRegulations)
+    {
+        return policyRegulationsMapper.insertPolicyRegulations(policyRegulations);
+    }
+
+    /**
+     * 淇敼鏀跨瓥娉曡缁存姢
+     * 
+     * @param policyRegulations 鏀跨瓥娉曡缁存姢
+     * @return 缁撴灉
+     */
+    @Override
+    public int updatePolicyRegulations(PolicyRegulations policyRegulations)
+    {
+        return policyRegulationsMapper.updatePolicyRegulations(policyRegulations);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡缁存姢
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏀跨瓥娉曡缁存姢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deletePolicyRegulationsByIds(String[] ids)
+    {
+        return policyRegulationsMapper.deletePolicyRegulationsByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡缁存姢淇℃伅
+     * 
+     * @param id 鏀跨瓥娉曡缁存姢ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deletePolicyRegulationsById(String id)
+    {
+        return policyRegulationsMapper.deletePolicyRegulationsById(id);
+    }
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsTranslateServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsTranslateServiceImpl.java
new file mode 100644
index 0000000..8f1c1bf
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/policy/service/impl/PolicyRegulationsTranslateServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.basic.data.policy.service.impl;
+
+import com.dingzhuo.energy.basic.data.policy.domain.PolicyRegulationsTranslate;
+import com.dingzhuo.energy.basic.data.policy.mapper.PolicyRegulationsTranslateMapper;
+import com.dingzhuo.energy.basic.data.policy.service.IPolicyRegulationsTranslateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 鏀跨瓥娉曡鏌ヨService涓氬姟灞傚鐞�
+ * 
+ * @author liuli
+ * @date 2020-04-24
+ */
+@Service
+public class PolicyRegulationsTranslateServiceImpl implements IPolicyRegulationsTranslateService 
+{
+    @Autowired
+    private PolicyRegulationsTranslateMapper policyRegulationsTranslateMapper;
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param id 鏀跨瓥娉曡鏌ヨID
+     * @return 鏀跨瓥娉曡鏌ヨ
+     */
+    @Override
+    public PolicyRegulationsTranslate selectPolicyRegulationsTranslateById(String id)
+    {
+        return policyRegulationsTranslateMapper.selectPolicyRegulationsTranslateById(id);
+    }
+
+    /**
+     * 鏌ヨ鏀跨瓥娉曡鏌ヨ鍒楄〃
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 鏀跨瓥娉曡鏌ヨ
+     */
+    @Override
+    public List<PolicyRegulationsTranslate> selectPolicyRegulationsTranslateList(PolicyRegulationsTranslate policyRegulationsTranslate)
+    {
+        return policyRegulationsTranslateMapper.selectPolicyRegulationsTranslateList(policyRegulationsTranslate);
+    }
+
+    /**
+     * 鏂板鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertPolicyRegulationsTranslate(PolicyRegulationsTranslate policyRegulationsTranslate)
+    {
+        return policyRegulationsTranslateMapper.insertPolicyRegulationsTranslate(policyRegulationsTranslate);
+    }
+
+    /**
+     * 淇敼鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param policyRegulationsTranslate 鏀跨瓥娉曡鏌ヨ
+     * @return 缁撴灉
+     */
+    @Override
+    public int updatePolicyRegulationsTranslate(PolicyRegulationsTranslate policyRegulationsTranslate)
+    {
+        return policyRegulationsTranslateMapper.updatePolicyRegulationsTranslate(policyRegulationsTranslate);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鏀跨瓥娉曡鏌ヨ
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏀跨瓥娉曡鏌ヨID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deletePolicyRegulationsTranslateByIds(String[] ids)
+    {
+        return policyRegulationsTranslateMapper.deletePolicyRegulationsTranslateByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鏀跨瓥娉曡鏌ヨ淇℃伅
+     * 
+     * @param id 鏀跨瓥娉曡鏌ヨID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deletePolicyRegulationsTranslateById(String id)
+    {
+        return policyRegulationsTranslateMapper.deletePolicyRegulationsTranslateById(id);
+    }
+
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringController.java
new file mode 100644
index 0000000..797aedf
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringController.java
@@ -0,0 +1,204 @@
+package com.dingzhuo.energy.basic.data.workforce.controller;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.Rostering;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringCopy;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 鎺掔彮琛ㄦ煡璇ontroller
+ * 
+ * @author liuli
+ * @date 2020-05-13
+ */
+@RestController
+@RequestMapping("/workforce/rosteringManagement")
+public class RosteringController extends BaseController
+{
+    @Autowired
+    private IRosteringService rosteringService;
+    /**
+     *鏌ヨ杞�兼柟妗堝悕绉伴泦鍚�
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:rosteringManagement:schemeNamelist')")
+    @GetMapping("/schemeNamelist")
+    public TableDataInfo schemeNamelist(Rostering rostering) {
+        startPage();
+        List<RosteringScheme> list = rosteringService.selectSchemeNameList();
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏌ヨ鎺掔彮琛ㄦ煡璇㈠垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:rosteringManagement:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(Rostering rostering)
+    {
+        startPage();
+        List<Rostering> list = rosteringService.selectRosteringList(rostering);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鎺掔彮琛ㄦ煡璇㈠垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:rosteringManagement:export')")
+    @Log(title = "鎺掔彮琛ㄦ煡璇�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(Rostering rostering)
+    {
+        List<Rostering> list = rosteringService.selectRosteringList(rostering);
+        ExcelUtil<Rostering> util = new ExcelUtil<Rostering>(Rostering.class);
+        return util.exportExcel(list, "rosteringManagement");
+    }
+
+    /**
+     * 鑾峰彇鎺掔彮琛ㄦ煡璇㈣缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:rosteringManagement:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(rosteringService.selectRosteringById(id));
+    }
+
+    /**
+     * 鏂板鎺掔彮琛ㄦ煡璇紙鐢熸垚锛�
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:rosteringManagement:add')")
+    @PostMapping
+    public AjaxResult add(@RequestBody Rostering rostering) throws ParseException {
+        //鏍规嵁杞�兼柟妗坕d鏌ヨ鐝id銆佸�兼id绛塴ist
+        List<RosteringCopy> list=rosteringService.selectList(rostering);
+        //璁剧疆杞崲鐨勬棩鏈熸牸寮�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        //寤轰竴涓柊鐨刲ist瀛樻斁insert鐨刲ist
+        List<Rostering> dataItems = new ArrayList<>();
+        //瀹氫箟涓�涓猚ount鏉ュ畬鎴恈ode锛堢紪鐮侊級鐨勮嚜澧�
+        int count=1;
+        //瀹氫箟浠庡墠鍙拌幏鍙栫殑寮�濮嬫椂闂� startdate涓哄紑濮嬫椂闂�
+        String startdate=sdf.format(rostering.getBeginTimes());
+       /* Long timenum =(rostering.getEndTimes().getTime()-rostering.getBeginTimes().getTime())/(60*60*24*1000);//鏃堕棿宸�*/
+        for(RosteringCopy b:list){
+            Date loopstarttime=sdf.parse(startdate);
+            long long3 =loopstarttime.getTime();
+            long long4= rostering.getEndTimes().getTime();
+            if(long3 > long4){//寰幆鍚庣殑鏃堕棿>浠庨〉闈㈣幏鍙栫殑缁撴潫鏃堕棿鍒欏仠姝㈠惊鐜�
+                break;
+            }else {
+                startdate=sdf.format(loopstarttime.getTime());
+                for (RosteringCopy a:list) {
+                    Rostering rosterings =new Rostering();
+                    rosterings.setId(UUID.randomUUID().toString());
+                    String code=String.valueOf(count);
+                    rosterings.setCode(code);
+                    rosterings.setName("鎺掔彮"+code);
+                    rosterings.setSchemeId(a.getSchemeId());
+                    rosterings.setShiftId(a.getShiftId());
+                    rosterings.setDutyId(a.getDutyId());
+                    rosterings.setDepartMemberId(rostering.getDepartMemberId());
+                    rosterings.setCreateBy(SecurityUtils.getUsername());
+                    rosterings.setCreateTime(DateUtils.getNowDate());
+                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                    String bengintime=startdate +" "+a.getStartTime();//bengintime涓烘嫾鎺ュ畬鐨勫紑濮嬫椂闂�
+                    Date looptime=sdf.parse(startdate);//寰幆鍚庣殑寮�濮嬫椂闂�
+                    Date endtime =rostering.getEndTimes();//浠庡墠鍙拌幏鍙栫殑缁撴潫鏃堕棿
+                    long long1 =looptime.getTime();
+                    long long2= endtime.getTime();
+                    if(long1 > long2){//鑻ュ綋鍓嶆椂闂�>浠庡墠鍙拌幏鍙栫殑缁撴潫鏃堕棿鍒欑粨鏉熷惊鐜�
+                        break;
+                    }else {
+                        if(a.getIsCrossDay().equals("Y")) {//鏄惁璺ㄥぉ
+                            Date starttime = sdf.parse(startdate);
+                            Calendar calendar = Calendar.getInstance();
+                            calendar.setTime(starttime);
+                            calendar.add(Calendar.DAY_OF_MONTH, 1);
+                            Date looptimes=sdf.parse(startdate);//寰幆鍚庣殑寮�濮嬫椂闂�
+                            Date endtimes =rostering.getEndTimes();//浠庡墠鍙拌幏鍙栫殑缁撴潫鏃堕棿
+                            long long5 =looptime.getTime();
+                            long long6= endtime.getTime();
+                            Date beginTimes = df.parse(bengintime);
+                            String enddate=startdate+" "+a.getEnddTime();
+                            Date endTimes = df.parse(enddate);
+                            rosterings.setBeginTimes(beginTimes);
+                            rosterings.setEndTimes(endTimes);
+                            startdate=sdf.format(calendar.getTime());//缁欏紑濮嬫椂闂磋祴鍊艰法澶╁悗鐨勬椂闂�
+                        }else{
+                            Date beginTimes = df.parse(bengintime);
+                            String enddate=startdate+" "+a.getEnddTime();
+                            Date endTimes = df.parse(enddate);
+                            rosterings.setBeginTimes(beginTimes);
+                            rosterings.setEndTimes(endTimes);
+                        }
+                    }
+                    dataItems.add(rosterings);
+                    count ++;
+                }
+            }
+        }
+
+        this.rosteringService.saveRostering(dataItems);
+        return AjaxResult.success("淇濆瓨鎴愬姛锛�");
+    }
+
+    /**
+     * 淇敼鎺掔彮琛ㄦ煡璇�
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:rosteringManagement:edit')")
+    @Log(title = "鎺掔彮琛ㄦ煡璇�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody Rostering rostering)
+    {
+        rostering.setUpdateBy(SecurityUtils.getUsername());
+        rostering.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(rosteringService.updateRostering(rostering));
+    }
+
+    /**
+     * 鍒犻櫎鎺掔彮琛ㄦ煡璇�
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:rosteringManagement:remove')")
+    @Log(title = "鎺掔彮琛ㄦ煡璇�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(rosteringService.deleteRosteringByIds(ids));
+    }
+    public static <E> List<List<E>> splitList(List<E> targetList, Integer splitSize) {
+        if (targetList == null) {
+            return new ArrayList<>();
+        }
+
+        int size = targetList.size();
+        List<List<E>> resultList = new ArrayList<>();
+        if (size <= splitSize) {
+            resultList.add(targetList);
+        } else {
+            for (int i = 0; i < size; i += splitSize) {
+                //鐢ㄤ簬闄愬埗鏈�鍚庝竴閮ㄥ垎size灏忎簬splitSize鐨刲ist
+                int limit = i + splitSize;
+                if (limit > size) {
+                    limit = size;
+                }
+                resultList.add(targetList.subList(i, limit));
+            }
+        }
+        return resultList;
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringDutyController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringDutyController.java
new file mode 100644
index 0000000..fcdb684
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringDutyController.java
@@ -0,0 +1,105 @@
+package com.dingzhuo.energy.basic.data.workforce.controller;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringDuty;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringDutyService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 鎺掔彮绠$悊Controller
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+@RestController
+@RequestMapping("/workforce/dutyManagement")
+public class RosteringDutyController extends BaseController
+{
+    @Autowired
+    private IRosteringDutyService rosteringDutyService;
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:dutyManagement:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RosteringDuty rosteringDuty)
+    {
+        startPage();
+        List<RosteringDuty> list = rosteringDutyService.selectRosteringDutyList(rosteringDuty);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鎺掔彮绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:dutyManagement:export')")
+    @Log(title = "鎺掔彮绠$悊", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(RosteringDuty rosteringDuty)
+    {
+        List<RosteringDuty> list = rosteringDutyService.selectRosteringDutyList(rosteringDuty);
+        ExcelUtil<RosteringDuty> util = new ExcelUtil<RosteringDuty>(RosteringDuty.class);
+        return util.exportExcel(list, "dutyManagement");
+    }
+
+    /**
+     * 鑾峰彇鎺掔彮绠$悊璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:dutyManagement:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(rosteringDutyService.selectRosteringDutyById(id));
+    }
+
+    /**
+     * 鏂板鎺掔彮绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:dutyManagement:add')")
+    @Log(title = "鎺掔彮绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RosteringDuty rosteringDuty)
+    {
+        rosteringDuty.setId(UUID.randomUUID().toString());
+        rosteringDuty.setCreateBy(SecurityUtils.getUsername());
+        rosteringDuty.setCreateTime(DateUtils.getNowDate());
+        return toAjax(rosteringDutyService.insertRosteringDuty(rosteringDuty));
+    }
+
+    /**
+     * 淇敼鎺掔彮绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:dutyManagement:edit')")
+    @Log(title = "鎺掔彮绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RosteringDuty rosteringDuty)
+    {
+        rosteringDuty.setUpdateBy(SecurityUtils.getUsername());
+        rosteringDuty.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(rosteringDutyService.updateRosteringDuty(rosteringDuty));
+    }
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:dutyManagement:remove')")
+    @Log(title = "鎺掔彮绠$悊", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(rosteringDutyService.deleteRosteringDutyByIds(ids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeController.java
new file mode 100644
index 0000000..f7f01a8
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeController.java
@@ -0,0 +1,112 @@
+package com.dingzhuo.energy.basic.data.workforce.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringSchemeService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 杞�兼柟妗圕ontroller
+ * 
+ * @author sys
+ * @date 2020-05-12
+ */
+@RestController
+@RequestMapping("/rosteringSrcheme/scheme")
+public class RosteringSchemeController extends BaseController
+{
+    @Autowired
+    private IRosteringSchemeService rosteringSchemeService;
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSrcheme:scheme:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RosteringScheme rosteringScheme)
+    {
+        startPage();
+        List<RosteringScheme> list = rosteringSchemeService.selectRosteringSchemeList(rosteringScheme);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭杞�兼柟妗堝垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSrcheme:scheme:export')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(RosteringScheme rosteringScheme)
+    {
+        List<RosteringScheme> list = rosteringSchemeService.selectRosteringSchemeList(rosteringScheme);
+        ExcelUtil<RosteringScheme> util = new ExcelUtil<RosteringScheme>(RosteringScheme.class);
+        return util.exportExcel(list, "scheme");
+    }
+
+    /**
+     * 鑾峰彇杞�兼柟妗堣缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSrcheme:scheme:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(rosteringSchemeService.selectRosteringSchemeById(id));
+    }
+
+    /**
+     * 鏂板杞�兼柟妗�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSrcheme:scheme:add')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RosteringScheme rosteringScheme)
+    {
+        rosteringScheme.setId(UUID.randomUUID().toString());
+        rosteringScheme.setCreateBy(SecurityUtils.getUsername());
+        rosteringScheme.setCreateTime(DateUtils.getNowDate());
+        return toAjax(rosteringSchemeService.insertRosteringScheme(rosteringScheme));
+    }
+
+    /**
+     * 淇敼杞�兼柟妗�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSrcheme:scheme:edit')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RosteringScheme rosteringScheme)
+    {
+        rosteringScheme.setUpdateBy(SecurityUtils.getUsername());
+        rosteringScheme.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(rosteringSchemeService.updateRosteringScheme(rosteringScheme));
+    }
+
+    /**
+     * 鍒犻櫎杞�兼柟妗�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSrcheme:scheme:remove')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(rosteringSchemeService.deleteRosteringSchemeByIds(ids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeitemController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeitemController.java
new file mode 100644
index 0000000..fd86226
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringSchemeitemController.java
@@ -0,0 +1,112 @@
+package com.dingzhuo.energy.basic.data.workforce.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringSchemeitem;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringSchemeitemService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 杞�兼柟妗圕ontroller
+ * 
+ * @author sys
+ * @date 2020-05-13
+ */
+@RestController
+@RequestMapping("/rosteringSchemeitem/schemeItem")
+public class RosteringSchemeitemController extends BaseController
+{
+    @Autowired
+    private IRosteringSchemeitemService rosteringSchemeitemService;
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSchemeitem:schemeItem:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RosteringSchemeitem rosteringSchemeitem)
+    {
+        startPage();
+        List<RosteringSchemeitem> list = rosteringSchemeitemService.selectRosteringSchemeitemList(rosteringSchemeitem);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭杞�兼柟妗堝垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSchemeitem:schemeItem:export')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(RosteringSchemeitem rosteringSchemeitem)
+    {
+        List<RosteringSchemeitem> list = rosteringSchemeitemService.selectRosteringSchemeitemList(rosteringSchemeitem);
+        ExcelUtil<RosteringSchemeitem> util = new ExcelUtil<RosteringSchemeitem>(RosteringSchemeitem.class);
+        return util.exportExcel(list, "schemeItem");
+    }
+
+    /**
+     * 鑾峰彇杞�兼柟妗堣缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSchemeitem:schemeItem:query')")
+    @GetMapping(value = "/{description}")
+    public AjaxResult getInfo(@PathVariable("description") String description)
+    {
+        return AjaxResult.success(rosteringSchemeitemService.selectRosteringSchemeitemById(description));
+    }
+
+    /**
+     * 鏂板杞�兼柟妗�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSchemeitem:schemeItem:add')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RosteringSchemeitem rosteringSchemeitem)
+    {
+        rosteringSchemeitem.setId(UUID.randomUUID().toString());
+        rosteringSchemeitem.setCreateBy(SecurityUtils.getUsername());
+        rosteringSchemeitem.setCreateTime(DateUtils.getNowDate());
+        return toAjax(rosteringSchemeitemService.insertRosteringSchemeitem(rosteringSchemeitem));
+    }
+
+    /**
+     * 淇敼杞�兼柟妗�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSchemeitem:schemeItem:edit')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RosteringSchemeitem rosteringSchemeitem)
+    {
+        rosteringSchemeitem.setUpdateBy(SecurityUtils.getUsername());
+        rosteringSchemeitem.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(rosteringSchemeitemService.updateRosteringSchemeitem(rosteringSchemeitem));
+    }
+
+    /**
+     * 鍒犻櫎杞�兼柟妗�
+     */
+    @PreAuthorize("@ss.hasPermi('rosteringSchemeitem:schemeItem:remove')")
+    @Log(title = "杞�兼柟妗�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{descriptions}")
+    public AjaxResult remove(@PathVariable String[] descriptions)
+    {
+        return toAjax(rosteringSchemeitemService.deleteRosteringSchemeitemByIds(descriptions));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringShiftController.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringShiftController.java
new file mode 100644
index 0000000..3a9e483
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/controller/RosteringShiftController.java
@@ -0,0 +1,116 @@
+package com.dingzhuo.energy.basic.data.workforce.controller;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringShift;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringShiftService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * 鎺掔彮绠$悊璁剧疆Controller
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+@RestController
+@RequestMapping("/workforce/shiftManagement")
+public class RosteringShiftController extends BaseController
+{
+    @Autowired
+    private IRosteringShiftService rosteringShiftService;
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:shiftManagement:treeList')")
+    @GetMapping("/treeList")
+    public AjaxResult treeList(RosteringShift rosteringShift) {
+        List<SysDept> list = rosteringShiftService.treeList();
+        return AjaxResult.success(rosteringShiftService.buildModelNodeTree(list));
+    }
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊璁剧疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:shiftManagement:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RosteringShift rosteringShift)
+    {
+        startPage();
+        List<RosteringShift> list = rosteringShiftService.selectRosteringShiftList(rosteringShift);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鎺掔彮绠$悊璁剧疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:shiftManagement:export')")
+    @Log(title = "鎺掔彮绠$悊璁剧疆", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(RosteringShift rosteringShift)
+    {
+        List<RosteringShift> list = rosteringShiftService.selectRosteringShiftList(rosteringShift);
+        ExcelUtil<RosteringShift> util = new ExcelUtil<RosteringShift>(RosteringShift.class);
+        return util.exportExcel(list, "shiftManagement");
+    }
+
+    /**
+     * 鑾峰彇鎺掔彮绠$悊璁剧疆璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:shiftManagement:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(rosteringShiftService.selectRosteringShiftById(id));
+    }
+
+    /**
+     * 鏂板鎺掔彮绠$悊璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:shiftManagement:add')")
+    @Log(title = "鎺掔彮绠$悊璁剧疆", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@NotNull @RequestBody RosteringShift rosteringShift){
+        rosteringShift.setId(UUID.randomUUID().toString());
+        rosteringShift.setCreateBy(SecurityUtils.getUsername());
+        rosteringShift.setCreateTime(DateUtils.getNowDate());
+        return toAjax(rosteringShiftService.insertRosteringShift(rosteringShift));
+    }
+
+    /**
+     * 淇敼鎺掔彮绠$悊璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:shiftManagement:edit')")
+    @Log(title = "鎺掔彮绠$悊璁剧疆", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RosteringShift rosteringShift)
+    {
+        rosteringShift.setUpdateBy(SecurityUtils.getUsername());
+        rosteringShift.setUpdateTime(DateUtils.getNowDate());
+        return toAjax(rosteringShiftService.updateRosteringShift(rosteringShift));
+    }
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊璁剧疆
+     */
+    @PreAuthorize("@ss.hasPermi('workforce:shiftManagement:remove')")
+    @Log(title = "鎺掔彮绠$悊璁剧疆", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(rosteringShiftService.deleteRosteringShiftByIds(ids));
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/Rostering.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/Rostering.java
new file mode 100644
index 0000000..ff7cde9
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/Rostering.java
@@ -0,0 +1,202 @@
+package com.dingzhuo.energy.basic.data.workforce.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 鎺掔彮琛ㄦ煡璇㈠璞� rostering
+ * 
+ * @author liuli
+ * @date 2020-05-13
+ */
+public class Rostering extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private String id;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    private String code;
+
+    /** 鍚嶇О */
+    @Excel(name = "鍚嶇О")
+    private String name;
+
+    /** 杞�兼柟妗坕d */
+    @Excel(name = "杞�兼柟妗坕d")
+    private String schemeId;
+    /** 杞�兼柟妗坣ame */
+    @Excel(name = "杞�兼柟妗坣ame")
+    private String schemeName;
+
+    /** 鐝id */
+    @Excel(name = "鐝id")
+    private String shiftId;
+
+    /** 鐝 */
+    @Excel(name = "鐝")
+    private String shiftName;
+
+    /** 鍊兼id */
+    @Excel(name = "鍊兼id")
+    private String dutyId;
+
+    /** 鍊兼 */
+    @Excel(name = "鍊兼")
+    private String dutyName;
+
+    /** 鎻忚堪 */
+    @Excel(name = "鎻忚堪")
+    private String description;
+
+    /** 缁勭粐缁撴瀯Id */
+    @Excel(name = "缁勭粐缁撴瀯Id")
+    private Long departMemberId;
+
+    /** 缁勭粐缁撴瀯Name */
+    @Excel(name = "缁勭粐缁撴瀯Name")
+    private String deptName;
+
+    /** 寮�濮嬫椂闂� */
+    @Excel(name = "寮�濮嬫椂闂�",dateFormat = "yyyy-MM-dd")
+    private Date beginTimes;
+
+    /** 缁撴潫鏃堕棿 */
+    @Excel(name = "缁撴潫鏃堕棿",dateFormat = "yyyy-MM-dd")
+    private Date endTimes;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+    public String getId() 
+    {
+        return id;
+    }
+
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+    public String getCode() 
+    {
+        return code;
+    }
+
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+    public String getName() 
+    {
+        return name;
+    }
+
+    public void setSchemeId(String schemeId) 
+    {
+        this.schemeId = schemeId;
+    }
+    public String getSchemeId()
+    {
+        return schemeId;
+    }
+
+    public void setShiftId(String shiftId) 
+    {
+        this.shiftId = shiftId;
+    }
+    public String getShiftId() 
+    {
+        return shiftId;
+    }
+
+    public void setShiftName(String shiftName) 
+    {
+        this.shiftName = shiftName;
+    }
+    public String getShiftName() 
+    {
+        return shiftName;
+    }
+
+    public void setDutyId(String dutyId) 
+    {
+        this.dutyId = dutyId;
+    }
+    public String getDutyId() 
+    {
+        return dutyId;
+    }
+
+    public void setDutyName(String dutyName) 
+    {
+        this.dutyName = dutyName;
+    }
+    public String getDutyName() 
+    {
+        return dutyName;
+    }
+
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+    public String getDescription() 
+    {
+        return description;
+    }
+
+    public void setDepartMemberId(Long departMemberId)
+    {
+        this.departMemberId = departMemberId;
+    }
+    public Long getDepartMemberId() {
+        return departMemberId;
+    }
+
+    public Date getBeginTimes() { return beginTimes; }
+    public void setBeginTimes(Date beginTimes)
+    {
+        this.beginTimes = beginTimes;
+    }
+
+    public Date getEndTimes()
+    {
+        return endTimes;
+    }
+    public void setEndTimes(Date endTimes)
+    {
+        this.endTimes = endTimes;
+    }
+
+    public void setSchemeName(String schemeName) { this.schemeName = schemeName; }
+    public String getSchemeName() { return schemeName; }
+
+    public void setDeptName(String deptName) { this.deptName = deptName; }
+    public String getDeptName() { return deptName; }
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("name", getName())
+            .append("schemeId", getSchemeId())
+            .append("shiftId", getShiftId())
+            .append("shiftName", getShiftName())
+            .append("dutyId", getDutyId())
+            .append("dutyName", getDutyName())
+            .append("description", getDescription())
+            .append("departMemberId",getDepartMemberId())
+            .append("beginTimes",getBeginTimes())
+            .append("endTimes",getEndTimes())
+            .append("schemeName",getSchemeName())
+            .append("deptName",getDeptName())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringCopy.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringCopy.java
new file mode 100644
index 0000000..c2cff0e
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringCopy.java
@@ -0,0 +1,126 @@
+package com.dingzhuo.energy.basic.data.workforce.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+public class RosteringCopy extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    private String code;
+    /** 鍚嶇О */
+    @Excel(name = "鍚嶇О")
+    private String name;
+    /** 杞�兼柟妗坕d */
+    @Excel(name = "杞�兼柟妗坕d")
+    private String schemeId;
+    /** 鐝鍚嶇О */
+    @Excel(name = "鐝鍚嶇О")
+    private String shiftName;
+    /** 寮�濮嬫椂闂� */
+    @Excel(name = "寮�濮嬫椂闂�", width = 30)
+    private String startTime;
+    /** 缁撴潫鏃堕棿 */
+    @Excel(name = "缁撴潫鏃堕棿", width = 30)
+    private String enddTime;
+    /** 鏄惁璺ㄥぉ */
+    @Excel(name = "鏄惁璺ㄥぉ")
+    private String isCrossDay;
+    /** 鍊兼鍚嶇О */
+    @Excel(name = "鍊兼鍚嶇О")
+    private String dutyName;
+    /** 鐝id */
+    @Excel(name = "鐝id")
+    private String shiftId;
+    /** 鍊兼id */
+    @Excel(name = "鍊兼id")
+    private String dutyId;
+
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+    public String getCode()
+    {
+        return code;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setSchemeId(String schemeId)
+    {
+        this.schemeId = schemeId;
+    }
+    public String getSchemeId() { return schemeId; }
+
+    public void setShiftName(String shiftName) { this.shiftName = shiftName; }
+    public String getShiftName() { return shiftName; }
+
+    public void setStartTime(String startTime)
+    {
+        this.startTime = startTime;
+    }
+    public String getStartTime() { return startTime; }
+
+    public void setEnddTime(String enddTime)
+    {
+        this.enddTime = enddTime;
+    }
+    public String getEnddTime() { return enddTime; }
+
+    public void setIsCrossDay(String isCrossDay)
+    {
+        this.isCrossDay = isCrossDay;
+    }
+    public String getIsCrossDay()
+    {
+        return isCrossDay;
+    }
+
+    public void setDutyName(String dutyName) { this.dutyName = dutyName; }
+    public String getDutyName() { return dutyName; }
+
+    public void setShiftId(String shiftId)
+    {
+        this.shiftId = shiftId;
+    }
+    public String getShiftId()
+    {
+        return shiftId;
+    }
+    public void setDutyId(String dutyId)
+    {
+        this.dutyId = dutyId;
+    }
+    public String getDutyId()
+    {
+        return dutyId;
+    }
+    @Override
+    public String toString(){
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("code",getCode())
+                .append("name",getName())
+                .append("schemeId",getSchemeId())
+                .append("shiftName",getShiftName())
+                .append("startTime",getStartTime())
+                .append("enddTime",getEnddTime())
+                .append("isCrossDay",getIsCrossDay())
+                .append("dutyName",getDutyName())
+                .append("shiftId", getShiftId())
+                .append("dutyId", getDutyId())
+                .toString();
+    }
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringDuty.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringDuty.java
new file mode 100644
index 0000000..58890ea
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringDuty.java
@@ -0,0 +1,119 @@
+package com.dingzhuo.energy.basic.data.workforce.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 鎺掔彮绠$悊瀵硅薄 rostering_duty
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+public class RosteringDuty extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private String id;
+
+    /** 缂栧彿 */
+    @Excel(name = "缂栧彿")
+    private String code;
+
+    /** 鍊兼鍚嶇О */
+    @Excel(name = "鍊兼鍚嶇О")
+    private String name;
+
+    /** 缁勭粐缁撴瀯id */
+    @Excel(name = "缁勭粐缁撴瀯id")
+    private Long deptId;
+    private String deptName;
+
+    /** 椤哄簭鍙� */
+    @Excel(name = "椤哄簭鍙�")
+    private String orderNo;
+
+    /** 鎻忚堪 */
+    @Excel(name = "鎻忚堪")
+    private String description;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+    public String getId() 
+    {
+        return id;
+    }
+
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+    public String getCode() 
+    {
+        return code;
+    }
+
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+    public String getName() 
+    {
+        return name;
+    }
+
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setOrderNo(String orderNo) 
+    {
+        this.orderNo = orderNo;
+    }
+
+    public String getOrderNo() 
+    {
+        return orderNo;
+    }
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+
+    public String getDescription() 
+    {
+        return description;
+    }
+
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("name", getName())
+            .append("deptId", getDeptId())
+            .append("deptName", getDeptName())
+            .append("orderNo", getOrderNo())
+            .append("description", getDescription())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringScheme.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringScheme.java
new file mode 100644
index 0000000..e41e1f0
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringScheme.java
@@ -0,0 +1,143 @@
+package com.dingzhuo.energy.basic.data.workforce.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 杞�兼柟妗堝璞� rostering_scheme
+ * 
+ * @author sys
+ * @date 2020-05-12
+ */
+public class RosteringScheme extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private String id;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    private String code;
+
+    /** 鍚嶇О */
+    @Excel(name = "鍚嶇О")
+    private String name;
+
+    /** 缁勭粐缁撴瀯Id */
+    @Excel(name = "缁勭粐缁撴瀯Id")
+    private Long departMemberId;
+    private String departMember;
+    /** 杞�兼柟妗堢被鍨� */
+    @Excel(name = "杞�兼柟妗堢被鍨�")
+    private String rosteringschemekind;
+
+    /** 鍙傜収鏃ユ湡 */
+    @Excel(name = "鍙傜収鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date referencedate;
+
+    /** 鏄惁鑷姩鎺掔彮 */
+    @Excel(name = "鏄惁鑷姩鎺掔彮")
+    private String isautorostering;
+
+    /** 鎻忚堪 */
+    @Excel(name = "鎻忚堪")
+    private String description;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+
+    public String getCode() 
+    {
+        return code;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setRosteringschemekind(String rosteringschemekind) 
+    {
+        this.rosteringschemekind = rosteringschemekind;
+    }
+
+    public String getRosteringschemekind() 
+    {
+        return rosteringschemekind;
+    }
+    public void setReferencedate(Date referencedate) 
+    {
+        this.referencedate = referencedate;
+    }
+
+    public Date getReferencedate() 
+    {
+        return referencedate;
+    }
+    public void setIsautorostering(String isautorostering)
+    {
+        this.isautorostering = isautorostering;
+    }
+
+    public String getIsautorostering()
+    {
+        return isautorostering;
+    }
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+
+    public String getDescription() 
+    {
+        return description;
+    }
+
+    public Long getDepartMemberId() {
+        return departMemberId;
+    }
+
+    public void setDepartMemberId(Long departMemberId) {
+        this.departMemberId = departMemberId;
+    }
+
+    public String getDepartMember() {
+        return departMember;
+    }
+
+    public void setDepartMember(String departMember) {
+        this.departMember = departMember;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("name", getName())
+            .append("departMemberId", getDepartMemberId())
+            .append("rosteringschemekind", getRosteringschemekind())
+            .append("referencedate", getReferencedate())
+            .append("isautorostering", getIsautorostering())
+            .append("description", getDescription())
+            .toString();
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringSchemeitem.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringSchemeitem.java
new file mode 100644
index 0000000..ba43abd
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringSchemeitem.java
@@ -0,0 +1,168 @@
+package com.dingzhuo.energy.basic.data.workforce.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 杞�兼柟妗堝璞� rostering_schemeItem
+ *
+ * @author sys
+ * @date 2020-05-13
+ */
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆戝璞� rostering_schemeItem
+ *
+ * @author sys
+ * @date 2020-05-13
+ */
+public class RosteringSchemeitem extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+    private String id;
+
+    /** 缂栫爜 */
+    @Excel(name = "缂栫爜")
+    private String code;
+
+    /** 鍚嶇О */
+    @Excel(name = "鍚嶇О")
+    private String name;
+
+    /** 杞�兼柟妗圛d */
+    @Excel(name = "杞�兼柟妗圛d")
+    private String schemeId;
+    private String schemeName;
+    /** 澶╂ */
+    @Excel(name = "澶╂")
+    private String dayofloopdays;
+
+    /** 鐝Id */
+    @Excel(name = "鐝Id")
+    private String shiftId;
+    private String shiftName;
+    /** 鍊兼Id */
+    @Excel(name = "鍊兼Id")
+    private String dutyId;
+    private String dutyName;
+    /** 鎻忚堪 */
+    @Excel(name = "鎻忚堪")
+    private String description;
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+    public void setSchemeId(String schemeId)
+    {
+        this.schemeId = schemeId;
+    }
+
+    public String getSchemeId()
+    {
+        return schemeId;
+    }
+    public void setDayofloopdays(String dayofloopdays)
+    {
+        this.dayofloopdays = dayofloopdays;
+    }
+
+    public String getDayofloopdays()
+    {
+        return dayofloopdays;
+    }
+    public void setShiftId(String shiftId)
+    {
+        this.shiftId = shiftId;
+    }
+
+    public String getShiftId()
+    {
+        return shiftId;
+    }
+    public void setDutyId(String dutyId)
+    {
+        this.dutyId = dutyId;
+    }
+
+    public String getDutyId()
+    {
+        return dutyId;
+    }
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public String getSchemeName() {
+        return schemeName;
+    }
+
+    public void setSchemeName(String schemeName) {
+        this.schemeName = schemeName;
+    }
+
+    public String getShiftName() {
+        return shiftName;
+    }
+
+    public void setShiftName(String shiftName) {
+        this.shiftName = shiftName;
+    }
+
+    public String getDutyName() {
+        return dutyName;
+    }
+
+    public void setDutyName(String dutyName) {
+        this.dutyName = dutyName;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("code", getCode())
+                .append("name", getName())
+                .append("schemeId", getSchemeId())
+                .append("dayofloopdays", getDayofloopdays())
+                .append("shiftId", getShiftId())
+                .append("dutyId", getDutyId())
+                .append("description", getDescription())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringShift.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringShift.java
new file mode 100644
index 0000000..7768fc3
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/RosteringShift.java
@@ -0,0 +1,165 @@
+package com.dingzhuo.energy.basic.data.workforce.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鎺掔彮绠$悊璁剧疆瀵硅薄 rostering_shift
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+public class RosteringShift extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** id */
+    private String id;
+
+    /** 缂栧彿 */
+    @Excel(name = "缂栧彿")
+    private String code;
+
+    /** 鐝鍚嶇О */
+    @Excel(name = "鐝鍚嶇О")
+    private String name;
+
+    /** 缁勭粐缁撴瀯id锛堥儴闂╥d锛� */
+    @Excel(name = "缁勭粐缁撴瀯id")
+    private Long deptId;
+    private String deptName;
+    /** 寮�濮嬫椂闂� */
+    @Excel(name = "寮�濮嬫椂闂�", width = 30)
+    private String startTime;
+
+    /** 缁撴潫鏃堕棿 */
+    @Excel(name = "缁撴潫鏃堕棿", width = 30)
+    private String enddTime;
+
+    /** 鏄惁璺ㄥぉ */
+    @Excel(name = "鏄惁璺ㄥぉ")
+    private String isCrossDay;
+
+    /** 椤哄簭鍙� */
+    @Excel(name = "椤哄簭鍙�")
+    private String orderNo;
+
+    /** 鎻忚堪 */
+    @Excel(name = "鎻忚堪")
+    private String description;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+    public String getId() 
+    {
+        return id;
+    }
+
+    public void setCode(String code) 
+    {
+        this.code = code;
+    }
+    public String getCode() 
+    {
+        return code;
+    }
+
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+    public String getName() 
+    {
+        return name;
+    }
+
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setStartTime(String startTime)
+    {
+        this.startTime = startTime;
+    }
+    public String getStartTime() { return startTime; }
+
+    public void setEnddTime(String enddTime)
+    {
+        this.enddTime = enddTime;
+    }
+    public String getEnddTime() { return enddTime; }
+
+    public void setIsCrossDay(String isCrossDay) 
+    {
+        this.isCrossDay = isCrossDay;
+    }
+    public String getIsCrossDay() 
+    {
+        return isCrossDay;
+    }
+
+    public void setOrderNo(String orderNo) 
+    {
+        this.orderNo = orderNo;
+    }
+    public String getOrderNo() 
+    {
+        return orderNo;
+    }
+
+    public void setDescription(String description) 
+    {
+        this.description = description;
+    }
+    public String getDescription() 
+    {
+        return description;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("code", getCode())
+            .append("name", getName())
+            .append("deptId", getDeptId())
+            .append("startTime", getStartTime())
+            .append("enddTime", getEnddTime())
+            .append("isCrossDay", getIsCrossDay())
+            .append("orderNo", getOrderNo())
+            .append("description", getDescription())
+            .append("deptName", getDeptName())
+            .toString();
+    }
+    private List<SysDept> children = new ArrayList<SysDept>();
+
+    public List<SysDept> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<SysDept> children) {
+        this.children = children;
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/workForceTreeObject.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/workForceTreeObject.java
new file mode 100644
index 0000000..7148647
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/domain/workForceTreeObject.java
@@ -0,0 +1,67 @@
+package com.dingzhuo.energy.basic.data.workforce.domain;
+
+import com.dingzhuo.energy.project.system.domain.SysDept;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Treeselect鏍戠粨鏋勫疄浣撶被
+ *
+ * @author ruoyi
+ */
+public class workForceTreeObject implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 鑺傜偣ID
+   */
+  private Long id;
+
+  /**
+   * 鑺傜偣鍚嶇О
+   */
+  private String label;
+
+  /**
+   * 瀛愯妭鐐�
+   */
+  @JsonInclude(JsonInclude.Include.NON_EMPTY)
+  private List<workForceTreeObject> children;
+
+  public workForceTreeObject() {
+
+  }
+
+  public workForceTreeObject(SysDept sysDept) {
+    this.id = sysDept.getDeptId();
+    this.label = sysDept.getDeptName();
+    this.children = sysDept.getChildren().stream().map(workForceTreeObject::new).collect(Collectors.toList());
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getLabel() {
+    return label;
+  }
+
+  public void setLabel(String label) {
+    this.label = label;
+  }
+
+  public List<workForceTreeObject> getChildren() {
+    return children;
+  }
+
+  public void setChildren(List<workForceTreeObject> children) {
+    this.children = children;
+  }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringDutyMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringDutyMapper.java
new file mode 100644
index 0000000..41b9f97
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringDutyMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.workforce.mapper;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringDuty;
+import java.util.List;
+
+/**
+ * 鎺掔彮绠$悊Mapper鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+public interface RosteringDutyMapper 
+{
+    /**
+     * 鏌ヨ鎺掔彮绠$悊
+     * 
+     * @param id 鎺掔彮绠$悊ID
+     * @return 鎺掔彮绠$悊
+     */
+    public RosteringDuty selectRosteringDutyById(String id);
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊鍒楄〃
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 鎺掔彮绠$悊闆嗗悎
+     */
+    public List<RosteringDuty> selectRosteringDutyList(RosteringDuty rosteringDuty);
+
+    /**
+     * 鏂板鎺掔彮绠$悊
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 缁撴灉
+     */
+    public int insertRosteringDuty(RosteringDuty rosteringDuty);
+
+    /**
+     * 淇敼鎺掔彮绠$悊
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 缁撴灉
+     */
+    public int updateRosteringDuty(RosteringDuty rosteringDuty);
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊
+     * 
+     * @param id 鎺掔彮绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringDutyById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringDutyByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringMapper.java
new file mode 100644
index 0000000..0eb7464
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringMapper.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.basic.data.workforce.mapper;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.Rostering;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringCopy;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+
+import java.util.List;
+
+/**
+ * 鎺掔彮琛ㄦ煡璇apper鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-05-13
+ */
+public interface RosteringMapper 
+{
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     * @return 杞�兼柟妗堝悕绉版煡璇㈤泦鍚�
+     */
+    public List<RosteringScheme> selectSchemeNameList();
+
+    /**
+     * 鏌ヨ鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param id 鎺掔彮琛ㄦ煡璇D
+     * @return 鎺掔彮琛ㄦ煡璇�
+     */
+    public Rostering selectRosteringById(String id);
+
+    /**
+     * 鏌ヨ鎺掔彮琛ㄦ煡璇㈠垪琛�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 鎺掔彮琛ㄦ煡璇㈤泦鍚�
+     */
+    public List<Rostering> selectRosteringList(Rostering rostering);
+
+    public List<RosteringCopy> selectList(Rostering rostering);
+    /**
+     * 鏂板鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 缁撴灉
+     */
+    public int insertRostering(Rostering rostering);
+    public void saveRostering( List<Rostering> dataItems);
+    /**
+     * 淇敼鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 缁撴灉
+     */
+    public int updateRostering(Rostering rostering);
+
+    /**
+     * 鍒犻櫎鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param id 鎺掔彮琛ㄦ煡璇D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeMapper.java
new file mode 100644
index 0000000..5d6917c
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.workforce.mapper;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+import java.util.List;
+
+/**
+ * 杞�兼柟妗圡apper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-05-12
+ */
+public interface RosteringSchemeMapper 
+{
+    /**
+     * 鏌ヨ杞�兼柟妗�
+     * 
+     * @param id 杞�兼柟妗圛D
+     * @return 杞�兼柟妗�
+     */
+    public RosteringScheme selectRosteringSchemeById(String id);
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 杞�兼柟妗堥泦鍚�
+     */
+    public List<RosteringScheme> selectRosteringSchemeList(RosteringScheme rosteringScheme);
+
+    /**
+     * 鏂板杞�兼柟妗�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int insertRosteringScheme(RosteringScheme rosteringScheme);
+
+    /**
+     * 淇敼杞�兼柟妗�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int updateRosteringScheme(RosteringScheme rosteringScheme);
+
+    /**
+     * 鍒犻櫎杞�兼柟妗�
+     * 
+     * @param id 杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎杞�兼柟妗�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeitemMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeitemMapper.java
new file mode 100644
index 0000000..aff7e03
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringSchemeitemMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.workforce.mapper;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringSchemeitem;
+import java.util.List;
+
+/**
+ * 杞�兼柟妗圡apper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-05-13
+ */
+public interface RosteringSchemeitemMapper 
+{
+    /**
+     * 鏌ヨ杞�兼柟妗�
+     * 
+     * @param description 杞�兼柟妗圛D
+     * @return 杞�兼柟妗�
+     */
+    public RosteringSchemeitem selectRosteringSchemeitemById(String description);
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 杞�兼柟妗堥泦鍚�
+     */
+    public List<RosteringSchemeitem> selectRosteringSchemeitemList(RosteringSchemeitem rosteringSchemeitem);
+
+    /**
+     * 鏂板杞�兼柟妗�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int insertRosteringSchemeitem(RosteringSchemeitem rosteringSchemeitem);
+
+    /**
+     * 淇敼杞�兼柟妗�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int updateRosteringSchemeitem(RosteringSchemeitem rosteringSchemeitem);
+
+    /**
+     * 鍒犻櫎杞�兼柟妗�
+     * 
+     * @param description 杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeitemById(String description);
+
+    /**
+     * 鎵归噺鍒犻櫎杞�兼柟妗�
+     * 
+     * @param descriptions 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeitemByIds(String[] descriptions);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringShiftMapper.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringShiftMapper.java
new file mode 100644
index 0000000..e6b9478
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/mapper/RosteringShiftMapper.java
@@ -0,0 +1,64 @@
+package com.dingzhuo.energy.basic.data.workforce.mapper;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringShift;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+
+import java.util.List;
+
+/**
+ * 鎺掔彮绠$悊璁剧疆Mapper鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+public interface RosteringShiftMapper 
+{
+    public List<SysDept> treeList();
+    /**
+     * 鏌ヨ鎺掔彮绠$悊璁剧疆
+     * 
+     * @param id 鎺掔彮绠$悊璁剧疆ID
+     * @return 鎺掔彮绠$悊璁剧疆
+     */
+    public RosteringShift selectRosteringShiftById(String id);
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊璁剧疆鍒楄〃
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 鎺掔彮绠$悊璁剧疆闆嗗悎
+     */
+    public List<RosteringShift> selectRosteringShiftList(RosteringShift rosteringShift);
+
+    /**
+     * 鏂板鎺掔彮绠$悊璁剧疆
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 缁撴灉
+     */
+    public int insertRosteringShift(RosteringShift rosteringShift);
+
+    /**
+     * 淇敼鎺掔彮绠$悊璁剧疆
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 缁撴灉
+     */
+    public int updateRosteringShift(RosteringShift rosteringShift);
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊璁剧疆
+     * 
+     * @param id 鎺掔彮绠$悊璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringShiftById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮绠$悊璁剧疆
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringShiftByIds(String[] ids);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringDutyService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringDutyService.java
new file mode 100644
index 0000000..ceea57b
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringDutyService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.workforce.service;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringDuty;
+import java.util.List;
+
+/**
+ * 鎺掔彮绠$悊Service鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+public interface IRosteringDutyService 
+{
+    /**
+     * 鏌ヨ鎺掔彮绠$悊
+     * 
+     * @param id 鎺掔彮绠$悊ID
+     * @return 鎺掔彮绠$悊
+     */
+    public RosteringDuty selectRosteringDutyById(String id);
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊鍒楄〃
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 鎺掔彮绠$悊闆嗗悎
+     */
+    public List<RosteringDuty> selectRosteringDutyList(RosteringDuty rosteringDuty);
+
+    /**
+     * 鏂板鎺掔彮绠$悊
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 缁撴灉
+     */
+    public int insertRosteringDuty(RosteringDuty rosteringDuty);
+
+    /**
+     * 淇敼鎺掔彮绠$悊
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 缁撴灉
+     */
+    public int updateRosteringDuty(RosteringDuty rosteringDuty);
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎺掔彮绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringDutyByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊淇℃伅
+     * 
+     * @param id 鎺掔彮绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringDutyById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeService.java
new file mode 100644
index 0000000..1223d25
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.workforce.service;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+import java.util.List;
+
+/**
+ * 杞�兼柟妗圫ervice鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-05-12
+ */
+public interface IRosteringSchemeService 
+{
+    /**
+     * 鏌ヨ杞�兼柟妗�
+     * 
+     * @param id 杞�兼柟妗圛D
+     * @return 杞�兼柟妗�
+     */
+    public RosteringScheme selectRosteringSchemeById(String id);
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 杞�兼柟妗堥泦鍚�
+     */
+    public List<RosteringScheme> selectRosteringSchemeList(RosteringScheme rosteringScheme);
+
+    /**
+     * 鏂板杞�兼柟妗�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int insertRosteringScheme(RosteringScheme rosteringScheme);
+
+    /**
+     * 淇敼杞�兼柟妗�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int updateRosteringScheme(RosteringScheme rosteringScheme);
+
+    /**
+     * 鎵归噺鍒犻櫎杞�兼柟妗�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎杞�兼柟妗堜俊鎭�
+     * 
+     * @param id 杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeitemService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeitemService.java
new file mode 100644
index 0000000..9d8bbc6
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringSchemeitemService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.basic.data.workforce.service;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringSchemeitem;
+import java.util.List;
+
+/**
+ * 杞�兼柟妗圫ervice鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-05-13
+ */
+public interface IRosteringSchemeitemService 
+{
+    /**
+     * 鏌ヨ杞�兼柟妗�
+     * 
+     * @param description 杞�兼柟妗圛D
+     * @return 杞�兼柟妗�
+     */
+    public RosteringSchemeitem selectRosteringSchemeitemById(String description);
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 杞�兼柟妗堥泦鍚�
+     */
+    public List<RosteringSchemeitem> selectRosteringSchemeitemList(RosteringSchemeitem rosteringSchemeitem);
+
+    /**
+     * 鏂板杞�兼柟妗�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int insertRosteringSchemeitem(RosteringSchemeitem rosteringSchemeitem);
+
+    /**
+     * 淇敼杞�兼柟妗�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    public int updateRosteringSchemeitem(RosteringSchemeitem rosteringSchemeitem);
+
+    /**
+     * 鎵归噺鍒犻櫎杞�兼柟妗�
+     * 
+     * @param descriptions 闇�瑕佸垹闄ょ殑杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeitemByIds(String[] descriptions);
+
+    /**
+     * 鍒犻櫎杞�兼柟妗堜俊鎭�
+     * 
+     * @param description 杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringSchemeitemById(String description);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringService.java
new file mode 100644
index 0000000..1691ea5
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringService.java
@@ -0,0 +1,76 @@
+package com.dingzhuo.energy.basic.data.workforce.service;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.Rostering;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringCopy;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+
+import java.util.List;
+
+/**
+ * 鎺掔彮琛ㄦ煡璇ervice鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-05-13
+ */
+public interface IRosteringService 
+{
+    /**
+     * 鏌ヨ杞�兼柟妗堝悕绉�
+     * @return 杞�兼柟妗堝悕绉伴泦鍚�
+     */
+    public List<RosteringScheme> selectSchemeNameList();
+    /**
+     * 鏌ヨ鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param id 鎺掔彮琛ㄦ煡璇D
+     * @return 鎺掔彮琛ㄦ煡璇�
+     */
+    public Rostering selectRosteringById(String id);
+
+    /**
+     * 鏌ヨ鎺掔彮琛ㄦ煡璇㈠垪琛�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 鎺掔彮琛ㄦ煡璇㈤泦鍚�
+     */
+    public List<Rostering> selectRosteringList(Rostering rostering);
+
+    /**
+     *
+     * @return
+     */
+    public List<RosteringCopy> selectList(Rostering rostering);
+    /**
+     * 鏂板鎺掔彮琛ㄦ煡璇�
+
+     * @return 缁撴灉
+     */
+    public int insertRostering(Rostering rostering );
+    public void saveRostering(List<Rostering> dataItems);
+
+    /**
+     * 淇敼鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 缁撴灉
+     */
+    public int updateRostering(Rostering rostering);
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎺掔彮琛ㄦ煡璇D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鎺掔彮琛ㄦ煡璇俊鎭�
+     * 
+     * @param id 鎺掔彮琛ㄦ煡璇D
+     * @return 缁撴灉
+     */
+    public int deleteRosteringById(String id);
+
+
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringShiftService.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringShiftService.java
new file mode 100644
index 0000000..40b25de
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/IRosteringShiftService.java
@@ -0,0 +1,66 @@
+package com.dingzhuo.energy.basic.data.workforce.service;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringShift;
+import com.dingzhuo.energy.basic.data.workforce.domain.workForceTreeObject;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+
+import java.util.List;
+
+/**
+ * 鎺掔彮绠$悊璁剧疆Service鎺ュ彛
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+public interface IRosteringShiftService 
+{
+    public List<SysDept> treeList();
+    public List<workForceTreeObject> buildModelNodeTree(List<SysDept> modelNodes);
+    /**
+     * 鏌ヨ鎺掔彮绠$悊璁剧疆
+     * 
+     * @param id 鎺掔彮绠$悊璁剧疆ID
+     * @return 鎺掔彮绠$悊璁剧疆
+     */
+    public RosteringShift selectRosteringShiftById(String id);
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊璁剧疆鍒楄〃
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 鎺掔彮绠$悊璁剧疆闆嗗悎
+     */
+    public List<RosteringShift> selectRosteringShiftList(RosteringShift rosteringShift);
+
+    /**
+     * 鏂板鎺掔彮绠$悊璁剧疆
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 缁撴灉
+     */
+    public int insertRosteringShift(RosteringShift rosteringShift);
+
+    /**
+     * 淇敼鎺掔彮绠$悊璁剧疆
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 缁撴灉
+     */
+    public int updateRosteringShift(RosteringShift rosteringShift);
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮绠$悊璁剧疆
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎺掔彮绠$悊璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringShiftByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊璁剧疆淇℃伅
+     * 
+     * @param id 鎺掔彮绠$悊璁剧疆ID
+     * @return 缁撴灉
+     */
+    public int deleteRosteringShiftById(String id);
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringDutyServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringDutyServiceImpl.java
new file mode 100644
index 0000000..6178baf
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringDutyServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.basic.data.workforce.service.impl;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringDuty;
+import com.dingzhuo.energy.basic.data.workforce.mapper.RosteringDutyMapper;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringDutyService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 鎺掔彮绠$悊Service涓氬姟灞傚鐞�
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+@Service
+public class RosteringDutyServiceImpl implements IRosteringDutyService 
+{
+    @Autowired
+    private RosteringDutyMapper rosteringDutyMapper;
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊
+     * 
+     * @param id 鎺掔彮绠$悊ID
+     * @return 鎺掔彮绠$悊
+     */
+    @Override
+    public RosteringDuty selectRosteringDutyById(String id)
+    {
+        return rosteringDutyMapper.selectRosteringDutyById(id);
+    }
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊鍒楄〃
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 鎺掔彮绠$悊
+     */
+    @Override
+    public List<RosteringDuty> selectRosteringDutyList(RosteringDuty rosteringDuty)
+    {
+        return rosteringDutyMapper.selectRosteringDutyList(rosteringDuty);
+    }
+
+    /**
+     * 鏂板鎺掔彮绠$悊
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertRosteringDuty(RosteringDuty rosteringDuty)
+    {
+        return rosteringDutyMapper.insertRosteringDuty(rosteringDuty);
+    }
+
+    /**
+     * 淇敼鎺掔彮绠$悊
+     * 
+     * @param rosteringDuty 鎺掔彮绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateRosteringDuty(RosteringDuty rosteringDuty)
+    {
+        rosteringDuty.setUpdateTime(DateUtils.getNowDate());
+        return rosteringDutyMapper.updateRosteringDuty(rosteringDuty);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮绠$悊
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎺掔彮绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringDutyByIds(String[] ids)
+    {
+        return rosteringDutyMapper.deleteRosteringDutyByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊淇℃伅
+     * 
+     * @param id 鎺掔彮绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringDutyById(String id)
+    {
+        return rosteringDutyMapper.deleteRosteringDutyById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeServiceImpl.java
new file mode 100644
index 0000000..cf04f64
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeServiceImpl.java
@@ -0,0 +1,95 @@
+package com.dingzhuo.energy.basic.data.workforce.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.workforce.mapper.RosteringSchemeMapper;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringSchemeService;
+
+/**
+ * 杞�兼柟妗圫ervice涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-05-12
+ */
+@Service
+public class RosteringSchemeServiceImpl implements IRosteringSchemeService 
+{
+    @Autowired
+    private RosteringSchemeMapper rosteringSchemeMapper;
+
+    /**
+     * 鏌ヨ杞�兼柟妗�
+     * 
+     * @param id 杞�兼柟妗圛D
+     * @return 杞�兼柟妗�
+     */
+    @Override
+    public RosteringScheme selectRosteringSchemeById(String id)
+    {
+        return rosteringSchemeMapper.selectRosteringSchemeById(id);
+    }
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 杞�兼柟妗�
+     */
+    @Override
+    public List<RosteringScheme> selectRosteringSchemeList(RosteringScheme rosteringScheme)
+    {
+        return rosteringSchemeMapper.selectRosteringSchemeList(rosteringScheme);
+    }
+
+    /**
+     * 鏂板杞�兼柟妗�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertRosteringScheme(RosteringScheme rosteringScheme)
+    {
+        return rosteringSchemeMapper.insertRosteringScheme(rosteringScheme);
+    }
+
+    /**
+     * 淇敼杞�兼柟妗�
+     * 
+     * @param rosteringScheme 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateRosteringScheme(RosteringScheme rosteringScheme)
+    {
+        rosteringScheme.setUpdateTime(DateUtils.getNowDate());
+        return rosteringSchemeMapper.updateRosteringScheme(rosteringScheme);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎杞�兼柟妗�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringSchemeByIds(String[] ids)
+    {
+        return rosteringSchemeMapper.deleteRosteringSchemeByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎杞�兼柟妗堜俊鎭�
+     * 
+     * @param id 杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringSchemeById(String id)
+    {
+        return rosteringSchemeMapper.deleteRosteringSchemeById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeitemServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeitemServiceImpl.java
new file mode 100644
index 0000000..acc05b3
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringSchemeitemServiceImpl.java
@@ -0,0 +1,95 @@
+package com.dingzhuo.energy.basic.data.workforce.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.basic.data.workforce.mapper.RosteringSchemeitemMapper;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringSchemeitem;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringSchemeitemService;
+
+/**
+ * 杞�兼柟妗圫ervice涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-05-13
+ */
+@Service
+public class RosteringSchemeitemServiceImpl implements IRosteringSchemeitemService 
+{
+    @Autowired
+    private RosteringSchemeitemMapper rosteringSchemeitemMapper;
+
+    /**
+     * 鏌ヨ杞�兼柟妗�
+     * 
+     * @param description 杞�兼柟妗圛D
+     * @return 杞�兼柟妗�
+     */
+    @Override
+    public RosteringSchemeitem selectRosteringSchemeitemById(String description)
+    {
+        return rosteringSchemeitemMapper.selectRosteringSchemeitemById(description);
+    }
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝垪琛�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 杞�兼柟妗�
+     */
+    @Override
+    public List<RosteringSchemeitem> selectRosteringSchemeitemList(RosteringSchemeitem rosteringSchemeitem)
+    {
+        return rosteringSchemeitemMapper.selectRosteringSchemeitemList(rosteringSchemeitem);
+    }
+
+    /**
+     * 鏂板杞�兼柟妗�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertRosteringSchemeitem(RosteringSchemeitem rosteringSchemeitem)
+    {
+        return rosteringSchemeitemMapper.insertRosteringSchemeitem(rosteringSchemeitem);
+    }
+
+    /**
+     * 淇敼杞�兼柟妗�
+     * 
+     * @param rosteringSchemeitem 杞�兼柟妗�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateRosteringSchemeitem(RosteringSchemeitem rosteringSchemeitem)
+    {
+        rosteringSchemeitem.setUpdateTime(DateUtils.getNowDate());
+        return rosteringSchemeitemMapper.updateRosteringSchemeitem(rosteringSchemeitem);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎杞�兼柟妗�
+     * 
+     * @param descriptions 闇�瑕佸垹闄ょ殑杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringSchemeitemByIds(String[] descriptions)
+    {
+        return rosteringSchemeitemMapper.deleteRosteringSchemeitemByIds(descriptions);
+    }
+
+    /**
+     * 鍒犻櫎杞�兼柟妗堜俊鎭�
+     * 
+     * @param description 杞�兼柟妗圛D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringSchemeitemById(String description)
+    {
+        return rosteringSchemeitemMapper.deleteRosteringSchemeitemById(description);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringServiceImpl.java
new file mode 100644
index 0000000..5c058f3
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringServiceImpl.java
@@ -0,0 +1,115 @@
+package com.dingzhuo.energy.basic.data.workforce.service.impl;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.Rostering;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringCopy;
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringScheme;
+import com.dingzhuo.energy.basic.data.workforce.mapper.RosteringMapper;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 鎺掔彮琛ㄦ煡璇ervice涓氬姟灞傚鐞�
+ * 
+ * @author liuli
+ * @date 2020-05-13
+ */
+@Service
+public class RosteringServiceImpl implements IRosteringService 
+{
+    @Autowired
+    private RosteringMapper rosteringMapper;
+
+    /**
+     * 鏌ヨ杞�兼柟妗堝悕绉�
+     * @return 杞�兼柟妗堝悕绉伴泦鍚�
+     */
+    @Override
+    public List<RosteringScheme> selectSchemeNameList() {
+        return rosteringMapper.selectSchemeNameList();
+    }
+
+
+    /**
+     * 鏌ヨ鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param id 鎺掔彮琛ㄦ煡璇D
+     * @return 鎺掔彮琛ㄦ煡璇�
+     */
+    @Override
+    public Rostering selectRosteringById(String id)
+    {
+        return rosteringMapper.selectRosteringById(id);
+    }
+
+    /**
+     * 鏌ヨ鎺掔彮琛ㄦ煡璇㈠垪琛�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 鎺掔彮琛ㄦ煡璇�
+     */
+    @Override
+    public List<Rostering> selectRosteringList(Rostering rostering)
+    {
+        return rosteringMapper.selectRosteringList(rostering);
+    }
+    @Override
+    public List<RosteringCopy> selectList(Rostering rostering)
+    {
+        return rosteringMapper.selectList(rostering);
+    }
+    /**
+     * 鏂板鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertRostering(Rostering rostering)
+    {
+        return rosteringMapper.insertRostering(rostering);
+    }
+    @Override
+    public void saveRostering(List<Rostering> dataItems){
+        rosteringMapper.saveRostering(dataItems);
+    }
+    /**
+     * 淇敼鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param rostering 鎺掔彮琛ㄦ煡璇�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateRostering(Rostering rostering)
+    {
+        rostering.setUpdateTime(DateUtils.getNowDate());
+        return rosteringMapper.updateRostering(rostering);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮琛ㄦ煡璇�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎺掔彮琛ㄦ煡璇D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringByIds(String[] ids)
+    {
+        return rosteringMapper.deleteRosteringByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鎺掔彮琛ㄦ煡璇俊鎭�
+     * 
+     * @param id 鎺掔彮琛ㄦ煡璇D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringById(String id)
+    {
+        return rosteringMapper.deleteRosteringById(id);
+    }
+}
diff --git a/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringShiftServiceImpl.java b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringShiftServiceImpl.java
new file mode 100644
index 0000000..c13c2e4
--- /dev/null
+++ b/basic-data/src/main/java/com/dingzhuo/energy/basic/data/workforce/service/impl/RosteringShiftServiceImpl.java
@@ -0,0 +1,129 @@
+package com.dingzhuo.energy.basic.data.workforce.service.impl;
+
+import com.dingzhuo.energy.basic.data.workforce.domain.RosteringShift;
+import com.dingzhuo.energy.basic.data.workforce.domain.workForceTreeObject;
+import com.dingzhuo.energy.basic.data.workforce.mapper.RosteringShiftMapper;
+import com.dingzhuo.energy.basic.data.workforce.service.IRosteringShiftService;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase;
+
+/**
+ * 鎺掔彮绠$悊璁剧疆Service涓氬姟灞傚鐞�
+ * 
+ * @author liuli
+ * @date 2020-05-12
+ */
+@Service
+public class RosteringShiftServiceImpl implements IRosteringShiftService 
+{
+    @Autowired
+    private RosteringShiftMapper rosteringShiftMapper;
+    @Override
+    public List<SysDept> treeList() {
+        return rosteringShiftMapper.treeList();
+    }
+    @Override
+    public List<workForceTreeObject> buildModelNodeTree(List<SysDept> modelNodes) {
+        List<SysDept> modelNodeTree = modelNodes.stream()
+                .filter(f -> f.getParentId().toString().equals("0"))
+                .collect(Collectors.toList());
+        for (SysDept modelNode : modelNodeTree) {
+            List<SysDept> children = modelNodes.stream()
+                    .filter(f -> equalsAnyIgnoreCase(f.getParentId().toString(), modelNode.getDeptId().toString()))
+                    .collect(Collectors.toList());
+            buildTree(modelNode, children, modelNodes);
+        }
+        return modelNodeTree.stream().map(workForceTreeObject::new).collect(Collectors.toList());
+    }
+    private void buildTree(SysDept parent, List<SysDept> children, List<SysDept> modelNodes) {
+        parent.setChildren(children);
+
+        for (SysDept modelNode : children) {
+            List<SysDept> tmp = modelNodes.stream()
+                    .filter(f -> equalsAnyIgnoreCase(f.getParentId().toString(), modelNode.getDeptId().toString()))
+                    .collect(Collectors.toList());
+            if (!tmp.isEmpty()) {
+                buildTree(modelNode, tmp, modelNodes);
+            }
+        }
+    }
+    /**
+     * 鏌ヨ鎺掔彮绠$悊璁剧疆
+     * 
+     * @param id 鎺掔彮绠$悊璁剧疆ID
+     * @return 鎺掔彮绠$悊璁剧疆
+     */
+    @Override
+    public RosteringShift selectRosteringShiftById(String id)
+    {
+        return rosteringShiftMapper.selectRosteringShiftById(id);
+    }
+
+    /**
+     * 鏌ヨ鎺掔彮绠$悊璁剧疆鍒楄〃
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 鎺掔彮绠$悊璁剧疆
+     */
+    @Override
+    public List<RosteringShift> selectRosteringShiftList(RosteringShift rosteringShift)
+    {
+        return rosteringShiftMapper.selectRosteringShiftList(rosteringShift);
+    }
+
+    /**
+     * 鏂板鎺掔彮绠$悊璁剧疆
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertRosteringShift(RosteringShift rosteringShift)
+    {
+        return rosteringShiftMapper.insertRosteringShift(rosteringShift);
+    }
+
+    /**
+     * 淇敼鎺掔彮绠$悊璁剧疆
+     * 
+     * @param rosteringShift 鎺掔彮绠$悊璁剧疆
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateRosteringShift(RosteringShift rosteringShift)
+    {
+        rosteringShift.setUpdateTime(DateUtils.getNowDate());
+        return rosteringShiftMapper.updateRosteringShift(rosteringShift);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鎺掔彮绠$悊璁剧疆
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎺掔彮绠$悊璁剧疆ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringShiftByIds(String[] ids)
+    {
+        return rosteringShiftMapper.deleteRosteringShiftByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鎺掔彮绠$悊璁剧疆淇℃伅
+     * 
+     * @param id 鎺掔彮绠$悊璁剧疆ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRosteringShiftById(String id)
+    {
+        return rosteringShiftMapper.deleteRosteringShiftById(id);
+    }
+}
diff --git a/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnerclassMapper.xml b/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnerclassMapper.xml
new file mode 100644
index 0000000..aa8e840
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnerclassMapper.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysEnerclassMapper">
+
+    <resultMap type="SysEnerclass" id="SysEnerclassResult">
+        <result property="enerclassid"    column="enerclassid"    />
+        <result property="enerclassname"    column="enerclassname"    />
+        <result property="oprMan"    column="opr_man"    />
+        <result property="oprTime"    column="opr_time"    />
+        <result property="modMan"    column="mod_man"    />
+        <result property="modTime"    column="mod_time"    />
+        <result property="note"    column="note"    />
+    </resultMap>
+
+    <sql id="selectSysEnerclassVo">
+        select enerclassid, enerclassname, opr_man, opr_time, mod_man, mod_time, note from sys_enerclass
+    </sql>
+
+    <select id="selectSysEnerclassList" parameterType="SysEnerclass" resultMap="SysEnerclassResult">
+        <include refid="selectSysEnerclassVo"/>
+        <where>
+            <if test="enerclassname != null  and enerclassname != ''"> and enerclassname like concat('%', #{enerclassname}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectSysEnerclassById" parameterType="Integer" resultMap="SysEnerclassResult">
+        <include refid="selectSysEnerclassVo"/>
+        where enerclassid = #{enerclassid}
+    </select>
+
+    <insert id="insertSysEnerclass" parameterType="SysEnerclass">
+        insert into sys_enerclass
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            mod_time,
+            opr_time,
+            <if test="note != null  and note != ''">note,</if>
+            <if test="enerclassid != null ">enerclassid,</if>
+            <if test="enerclassname != null  and enerclassname != ''">enerclassname,</if>
+            <if test="oprMan != null  and oprMan != ''">opr_man,</if>
+            <if test="modMan != null  and modMan != ''">mod_man,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            now(),
+            now(),
+            <if test="note != null  and note != ''">#{note},</if>
+            <if test="enerclassid != null ">#{enerclassid},</if>
+            <if test="enerclassname != null  and enerclassname != ''">#{enerclassname},</if>
+            <if test="oprMan != null  and oprMan != ''">#{oprMan},</if>
+            <if test="modMan != null  and modMan != ''">#{modMan},</if>
+        </trim>
+    </insert>
+
+    <update id="updateSysEnerclass" parameterType="SysEnerclass">
+        update sys_enerclass
+        <trim prefix="SET" suffixOverrides=",">
+            mod_time = now(),
+            <if test="enerclassname != null  and enerclassname != ''">enerclassname = #{enerclassname},</if>
+            <if test="modMan != null  and modMan != ''">mod_man = #{modMan},</if>
+            <if test="note != null  and note != ''">note = #{note},</if>
+        </trim>
+        where enerclassid = #{enerclassid}
+    </update>
+
+    <delete id="deleteSysEnerclassById" parameterType="Integer">
+        delete from sys_enerclass where enerclassid = #{enerclassid}
+    </delete>
+
+    <delete id="deleteSysEnerclassByIds" parameterType="String">
+        delete from sys_enerclass where enerclassid in
+        <foreach item="enerclassid" collection="array" open="(" separator="," close=")">
+            #{enerclassid}
+        </foreach>
+    </delete>
+
+    <select id="selectSameEnergyNameNum" parameterType="String" resultType="Integer">
+        select COUNT(enerclassid) from sys_enerclass where enerclassname = #{enerclassname}
+    </select>
+
+    <select id="selectIdByName" parameterType="String" resultType="Integer">
+        select enerclassid from sys_enerclass where enerclassname = #{enerclassname}
+    </select>
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnercoefficientMapper.xml b/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnercoefficientMapper.xml
new file mode 100644
index 0000000..31cf6b9
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnercoefficientMapper.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysEnercoefficientMapper">
+
+    <resultMap type="SysEnercoefficient" id="SysEnercoefficientResult">
+        <result property="ecid"    column="ecid"    />
+        <result property="enerid"    column="enerid"    />
+        <result property="coefficient"    column="coefficient"    />
+        <result property="coefficient2"    column="coefficient2"    />
+        <result property="execdate"    column="execdate"    />
+        <result property="oprMan"    column="opr_man"    />
+        <result property="oprTime"    column="opr_time"    />
+        <result property="modMan"    column="mod_man"    />
+        <result property="modTime"    column="mod_time"    />
+        <result property="note"    column="note"    />
+    </resultMap>
+
+    <sql id="selectSysEnercoefficientVo">
+        select ecid, enerid, coefficient, coefficient2, execdate, opr_man, opr_time, mod_man, mod_time, note from sys_enercoefficient
+    </sql>
+
+    <select id="selectSysEnercoefficientList" parameterType="SysEnercoefficient" resultMap="SysEnercoefficientResult">
+        select a.ecid, a.enerid, a.coefficient, a.coefficient2, a.execdate, a.opr_man, a.opr_time, a.mod_man, a.mod_time, a.note,b.enername
+        from sys_enercoefficient a
+        left join sys_energy b on a.enerid = b.enerid
+        <where>
+            <if test="enername != null  and enername != ''"> and enername like concat('%', #{enername}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectSysEnercoefficientById" parameterType="Integer" resultMap="SysEnercoefficientResult">
+        <include refid="selectSysEnercoefficientVo"/>
+        where ecid = #{ecid}
+    </select>
+
+    <insert id="insertSysEnercoefficient" parameterType="SysEnercoefficient">
+        insert into sys_enercoefficient
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="ecid != null ">ecid,</if>
+            <if test="enerid != null ">enerid,</if>
+            <if test="coefficient != null  and coefficient != ''">coefficient,</if>
+            <if test="coefficient2 != null  and coefficient2 != ''">coefficient2,</if>
+            <if test="execdate != null ">execdate,</if>
+            <if test="oprMan != null  and oprMan != ''">opr_man,</if>
+            <if test="oprTime != null ">opr_time,</if>
+            <if test="modMan != null  and modMan != ''">mod_man,</if>
+            <if test="modTime != null ">mod_time,</if>
+            <if test="note != null  and note != ''">note,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="ecid != null ">#{ecid},</if>
+            <if test="enerid != null ">#{enerid},</if>
+            <if test="coefficient != null  and coefficient != ''">#{coefficient},</if>
+            <if test="coefficient2 != null  and coefficient2 != ''">#{coefficient2},</if>
+            <if test="execdate != null ">#{execdate},</if>
+            <if test="oprMan != null  and oprMan != ''">#{oprMan},</if>
+            <if test="oprTime != null ">#{oprTime},</if>
+            <if test="modMan != null  and modMan != ''">#{modMan},</if>
+            <if test="modTime != null ">#{modTime},</if>
+            <if test="note != null  and note != ''">#{note},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysEnercoefficient" parameterType="SysEnercoefficient">
+        update sys_enercoefficient
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="enerid != null ">enerid = #{enerid},</if>
+            <if test="coefficient != null  and coefficient != ''">coefficient = #{coefficient},</if>
+            <if test="coefficient2 != null  and coefficient2 != ''">coefficient2 = #{coefficient2},</if>
+            <if test="execdate != null ">execdate = #{execdate},</if>
+            <if test="oprMan != null  and oprMan != ''">opr_man = #{oprMan},</if>
+            <if test="oprTime != null ">opr_time = #{oprTime},</if>
+            <if test="modMan != null  and modMan != ''">mod_man = #{modMan},</if>
+            <if test="modTime != null ">mod_time = #{modTime},</if>
+            <if test="note != null  and note != ''">note = #{note},</if>
+        </trim>
+        where ecid = #{ecid}
+    </update>
+
+    <delete id="deleteSysEnercoefficientById" parameterType="Integer">
+        delete from sys_enercoefficient where ecid = #{ecid}
+    </delete>
+
+    <delete id="deleteSysEnercoefficientByIds" parameterType="String">
+        delete from sys_enercoefficient where ecid in
+        <foreach item="ecid" collection="array" open="(" separator="," close=")">
+            #{ecid}
+        </foreach>
+    </delete>
+
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnergyMapper.xml b/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnergyMapper.xml
new file mode 100644
index 0000000..d1cee51
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/enerInfoManage/SysEnergyMapper.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysEnergyMapper">
+
+    <resultMap type="SysEnergy" id="SysEnergyResult">
+        <result property="oprMan"    column="opr_man"    />
+        <result property="oprTime"    column="opr_time"    />
+        <result property="modMan"    column="mod_man"    />
+        <result property="modTime"    column="mod_time"    />
+        <result property="enerid"    column="enerid"    />
+        <result property="enername"    column="enername"    />
+        <result property="muid"    column="muid"    />
+        <result property="enerclassid"    column="enerclassid"    />
+        <result property="enersno"    column="enersno"    />
+        <result property="isstorage"    column="isstorage"    />
+        <result property="note"    column="note"    />
+    </resultMap>
+
+    <sql id="selectSysEnergyVo">
+        select
+        a.opr_man, a.opr_time, a.mod_man, a.mod_time, a.enerid, a.enername,
+        a.muid as muidString, a.enerclassid, a.enersno, a.isstorage, a.note,enerclassname
+        from sys_energy a left join sys_enerclass  b on a.enerclassid = b.enerclassid
+    </sql>
+
+    <select id="getenerclassname" resultType="SysEnerclass">
+        select enerclassid,enerclassname from sys_enerclass
+    </select>
+
+    <select id="selectSysEnergyList" parameterType="SysEnergy" resultMap="SysEnergyResult">
+        select
+        a.opr_man, a.opr_time, a.mod_man, a.mod_time, a.enerid, a.enername,
+        a.muid as muidString, a.enerclassid, a.enersno, a.isstorage, a.note,enerclassname,
+        c.dict_label as muidName
+        from sys_energy a left join sys_enerclass  b on a.enerclassid = b.enerclassid
+        left join sys_dict_data c on a.muid = c.dict_sort and dict_type = 'sys_unit'
+        <where>
+            <if test="enername != null  and enername != ''"> and enername like concat('%', #{enername}, '%')</if>
+            <if test="enerclassname != null  and enerclassname != ''"> and enerclassname = #{enerclassname}</if>
+        </where>
+    </select>
+
+    <select id="selectSysEnergyById" parameterType="Integer" resultMap="SysEnergyResult">
+        select
+        a.opr_man, a.opr_time, a.mod_man, a.mod_time, a.enerid, a.enername,
+        a.muid as muidString, a.enerclassid, a.enersno, a.isstorage, a.note,enerclassname,
+        c.dict_label as muidName,d.coefficient,d.coefficient2,d.execdate as coefficientexecdate,d.note as coefficientnote
+        from sys_energy a left join sys_enerclass  b on a.enerclassid = b.enerclassid
+        left join sys_dict_data c on a.muid = c.dict_sort and dict_type = 'sys_unit'
+            left join sys_enercoefficient d on a.enerid = d.enerid
+        where a.enerid = #{enerid}
+    </select>
+
+    <insert id="insertSysEnergy" parameterType="SysEnergy">
+        insert into sys_energy
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            mod_time,
+            opr_time,
+            <if test="oprMan != null  and oprMan != ''">opr_man,</if>
+            <if test="modMan != null  and modMan != ''">mod_man,</if>
+            <if test="enerid != null ">enerid,</if>
+            <if test="enername != null  and enername != ''">enername,</if>
+            <if test="muidString != null ">muid,</if>
+            <if test="enerclassid != null ">enerclassid,</if>
+            <if test="enersno != null  and enersno != ''">enersno,</if>
+            <if test="isstorage != null ">isstorage,</if>
+            <if test="note != null  and note != ''">note,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            now(),
+            now(),
+            <if test="oprMan != null  and oprMan != ''">#{oprMan},</if>
+            <if test="modMan != null  and modMan != ''">#{modMan},</if>
+            <if test="enerid != null ">#{enerid},</if>
+            <if test="enername != null  and enername != ''">#{enername},</if>
+            <if test="muidString != null ">#{muidString},</if>
+            <if test="enerclassid != null ">#{enerclassid},</if>
+            <if test="enersno != null  and enersno != ''">#{enersno},</if>
+            <if test="isstorage != null ">#{isstorage},</if>
+            <if test="note != null  and note != ''">#{note},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysEnergy" parameterType="SysEnergy">
+        update sys_energy
+        <trim prefix="SET" suffixOverrides=",">
+            mod_time = now(),
+            <if test="modMan != null  and modMan != ''">mod_man = #{modMan},</if>
+            <if test="enerid != null ">enerid = #{enerid},</if>
+            <if test="enername != null  and enername != ''">enername = #{enername},</if>
+            <if test="muidString != null ">muid = #{muidString},</if>
+            <if test="enerclassid != null ">enerclassid = #{enerclassid},</if>
+            <if test="enersno != null  and enersno != ''">enersno = #{enersno},</if>
+            <if test="isstorage != null ">isstorage = #{isstorage},</if>
+            <if test="note != null  and note != ''">note = #{note},</if>
+        </trim>
+        where enerid = #{enerid}
+    </update>
+
+    <delete id="deleteSysEnergyById" parameterType="String">
+        delete from sys_energy where enerid = #{enerid}
+    </delete>
+
+    <delete id="deleteSysEnergyByIds" parameterType="String">
+        delete from sys_energy where enerid in
+        <foreach item="enerid" collection="array" open="(" separator="," close=")">
+            #{enerid}
+        </foreach>
+    </delete>
+
+    <select id="getEnerClassid" parameterType="String" resultType="Integer">
+        select enerclassid from sys_enerclass where enerclassname = #{enerclassname}
+    </select>
+
+    <select id="selectSameEnergyNameNum" parameterType="String" resultType="Integer">
+        select COUNT(enerid) from sys_energy where enername = #{enername}
+    </select>
+
+    <select id="selectIdByName" parameterType="String" resultType="Integer">
+        select enerid from sys_energy where enername = #{enername}
+    </select>
+
+    <select id="getPriceCountByEnerid" parameterType="SysEnergy" resultType="Integer">
+        select COUNT(objectid) from sys_price where objectid = #{enerid} and objecttype = 1 and execdate = #{execdate}
+    </select>
+
+    <insert id="insertEnergyPrice" parameterType="SysEnergy">
+        insert into sys_price
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            mod_time,
+            opr_time,
+            <if test="oprMan != null  and oprMan != ''">opr_man,</if>
+            <if test="modMan != null  and modMan != ''">mod_man,</if>
+            objectid,
+            objecttype,
+            price,
+            execdate,
+            <if test="note != null  and note != ''">note,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            now(),
+            now(),
+            <if test="oprMan != null  and oprMan != ''">#{oprMan},</if>
+            <if test="modMan != null  and modMan != ''">#{modMan},</if>
+            <if test="enerid != null ">#{enerid},</if>
+            1,
+            #{price},
+            #{execdate},
+            <if test="note != null  and note != ''">#{pricenote},</if>
+        </trim>
+    </insert>
+
+    <update id="updateEnergyPrice" parameterType="SysEnergy" >
+        update sys_price
+        <trim prefix="SET" suffixOverrides=",">
+            mod_time = now(),
+            <if test="modMan != null  and modMan != ''">mod_man = #{modMan},</if>
+            price = #{price},
+            execdate = #{execdate},
+            <if test="note != null  and note != ''">note = #{pricenote},</if>
+        </trim>
+    </update>
+
+    <select id="getCoefficientCountByEnerid" parameterType="Integer" resultType="Integer">
+        select COUNT(enerid) from sys_enercoefficient where enerid = #{enerid}
+    </select>
+
+    <insert id="insertEnergyCoefficient" parameterType="SysEnergy">
+        insert into sys_enercoefficient
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            mod_time,
+            opr_time,
+            <if test="oprMan != null  and oprMan != ''">opr_man,</if>
+            <if test="modMan != null  and modMan != ''">mod_man,</if>
+            enerid,
+            coefficient,
+            coefficient2,
+            execdate,
+            <if test="note != null  and note != ''">note,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            now(),
+            now(),
+            <if test="oprMan != null  and oprMan != ''">#{oprMan},</if>
+            <if test="modMan != null  and modMan != ''">#{modMan},</if>
+            <if test="enerid != null ">#{enerid},</if>
+            #{coefficient},
+            #{coefficient2},
+            #{coefficientexecdate},
+            <if test="note != null  and note != ''">#{coefficientnote},</if>
+        </trim>
+    </insert>
+
+    <update id="updateEnergyCoefficient" parameterType="SysEnergy" >
+        update sys_enercoefficient
+        <trim prefix="SET" suffixOverrides=",">
+            mod_time = now(),
+            <if test="modMan != null  and modMan != ''">mod_man = #{modMan},</if>
+            coefficient = #{coefficient},
+            coefficient2 = #{coefficient2},
+            execdate = #{coefficientexecdate},
+            <if test="note != null  and note != ''">note = #{coefficientnote},</if>
+        </trim>
+        where enerid = #{enerid}
+    </update>
+
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/enerInfoManage/SysPriceMapper.xml b/basic-data/src/main/resources/mybatis/enerInfoManage/SysPriceMapper.xml
new file mode 100644
index 0000000..e977119
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/enerInfoManage/SysPriceMapper.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysPriceMapper">
+
+    <resultMap type="SysPrice" id="SysPriceResult">
+        <result property="oprTime"    column="opr_time"    />
+        <result property="modMan"    column="mod_man"    />
+        <result property="priceid"    column="priceid"    />
+        <result property="objectid"    column="objectid"    />
+        <result property="objecttype"    column="objecttype"    />
+        <result property="price"    column="price"    />
+        <result property="execdate"    column="execdate"    />
+        <result property="oprMan"    column="opr_man"    />
+        <result property="modTime"    column="mod_time"    />
+        <result property="note"    column="note"    />
+    </resultMap>
+
+    <sql id="selectSysPriceVo">
+        select a.opr_time, a.mod_man, a.priceid, a.objectid, a.objecttype, a.price, a.execdate, a.opr_man, a.mod_time, a.note , b.enername
+        from sys_price a
+        left join sys_energy b on objectid = enerid and objecttype = 1
+    </sql>
+
+    <select id="selectSysPriceList" parameterType="SysPrice" resultMap="SysPriceResult">
+        <include refid="selectSysPriceVo"/>
+        <where>
+            <if test="enername != null  and enername != ''"> and enername like concat('%', #{enername}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectSysPriceById" parameterType="Date" resultMap="SysPriceResult">
+        <include refid="selectSysPriceVo"/>
+        where opr_time = #{oprTime}
+    </select>
+
+    <insert id="insertSysPrice" parameterType="SysPrice">
+        insert into sys_price
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="oprTime != null ">opr_time,</if>
+            <if test="modMan != null  and modMan != ''">mod_man,</if>
+            <if test="priceid != null ">priceid,</if>
+            <if test="objectid != null ">objectid,</if>
+            <if test="objecttype != null ">objecttype,</if>
+            <if test="price != null ">price,</if>
+            <if test="execdate != null ">execdate,</if>
+            <if test="oprMan != null  and oprMan != ''">opr_man,</if>
+            <if test="modTime != null ">mod_time,</if>
+            <if test="note != null  and note != ''">note,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="oprTime != null ">#{oprTime},</if>
+            <if test="modMan != null  and modMan != ''">#{modMan},</if>
+            <if test="priceid != null ">#{priceid},</if>
+            <if test="objectid != null ">#{objectid},</if>
+            <if test="objecttype != null ">#{objecttype},</if>
+            <if test="price != null ">#{price},</if>
+            <if test="execdate != null ">#{execdate},</if>
+            <if test="oprMan != null  and oprMan != ''">#{oprMan},</if>
+            <if test="modTime != null ">#{modTime},</if>
+            <if test="note != null  and note != ''">#{note},</if>
+        </trim>
+    </insert>
+
+    <update id="updateSysPrice" parameterType="SysPrice">
+        update sys_price
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="modMan != null  and modMan != ''">mod_man = #{modMan},</if>
+            <if test="priceid != null ">priceid = #{priceid},</if>
+            <if test="objectid != null ">objectid = #{objectid},</if>
+            <if test="objecttype != null ">objecttype = #{objecttype},</if>
+            <if test="price != null ">price = #{price},</if>
+            <if test="execdate != null ">execdate = #{execdate},</if>
+            <if test="oprMan != null  and oprMan != ''">opr_man = #{oprMan},</if>
+            <if test="modTime != null ">mod_time = #{modTime},</if>
+            <if test="note != null  and note != ''">note = #{note},</if>
+        </trim>
+        where opr_time = #{oprTime}
+    </update>
+
+    <delete id="deleteSysPriceById" parameterType="Date">
+        delete from sys_price where opr_time = #{oprTime}
+    </delete>
+
+    <delete id="deleteSysPriceByIds" parameterType="String">
+        delete from sys_price where opr_time in
+        <foreach item="oprTime" collection="array" open="(" separator="," close=")">
+            #{oprTime}
+        </foreach>
+    </delete>
+
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/enerInfoManage/SysProductMapper.xml b/basic-data/src/main/resources/mybatis/enerInfoManage/SysProductMapper.xml
new file mode 100644
index 0000000..f9bcceb
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/enerInfoManage/SysProductMapper.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.enerInfoManage.mapper.SysProductMapper">
+
+    <resultMap type="SysProduct" id="SysProductResult">
+        <result property="productid"    column="productid"    />
+        <result property="productname"    column="productname"    />
+        <result property="productsno"    column="productsno"    />
+        <result property="muid"    column="muid"    />
+        <result property="superid"    column="superid"    />
+        <result property="issub"    column="issub"    />
+        <result property="procofficient"    column="procofficient"    />
+        <result property="isshow"    column="isshow"    />
+        <result property="iscpnyproduct"    column="iscpnyproduct"    />
+        <result property="oprMan"    column="opr_man"    />
+        <result property="oprTime"    column="opr_time"    />
+        <result property="modMan"    column="mod_man"    />
+        <result property="modTime"    column="mod_time"    />
+        <result property="note"    column="note"    />
+    </resultMap>
+
+    <sql id="selectSysProductVo">
+        select productid, productname, productsno, muid,
+        superid, issub, procofficient,
+        isshow, iscpnyproduct, opr_man, opr_time, mod_man, mod_time, note,price from sys_product
+    </sql>
+
+    <select id="selectSysProductList" parameterType="SysProduct" resultMap="SysProductResult">
+        select a.productid, a.productname, productsno, muid,
+        b.productname as superidname,
+        issub, procofficient,
+        isshow, iscpnyproduct, opr_man, opr_time, mod_man, mod_time, note,price from sys_product a
+        left join (select productid,productname from sys_product) as b on a.superid = b.productid
+        <where>
+            <if test="productname != null  and productname != ''"> and a.productname like concat('%', #{productname}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectSysProductById" parameterType="Integer" resultMap="SysProductResult">
+        <include refid="selectSysProductVo"/>
+        where productid = #{productid}
+    </select>
+
+    <insert id="insertSysProduct" parameterType="SysProduct">
+        insert into sys_product
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            opr_time,
+            mod_time,
+            <if test="productname != null  and productname != ''">productname,</if>
+            <if test="productsno != null  and productsno != ''">productsno,</if>
+            <if test="muid != null ">muid,</if>
+            <if test="superid != null ">superid,</if>
+            <if test="issub != null ">issub,</if>
+            <if test="procofficient != null ">procofficient,</if>
+            <if test="isshow != null ">isshow,</if>
+            <if test="iscpnyproduct != null ">iscpnyproduct,</if>
+            <if test="oprMan != null  and oprMan != ''">opr_man,</if>
+
+            <if test="modMan != null  and modMan != ''">mod_man,</if>
+
+            <if test="note != null  and note != ''">note,</if>
+            <if test="price != null  and price != ''">price,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            now(),
+            now(),
+            <if test="productid != null ">#{productid},</if>
+            <if test="productname != null  and productname != ''">#{productname},</if>
+            <if test="productsno != null  and productsno != ''">#{productsno},</if>
+            <if test="muid != null ">#{muid},</if>
+            <if test="superid != null ">#{superid},</if>
+            <if test="issub != null ">#{issub},</if>
+            <if test="procofficient != null ">#{procofficient},</if>
+            <if test="isshow != null ">#{isshow},</if>
+            <if test="iscpnyproduct != null ">#{iscpnyproduct},</if>
+            <if test="oprMan != null  and oprMan != ''">#{oprMan},</if>
+            <if test="modMan != null  and modMan != ''">#{modMan},</if>
+            <if test="note != null  and note != ''">#{note},</if>
+            <if test="price != null  and price != ''">#{price},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysProduct" parameterType="SysProduct">
+        update sys_product
+        <trim prefix="SET" suffixOverrides=",">
+            mod_time = now(),
+            <if test="productname != null  and productname != ''">productname = #{productname},</if>
+            <if test="productsno != null  and productsno != ''">productsno = #{productsno},</if>
+            <if test="muid != null ">muid = #{muid},</if>
+            <if test="superid != null ">superid = #{superid},</if>
+            <if test="issub != null ">issub = #{issub},</if>
+            <if test="procofficient != null ">procofficient = #{procofficient},</if>
+            <if test="isshow != null ">isshow = #{isshow},</if>
+            <if test="iscpnyproduct != null ">iscpnyproduct = #{iscpnyproduct},</if>
+            <if test="modMan != null  and modMan != ''">mod_man = #{modMan},</if>
+            <if test="note != null  and note != ''">note = #{note},</if>
+            <if test="price != null  and price != ''">price = #{price},</if>
+        </trim>
+        where productid = #{productid}
+    </update>
+
+    <delete id="deleteSysProductById" parameterType="Integer">
+        delete from sys_product where productid = #{productid}
+    </delete>
+
+    <delete id="deleteSysProductByIds" parameterType="String">
+        delete from sys_product where productid in
+        <foreach item="productid" collection="array" open="(" separator="," close=")">
+            #{productid}
+        </foreach>
+    </delete>
+
+    <select id="selectCountByName" parameterType="SysProduct" resultType="Integer">
+        select count(productid) from sys_product where productname = #{productname}
+    </select>
+
+    <select id="selectCountByNo" parameterType="SysProduct" resultType="Integer">
+        select count(productid) from sys_product where productsno = #{productsno}
+    </select>
+
+    <select id="selectIdByName" parameterType="SysProduct" resultType="Integer">
+        select productid from sys_product where productname = #{productname}
+    </select>
+
+    <select id="selectIdByNo" parameterType="SysProduct" resultType="Integer">
+        select productid from sys_product where productsno = #{productsno}
+    </select>
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/energy/EnergyProjectAnnexMapper.xml b/basic-data/src/main/resources/mybatis/energy/EnergyProjectAnnexMapper.xml
new file mode 100644
index 0000000..e22db3c
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/energy/EnergyProjectAnnexMapper.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.energy.mapper.EnergyProjectAnnexMapper">
+    
+    <resultMap type="EnergyProjectAnnex" id="EnergyProjectAnnexResult">
+        <result property="id"    column="id"    />
+        <result property="projectId"    column="project_id"    />
+        <result property="fileName"    column="file_name"    />
+        <result property="fileSuffix"    column="file_suffix"    />
+        <result property="filePath"    column="file_path"    />
+        <result property="delFlage"    column="del_flage"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createOperator"    column="create_operator"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateOperator"    column="update_operator"    />
+    </resultMap>
+
+    <sql id="selectEnergyProjectAnnexVo">
+        select id, project_id, file_name, file_suffix, file_path, del_flage, create_time, create_operator, update_time, update_operator from energy_project_annex
+    </sql>
+
+    <select id="selectEnergyProjectAnnexList" parameterType="EnergyProjectAnnex" resultMap="EnergyProjectAnnexResult">
+        <include refid="selectEnergyProjectAnnexVo"/>
+        <where>
+            <if test="projectId != null  and projectId != ''"> and project_id=#{projectId}</if>
+            <if test="fileName != null  and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if>
+            <if test="fileSuffix != null  and fileSuffix != ''"> and file_suffix like concat('%', #{fileSuffix}, '%')</if>
+            <if test="filePath != null  and filePath != ''"> and file_path like concat('%', #{filePath}, '%')</if>
+            <if test="delFlage != null  and delFlage != ''"> and del_flage like concat('%', #{delFlage}, '%')</if>
+            <if test="createOperator != null  and createOperator != ''"> and create_operator like concat('%', #{createOperator}, '%')</if>
+            <if test="updateOperator != null  and updateOperator != ''"> and update_operator like concat('%', #{updateOperator}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectEnergyProjectAnnexById" parameterType="String" resultMap="EnergyProjectAnnexResult">
+        <include refid="selectEnergyProjectAnnexVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertEnergyProjectAnnex" parameterType="EnergyProjectAnnex">
+        insert into energy_project_annex
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="projectId != null  and projectId != ''">project_id,</if>
+            <if test="fileName != null  and fileName != ''">file_name,</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix,</if>
+            <if test="filePath != null  and filePath != ''">file_path,</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createOperator != null  and createOperator != ''">create_operator,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateOperator != null  and updateOperator != ''">update_operator,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="projectId != null  and projectId != ''">#{projectId},</if>
+            <if test="fileName != null  and fileName != ''">#{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">#{fileSuffix},</if>
+            <if test="filePath != null  and filePath != ''">#{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">#{delFlage},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createOperator != null  and createOperator != ''">#{createOperator},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateOperator != null  and updateOperator != ''">#{updateOperator},</if>
+         </trim>
+    </insert>
+
+    <update id="updateEnergyProjectAnnex" parameterType="EnergyProjectAnnex">
+        update energy_project_annex
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="projectId != null  and projectId != ''">project_id = #{projectId},</if>
+            <if test="fileName != null  and fileName != ''">file_name = #{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix = #{fileSuffix},</if>
+            <if test="filePath != null  and filePath != ''">file_path = #{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage = #{delFlage},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createOperator != null  and createOperator != ''">create_operator = #{createOperator},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateOperator != null  and updateOperator != ''">update_operator = #{updateOperator},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteEnergyProjectAnnexById" parameterType="String">
+        delete from energy_project_annex where id = #{id}
+    </delete>
+
+    <delete id="deleteEnergyProjectAnnexByIds" parameterType="String">
+        delete from energy_project_annex where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/energy/EnergyProjectMapper.xml b/basic-data/src/main/resources/mybatis/energy/EnergyProjectMapper.xml
new file mode 100644
index 0000000..a413df1
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/energy/EnergyProjectMapper.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.energy.mapper.EnergyProjectMapper">
+    
+    <resultMap type="EnergyProject" id="EnergyProjectResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="plan"    column="plan"    />
+        <result property="target"    column="target"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="enddTime"    column="endd_time"    />
+        <result property="people"    column="people"    />
+        <result property="setTime"    column="set_time"    />
+        <result property="createOperator"    column="create_operator"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateOperator"    column="update_operator"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectEnergyProjectVo">
+        select id, name, plan, target, start_time, endd_time, people, set_time, create_operator, create_time, update_operator, update_time from energy_project
+    </sql>
+
+    <select id="selectEnergyProjectList" parameterType="EnergyProject" resultMap="EnergyProjectResult">
+        <include refid="selectEnergyProjectVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="plan != null  and plan != ''"> and plan like concat('%', #{plan}, '%')</if>
+            <if test="target != null  and target != ''"> and target like concat('%', #{target}, '%')</if>
+            <if test="startTime != null "> and start_time like concat('%', #{startTime}, '%')</if>
+            <if test="enddTime != null "> and endd_time like concat('%', #{enddTime}, '%')</if>
+            <if test="people != null  and people != ''"> and people like concat('%', #{people}, '%')</if>
+            <if test="setTime != null "> and set_time like concat('%', #{setTime}, '%')</if>
+            <if test="createOperator != null  and createOperator != ''"> and create_operator like concat('%', #{createOperator}, '%')</if>
+            <if test="updateOperator != null  and updateOperator != ''"> and update_operator like concat('%', #{updateOperator}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectEnergyProjectById" parameterType="String" resultMap="EnergyProjectResult">
+        <include refid="selectEnergyProjectVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertEnergyProject" parameterType="EnergyProject">
+        insert into energy_project
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="plan != null  and plan != ''">plan,</if>
+            <if test="target != null  and target != ''">target,</if>
+            <if test="startTime != null ">start_time,</if>
+            <if test="enddTime != null ">endd_time,</if>
+            <if test="people != null  and people != ''">people,</if>
+            <if test="setTime != null ">set_time,</if>
+            <if test="createOperator != null  and createOperator != ''">create_operator,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateOperator != null  and updateOperator != ''">update_operator,</if>
+            <if test="updateTime != null ">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="plan != null  and plan != ''">#{plan},</if>
+            <if test="target != null  and target != ''">#{target},</if>
+            <if test="startTime != null ">#{startTime},</if>
+            <if test="enddTime != null ">#{enddTime},</if>
+            <if test="people != null  and people != ''">#{people},</if>
+            <if test="setTime != null ">#{setTime},</if>
+            <if test="createOperator != null  and createOperator != ''">#{createOperator},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateOperator != null  and updateOperator != ''">#{updateOperator},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateEnergyProject" parameterType="EnergyProject">
+        update energy_project
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="plan != null  and plan != ''">plan = #{plan},</if>
+            <if test="target != null  and target != ''">target = #{target},</if>
+            <if test="startTime != null ">start_time = #{startTime},</if>
+            <if test="enddTime != null ">endd_time = #{enddTime},</if>
+            <if test="people != null  and people != ''">people = #{people},</if>
+            <if test="setTime != null ">set_time = #{setTime},</if>
+            <if test="createOperator != null  and createOperator != ''">create_operator = #{createOperator},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateOperator != null  and updateOperator != ''">update_operator = #{updateOperator},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteEnergyProjectById" parameterType="String">
+        delete from energy_project where id = #{id}
+    </delete>
+
+    <delete id="deleteEnergyProjectByIds" parameterType="String">
+        delete from energy_project where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/energy/EnergyReportAnnexMapper.xml b/basic-data/src/main/resources/mybatis/energy/EnergyReportAnnexMapper.xml
new file mode 100644
index 0000000..b21d5d2
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/energy/EnergyReportAnnexMapper.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.energy.mapper.EnergyReportAnnexMapper">
+    
+    <resultMap type="EnergyReportAnnex" id="EnergyReportAnnexResult">
+        <result property="id"    column="id"    />
+        <result property="reportId"    column="report_id"    />
+        <result property="fileName"    column="file_name"    />
+        <result property="fileSuffix"    column="file_suffix"    />
+        <result property="filePath"    column="file_path"    />
+        <result property="delFlage"    column="del_flage"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <sql id="selectEnergyReportAnnexVo">
+        select id, report_id, file_name, file_suffix, file_path, del_flage, create_time, create_by, update_time, update_by from energy_report_annex
+    </sql>
+
+    <select id="selectEnergyReportAnnexList" parameterType="EnergyReportAnnex" resultMap="EnergyReportAnnexResult">
+        <include refid="selectEnergyReportAnnexVo"/>
+        <where>  
+            <if test="fileName != null  and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if>
+            <if test="fileSuffix != null  and fileSuffix != ''"> and file_suffix like concat('%', #{fileSuffix}, '%')</if>
+            <if test="filePath != null  and filePath != ''"> and file_path like concat('%', #{filePath}, '%')</if>
+            <if test="delFlage != null  and delFlage != ''"> and del_flage like concat('%', #{delFlage}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectEnergyReportAnnexById" parameterType="String" resultMap="EnergyReportAnnexResult">
+        <include refid="selectEnergyReportAnnexVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertEnergyReportAnnex" parameterType="EnergyReportAnnex">
+        insert into energy_report_annex
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="reportId != null  and reportId != ''">report_id,</if>
+            <if test="fileName != null  and fileName != ''">file_name,</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix,</if>
+            <if test="filePath != null  and filePath != ''">file_path,</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="reportId != null  and reportId != ''">#{reportId},</if>
+            <if test="fileName != null  and fileName != ''">#{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">#{fileSuffix},</if>
+            <if test="filePath != null  and filePath != ''">#{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">#{delFlage},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateEnergyReportAnnex" parameterType="EnergyReportAnnex">
+        update energy_report_annex
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="reportId != null  and reportId != ''">report_id = #{reportId},</if>
+            <if test="fileName != null  and fileName != ''">file_name = #{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix = #{fileSuffix},</if>
+            <if test="filePath != null  and filePath != ''">file_path = #{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage = #{delFlage},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteEnergyReportAnnexById" parameterType="String">
+        delete from energy_report_annex where id = #{id}
+    </delete>
+
+    <delete id="deleteEnergyReportAnnexByIds" parameterType="String">
+        delete from energy_report_annex where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/energy/EnergyReportMapper.xml b/basic-data/src/main/resources/mybatis/energy/EnergyReportMapper.xml
new file mode 100644
index 0000000..a6c5445
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/energy/EnergyReportMapper.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.energy.mapper.EnergyReportMapper">
+    
+    <resultMap type="EnergyReport" id="EnergyReportResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="enddTime"    column="endd_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="bak"    column="bak"    />
+    </resultMap>
+
+    <sql id="selectEnergyReportVo">
+        select id, name, to_char(start_time,'YYYY-MM-DD') as start_time, to_char(endd_time,'YYYY-MM-DD') as endd_time, create_by, create_time, update_by, update_time, bak from energy_report
+    </sql>
+
+    <select id="selectEnergyReportList" parameterType="EnergyReport" resultMap="EnergyReportResult">
+        <include refid="selectEnergyReportVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectEnergyReportById" parameterType="String" resultMap="EnergyReportResult">
+        <include refid="selectEnergyReportVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertEnergyReport" parameterType="EnergyReport">
+        insert into energy_report
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="startTime != null ">start_time,</if>
+            <if test="enddTime != null ">endd_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="bak != null  and bak != ''">bak,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="startTime != null ">#{startTime},</if>
+            <if test="enddTime != null ">#{enddTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="bak != null  and bak != ''">#{bak},</if>
+         </trim>
+    </insert>
+
+    <update id="updateEnergyReport" parameterType="EnergyReport">
+        update energy_report
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="startTime != null ">start_time = #{startTime},</if>
+            <if test="enddTime != null ">endd_time = #{enddTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="bak != null  and bak != ''">bak = #{bak},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteEnergyReportById" parameterType="String">
+        delete from energy_report where id = #{id}
+    </delete>
+
+    <delete id="deleteEnergyReportByIds" parameterType="String">
+        delete from energy_report where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/energyExamine/AssessmentIndexMapper.xml b/basic-data/src/main/resources/mybatis/energyExamine/AssessmentIndexMapper.xml
new file mode 100644
index 0000000..10560ce
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/energyExamine/AssessmentIndexMapper.xml
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.energyExamine.mapper.AssessmentIndexMapper">
+    
+    <resultMap type="AssessmentIndex" id="AssessmentIndexResult">
+        <result property="id"    column="id"    />
+        <result property="modeNodeId"    column="mode_node_id"    />
+        <result property="indexId"    column="index_id"    />
+        <result property="plan"    column="plan"    />
+        <result property="benchmarking"    column="benchmarking"    />
+        <result property="benchRange"    column="bench_range"    />
+        <result property="benchType"    column="bench_type"    />
+        <result property="dualControl"    column="dual_control"    />
+        <result property="customStandard"    column="custom_standard"    />
+        <result property="customVal"    column="custom_val"    />
+        <result property="modename"    column="modename"    />
+        <result property="indexname"    column="indexname"    />
+        <result property="jldw"    column="jldw"    />
+    </resultMap>
+
+    <sql id="selectAssessmentIndexVo">
+        select id, mode_node_id, index_id, plan, benchmarking, bench_range, bench_type, dual_control, custom_standard, custom_val from assessment_Index
+    </sql>
+
+    <select id="selectAssessmentIndexList" parameterType="AssessmentIndex" resultMap="AssessmentIndexResult">
+        <include refid="selectAssessmentIndexVo"/>
+        <where>
+        </where>
+    </select>
+
+    <select id="selectAssessmentIndexListByMode" parameterType="AssessmentIndex" resultMap="AssessmentIndexResult">
+        SELECT ID,
+            mode_node_id,
+            a.index_id,
+            plan,
+            benchmarking,
+            bench_range,
+            bench_type,
+            dual_control,
+            custom_standard,
+            custom_val,
+            b.name as modename,
+            c.name as indexname,
+            d.dict_label as jldw
+        FROM
+            assessment_Index a,model_node b,energy_index c,sys_dict_data d
+        WHERE
+            a.mode_node_id IN ( SELECT node_id FROM model_node WHERE address LIKE ( SELECT address FROM
+            model_node WHERE node_id = #{modeNodeId} )
+            <if test='eierarchyFlag=="ALL"'>
+                || '%'
+            </if>
+            )
+            and a.mode_node_id = b.node_id
+            and a.index_id = c.index_id
+            and d.dict_type='sys_unit'
+            and c.unit_id = d.dict_value
+    </select>
+    
+    <select id="selectAssessmentIndexById" parameterType="String" resultMap="AssessmentIndexResult">
+        SELECT ID,
+            mode_node_id,
+            a.index_id,
+            plan,
+            benchmarking,
+            bench_range,
+            bench_type,
+            dual_control,
+            custom_standard,
+            custom_val,
+            b.name as modename,
+            c.name as indexname,
+            d.dict_label as jldw
+        FROM
+            assessment_Index a,model_node b,energy_index c,sys_dict_data d
+        WHERE
+            a.id = #{id}
+            and a.mode_node_id = b.node_id
+            and a.index_id = c.index_id
+            and d.dict_type='sys_unit'
+            and c.unit_id = d.dict_value
+    </select>
+        
+    <insert id="insertAssessmentIndex" parameterType="AssessmentIndex">
+        insert into assessmentIndex
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="modeNodeId != null  and modeNodeId != ''">mode_node_id,</if>
+            <if test="indexId != null  and indexId != ''">index_id,</if>
+            <if test="plan != null  and plan != ''">plan,</if>
+            <if test="benchmarking != null  and benchmarking != ''">benchmarking,</if>
+            <if test="benchRange != null ">bench_range,</if>
+            <if test="benchType != null ">bench_type,</if>
+            <if test="dualControl != null  and dualControl != ''">dual_control,</if>
+            <if test="customStandard != null  and customStandard != ''">custom_standard,</if>
+            <if test="customVal != null ">custom_val,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="modeNodeId != null  and modeNodeId != ''">#{modeNodeId},</if>
+            <if test="indexId != null  and indexId != ''">#{indexId},</if>
+            <if test="plan != null  and plan != ''">#{plan},</if>
+            <if test="benchmarking != null  and benchmarking != ''">#{benchmarking},</if>
+            <if test="benchRange != null ">#{benchRange},</if>
+            <if test="benchType != null ">#{benchType},</if>
+            <if test="dualControl != null  and dualControl != ''">#{dualControl},</if>
+            <if test="customStandard != null  and customStandard != ''">#{customStandard},</if>
+            <if test="customVal != null ">#{customVal},</if>
+         </trim>
+    </insert>
+
+    <update id="updateAssessmentIndex" parameterType="AssessmentIndex">
+        update assessment_Index
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="modeNodeId != null  and modeNodeId != ''">mode_node_id = #{modeNodeId},</if>
+            <if test="indexId != null  and indexId != ''">index_id = #{indexId},</if>
+            <if test="plan != null  and plan != ''">plan = #{plan},</if>
+            <if test="benchmarking != null  and benchmarking != ''">benchmarking = #{benchmarking},</if>
+            <if test="benchRange != null ">bench_range = #{benchRange},</if>
+            <if test="benchType != null ">bench_type = #{benchType},</if>
+            <if test="dualControl != null  and dualControl != ''">dual_control = #{dualControl},</if>
+            <if test="customStandard != null  and customStandard != ''">custom_standard = #{customStandard},</if>
+            <if test="customVal != null ">custom_val = #{customVal},</if>
+            <if test="plan == null  or plan == ''">plan = false,</if>
+            <if test="benchmarking == null  or benchmarking == ''">benchmarking = false,</if>
+            <if test="dualControl == null  or dualControl == ''">dual_control = false,</if>
+            <if test="customStandard == null  or customStandard == ''">custom_standard = false,</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteAssessmentIndexById" parameterType="String">
+        delete from assessment_Index where id = #{id}
+    </delete>
+
+    <delete id="deleteAssessmentIndexByIds" parameterType="String">
+        delete from assessment_Index where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <insert id="batchAssessIndex">
+        insert into assessment_Index(id, mode_node_id, index_id) values
+        <foreach item="item" index="index" collection="list" separator=",">
+            (#{item.id},#{item.modeNodeId},#{item.indexId})
+        </foreach>
+    </insert>
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/facility/FacilityAnnexMapper.xml b/basic-data/src/main/resources/mybatis/facility/FacilityAnnexMapper.xml
new file mode 100644
index 0000000..626f945
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/facility/FacilityAnnexMapper.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.facility.mapper.FacilityAnnexMapper">
+    
+    <resultMap type="FacilityAnnex" id="FacilityAnnexResult">
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="id"    column="id"    />
+        <result property="facilityId"    column="facility_id"    />
+        <result property="fileName"    column="file_name"    />
+        <result property="filesuffix"    column="file_suffix"    />
+        <result property="filePath"    column="file_path"    />
+        <result property="delFlage"    column="del_flage"    />
+    </resultMap>
+
+    <sql id="selectFacilityAnnexVo">
+        select create_time, create_by, update_time, update_by, id, facility_id, file_name, file_suffix, file_path, del_flage from facility_annex
+    </sql>
+
+    <select id="selectFacilityAnnexList" parameterType="FacilityAnnex" resultMap="FacilityAnnexResult">
+        <include refid="selectFacilityAnnexVo"/>
+        <where>
+            del_flage='N'
+            <if test="fileName != null  and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if>
+            <if test="facilityId != null  and facilityId != ''"> and facility_id=#{facilityId}</if>
+        </where>
+    </select>
+    
+    <select id="selectFacilityAnnexById" parameterType="Date" resultMap="FacilityAnnexResult">
+        <include refid="selectFacilityAnnexVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertFacilityAnnex" parameterType="FacilityAnnex">
+        insert into facility_annex
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="id != null  and id != ''">id,</if>
+            <if test="facilityId != null  and facilityId != ''">facility_id,</if>
+            <if test="fileName != null  and fileName != ''">file_name,</if>
+            <if test="filesuffix != null  and filesuffix != ''">file_suffix,</if>
+            <if test="filePath != null  and filePath != ''">file_path,</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="facilityId != null  and facilityId != ''">#{facilityId},</if>
+            <if test="fileName != null  and fileName != ''">#{fileName},</if>
+            <if test="filesuffix != null  and filesuffix != ''">#{filesuffix},</if>
+            <if test="filePath != null  and filePath != ''">#{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">#{delFlage},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFacilityAnnex" parameterType="FacilityAnnex">
+        update facility_annex
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="id != null  and id != ''">id = #{id},</if>
+            <if test="facilityId != null  and facilityId != ''">facility_id = #{facilityId},</if>
+            <if test="fileName != null  and fileName != ''">file_name = #{fileName},</if>
+            <if test="filesuffix != null  and filesuffix != ''">file_suffix = #{filesuffix},</if>
+            <if test="filePath != null  and filePath != ''">file_path = #{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage = #{delFlage},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFacilityAnnexById" parameterType="Date">
+        <!--delete from facility_annex where create_time = #{createTime}-->
+        update facility_annex set del_flage='Y',update_time=now() where id = #{id}
+    </delete>
+
+    <delete id="deleteFacilityAnnexByIds" parameterType="String">
+        <!--delete from facility_annex where create_time in-->
+        update facility_annex set del_flage='Y',update_time=now() where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/facility/FacilityArchivesMapper.xml b/basic-data/src/main/resources/mybatis/facility/FacilityArchivesMapper.xml
new file mode 100644
index 0000000..3cdf322
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/facility/FacilityArchivesMapper.xml
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.facility.mapper.FacilityArchivesMapper">
+
+    <resultMap type="FacilityArchives" id="FacilityArchivesResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="facilityName"    column="facility_name"    />
+        <result property="facilityType"    column="facility_type"    />
+        <result property="branchFactory"    column="branch_factory"    />
+        <result property="istallationLocationn"    column="installation_location"    />
+        <result property="facilityGrade"    column="facility_grade"    />
+        <result property="ratedPower"    column="rated_power"    />
+        <result property="productionDate"    column="production_date"    />
+        <result property="putrunDate"    column="putrun_date"    />
+        <result property="manufacturer"    column="manufacturer"    />
+        <result property="personCharge"    column="person_charge"    />
+        <result property="technicalData"    column="technical_data"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="checkCycle"    column="check_cycle"    />
+        <result property="reminderCycle"    column="reminder_cycle"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="txflage"    column="txflage"    />
+        <result property="pointFlag"    column="point_flag"    />
+    </resultMap>
+
+    <sql id="selectFacilityArchivesVo">
+        select id, code, facility_name, facility_type, branch_factory, installation_location, facility_grade, rated_power, production_date, putrun_date, manufacturer, person_charge, technical_data, start_time, check_cycle, reminder_cycle, remark, create_time, create_by, update_time, update_by,point_flag,(start_time+check_cycle-reminder_cycle)&lt;=current_date as txflage from facility_archives
+    </sql>
+
+    <select id="selectFacilityArchivesList" parameterType="FacilityArchives" resultMap="FacilityArchivesResult">
+        <include refid="selectFacilityArchivesVo"/>
+        <where>
+            <if test="code != null  and code != ''"> and code like concat('%', #{code}, '%')</if>
+            <if test="facilityName != null  and facilityName != ''"> and facility_name like concat('%', #{facilityName}, '%')</if>
+            <if test="manufacturer != null  and manufacturer != ''"> and manufacturer like concat('%', #{manufacturer}, '%')</if>
+            <if test="facilityType != null  and facilityType != ''"> and facility_type = #{facilityType}</if>
+            <if test="branchFactory != null  and branchFactory != ''"> and branch_factory = #{branchFactory}</if>
+            <if test="istallationLocationn != null  and istallationLocationn != ''"> and installation_location like concat('%', #{istallationLocationn}, '%')</if>
+            <if test="facilityGrade != null  and facilityGrade != ''"> and facility_grade = #{facilityGrade}</if>
+            <if test="ratedPower != null  and ratedPower != ''"> and to_number(rated_power,'9999999999') >= to_number(#{ratedPower},'9999999999')</if>
+        </where>
+        order by code
+    </select>
+
+    <select id="selectFacilityArchivesById" parameterType="String" resultMap="FacilityArchivesResult">
+        <include refid="selectFacilityArchivesVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertFacilityArchives" parameterType="FacilityArchives">
+        insert into facility_archives
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="facilityName != null  and facilityName != ''">facility_name,</if>
+            <if test="facilityType != null  and facilityType != ''">facility_type,</if>
+            <if test="branchFactory != null  and branchFactory != ''">branch_factory,</if>
+            <if test="istallationLocationn != null  and istallationLocationn != ''">installation_location,</if>
+            <if test="facilityGrade != null  and facilityGrade != ''">facility_grade,</if>
+            <if test="ratedPower != null  and ratedPower != ''">rated_power,</if>
+            <if test="productionDate != null ">production_date,</if>
+            <if test="putrunDate != null ">putrun_date,</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer,</if>
+            <if test="personCharge != null  and personCharge != ''">person_charge,</if>
+            <if test="technicalData != null  and technicalData != ''">technical_data,</if>
+            <if test="startTime != null ">start_time,</if>
+            <if test="checkCycle != null ">check_cycle,</if>
+            <if test="reminderCycle != null ">reminder_cycle,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="pointFlag != null  and pointFlag != ''">point_flag,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="facilityName != null  and facilityName != ''">#{facilityName},</if>
+            <if test="facilityType != null  and facilityType != ''">#{facilityType},</if>
+            <if test="branchFactory != null  and branchFactory != ''">#{branchFactory},</if>
+            <if test="istallationLocationn != null  and istallationLocationn != ''">#{istallationLocationn},</if>
+            <if test="facilityGrade != null  and facilityGrade != ''">#{facilityGrade},</if>
+            <if test="ratedPower != null  and ratedPower != ''">#{ratedPower},</if>
+            <if test="productionDate != null ">#{productionDate},</if>
+            <if test="putrunDate != null ">#{putrunDate},</if>
+            <if test="manufacturer != null  and manufacturer != ''">#{manufacturer},</if>
+            <if test="personCharge != null  and personCharge != ''">#{personCharge},</if>
+            <if test="technicalData != null  and technicalData != ''">#{technicalData},</if>
+            <if test="startTime != null ">#{startTime},</if>
+            <if test="checkCycle != null ">#{checkCycle},</if>
+            <if test="reminderCycle != null ">#{reminderCycle},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="pointFlag != null  and pointFlag != ''">#{pointFlag},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFacilityArchives" parameterType="FacilityArchives">
+        update facility_archives
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="facilityName != null  and facilityName != ''">facility_name = #{facilityName},</if>
+            <if test="facilityType != null  and facilityType != ''">facility_type = #{facilityType},</if>
+            <if test="branchFactory != null  and branchFactory != ''">branch_factory = #{branchFactory},</if>
+            <if test="istallationLocationn != null  and istallationLocationn != ''">installation_location = #{istallationLocationn},</if>
+            <if test="facilityGrade != null  and facilityGrade != ''">facility_grade = #{facilityGrade},</if>
+            <if test="ratedPower != null  and ratedPower != ''">rated_power = #{ratedPower},</if>
+            <if test="productionDate != null ">production_date = #{productionDate},</if>
+            <if test="putrunDate != null ">putrun_date = #{putrunDate},</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer = #{manufacturer},</if>
+            <if test="personCharge != null  and personCharge != ''">person_charge = #{personCharge},</if>
+            <if test="technicalData != null  and technicalData != ''">technical_data = #{technicalData},</if>
+            <if test="startTime != null ">start_time = #{startTime},</if>
+            <if test="checkCycle != null ">check_cycle = #{checkCycle},</if>
+            <if test="reminderCycle != null ">reminder_cycle = #{reminderCycle},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="pointFlag != null  and pointFlag != ''">point_flag = #{pointFlag},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFacilityArchivesById" parameterType="String">
+        delete from facility_archives where id = #{id}
+    </delete>
+
+    <delete id="deleteFacilityArchivesByIds" parameterType="String">
+        delete from facility_archives where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+
+    <update id="resetFacilityArchivesByIds" parameterType="String" >
+        update facility_archives
+        set start_time = NOW()
+        where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </update>
+
+    <select id="selectFacilityArchivesByCode" parameterType="FacilityArchives" resultMap="FacilityArchivesResult">
+        <include refid="selectFacilityArchivesVo"/>
+        where code = #{code}
+        <if test="id != null  and id != ''"> and id != #{id} or id is null</if>
+    </select>
+    <select id="excelFacilityArchivesList" parameterType="FacilityArchives" resultMap="FacilityArchivesResult">
+        select id, code, facility_name, fun_getDiceData('facility_type',facility_type) as facility_type,
+        fun_getDiceData('branch_factory',branch_factory) as branch_factory, installation_location,
+        fun_getDiceData('facility_grade',facility_grade) as facility_grade, rated_power, to_char(production_date,'YYYY-MM-DD') as  production_date,
+        to_char(putrun_date,'YYYY-MM-DD') as putrun_date, manufacturer, person_charge,
+          technical_data, start_time, check_cycle, reminder_cycle, remark, create_time, create_by,
+           update_time, update_by
+        from facility_archives
+        <where>
+            <if test="code != null  and code != ''"> and code like concat('%', #{code}, '%')</if>
+            <if test="facilityName != null  and facilityName != ''"> and facility_name like concat('%', #{facilityName}, '%')</if>
+            <if test="manufacturer != null  and manufacturer != ''"> and manufacturer like concat('%', #{manufacturer}, '%')</if>
+            <if test="facilityType != null  and facilityType != ''"> and facility_type = #{facilityType}</if>
+            <if test="branchFactory != null  and branchFactory != ''"> and branch_factory = #{branchFactory}</if>
+            <if test="istallationLocationn != null  and istallationLocationn != ''"> and installation_location like concat('%', #{istallationLocationn}, '%')</if>
+            <if test="facilityGrade != null  and facilityGrade != ''"> and facility_grade = #{facilityGrade}</if>
+            <if test="ratedPower != null  and ratedPower != ''"> and to_number(rated_power,'9999999999') >= #{ratedPower}</if>
+        </where>
+        order by code
+    </select>
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/meter/MeterAnnexMapper.xml b/basic-data/src/main/resources/mybatis/meter/MeterAnnexMapper.xml
new file mode 100644
index 0000000..a9edc49
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/meter/MeterAnnexMapper.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.meter.mapper.MeterAnnexMapper">
+    
+    <resultMap type="MeterAnnex" id="MeterAnnexResult">
+        <result property="id"    column="id"    />
+        <result property="implementId"    column="implement_id"    />
+        <result property="fileName"    column="file_name"    />
+        <result property="fileSuffix"    column="file_suffix"    />
+        <result property="filePath"    column="file_path"    />
+        <result property="delFlage"    column="del_flage"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <sql id="selectMeterAnnexVo">
+        select id, implement_id, file_name, file_suffix, file_path, del_flage, create_time, create_by, update_time, update_by from meter_annex
+    </sql>
+
+    <select id="selectMeterAnnexList" parameterType="MeterAnnex" resultMap="MeterAnnexResult">
+        <include refid="selectMeterAnnexVo"/>
+        <where>
+            del_flage='N'
+            <if test="fileName != null  and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if>
+            <if test="implementId != null  and implementId != ''"> and implement_id=#{implementId}</if>
+        </where>
+    </select>
+    
+    <select id="selectMeterAnnexById" parameterType="String" resultMap="MeterAnnexResult">
+        <include refid="selectMeterAnnexVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertMeterAnnex" parameterType="MeterAnnex">
+        insert into meter_annex
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="implementId != null  and implementId != ''">implement_id,</if>
+            <if test="fileName != null  and fileName != ''">file_name,</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix,</if>
+            <if test="filePath != null  and filePath != ''">file_path,</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="implementId != null  and implementId != ''">#{implementId},</if>
+            <if test="fileName != null  and fileName != ''">#{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">#{fileSuffix},</if>
+            <if test="filePath != null  and filePath != ''">#{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">#{delFlage},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateMeterAnnex" parameterType="MeterAnnex">
+        update meter_annex
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="implementId != null  and implementId != ''">implement_id = #{implementId},</if>
+            <if test="fileName != null  and fileName != ''">file_name = #{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix = #{fileSuffix},</if>
+            <if test="filePath != null  and filePath != ''">file_path = #{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage = #{delFlage},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteMeterAnnexById" parameterType="String">
+        <!--delete from meter_annex where id = #{id}-->
+        update meter_annex set del_flage='Y' where id = #{id}
+    </delete>
+
+    <delete id="deleteMeterAnnexByIds" parameterType="String">
+        <!--delete from meter_annex where id in -->
+        update meter_annex set del_flage='Y' where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/meter/MeterImplementCountMapper.xml b/basic-data/src/main/resources/mybatis/meter/MeterImplementCountMapper.xml
new file mode 100644
index 0000000..e76a0a7
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/meter/MeterImplementCountMapper.xml
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.meter.mapper.MeterImplementCountMapper">
+    
+    <resultMap type="MeterImplementCount" id="MeterImplementCountResult">
+        <result property="code"    column="code"    />
+        <result property="meterName"    column="meter_name"    />
+        <result property="meterType"    column="meter_type"    />
+        <result property="modelNumber"    column="model_number"    />
+        <result property="measureRange"    column="measure_range"    />
+        <result property="id"    column="id"    />
+        <result property="manufacturer"    column="manufacturer"    />
+        <result property="personCharge"    column="person_charge"    />
+        <result property="installactionLocation"    column="installaction_location"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="checkCycle"    column="check_cycle"    />
+        <result property="reminderCycle"    column="reminder_cycle"    />
+        <result property="meterStatus"    column="meter_status"    />
+        <result property="delFlage"    column="del_flage"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="txflage"    column="txflage"    />
+        <result property="putrunTime"    column="putrun_time"    />
+    </resultMap>
+
+    <sql id="selectMeterImplementCountVo">
+         select id, code, meter_name, meter_type, model_number, measure_range, manufacturer, person_charge, installaction_location, start_time, check_cycle, reminder_cycle, meter_status, del_flage, remark, putrun_time, create_time, create_by, update_time, update_by,(start_time+check_cycle-reminder_cycle)&lt;=current_date as txflage from meter_implement
+    </sql>
+
+    <select id="selectMeterImplementCountList" parameterType="MeterImplementCount" resultMap="MeterImplementCountResult">
+        <include refid="selectMeterImplementCountVo"/>
+        <where>  
+            <if test="code != null  and code != ''"> and code like concat('%', #{code}, '%')</if>
+            <if test="meterName != null  and meterName != ''"> and meter_name like concat('%', #{meterName}, '%')</if>
+            <if test="meterType != null  and meterType != ''"> and meter_type = #{meterType}</if>
+            <if test="measureRange != null  and measureRange != ''"> and measure_range like concat('%', #{measureRange}, '%')</if>
+            <if test="manufacturer != null  and manufacturer != ''"> and manufacturer like concat('%', #{manufacturer}, '%')</if>
+            <if test="installactionLocation != null  and installactionLocation != ''"> and installaction_location like concat('%', #{installactionLocation}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectMeterImplementCountById" parameterType="String" resultMap="MeterImplementCountResult">
+        <include refid="selectMeterImplementCountVo"/>
+        where code = #{code}
+    </select>
+        
+    <insert id="insertMeterImplementCount" parameterType="MeterImplementCount">
+        insert into meter_implement
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="code != null  and code != ''">code,</if>
+            <if test="meterName != null  and meterName != ''">meter_name,</if>
+            <if test="meterType != null  and meterType != ''">meter_type,</if>
+            <if test="modelNumber != null  and modelNumber != ''">model_number,</if>
+            <if test="measureRange != null  and measureRange != ''">measure_range,</if>
+            <if test="id != null  and id != ''">id,</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer,</if>
+            <if test="personCharge != null  and personCharge != ''">person_charge,</if>
+            <if test="installactionLocation != null  and installactionLocation != ''">installaction_location,</if>
+            <if test="startTime != null ">start_time,</if>
+            <if test="checkCycle != null ">check_cycle,</if>
+            <if test="reminderCycle != null ">reminder_cycle,</if>
+            <if test="meterStatus != null  and meterStatus != ''">meter_status,</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="meterName != null  and meterName != ''">#{meterName},</if>
+            <if test="meterType != null  and meterType != ''">#{meterType},</if>
+            <if test="modelNumber != null  and modelNumber != ''">#{modelNumber},</if>
+            <if test="measureRange != null  and measureRange != ''">#{measureRange},</if>
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="manufacturer != null  and manufacturer != ''">#{manufacturer},</if>
+            <if test="personCharge != null  and personCharge != ''">#{personCharge},</if>
+            <if test="installactionLocation != null  and installactionLocation != ''">#{installactionLocation},</if>
+            <if test="startTime != null ">#{startTime},</if>
+            <if test="checkCycle != null ">#{checkCycle},</if>
+            <if test="reminderCycle != null ">#{reminderCycle},</if>
+            <if test="meterStatus != null  and meterStatus != ''">#{meterStatus},</if>
+            <if test="delFlage != null  and delFlage != ''">#{delFlage},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateMeterImplementCount" parameterType="MeterImplementCount">
+        update meter_implement
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="meterName != null  and meterName != ''">meter_name = #{meterName},</if>
+            <if test="meterType != null  and meterType != ''">meter_type = #{meterType},</if>
+            <if test="modelNumber != null  and modelNumber != ''">model_number = #{modelNumber},</if>
+            <if test="measureRange != null  and measureRange != ''">measure_range = #{measureRange},</if>
+            <if test="id != null  and id != ''">id = #{id},</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer = #{manufacturer},</if>
+            <if test="personCharge != null  and personCharge != ''">person_charge = #{personCharge},</if>
+            <if test="installactionLocation != null  and installactionLocation != ''">installaction_location = #{installactionLocation},</if>
+            <if test="startTime != null ">start_time = #{startTime},</if>
+            <if test="checkCycle != null ">check_cycle = #{checkCycle},</if>
+            <if test="reminderCycle != null ">reminder_cycle = #{reminderCycle},</if>
+            <if test="meterStatus != null  and meterStatus != ''">meter_status = #{meterStatus},</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage = #{delFlage},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+        </trim>
+        where code = #{code}
+    </update>
+
+    <delete id="deleteMeterImplementCountById" parameterType="String">
+        delete from meter_implement where code = #{code}
+    </delete>
+
+  <!--  <delete id="deleteMeterImplementCountByIds" parameterType="String">
+        delete from meter_implement where code in 
+        <foreach item="code" collection="array" open="(" separator="," close=")">
+            #{code}
+        </foreach>
+    </delete>-->
+
+    <update id="deleteMeterImplementCountByIds" parameterType="String" >
+        update meter_implement
+        set start_time = NOW()
+        where code in
+        <foreach item="code" collection="array" open="(" separator="," close=")">
+        #{code}
+        </foreach>
+    </update>
+    
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/meter/MeterImplementMapper.xml b/basic-data/src/main/resources/mybatis/meter/MeterImplementMapper.xml
new file mode 100644
index 0000000..1fa0a7e
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/meter/MeterImplementMapper.xml
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.meter.mapper.MeterImplementMapper">
+    
+    <resultMap type="MeterImplement" id="MeterImplementResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="meterName"    column="meter_name"    />
+        <result property="meterType"    column="meter_type"    />
+        <result property="modelNumber"    column="model_number"    />
+        <result property="measureRange"    column="measure_range"    />
+        <result property="manufacturer"    column="manufacturer"    />
+        <result property="personCharge"    column="person_charge"    />
+        <result property="installactionLocation"    column="installaction_location"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="checkCycle"    column="check_cycle"    />
+        <result property="reminderCycle"    column="reminder_cycle"    />
+        <result property="meterStatus"    column="meter_status"    />
+        <result property="delFlage"    column="del_flage"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="txflage"    column="txflage"    />
+        <result property="putrunTime"    column="putrun_time"    />
+    </resultMap>
+    <resultMap type="MeterImplementExcel" id="MeterImplementResultExcel">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="meterName"    column="meter_name"    />
+        <result property="meterType"    column="meter_type"    />
+        <result property="modelNumber"    column="model_number"    />
+        <result property="measureRange"    column="measure_range"    />
+        <result property="manufacturer"    column="manufacturer"    />
+        <result property="personCharge"    column="person_charge"    />
+        <result property="installactionLocation"    column="installaction_location"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="checkCycle"    column="check_cycle"    />
+        <result property="reminderCycle"    column="reminder_cycle"    />
+        <result property="meterStatus"    column="meter_status"    />
+        <result property="delFlage"    column="del_flage"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+    <sql id="selectMeterImplementVo">
+        select id, code, meter_name, meter_type, model_number, measure_range, manufacturer, person_charge, installaction_location, start_time, check_cycle, reminder_cycle, meter_status, del_flage, remark, putrun_time,create_time, create_by, update_time, update_by,(start_time+check_cycle-reminder_cycle)&lt;=current_date as txflage from meter_implement
+    </sql>
+
+    <select id="selectMeterImplementList" parameterType="MeterImplement" resultMap="MeterImplementResult">
+        <include refid="selectMeterImplementVo"/>
+        <where>
+            del_flage='N'
+            <if test="code != null  and code != ''"> and code like concat('%', #{code}, '%')</if>
+            <if test="meterName != null  and meterName != ''"> and meter_name like concat('%', #{meterName}, '%')</if>
+            <if test="meterType != null  and meterType != ''"> and meter_type = #{meterType}</if>
+            <if test="measureRange != null  and measureRange != ''"> and measure_range like concat('%', #{measureRange}, '%')</if>
+            <if test="manufacturer != null  and manufacturer != ''"> and manufacturer like concat('%', #{manufacturer}, '%')</if>
+            <if test="installactionLocation != null  and installactionLocation != ''"> and installaction_location like concat('%', #{installactionLocation}, '%')</if>
+        </where>
+        order by code
+    </select>
+
+    <select id="exectMeterImplementList" parameterType="MeterImplement" resultMap="MeterImplementResultExcel">
+        select id, code, meter_name, fun_getDiceData('sys_device_type',meter_status) as meter_type, model_number, measure_range, manufacturer,
+        person_charge, installaction_location, to_char(start_time,'YYYY-MM-DD') start_time, check_cycle, reminder_cycle, fun_getDiceData('meter_status',meter_status) as meter_status,
+        del_flage, remark, create_time, create_by, update_time, update_by
+        from meter_implement
+        <where>
+            del_flage='N'
+            <if test="code != null  and code != ''"> and code like concat('%', #{code}, '%')</if>
+            <if test="meterName != null  and meterName != ''"> and meter_name like concat('%', #{meterName}, '%')</if>
+            <if test="meterType != null  and meterType != ''"> and meter_type = #{meterType}</if>
+            <if test="measureRange != null  and measureRange != ''"> and measure_range like concat('%', #{measureRange}, '%')</if>
+            <if test="manufacturer != null  and manufacturer != ''"> and manufacturer like concat('%', #{manufacturer}, '%')</if>
+            <if test="installactionLocation != null  and installactionLocation != ''"> and installaction_location like concat('%', #{installactionLocation}, '%')</if>
+        </where>
+        order by code
+    </select>
+
+    <select id="selectMeterImplementById" parameterType="String" resultMap="MeterImplementResult">
+        <include refid="selectMeterImplementVo"/>
+        where id = #{id}
+    </select>
+
+    <select id="selectMeterImplementByCode" parameterType="MeterImplement" resultMap="MeterImplementResult">
+        <include refid="selectMeterImplementVo"/>
+        where code = #{code}
+        <if test="id != null  and id != ''"> and id != #{id} or id is null</if>
+    </select>
+
+    <select id="listMeterImplementByIds" resultMap="MeterImplementResult">
+        SELECT
+            "id",
+            code,
+            meter_name,
+            meter_type,
+            meter_status,
+            installaction_location
+        FROM
+            "meter_implement"
+        WHERE
+            id IN
+            <foreach collection="meterIdList" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+    </select>
+
+    <insert id="insertMeterImplement" parameterType="MeterImplement">
+        insert into meter_implement
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="meterName != null  and meterName != ''">meter_name,</if>
+            <if test="meterType != null  and meterType != ''">meter_type,</if>
+            <if test="modelNumber != null  and modelNumber != ''">model_number,</if>
+            <if test="measureRange != null  and measureRange != ''">measure_range,</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer,</if>
+            <if test="personCharge != null  and personCharge != ''">person_charge,</if>
+            <if test="installactionLocation != null  and installactionLocation != ''">installaction_location,</if>
+            <if test="startTime != null ">start_time,</if>
+            <if test="putrunTime != null ">putrun_time,</if>
+            <if test="checkCycle != null ">check_cycle,</if>
+            <if test="reminderCycle != null ">reminder_cycle,</if>
+            <if test="meterStatus != null  and meterStatus != ''">meter_status,</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="meterName != null  and meterName != ''">#{meterName},</if>
+            <if test="meterType != null  and meterType != ''">#{meterType},</if>
+            <if test="modelNumber != null  and modelNumber != ''">#{modelNumber},</if>
+            <if test="measureRange != null  and measureRange != ''">#{measureRange},</if>
+            <if test="manufacturer != null  and manufacturer != ''">#{manufacturer},</if>
+            <if test="personCharge != null  and personCharge != ''">#{personCharge},</if>
+            <if test="installactionLocation != null  and installactionLocation != ''">#{installactionLocation},</if>
+            <if test="startTime != null ">#{startTime},</if>
+            <if test="putrunTime != null ">#{putrunTime},</if>
+            <if test="checkCycle != null ">#{checkCycle},</if>
+            <if test="reminderCycle != null ">#{reminderCycle},</if>
+            <if test="meterStatus != null  and meterStatus != ''">#{meterStatus},</if>
+            <if test="delFlage != null  and delFlage != ''">#{delFlage},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateMeterImplement" parameterType="MeterImplement">
+        update meter_implement
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="meterName != null  and meterName != ''">meter_name = #{meterName},</if>
+            <if test="meterType != null  and meterType != ''">meter_type = #{meterType},</if>
+            <if test="modelNumber != null  and modelNumber != ''">model_number = #{modelNumber},</if>
+            <if test="measureRange != null  and measureRange != ''">measure_range = #{measureRange},</if>
+            <if test="manufacturer != null  and manufacturer != ''">manufacturer = #{manufacturer},</if>
+            <if test="personCharge != null  and personCharge != ''">person_charge = #{personCharge},</if>
+            <if test="installactionLocation != null  and installactionLocation != ''">installaction_location = #{installactionLocation},</if>
+            <if test="startTime != null ">start_time = #{startTime},</if>
+            <if test="putrunTime != null ">putrun_time = #{putrunTime},</if>
+            <if test="checkCycle != null ">check_cycle = #{checkCycle},</if>
+            <if test="reminderCycle != null ">reminder_cycle = #{reminderCycle},</if>
+            <if test="meterStatus != null  and meterStatus != ''">meter_status = #{meterStatus},</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage = #{delFlage},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteMeterImplementById" parameterType="String">
+        <!--update meter_implement set del_flage='Y' where id = #{id} 鍏堢敤鐗╃悊鍒犻櫎锛屽悗鏈熸湁蹇呰鍐嶆墦寮�閫昏緫鍒犻櫎-->
+        delete from meter_implement where id = #{id}
+    </delete>
+
+    <delete id="deleteMeterImplementByIds" parameterType="String">
+        <!--update meter_implement set del_flage='Y' where id in 鍏堢敤鐗╃悊鍒犻櫎锛屽悗鏈熸湁蹇呰鍐嶆墦寮�閫昏緫鍒犻櫎-->
+        delete from meter_implement where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
diff --git a/basic-data/src/main/resources/mybatis/policy/PolicyAnnexMapper.xml b/basic-data/src/main/resources/mybatis/policy/PolicyAnnexMapper.xml
new file mode 100644
index 0000000..d169a2f
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/policy/PolicyAnnexMapper.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.policy.mapper.PolicyAnnexMapper">
+    
+    <resultMap type="PolicyAnnex" id="PolicyAnnexResult">
+        <result property="filePath"    column="file_path"    />
+        <result property="delFlage"    column="del_flage"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createOperator"    column="create_operator"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateOperator"    column="update_operator"    />
+        <result property="id"    column="id"    />
+        <result property="regulationsId"    column="regulations_id"    />
+        <result property="fileName"    column="file_name"    />
+        <result property="fileSuffix"    column="file_suffix"    />
+    </resultMap>
+
+    <sql id="selectPolicyAnnexVo">
+        select file_path, del_flage, create_time, create_operator, update_time, update_operator, id, regulations_id, file_name, file_suffix from policy_annex
+    </sql>
+
+    <select id="selectPolicyAnnexList" parameterType="PolicyAnnex" resultMap="PolicyAnnexResult">
+        <include refid="selectPolicyAnnexVo"/>
+        <where>  
+            <if test="fileName != null  and fileName != ''"> and file_name like concat('%', #{fileName}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectPolicyAnnexById" parameterType="String" resultMap="PolicyAnnexResult">
+        <include refid="selectPolicyAnnexVo"/>
+        where file_path = #{filePath}
+    </select>
+        
+    <insert id="insertPolicyAnnex" parameterType="PolicyAnnex">
+        insert into policy_annex
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="filePath != null  and filePath != ''">file_path,</if>
+            <if test="delFlage != null  and delFlage != ''">del_flage,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createOperator != null  and createOperator != ''">create_operator,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateOperator != null  and updateOperator != ''">update_operator,</if>
+            <if test="id != null  and id != ''">id,</if>
+            <if test="regulationsId != null  and regulationsId != ''">regulations_id,</if>
+            <if test="fileName != null  and fileName != ''">file_name,</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="filePath != null  and filePath != ''">#{filePath},</if>
+            <if test="delFlage != null  and delFlage != ''">#{delFlage},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createOperator != null  and createOperator != ''">#{createOperator},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateOperator != null  and updateOperator != ''">#{updateOperator},</if>
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="regulationsId != null  and regulationsId != ''">#{regulationsId},</if>
+            <if test="fileName != null  and fileName != ''">#{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">#{fileSuffix},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePolicyAnnex" parameterType="PolicyAnnex">
+        update policy_annex
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="delFlage != null  and delFlage != ''">del_flage = #{delFlage},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createOperator != null  and createOperator != ''">create_operator = #{createOperator},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateOperator != null  and updateOperator != ''">update_operator = #{updateOperator},</if>
+            <if test="id != null  and id != ''">id = #{id},</if>
+            <if test="regulationsId != null  and regulationsId != ''">regulations_id = #{regulationsId},</if>
+            <if test="fileName != null  and fileName != ''">file_name = #{fileName},</if>
+            <if test="fileSuffix != null  and fileSuffix != ''">file_suffix = #{fileSuffix},</if>
+        </trim>
+        where file_path = #{filePath}
+    </update>
+
+    <delete id="deletePolicyAnnexById" parameterType="String">
+        delete from policy_annex where id = #{id}
+    </delete>
+
+    <delete id="deletePolicyAnnexByIds" parameterType="String">
+        delete from policy_annex where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/policy/PolicyRegulationsMapper.xml b/basic-data/src/main/resources/mybatis/policy/PolicyRegulationsMapper.xml
new file mode 100644
index 0000000..594f8f9
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/policy/PolicyRegulationsMapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.policy.mapper.PolicyRegulationsMapper">
+    <resultMap type="PolicyRegulations" id="PolicyRegulationsResult">
+        <result property="id"    column="id"    />
+        <result property="titleName"    column="title_name"    />
+        <result property="content"    column="content"    />
+        <result property="sort"    column="sort"    />
+        <result property="creationTime"    column="creation_time"    />
+        <result property="operator"    column="operator"    />
+    </resultMap>
+
+    <sql id="selectPolicyRegulationsVo">
+       select id,title_name,content,fun_getDiceData('policy_sort',sort)as sort,to_char(creation_time,'YYYY-MM-DD') creation_time,operator from policy_regulations
+    </sql>
+
+    <select id="selectPolicyRegulationsList" parameterType="PolicyRegulations" resultMap="PolicyRegulationsResult">
+        <include refid="selectPolicyRegulationsVo"/>
+        <where>  
+            <if test="titleName != null  and titleName != ''"> and title_name like concat('%', #{titleName}, '%')</if>
+            <if test="content != null  and content != ''"> and content like concat('%', #{content}, '%')</if>
+            <if test="sort != null  and sort != ''"> and sort like concat('%', #{sort}, '%')</if>
+            <if test="creationTime != null "> and creation_time like concat('%', #{creationTime}, '%')</if>
+            <if test="operator != null  and operator != ''"> and operator like concat('%', #{operator}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectPolicyRegulationsById" parameterType="String" resultMap="PolicyRegulationsResult">
+        <include refid="selectPolicyRegulationsVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPolicyRegulations" parameterType="PolicyRegulations">
+        insert into policy_regulations
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="titleName != null  and titleName != ''">title_name,</if>
+            <if test="content != null  and content != ''">content,</if>
+            <if test="sort != null  and sort != ''">sort,</if>
+            <if test="creationTime != null ">creation_time,</if>
+            <if test="operator != null  and operator != ''">operator,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="titleName != null  and titleName != ''">#{titleName},</if>
+            <if test="content != null  and content != ''">#{content},</if>
+            <if test="sort != null  and sort != ''">#{sort},</if>
+            <if test="creationTime != null ">#{creationTime},</if>
+            <if test="operator != null  and operator != ''">#{operator},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePolicyRegulations" parameterType="PolicyRegulations">
+        update policy_regulations
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="titleName != null  and titleName != ''">title_name = #{titleName},</if>
+            <if test="content != null  and content != ''">content = #{content},</if>
+            <if test="sort != null  and sort != ''">sort = #{sort},</if>
+            <if test="creationTime != null ">creation_time = #{creationTime},</if>
+            <if test="operator != null  and operator != ''">operator = #{operator},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePolicyRegulationsById" parameterType="String">
+        delete from policy_regulations where id = #{id}
+    </delete>
+
+    <delete id="deletePolicyRegulationsByIds" parameterType="String">
+        delete from policy_regulations where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/policy/PolicyRegulationsTranslateMapper.xml b/basic-data/src/main/resources/mybatis/policy/PolicyRegulationsTranslateMapper.xml
new file mode 100644
index 0000000..3739a35
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/policy/PolicyRegulationsTranslateMapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.policy.mapper.PolicyRegulationsTranslateMapper">
+    
+    <resultMap type="PolicyRegulationsTranslate" id="PolicyRegulationsTranslateResult">
+        <result property="id"    column="id"    />
+        <result property="titleName"    column="title_name"    />
+        <result property="content"    column="content"    />
+        <result property="sort"    column="sort"    />
+        <result property="creationTime"    column="creation_time"    />
+        <result property="operator"    column="operator"    />
+    </resultMap>
+
+    <sql id="selectPolicyRegulationsTranslateVo">
+         select "id",title_name,"content",fun_getDiceData('policy_sort',sort)as sort,to_char(creation_time,'YYYY-MM-DD') creation_time,"operator" from policy_regulations
+    </sql>
+
+    <select id="selectPolicyRegulationsTranslateList" parameterType="PolicyRegulationsTranslate" resultMap="PolicyRegulationsTranslateResult">
+        <include refid="selectPolicyRegulationsTranslateVo"/>
+        <where>  
+            <if test="titleName != null  and titleName != ''"> and title_name like concat('%', #{titleName}, '%')</if>
+            <if test="content != null  and content != ''"> and content like concat('%', #{content}, '%')</if>
+            <if test="sort != null  and sort != ''"> and sort like concat('%', #{sort}, '%')</if>
+            <if test="creationTime != null "> and creation_time like concat('%', #{creationTime}, '%')</if>
+            <if test="operator != null  and operator != ''"> and operator like concat('%', #{operator}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectPolicyRegulationsTranslateById" parameterType="String" resultMap="PolicyRegulationsTranslateResult">
+        <include refid="selectPolicyRegulationsTranslateVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPolicyRegulationsTranslate" parameterType="PolicyRegulationsTranslate">
+        insert into policy_regulations
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="titleName != null  and titleName != ''">title_name,</if>
+            <if test="content != null  and content != ''">content,</if>
+            <if test="sort != null  and sort != ''">sort,</if>
+            <if test="creationTime != null ">creation_time,</if>
+            <if test="operator != null  and operator != ''">operator,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="titleName != null  and titleName != ''">#{titleName},</if>
+            <if test="content != null  and content != ''">#{content},</if>
+            <if test="sort != null  and sort != ''">#{sort},</if>
+            <if test="creationTime != null ">#{creationTime},</if>
+            <if test="operator != null  and operator != ''">#{operator},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePolicyRegulationsTranslate" parameterType="PolicyRegulationsTranslate">
+        update policy_regulations
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="titleName != null  and titleName != ''">title_name = #{titleName},</if>
+            <if test="content != null  and content != ''">content = #{content},</if>
+            <if test="sort != null  and sort != ''">sort = #{sort},</if>
+            <if test="creationTime != null ">creation_time = #{creationTime},</if>
+            <if test="operator != null  and operator != ''">operator = #{operator},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePolicyRegulationsTranslateById" parameterType="String">
+        delete from policy_regulations where id = #{id}
+    </delete>
+
+    <delete id="deletePolicyRegulationsTranslateByIds" parameterType="String">
+        delete from policy_regulations where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/workforce/RosteringDutyMapper.xml b/basic-data/src/main/resources/mybatis/workforce/RosteringDutyMapper.xml
new file mode 100644
index 0000000..2466d32
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/workforce/RosteringDutyMapper.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.workforce.mapper.RosteringDutyMapper">
+    
+    <resultMap type="RosteringDuty" id="RosteringDutyResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="name"    column="name"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="orderNo"    column="order_no"    />
+        <result property="description"    column="description"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRosteringDutyVo">
+        select id, code, name, dept_id,(SELECT s.dept_name FROM sys_dept s WHERE  s.dept_id = rostering_duty.dept_id )  deptName, order_no, description, create_by, create_time, update_by, update_time from rostering_duty
+    </sql>
+
+    <select id="selectRosteringDutyList" parameterType="RosteringDuty" resultMap="RosteringDutyResult">
+        <include refid="selectRosteringDutyVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="deptId != null  and deptId != ''"> and dept_id like concat('%', #{deptId}, '%')</if>
+            <if test="orderNo != null  and orderNo != ''"> and order_no like concat('%', #{orderNo}, '%')</if>
+            <if test="description != null  and description != ''"> and description like concat('%', #{description}, '%')</if>
+            <if test="createBy != null  and createBy != ''"> and create_by like concat('%', #{createBy}, '%')</if>
+            <if test="createTime != null "> and create_time like concat('%', #{createTime}, '%')</if>
+            <if test="updateBy != null  and updateBy != ''"> and update_by like concat('%', #{updateBy}, '%')</if>
+            <if test="updateTime != null "> and update_time like concat('%', #{updateTime}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectRosteringDutyById" parameterType="String" resultMap="RosteringDutyResult">
+        <include refid="selectRosteringDutyVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertRosteringDuty" parameterType="RosteringDuty">
+        insert into rostering_duty
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="deptId != null  and deptId != ''">dept_id,</if>
+            <if test="orderNo != null  and orderNo != ''">order_no,</if>
+            <if test="description != null  and description != ''">description,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="deptId != null  and deptId != ''">#{deptId},</if>
+            <if test="orderNo != null  and orderNo != ''">#{orderNo},</if>
+            <if test="description != null  and description != ''">#{description},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRosteringDuty" parameterType="RosteringDuty">
+        update rostering_duty
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="deptId != null  and deptId != ''">dept_id = #{deptId},</if>
+            <if test="orderNo != null  and orderNo != ''">order_no = #{orderNo},</if>
+            <if test="description != null  and description != ''">description = #{description},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRosteringDutyById" parameterType="String">
+        delete from rostering_duty where id = #{id}
+    </delete>
+
+    <delete id="deleteRosteringDutyByIds" parameterType="String">
+        delete from rostering_duty where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/workforce/RosteringMapper.xml b/basic-data/src/main/resources/mybatis/workforce/RosteringMapper.xml
new file mode 100644
index 0000000..a4bf7bf
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/workforce/RosteringMapper.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.workforce.mapper.RosteringMapper">
+    
+    <resultMap type="Rostering" id="RosteringResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="name"    column="name"    />
+        <result property="schemeId"    column="scheme_id"    />
+        <result property="shiftId"    column="shift_id"    />
+        <result property="dutyId"    column="duty_id"    />
+        <result property="description"    column="description"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="departMemberId"    column="depart_member_id"  />
+        <result property="beginTimes"    column="begin_times"    />
+        <result property="endTimes"    column="end_times"  />
+    </resultMap>
+    <resultMap type="RosteringScheme" id="RosteringSchemeResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+    </resultMap>
+    <resultMap type="RosteringCopy" id="RosteringCopyResult">
+        <result property="code"    column="code"    />
+        <result property="name"    column="name"    />
+        <result property="schemeId"    column="scheme_id"    />
+        <result property="shiftName"    column="name"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="enddTime"    column="endd_time"    />
+        <result property="isCrossDay"    column="is_cross_day"    />
+        <result property="dutyName"    column="name"    />
+        <result property="shiftId"    column="shift_id"    />
+        <result property="dutyId"    column="duty_id"    />
+    </resultMap>
+    <sql id="selectRosteringVo">
+        SELECT r.ID,
+            r.code,
+            r.NAME,
+            r.begin_times,
+            r.end_times,
+            r.scheme_id,
+            (SELECT name from rostering_scheme a where a.id=r.scheme_id) schemeName,
+            r.shift_id,
+           (SELECT name from rostering_shift d where d.id=r.shift_id) shiftName,
+            r.duty_id,
+            (SELECT name from rostering_duty d where d.id=r.duty_id) dutyName,
+            r.depart_member_id,
+            (SELECT s.dept_name FROM sys_dept s WHERE s.dept_id=r.depart_member_id) deptName,
+            r.description
+        FROM
+            rostering r
+
+    </sql>
+
+    <select id="selectRosteringList" parameterType="Rostering" resultMap="RosteringResult">
+        <include refid="selectRosteringVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="schemeId != null  and schemeId != ''"> and scheme_id like concat('%', #{schemeId}, '%')</if>
+            <if test="shiftId != null  and shiftId != ''"> and shift_id like concat('%', #{shiftId}, '%')</if>
+            <if test="dutyId != null  and dutyId != ''"> and duty_id like concat('%', #{dutyId}, '%')</if>
+            <if test="description != null  and description != ''"> and description like concat('%', #{description}, '%')</if>
+            <if test="departMemberId != null  and departMemberId != ''"> and depart_member_id like concat('%', #{departMemberId}, '%')</if>
+        </where>
+    </select>
+    <select id="selectSchemeNameList" parameterType="RosteringScheme" resultMap="RosteringSchemeResult">
+         select id,name from rostering_scheme
+    </select>
+
+    <select id="selectRosteringById" parameterType="String" resultMap="RosteringResult">
+        <include refid="selectRosteringVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertRostering" parameterType="Rostering">
+        insert into rostering
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="schemeId != null  and schemeId != ''">scheme_id,</if>
+            <if test="shiftId != null  and shiftId != ''">shift_id,</if>
+            <if test="dutyId != null  and dutyId != ''">duty_id,</if>
+            <if test="description != null  and description != ''">description,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="departMemberId != null  and departMemberId != ''">depart_member_id,</if>
+            <if test="beginTimes != null">begin_times,</if>
+            <if test="endTimes != null">end_times,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="schemeId != null  and schemeId != ''">#{schemeId},</if>
+            <if test="shiftId != null  and shiftId != ''">#{shiftId},</if>
+            <if test="dutyId != null  and dutyId != ''">#{dutyId},</if>
+            <if test="description != null  and description != ''">#{description},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="departMemberId != null  and departMemberId != ''">#{departMemberId},</if>
+            <if test="beginTimes != null">#{beginTimes},</if>
+            <if test="endTimes != null">#{endTimes},</if>
+         </trim>
+    </insert>
+    <insert id="saveRostering1" parameterType="java.util.List">
+        <foreach item="dataItems" collection="dataItemVlues">
+            <if test="dataItems != null">
+                insert into rostering (id,code,name,scheme_id,shift_id,duty_id,description,create_by,create_time,depart_member_id,begin_times,end_times)
+                values (#{dataItems.id},#{dataItems.code},#{dataItems.name},#{dataItems.schemeId},#{dataItems.shiftId},#{dataItems.dutyId},#{dataItems.description},#{dataItems.createBy},#{dataItems.createTime},#{dataItems.departMemberId},#{dataItems.beginTimes},#{dataItems.endTimes});
+            </if>
+        </foreach>
+    </insert>
+    <insert id="saveRostering">
+        insert into rostering (id,code,name,scheme_id,shift_id,duty_id,description,create_by,create_time,depart_member_id,begin_times,end_times)
+        values
+        <foreach collection="list" item="dataItems" index="index" separator=",">
+            (#{dataItems.id},#{dataItems.code},#{dataItems.name},#{dataItems.schemeId},#{dataItems.shiftId},#{dataItems.dutyId},#{dataItems.description},#{dataItems.createBy},#{dataItems.createTime},#{dataItems.departMemberId},#{dataItems.beginTimes},#{dataItems.endTimes})
+        </foreach>
+    </insert>
+    <update id="updateRostering" parameterType="Rostering">
+        update rostering
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="schemeId != null  and schemeId != ''">scheme_id = #{schemeId},</if>
+            <if test="shiftId != null  and shiftId != ''">shift_id = #{shiftId},</if>
+            <if test="dutyId != null  and dutyId != ''">duty_id = #{dutyId},</if>
+            <if test="description != null  and description != ''">description = #{description},</if>
+            <if test="departMemberId != null  and departMemberId != ''">depart_member_id = #{departMemberId},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="beginTimes != null">begin_times = #{beginTimes},</if>
+            <if test="endTimes != null">end_times = #{endTimes},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRosteringById" parameterType="String">
+        delete from rostering where id = #{id}
+    </delete>
+
+    <delete id="deleteRosteringByIds" parameterType="String">
+        delete from rostering where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectList" parameterType="RosteringCopy" resultMap="RosteringCopyResult">
+        SELECT
+            s.code,
+            s.name,
+            s.scheme_id,
+            s.shift_id,
+	        s.duty_id,
+            (rs.name) shiftName,
+            rs.start_time,
+            rs.endd_time,
+            rs.is_cross_day,
+            (d.name) dutyName
+        FROM
+            rostering_scheme_item s
+            LEFT JOIN rostering_shift rs ON rs.id = s.shift_id
+            LEFT JOIN rostering_duty d ON d.id = s.duty_id
+        WHERE
+            scheme_id = #{schemeId}
+            AND rs.dept_id = #{departMemberId}
+
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/workforce/RosteringSchemeMapper.xml b/basic-data/src/main/resources/mybatis/workforce/RosteringSchemeMapper.xml
new file mode 100644
index 0000000..7a5a095
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/workforce/RosteringSchemeMapper.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.workforce.mapper.RosteringSchemeMapper">
+    
+    <resultMap type="RosteringScheme" id="RosteringSchemeResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="name"    column="name"    />
+        <result property="departMemberId"    column="departMemberId"    />
+        <result property="rosteringschemekind"    column="rosteringSchemeKind"    />
+        <result property="referencedate"    column="referenceDate"    />
+        <result property="isautorostering"    column="isAutoRostering"    />
+        <result property="description"    column="description"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRosteringSchemeVo">
+        select ID, code, NAME, "rosteringSchemeKind", "referenceDate", "isAutoRostering", description,(SELECT s.dept_name FROM sys_dept s WHERE  s.dept_id = "departMemberId" )  departMember, created_by, created_time, update_by, update_time from rostering_scheme
+    </sql>
+
+    <select id="selectRosteringSchemeList" parameterType="RosteringScheme" resultMap="RosteringSchemeResult">
+        <include refid="selectRosteringSchemeVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="departMemberId != null  and departMemberId != ''"> and "departMemberId" like concat('%', #{departMemberId}, '%')</if>
+            <if test="rosteringschemekind != null  and rosteringschemekind != ''"> and "rosteringSchemeKind" like concat('%', #{rosteringschemekind}, '%')</if>
+            <if test="referencedate != null "> and "referenceDate" like concat('%', #{referencedate}, '%')</if>
+            <if test="isautorostering != null "> and "isAutoRostering" like concat('%', #{isautorostering}, '%')</if>
+            <if test="description != null  and description != ''"> and description like concat('%', #{description}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectRosteringSchemeById" parameterType="String" resultMap="RosteringSchemeResult">
+        <include refid="selectRosteringSchemeVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertRosteringScheme" parameterType="RosteringScheme">
+        insert into rostering_scheme
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="departMemberId != null  and departMemberId != ''">"departMemberId",</if>
+            <if test="rosteringschemekind != null  and rosteringschemekind != ''">"rosteringSchemeKind",</if>
+            <if test="referencedate != null ">"referenceDate",</if>
+            <if test="isautorostering != null ">"isAutoRostering",</if>
+            <if test="description != null  and description != ''">description,</if>
+            <if test="createBy != null  and createdBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="departMemberId != null  and departMemberId != ''">#{departMemberId},</if>
+            <if test="rosteringschemekind != null  and rosteringschemekind != ''">#{rosteringschemekind},</if>
+            <if test="referencedate != null ">#{referencedate},</if>
+            <if test="isautorostering != null ">#{isautorostering},</if>
+            <if test="description != null  and description != ''">#{description},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRosteringScheme" parameterType="RosteringScheme">
+        update rostering_scheme
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="departMemberId != null  and departMemberId != ''">"departMemberId" = #{departMemberId},</if>
+            <if test="rosteringschemekind != null  and rosteringschemekind != ''">"rosteringSchemeKind" = #{rosteringschemekind},</if>
+            <if test="referencedate != null ">"referenceDate" = #{referencedate},</if>
+            <if test="isautorostering != null ">"isAutoRostering" = #{isautorostering},</if>
+            <if test="description != null  and description != ''">description = #{description},</if>
+            <if test="createdBy != null  and createdBy != ''">created_by = #{createdBy},</if>
+            <if test="createdTime != null ">created_time = #{createdTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRosteringSchemeById" parameterType="String">
+        delete from rostering_scheme where id = #{id}
+    </delete>
+
+    <delete id="deleteRosteringSchemeByIds" parameterType="String">
+        delete from rostering_scheme where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/workforce/RosteringSchemeitemMapper.xml b/basic-data/src/main/resources/mybatis/workforce/RosteringSchemeitemMapper.xml
new file mode 100644
index 0000000..9a02f26
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/workforce/RosteringSchemeitemMapper.xml
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.workforce.mapper.RosteringSchemeitemMapper">
+    <resultMap type="RosteringSchemeitem" id="RosteringSchemeitemResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="name"    column="name"    />
+        <result property="schemeId"    column="scheme_id"    />
+        <result property="dayofloopdays"    column="dayOfLoopDays"    />
+        <result property="shiftId"    column="shift_id"    />
+        <result property="dutyId"    column="duty_id"    />
+        <result property="description"    column="description"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectRosteringSchemeitemVo">
+        select id, code, name, scheme_id,(select name from rostering_scheme where id=scheme_id) schemeName, "dayOfLoopDays", shift_id,(select name from rostering_shift where id=shift_id) shiftName, duty_id,(select name from rostering_duty where id=duty_id) dutyName, description, create_by, create_time, update_by, update_time from rostering_scheme_item
+    </sql>
+
+    <select id="selectRosteringSchemeitemList" parameterType="RosteringSchemeitem" resultMap="RosteringSchemeitemResult">
+        <include refid="selectRosteringSchemeitemVo"/>
+        <where>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="schemeId != null  and schemeId != ''"> and scheme_id like concat('%', #{schemeId}, '%')</if>
+            <if test="dayofloopdays != null  and dayofloopdays != ''"> and dayOfLoopDays like concat('%', #{dayofloopdays}, '%')</if>
+            <if test="shiftId != null  and shiftId != ''"> and shift_id like concat('%', #{shiftId}, '%')</if>
+            <if test="dutyId != null  and dutyId != ''"> and duty_id like concat('%', #{dutyId}, '%')</if>
+            <if test="description != null  and description != ''"> and description like concat('%', #{description}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectRosteringSchemeitemById" parameterType="String" resultMap="RosteringSchemeitemResult">
+        <include refid="selectRosteringSchemeitemVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRosteringSchemeitem" parameterType="RosteringSchemeitem">
+        insert into rostering_scheme_item
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="schemeId != null  and schemeId != ''">scheme_id,</if>
+            <if test="dayofloopdays != null  and dayofloopdays != ''">"dayOfLoopDays",</if>
+            <if test="shiftId != null  and shiftId != ''">shift_id,</if>
+            <if test="dutyId != null  and dutyId != ''">duty_id,</if>
+            <if test="description != null  and description != ''">description,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="schemeId != null  and schemeId != ''">#{schemeId},</if>
+            <if test="dayofloopdays != null  and dayofloopdays != ''">#{dayofloopdays},</if>
+            <if test="shiftId != null  and shiftId != ''">#{shiftId},</if>
+            <if test="dutyId != null  and dutyId != ''">#{dutyId},</if>
+            <if test="description != null  and description != ''">#{description},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateRosteringSchemeitem" parameterType="RosteringSchemeitem">
+        update rostering_scheme_item
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="schemeId != null  and schemeId != ''">scheme_id = #{schemeId},</if>
+            <if test="dayofloopdays != null  and dayofloopdays != ''">"dayOfLoopDays" = #{dayofloopdays},</if>
+            <if test="shiftId != null  and shiftId != ''">shift_id = #{shiftId},</if>
+            <if test="dutyId != null  and dutyId != ''">duty_id = #{dutyId},</if>
+            <if test="description != null  and description != ''">description = #{description},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRosteringSchemeitemById" parameterType="String">
+        delete from rostering_scheme_item where id = #{id}
+    </delete>
+
+    <delete id="deleteRosteringSchemeitemByIds" parameterType="String">
+        delete from rostering_scheme_item where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/basic-data/src/main/resources/mybatis/workforce/RosteringShiftMapper.xml b/basic-data/src/main/resources/mybatis/workforce/RosteringShiftMapper.xml
new file mode 100644
index 0000000..cc6def3
--- /dev/null
+++ b/basic-data/src/main/resources/mybatis/workforce/RosteringShiftMapper.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.basic.data.workforce.mapper.RosteringShiftMapper">
+    
+    <resultMap type="RosteringShift" id="RosteringShiftResult">
+        <result property="id"    column="id"    />
+        <result property="code"    column="code"    />
+        <result property="name"    column="name"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="enddTime"    column="endd_time"    />
+        <result property="isCrossDay"    column="is_cross_day"    />
+        <result property="orderNo"    column="order_no"    />
+        <result property="description"    column="description"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+    <resultMap type="SysDept" id="SysDeptResult">
+        <id property="deptId" column="dept_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="deptName" column="dept_name"/>
+    </resultMap>
+    <sql id="selectRosteringShiftVo">
+        select id, code, name, dept_id, start_time, endd_time, is_cross_day, order_no, description,(SELECT s.dept_name FROM sys_dept s WHERE  s.dept_id = rostering_shift.dept_id )  deptName, create_by, create_time, update_by, update_time from rostering_shift
+
+    </sql>
+
+    <select id="selectRosteringShiftList" parameterType="RosteringShift" resultMap="RosteringShiftResult">
+        <include refid="selectRosteringShiftVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="deptId != null  and deptId != ''"> and dept_id like concat('%', #{deptId}, '%')</if>
+            <if test="startTime != null "> and start_time like concat('%', #{startTime}, '%')</if>
+            <if test="enddTime != null "> and endd_time like concat('%', #{enddTime}, '%')</if>
+            <if test="isCrossDay != null  and isCrossDay != ''"> and is_cross_day like concat('%', #{isCrossDay}, '%')</if>
+            <if test="orderNo != null  and orderNo != ''"> and order_no like concat('%', #{orderNo}, '%')</if>
+            <if test="description != null  and description != ''"> and description like concat('%', #{description}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectRosteringShiftById" parameterType="String" resultMap="RosteringShiftResult">
+        <include refid="selectRosteringShiftVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertRosteringShift" parameterType="RosteringShift">
+        insert into rostering_shift
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="deptId != null  and deptId != ''">dept_id,</if>
+            <if test="startTime != null ">start_time,</if>
+            <if test="enddTime != null ">endd_time,</if>
+            <if test="isCrossDay != null  and isCrossDay != ''">is_cross_day,</if>
+            <if test="orderNo != null  and orderNo != ''">order_no,</if>
+            <if test="description != null  and description != ''">description,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="deptId != null  and deptId != ''">#{deptId},</if>
+            <if test="startTime != null ">#{startTime},</if>
+            <if test="enddTime != null ">#{enddTime},</if>
+            <if test="isCrossDay != null  and isCrossDay != ''">#{isCrossDay},</if>
+            <if test="orderNo != null  and orderNo != ''">#{orderNo},</if>
+            <if test="description != null  and description != ''">#{description},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRosteringShift" parameterType="RosteringShift">
+        update rostering_shift
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="deptId != null  and deptId != ''">dept_id = #{deptId},</if>
+            <if test="startTime != null ">start_time = #{startTime},</if>
+            <if test="enddTime != null ">endd_time = #{enddTime},</if>
+            <if test="isCrossDay != null  and isCrossDay != ''">is_cross_day = #{isCrossDay},</if>
+            <if test="orderNo != null  and orderNo != ''">order_no = #{orderNo},</if>
+            <if test="description != null  and description != ''">description = #{description},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRosteringShiftById" parameterType="String">
+        delete from rostering_shift where id = #{id}
+    </delete>
+
+    <delete id="deleteRosteringShiftByIds" parameterType="String">
+        delete from rostering_shift where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <select id="treeList" parameterType="SysDept" resultMap="SysDeptResult">
+        SELECT
+            dept_id,
+            parent_id,
+            dept_name
+        FROM
+            sys_dept
+        WHERE
+            status = '0'
+            AND del_flag = '0'
+    </select>
+    
+</mapper>
\ No newline at end of file
diff --git a/basic/pom.xml b/basic/pom.xml
new file mode 100644
index 0000000..a8ace7f
--- /dev/null
+++ b/basic/pom.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>basic</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>parent</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/constant/Constants.java b/basic/src/main/java/com/dingzhuo/energy/common/constant/Constants.java
new file mode 100644
index 0000000..634e945
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/constant/Constants.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.common.constant;
+
+import io.jsonwebtoken.Claims;
+
+/**
+ * 閫氱敤甯搁噺淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class Constants
+{
+    /**
+     * UTF-8 瀛楃闆�
+     */
+    public static final String UTF8 = "UTF-8";
+    
+    /**
+     * 閫氱敤鎴愬姛鏍囪瘑
+     */
+    public static final String SUCCESS = "0";
+
+    /**
+     * 閫氱敤澶辫触鏍囪瘑
+     */
+    public static final String FAIL = "1";
+
+    /**
+     * 鐧诲綍鎴愬姛
+     */
+    public static final String LOGIN_SUCCESS = "Success";
+
+    /**
+     * 娉ㄩ攢
+     */
+    public static final String LOGOUT = "Logout";
+
+    /**
+     * 鐧诲綍澶辫触
+     */
+    public static final String LOGIN_FAIL = "Error";
+
+    /**
+     * 楠岃瘉鐮� redis key
+     */
+    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
+
+    /**
+     * 鐧诲綍鐢ㄦ埛 redis key
+     */
+    public static final String LOGIN_TOKEN_KEY = "login_tokens:";
+
+    /**
+     * 楠岃瘉鐮佹湁鏁堟湡锛堝垎閽燂級
+     */
+    public static final Integer CAPTCHA_EXPIRATION = 2;
+
+    /**
+     * 浠ょ墝
+     */
+    public static final String TOKEN = "token";
+
+    /**
+     * 浠ょ墝鍓嶇紑
+     */
+    public static final String TOKEN_PREFIX = "Bearer ";
+
+    /**
+     * 浠ょ墝鍓嶇紑
+     */
+    public static final String LOGIN_USER_KEY = "login_user_key";
+
+    /**
+     * 鐢ㄦ埛ID
+     */
+    public static final String JWT_USERID = "userid";
+
+    /**
+     * 鐢ㄦ埛鍚嶇О
+     */
+    public static final String JWT_USERNAME = Claims.SUBJECT;
+
+    /**
+     * 鐢ㄦ埛澶村儚
+     */
+    public static final String JWT_AVATAR = "avatar";
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    public static final String JWT_CREATED = "created";
+
+    /**
+     * 鐢ㄦ埛鏉冮檺
+     */
+    public static final String JWT_AUTHORITIES = "authorities";
+
+    /**
+     * 璧勬簮鏄犲皠璺緞 鍓嶇紑
+     */
+    public static final String RESOURCE_PREFIX = "/profile";
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/constant/GenConstants.java b/basic/src/main/java/com/dingzhuo/energy/common/constant/GenConstants.java
new file mode 100644
index 0000000..ecced41
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/constant/GenConstants.java
@@ -0,0 +1,94 @@
+package com.dingzhuo.energy.common.constant;
+
+/**
+ * 浠g爜鐢熸垚閫氱敤甯搁噺
+ * 
+ * @author ruoyi
+ */
+public class GenConstants
+{
+    /** 鍗曡〃锛堝鍒犳敼鏌ワ級 */
+    public static final String TPL_CRUD = "crud";
+
+    /** 鏍戣〃锛堝鍒犳敼鏌ワ級 */
+    public static final String TPL_TREE = "tree";
+
+    /** 鏍戠紪鐮佸瓧娈� */
+    public static final String TREE_CODE = "treeCode";
+
+    /** 鏍戠埗缂栫爜瀛楁 */
+    public static final String TREE_PARENT_CODE = "treeParentCode";
+
+    /** 鏍戝悕绉板瓧娈� */
+    public static final String TREE_NAME = "treeName";
+
+    /** 鏁版嵁搴撳瓧绗︿覆绫诲瀷 */
+    public static final String[] COLUMNTYPE_STR = { "char", "varchar", "narchar", "varchar2", "tinytext", "text",
+            "mediumtext", "longtext" };
+
+    /** 鏁版嵁搴撴椂闂寸被鍨� */
+    public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
+
+    /** 鏁版嵁搴撴暟瀛楃被鍨� */
+    public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
+            "bigint", "float", "float", "double", "decimal" };
+
+    /** 椤甸潰涓嶉渶瑕佺紪杈戝瓧娈� */
+    public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
+
+    /** 椤甸潰涓嶉渶瑕佹樉绀虹殑鍒楄〃瀛楁 */
+    public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
+            "update_time" };
+
+    /** 椤甸潰涓嶉渶瑕佹煡璇㈠瓧娈� */
+    public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
+            "update_time", "remark" };
+
+    /** Entity鍩虹被瀛楁 */
+    public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
+
+    /** Tree鍩虹被瀛楁 */
+    public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" };
+
+    /** 鏂囨湰妗� */
+    public static final String HTML_INPUT = "input";
+
+    /** 鏂囨湰鍩� */
+    public static final String HTML_TEXTAREA = "textarea";
+
+    /** 涓嬫媺妗� */
+    public static final String HTML_SELECT = "select";
+
+    /** 鍗曢�夋 */
+    public static final String HTML_RADIO = "radio";
+
+    /** 澶嶉�夋 */
+    public static final String HTML_CHECKBOX = "checkbox";
+
+    /** 鏃ユ湡鎺т欢 */
+    public static final String HTML_DATETIME = "datetime";
+
+    /** 瀛楃涓茬被鍨� */
+    public static final String TYPE_STRING = "String";
+
+    /** 鏁村瀷 */
+    public static final String TYPE_INTEGER = "Integer";
+
+    /** 闀挎暣鍨� */
+    public static final String TYPE_LONG = "Long";
+
+    /** 娴偣鍨� */
+    public static final String TYPE_DOUBLE = "Double";
+
+    /** 楂樼簿搴﹁绠楃被鍨� */
+    public static final String TYPE_BIGDECIMAL = "BigDecimal";
+
+    /** 鏃堕棿绫诲瀷 */
+    public static final String TYPE_DATE = "Date";
+
+    /** 妯$硦鏌ヨ */
+    public static final String QUERY_LIKE = "LIKE";
+
+    /** 闇�瑕� */
+    public static final String REQUIRE = "1";
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/constant/HttpStatus.java b/basic/src/main/java/com/dingzhuo/energy/common/constant/HttpStatus.java
new file mode 100644
index 0000000..f8c5b7f
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/constant/HttpStatus.java
@@ -0,0 +1,89 @@
+package com.dingzhuo.energy.common.constant;
+
+/**
+ * 杩斿洖鐘舵�佺爜
+ * 
+ * @author ruoyi
+ */
+public interface HttpStatus
+{
+    /**
+     * 鎿嶄綔鎴愬姛
+     */
+    int SUCCESS = 200;
+
+    /**
+     * 瀵硅薄鍒涘缓鎴愬姛
+     */
+    int CREATED = 201;
+
+    /**
+     * 璇锋眰宸茬粡琚帴鍙�
+     */
+    int ACCEPTED = 202;
+
+    /**
+     * 鎿嶄綔宸茬粡鎵ц鎴愬姛锛屼絾鏄病鏈夎繑鍥炴暟鎹�
+     */
+    int NO_CONTENT = 204;
+
+    /**
+     * 璧勬簮宸茶绉婚櫎
+     */
+    int MOVED_PERM = 301;
+
+    /**
+     * 閲嶅畾鍚�
+     */
+    int SEE_OTHER = 303;
+
+    /**
+     * 璧勬簮娌℃湁琚慨鏀�
+     */
+    int NOT_MODIFIED = 304;
+
+    /**
+     * 鍙傛暟鍒楄〃閿欒锛堢己灏戯紝鏍煎紡涓嶅尮閰嶏級
+     */
+    int BAD_REQUEST = 400;
+
+    /**
+     * 鏈巿鏉�
+     */
+    int UNAUTHORIZED = 401;
+
+    /**
+     * 璁块棶鍙楅檺锛屾巿鏉冭繃鏈�
+     */
+    int FORBIDDEN = 403;
+
+    /**
+     * 璧勬簮锛屾湇鍔℃湭鎵惧埌
+     */
+    int NOT_FOUND = 404;
+
+    /**
+     * 涓嶅厑璁哥殑http鏂规硶
+     */
+    int BAD_METHOD = 405;
+
+    /**
+     * 璧勬簮鍐茬獊锛屾垨鑰呰祫婧愯閿�
+     */
+    int CONFLICT = 409;
+
+    /**
+     * 涓嶆敮鎸佺殑鏁版嵁锛屽獟浣撶被鍨�
+     */
+    int UNSUPPORTED_TYPE = 415;
+
+    /**
+     * 绯荤粺鍐呴儴閿欒
+     */
+    int ERROR = 500;
+
+    /**
+     * 鎺ュ彛鏈疄鐜�
+     */
+    int NOT_IMPLEMENTED = 501;
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/constant/UserConstants.java b/basic/src/main/java/com/dingzhuo/energy/common/constant/UserConstants.java
new file mode 100644
index 0000000..1a6df86
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/constant/UserConstants.java
@@ -0,0 +1,39 @@
+package com.dingzhuo.energy.common.constant;
+
+/**
+ * 鐢ㄦ埛甯搁噺淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class UserConstants
+{
+    /**
+     * 骞冲彴鍐呯郴缁熺敤鎴风殑鍞竴鏍囧織
+     */
+    public static final String SYS_USER = "SYS_USER";
+
+    /** 姝e父鐘舵�� */
+    public static final String NORMAL = "0";
+
+    /** 寮傚父鐘舵�� */
+    public static final String EXCEPTION = "1";
+
+    /** 鐢ㄦ埛灏佺鐘舵�� */
+    public static final String USER_BLOCKED = "1";
+
+    /** 瑙掕壊灏佺鐘舵�� */
+    public static final String ROLE_BLOCKED = "1";
+
+    /** 閮ㄩ棬姝e父鐘舵�� */
+    public static final String DEPT_NORMAL = "0";
+
+    /** 瀛楀吀姝e父鐘舵�� */
+    public static final String DICT_NORMAL = "0";
+
+    /** 鏄惁涓虹郴缁熼粯璁わ紙鏄級 */
+    public static final String YES = "Y";
+
+    /** 鏍¢獙杩斿洖缁撴灉鐮� */
+    public final static String UNIQUE = "0";
+    public final static String NOT_UNIQUE = "1";
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/core/lang/UUID.java b/basic/src/main/java/com/dingzhuo/energy/common/core/lang/UUID.java
new file mode 100644
index 0000000..bf2a31c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/core/lang/UUID.java
@@ -0,0 +1,483 @@
+package com.dingzhuo.energy.common.core.lang;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+
+import com.dingzhuo.energy.common.exception.UtilException;
+import com.dingzhuo.energy.common.exception.UtilException;
+
+/**
+ * 鎻愪緵閫氱敤鍞竴璇嗗埆鐮侊紙universally unique identifier锛夛紙UUID锛夊疄鐜�
+ *
+ * @author ruoyi
+ */
+public final class UUID implements java.io.Serializable, Comparable<UUID>
+{
+    private static final long serialVersionUID = -1185015143654744140L;
+
+    /**
+     * SecureRandom 鐨勫崟渚�
+     *
+     */
+    private static class Holder
+    {
+        static final SecureRandom numberGenerator = getSecureRandom();
+    }
+
+    /** 姝UID鐨勬渶楂�64鏈夋晥浣� */
+    private final long mostSigBits;
+
+    /** 姝UID鐨勬渶浣�64鏈夋晥浣� */
+    private final long leastSigBits;
+
+    /**
+     * 绉佹湁鏋勯��
+     * 
+     * @param data 鏁版嵁
+     */
+    private UUID(byte[] data)
+    {
+        long msb = 0;
+        long lsb = 0;
+        assert data.length == 16 : "data must be 16 bytes in length";
+        for (int i = 0; i < 8; i++)
+        {
+            msb = (msb << 8) | (data[i] & 0xff);
+        }
+        for (int i = 8; i < 16; i++)
+        {
+            lsb = (lsb << 8) | (data[i] & 0xff);
+        }
+        this.mostSigBits = msb;
+        this.leastSigBits = lsb;
+    }
+
+    /**
+     * 浣跨敤鎸囧畾鐨勬暟鎹瀯閫犳柊鐨� UUID銆�
+     *
+     * @param mostSigBits 鐢ㄤ簬 {@code UUID} 鐨勬渶楂樻湁鏁� 64 浣�
+     * @param leastSigBits 鐢ㄤ簬 {@code UUID} 鐨勬渶浣庢湁鏁� 64 浣�
+     */
+    public UUID(long mostSigBits, long leastSigBits)
+    {
+        this.mostSigBits = mostSigBits;
+        this.leastSigBits = leastSigBits;
+    }
+
+    /**
+     * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘�� 浣跨敤鍔犲瘑鐨勬湰鍦扮嚎绋嬩吉闅忔満鏁扮敓鎴愬櫒鐢熸垚璇� UUID銆�
+     * 
+     * @return 闅忔満鐢熸垚鐨� {@code UUID}
+     */
+    public static UUID fastUUID()
+    {
+        return randomUUID(false);
+    }
+
+    /**
+     * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘�� 浣跨敤鍔犲瘑鐨勫己浼殢鏈烘暟鐢熸垚鍣ㄧ敓鎴愯 UUID銆�
+     * 
+     * @return 闅忔満鐢熸垚鐨� {@code UUID}
+     */
+    public static UUID randomUUID()
+    {
+        return randomUUID(true);
+    }
+
+    /**
+     * 鑾峰彇绫诲瀷 4锛堜吉闅忔満鐢熸垚鐨勶級UUID 鐨勯潤鎬佸伐鍘傘�� 浣跨敤鍔犲瘑鐨勫己浼殢鏈烘暟鐢熸垚鍣ㄧ敓鎴愯 UUID銆�
+     * 
+     * @param isSecure 鏄惁浣跨敤{@link SecureRandom}濡傛灉鏄彲浠ヨ幏寰楁洿瀹夊叏鐨勯殢鏈虹爜锛屽惁鍒欏彲浠ュ緱鍒版洿濂界殑鎬ц兘
+     * @return 闅忔満鐢熸垚鐨� {@code UUID}
+     */
+    public static UUID randomUUID(boolean isSecure)
+    {
+        final Random ng = isSecure ? Holder.numberGenerator : getRandom();
+
+        byte[] randomBytes = new byte[16];
+        ng.nextBytes(randomBytes);
+        randomBytes[6] &= 0x0f; /* clear version */
+        randomBytes[6] |= 0x40; /* set to version 4 */
+        randomBytes[8] &= 0x3f; /* clear variant */
+        randomBytes[8] |= 0x80; /* set to IETF variant */
+        return new UUID(randomBytes);
+    }
+
+    /**
+     * 鏍规嵁鎸囧畾鐨勫瓧鑺傛暟缁勮幏鍙栫被鍨� 3锛堝熀浜庡悕绉扮殑锛塙UID 鐨勯潤鎬佸伐鍘傘��
+     *
+     * @param name 鐢ㄤ簬鏋勯�� UUID 鐨勫瓧鑺傛暟缁勩��
+     *
+     * @return 鏍规嵁鎸囧畾鏁扮粍鐢熸垚鐨� {@code UUID}
+     */
+    public static UUID nameUUIDFromBytes(byte[] name)
+    {
+        MessageDigest md;
+        try
+        {
+            md = MessageDigest.getInstance("MD5");
+        }
+        catch (NoSuchAlgorithmException nsae)
+        {
+            throw new InternalError("MD5 not supported");
+        }
+        byte[] md5Bytes = md.digest(name);
+        md5Bytes[6] &= 0x0f; /* clear version */
+        md5Bytes[6] |= 0x30; /* set to version 3 */
+        md5Bytes[8] &= 0x3f; /* clear variant */
+        md5Bytes[8] |= 0x80; /* set to IETF variant */
+        return new UUID(md5Bytes);
+    }
+
+    /**
+     * 鏍规嵁 {@link #toString()} 鏂规硶涓弿杩扮殑瀛楃涓叉爣鍑嗚〃绀哄舰寮忓垱寤簕@code UUID}銆�
+     *
+     * @param name 鎸囧畾 {@code UUID} 瀛楃涓�
+     * @return 鍏锋湁鎸囧畾鍊肩殑 {@code UUID}
+     * @throws IllegalArgumentException 濡傛灉 name 涓� {@link #toString} 涓弿杩扮殑瀛楃涓茶〃绀哄舰寮忎笉绗︽姏鍑烘寮傚父
+     *
+     */
+    public static UUID fromString(String name)
+    {
+        String[] components = name.split("-");
+        if (components.length != 5)
+        {
+            throw new IllegalArgumentException("Invalid UUID string: " + name);
+        }
+        for (int i = 0; i < 5; i++)
+        {
+            components[i] = "0x" + components[i];
+        }
+
+        long mostSigBits = Long.decode(components[0]).longValue();
+        mostSigBits <<= 16;
+        mostSigBits |= Long.decode(components[1]).longValue();
+        mostSigBits <<= 16;
+        mostSigBits |= Long.decode(components[2]).longValue();
+
+        long leastSigBits = Long.decode(components[3]).longValue();
+        leastSigBits <<= 48;
+        leastSigBits |= Long.decode(components[4]).longValue();
+
+        return new UUID(mostSigBits, leastSigBits);
+    }
+
+    /**
+     * 杩斿洖姝� UUID 鐨� 128 浣嶅�间腑鐨勬渶浣庢湁鏁� 64 浣嶃��
+     *
+     * @return 姝� UUID 鐨� 128 浣嶅�间腑鐨勬渶浣庢湁鏁� 64 浣嶃��
+     */
+    public long getLeastSignificantBits()
+    {
+        return leastSigBits;
+    }
+
+    /**
+     * 杩斿洖姝� UUID 鐨� 128 浣嶅�间腑鐨勬渶楂樻湁鏁� 64 浣嶃��
+     *
+     * @return 姝� UUID 鐨� 128 浣嶅�间腑鏈�楂樻湁鏁� 64 浣嶃��
+     */
+    public long getMostSignificantBits()
+    {
+        return mostSigBits;
+    }
+
+    /**
+     * 涓庢 {@code UUID} 鐩稿叧鑱旂殑鐗堟湰鍙�. 鐗堟湰鍙锋弿杩版 {@code UUID} 鏄浣曠敓鎴愮殑銆�
+     * <p>
+     * 鐗堟湰鍙峰叿鏈変互涓嬪惈鎰�:
+     * <ul>
+     * <li>1 鍩轰簬鏃堕棿鐨� UUID
+     * <li>2 DCE 瀹夊叏 UUID
+     * <li>3 鍩轰簬鍚嶇О鐨� UUID
+     * <li>4 闅忔満鐢熸垚鐨� UUID
+     * </ul>
+     *
+     * @return 姝� {@code UUID} 鐨勭増鏈彿
+     */
+    public int version()
+    {
+        // Version is bits masked by 0x000000000000F000 in MS long
+        return (int) ((mostSigBits >> 12) & 0x0f);
+    }
+
+    /**
+     * 涓庢 {@code UUID} 鐩稿叧鑱旂殑鍙樹綋鍙枫�傚彉浣撳彿鎻忚堪 {@code UUID} 鐨勫竷灞�銆�
+     * <p>
+     * 鍙樹綋鍙峰叿鏈変互涓嬪惈鎰忥細
+     * <ul>
+     * <li>0 涓� NCS 鍚戝悗鍏煎淇濈暀
+     * <li>2 <a href="http://www.ietf.org/rfc/rfc4122.txt">IETF&nbsp;RFC&nbsp;4122</a>(Leach-Salz), 鐢ㄤ簬姝ょ被
+     * <li>6 淇濈暀锛屽井杞悜鍚庡吋瀹�
+     * <li>7 淇濈暀渚涗互鍚庡畾涔変娇鐢�
+     * </ul>
+     *
+     * @return 姝� {@code UUID} 鐩稿叧鑱旂殑鍙樹綋鍙�
+     */
+    public int variant()
+    {
+        // This field is composed of a varying number of bits.
+        // 0 - - Reserved for NCS backward compatibility
+        // 1 0 - The IETF aka Leach-Salz variant (used by this class)
+        // 1 1 0 Reserved, Microsoft backward compatibility
+        // 1 1 1 Reserved for future definition.
+        return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));
+    }
+
+    /**
+     * 涓庢 UUID 鐩稿叧鑱旂殑鏃堕棿鎴冲�笺��
+     *
+     * <p>
+     * 60 浣嶇殑鏃堕棿鎴冲�兼牴鎹 {@code UUID} 鐨� time_low銆乼ime_mid 鍜� time_hi 瀛楁鏋勯�犮��<br>
+     * 鎵�寰楀埌鐨勬椂闂存埑浠� 100 姣井绉掍负鍗曚綅锛屼粠 UTC锛堥�氱敤鍗忚皟鏃堕棿锛� 1582 骞� 10 鏈� 15 鏃ラ浂鏃跺紑濮嬨��
+     *
+     * <p>
+     * 鏃堕棿鎴冲�间粎鍦ㄥ湪鍩轰簬鏃堕棿鐨� UUID锛堝叾 version 绫诲瀷涓� 1锛変腑鎵嶆湁鎰忎箟銆�<br>
+     * 濡傛灉姝� {@code UUID} 涓嶆槸鍩轰簬鏃堕棿鐨� UUID锛屽垯姝ゆ柟娉曟姏鍑� UnsupportedOperationException銆�
+     *
+     * @throws UnsupportedOperationException 濡傛灉姝� {@code UUID} 涓嶆槸 version 涓� 1 鐨� UUID銆�
+     */
+    public long timestamp() throws UnsupportedOperationException
+    {
+        checkTimeBase();
+        return (mostSigBits & 0x0FFFL) << 48//
+                | ((mostSigBits >> 16) & 0x0FFFFL) << 32//
+                | mostSigBits >>> 32;
+    }
+
+    /**
+     * 涓庢 UUID 鐩稿叧鑱旂殑鏃堕挓搴忓垪鍊笺��
+     *
+     * <p>
+     * 14 浣嶇殑鏃堕挓搴忓垪鍊兼牴鎹 UUID 鐨� clock_seq 瀛楁鏋勯�犮�俢lock_seq 瀛楁鐢ㄤ簬淇濊瘉鍦ㄥ熀浜庢椂闂寸殑 UUID 涓殑鏃堕棿鍞竴鎬с��
+     * <p>
+     * {@code clockSequence} 鍊间粎鍦ㄥ熀浜庢椂闂寸殑 UUID锛堝叾 version 绫诲瀷涓� 1锛変腑鎵嶆湁鎰忎箟銆� 濡傛灉姝� UUID 涓嶆槸鍩轰簬鏃堕棿鐨� UUID锛屽垯姝ゆ柟娉曟姏鍑�
+     * UnsupportedOperationException銆�
+     *
+     * @return 姝� {@code UUID} 鐨勬椂閽熷簭鍒�
+     *
+     * @throws UnsupportedOperationException 濡傛灉姝� UUID 鐨� version 涓嶄负 1
+     */
+    public int clockSequence() throws UnsupportedOperationException
+    {
+        checkTimeBase();
+        return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);
+    }
+
+    /**
+     * 涓庢 UUID 鐩稿叧鐨勮妭鐐瑰�笺��
+     *
+     * <p>
+     * 48 浣嶇殑鑺傜偣鍊兼牴鎹 UUID 鐨� node 瀛楁鏋勯�犮�傛瀛楁鏃ㄥ湪鐢ㄤ簬淇濆瓨鏈哄櫒鐨� IEEE 802 鍦板潃锛岃鍦板潃鐢ㄤ簬鐢熸垚姝� UUID 浠ヤ繚璇佺┖闂村敮涓�鎬с��
+     * <p>
+     * 鑺傜偣鍊间粎鍦ㄥ熀浜庢椂闂寸殑 UUID锛堝叾 version 绫诲瀷涓� 1锛変腑鎵嶆湁鎰忎箟銆�<br>
+     * 濡傛灉姝� UUID 涓嶆槸鍩轰簬鏃堕棿鐨� UUID锛屽垯姝ゆ柟娉曟姏鍑� UnsupportedOperationException銆�
+     *
+     * @return 姝� {@code UUID} 鐨勮妭鐐瑰��
+     *
+     * @throws UnsupportedOperationException 濡傛灉姝� UUID 鐨� version 涓嶄负 1
+     */
+    public long node() throws UnsupportedOperationException
+    {
+        checkTimeBase();
+        return leastSigBits & 0x0000FFFFFFFFFFFFL;
+    }
+
+    /**
+     * 杩斿洖姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡銆�
+     *
+     * <p>
+     * UUID 鐨勫瓧绗︿覆琛ㄧず褰㈠紡鐢辨 BNF 鎻忚堪锛�
+     * 
+     * <pre>
+     * {@code
+     * UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
+     * time_low               = 4*<hexOctet>
+     * time_mid               = 2*<hexOctet>
+     * time_high_and_version  = 2*<hexOctet>
+     * variant_and_sequence   = 2*<hexOctet>
+     * node                   = 6*<hexOctet>
+     * hexOctet               = <hexDigit><hexDigit>
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * </pre>
+     * 
+     * </blockquote>
+     *
+     * @return 姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡
+     * @see #toString(boolean)
+     */
+    @Override
+    public String toString()
+    {
+        return toString(false);
+    }
+
+    /**
+     * 杩斿洖姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡銆�
+     *
+     * <p>
+     * UUID 鐨勫瓧绗︿覆琛ㄧず褰㈠紡鐢辨 BNF 鎻忚堪锛�
+     * 
+     * <pre>
+     * {@code
+     * UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
+     * time_low               = 4*<hexOctet>
+     * time_mid               = 2*<hexOctet>
+     * time_high_and_version  = 2*<hexOctet>
+     * variant_and_sequence   = 2*<hexOctet>
+     * node                   = 6*<hexOctet>
+     * hexOctet               = <hexDigit><hexDigit>
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * </pre>
+     * 
+     * </blockquote>
+     *
+     * @param isSimple 鏄惁绠�鍗曟ā寮忥紝绠�鍗曟ā寮忎负涓嶅甫'-'鐨刄UID瀛楃涓�
+     * @return 姝@code UUID} 鐨勫瓧绗︿覆琛ㄧ幇褰㈠紡
+     */
+    public String toString(boolean isSimple)
+    {
+        final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36);
+        // time_low
+        builder.append(digits(mostSigBits >> 32, 8));
+        if (false == isSimple)
+        {
+            builder.append('-');
+        }
+        // time_mid
+        builder.append(digits(mostSigBits >> 16, 4));
+        if (false == isSimple)
+        {
+            builder.append('-');
+        }
+        // time_high_and_version
+        builder.append(digits(mostSigBits, 4));
+        if (false == isSimple)
+        {
+            builder.append('-');
+        }
+        // variant_and_sequence
+        builder.append(digits(leastSigBits >> 48, 4));
+        if (false == isSimple)
+        {
+            builder.append('-');
+        }
+        // node
+        builder.append(digits(leastSigBits, 12));
+
+        return builder.toString();
+    }
+
+    /**
+     * 杩斿洖姝� UUID 鐨勫搱甯岀爜銆�
+     *
+     * @return UUID 鐨勫搱甯岀爜鍊笺��
+     */
+    public int hashCode()
+    {
+        long hilo = mostSigBits ^ leastSigBits;
+        return ((int) (hilo >> 32)) ^ (int) hilo;
+    }
+
+    /**
+     * 灏嗘瀵硅薄涓庢寚瀹氬璞℃瘮杈冦��
+     * <p>
+     * 褰撲笖浠呭綋鍙傛暟涓嶄负 {@code null}銆佽�屾槸涓�涓� UUID 瀵硅薄銆佸叿鏈変笌姝� UUID 鐩稿悓鐨� varriant銆佸寘鍚浉鍚岀殑鍊硷紙姣忎竴浣嶅潎鐩稿悓锛夋椂锛岀粨鏋滄墠涓� {@code true}銆�
+     *
+     * @param obj 瑕佷笌涔嬫瘮杈冪殑瀵硅薄
+     *
+     * @return 濡傛灉瀵硅薄鐩稿悓锛屽垯杩斿洖 {@code true}锛涘惁鍒欒繑鍥� {@code false}
+     */
+    public boolean equals(Object obj)
+    {
+        if ((null == obj) || (obj.getClass() != UUID.class))
+        {
+            return false;
+        }
+        UUID id = (UUID) obj;
+        return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);
+    }
+
+    // Comparison Operations
+
+    /**
+     * 灏嗘 UUID 涓庢寚瀹氱殑 UUID 姣旇緝銆�
+     *
+     * <p>
+     * 濡傛灉涓や釜 UUID 涓嶅悓锛屼笖绗竴涓� UUID 鐨勬渶楂樻湁鏁堝瓧娈靛ぇ浜庣浜屼釜 UUID 鐨勫搴斿瓧娈碉紝鍒欑涓�涓� UUID 澶т簬绗簩涓� UUID銆�
+     *
+     * @param val 涓庢 UUID 姣旇緝鐨� UUID
+     *
+     * @return 鍦ㄦ UUID 灏忎簬銆佺瓑浜庢垨澶т簬 val 鏃讹紝鍒嗗埆杩斿洖 -1銆�0 鎴� 1銆�
+     *
+     */
+    public int compareTo(UUID val)
+    {
+        // The ordering is intentionally set up so that the UUIDs
+        // can simply be numerically compared as two numbers
+        return (this.mostSigBits < val.mostSigBits ? -1 : //
+                (this.mostSigBits > val.mostSigBits ? 1 : //
+                        (this.leastSigBits < val.leastSigBits ? -1 : //
+                                (this.leastSigBits > val.leastSigBits ? 1 : //
+                                        0))));
+    }
+
+    // -------------------------------------------------------------------------------------------------------------------
+    // Private method start
+    /**
+     * 杩斿洖鎸囧畾鏁板瓧瀵瑰簲鐨刪ex鍊�
+     * 
+     * @param val 鍊�
+     * @param digits 浣�
+     * @return 鍊�
+     */
+    private static String digits(long val, int digits)
+    {
+        long hi = 1L << (digits * 4);
+        return Long.toHexString(hi | (val & (hi - 1))).substring(1);
+    }
+
+    /**
+     * 妫�鏌ユ槸鍚︿负time-based鐗堟湰UUID
+     */
+    private void checkTimeBase()
+    {
+        if (version() != 1)
+        {
+            throw new UnsupportedOperationException("Not a time-based UUID");
+        }
+    }
+
+    /**
+     * 鑾峰彇{@link SecureRandom}锛岀被鎻愪緵鍔犲瘑鐨勫己闅忔満鏁扮敓鎴愬櫒 (RNG)
+     * 
+     * @return {@link SecureRandom}
+     */
+    public static SecureRandom getSecureRandom()
+    {
+        try
+        {
+            return SecureRandom.getInstance("SHA1PRNG");
+        }
+        catch (NoSuchAlgorithmException e)
+        {
+            throw new UtilException(e);
+        }
+    }
+
+    /**
+     * 鑾峰彇闅忔満鏁扮敓鎴愬櫒瀵硅薄<br>
+     * ThreadLocalRandom鏄疛DK 7涔嬪悗鎻愪緵骞跺彂浜х敓闅忔満鏁帮紝鑳藉瑙e喅澶氫釜绾跨▼鍙戠敓鐨勭珵浜変簤澶恒��
+     * 
+     * @return {@link ThreadLocalRandom}
+     */
+    public static ThreadLocalRandom getRandom()
+    {
+        return ThreadLocalRandom.current();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/core/text/CharsetKit.java b/basic/src/main/java/com/dingzhuo/energy/common/core/text/CharsetKit.java
new file mode 100644
index 0000000..d5245ba
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/core/text/CharsetKit.java
@@ -0,0 +1,88 @@
+package com.dingzhuo.energy.common.core.text;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 瀛楃闆嗗伐鍏风被
+ * 
+ * @author ruoyi
+ */
+public class CharsetKit
+{
+    /** ISO-8859-1 */
+    public static final String ISO_8859_1 = "ISO-8859-1";
+    /** UTF-8 */
+    public static final String UTF_8 = "UTF-8";
+    /** GBK */
+    public static final String GBK = "GBK";
+
+    /** ISO-8859-1 */
+    public static final Charset CHARSET_ISO_8859_1 = StandardCharsets.ISO_8859_1;
+    /** UTF-8 */
+    public static final Charset CHARSET_UTF_8 = StandardCharsets.UTF_8;
+    /** GBK */
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
+
+    /**
+     * 杞崲涓篊harset瀵硅薄
+     * 
+     * @param charset 瀛楃闆嗭紝涓虹┖鍒欒繑鍥為粯璁ゅ瓧绗﹂泦
+     * @return Charset
+     */
+    public static Charset charset(String charset)
+    {
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
+    }
+
+    /**
+     * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮�
+     * 
+     * @param source 瀛楃涓�
+     * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1
+     * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8
+     * @return 杞崲鍚庣殑瀛楃闆�
+     */
+    public static String convert(String source, String srcCharset, String destCharset)
+    {
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
+    }
+
+    /**
+     * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮�
+     * 
+     * @param source 瀛楃涓�
+     * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1
+     * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8
+     * @return 杞崲鍚庣殑瀛楃闆�
+     */
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
+    {
+        if (null == srcCharset)
+        {
+            srcCharset = StandardCharsets.ISO_8859_1;
+        }
+
+        if (null == destCharset)
+        {
+            srcCharset = StandardCharsets.UTF_8;
+        }
+
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
+        {
+            return source;
+        }
+        return new String(source.getBytes(srcCharset), destCharset);
+    }
+
+    /**
+     * @return 绯荤粺瀛楃闆嗙紪鐮�
+     */
+    public static String systemCharset()
+    {
+        return Charset.defaultCharset().name();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/core/text/Convert.java b/basic/src/main/java/com/dingzhuo/energy/common/core/text/Convert.java
new file mode 100644
index 0000000..8bab4f7
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/core/text/Convert.java
@@ -0,0 +1,1001 @@
+package com.dingzhuo.energy.common.core.text;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.text.NumberFormat;
+import java.util.Set;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 绫诲瀷杞崲鍣�
+ * 
+ * @author ruoyi
+ */
+public class Convert
+{
+    /**
+     * 杞崲涓哄瓧绗︿覆<br>
+     * 濡傛灉缁欏畾鐨勫�间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static String toStr(Object value, String defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof String)
+        {
+            return (String) value;
+        }
+        return value.toString();
+    }
+
+    /**
+     * 杞崲涓哄瓧绗︿覆<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static String toStr(Object value)
+    {
+        return toStr(value, null);
+    }
+
+    /**
+     * 杞崲涓哄瓧绗�<br>
+     * 濡傛灉缁欏畾鐨勫�间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Character toChar(Object value, Character defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Character)
+        {
+            return (Character) value;
+        }
+
+        final String valueStr = toStr(value, null);
+        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+    }
+
+    /**
+     * 杞崲涓哄瓧绗�<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Character toChar(Object value)
+    {
+        return toChar(value, null);
+    }
+
+    /**
+     * 杞崲涓篵yte<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Byte toByte(Object value, Byte defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Byte)
+        {
+            return (Byte) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).byteValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Byte.parseByte(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篵yte<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Byte toByte(Object value)
+    {
+        return toByte(value, null);
+    }
+
+    /**
+     * 杞崲涓篠hort<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Short toShort(Object value, Short defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Short)
+        {
+            return (Short) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).shortValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Short.parseShort(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篠hort<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Short toShort(Object value)
+    {
+        return toShort(value, null);
+    }
+
+    /**
+     * 杞崲涓篘umber<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Number toNumber(Object value, Number defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Number)
+        {
+            return (Number) value;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return NumberFormat.getInstance().parse(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篘umber<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Number toNumber(Object value)
+    {
+        return toNumber(value, null);
+    }
+
+    /**
+     * 杞崲涓篿nt<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Integer toInt(Object value, Integer defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Integer)
+        {
+            return (Integer) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).intValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Integer.parseInt(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篿nt<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Integer toInt(Object value)
+    {
+        return toInt(value, null);
+    }
+
+    /**
+     * 杞崲涓篒nteger鏁扮粍<br>
+     * 
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Integer[] toIntArray(String str)
+    {
+        return toIntArray(",", str);
+    }
+
+    /**
+     * 杞崲涓篖ong鏁扮粍<br>
+     * 
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Long[] toLongArray(String str)
+    {
+        return toLongArray(",", str);
+    }
+
+    /**
+     * 杞崲涓篒nteger鏁扮粍<br>
+     * 
+     * @param split 鍒嗛殧绗�
+     * @param split 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Integer[] toIntArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Integer[] {};
+        }
+        String[] arr = str.split(split);
+        final Integer[] ints = new Integer[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Integer v = toInt(arr[i], 0);
+            ints[i] = v;
+        }
+        return ints;
+    }
+
+    /**
+     * 杞崲涓篖ong鏁扮粍<br>
+     * 
+     * @param split 鍒嗛殧绗�
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Long[] toLongArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Long[] {};
+        }
+        String[] arr = str.split(split);
+        final Long[] longs = new Long[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Long v = toLong(arr[i], null);
+            longs[i] = v;
+        }
+        return longs;
+    }
+
+    /**
+     * 杞崲涓篠tring鏁扮粍<br>
+     * 
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static String[] toStrArray(String str)
+    {
+        return toStrArray(",", str);
+    }
+
+    /**
+     * 杞崲涓篠tring鏁扮粍<br>
+     * 
+     * @param split 鍒嗛殧绗�
+     * @param split 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static String[] toStrArray(String split, String str)
+    {
+        return str.split(split);
+    }
+
+    /**
+     * 杞崲涓簂ong<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Long toLong(Object value, Long defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Long)
+        {
+            return (Long) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).longValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 鏀寔绉戝璁℃暟娉�
+            return new BigDecimal(valueStr.trim()).longValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓簂ong<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Long toLong(Object value)
+    {
+        return toLong(value, null);
+    }
+
+    /**
+     * 杞崲涓篸ouble<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Double toDouble(Object value, Double defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Double)
+        {
+            return (Double) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).doubleValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 鏀寔绉戝璁℃暟娉�
+            return new BigDecimal(valueStr.trim()).doubleValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篸ouble<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Double toDouble(Object value)
+    {
+        return toDouble(value, null);
+    }
+
+    /**
+     * 杞崲涓篎loat<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Float toFloat(Object value, Float defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Float)
+        {
+            return (Float) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).floatValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Float.parseFloat(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篎loat<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Float toFloat(Object value)
+    {
+        return toFloat(value, null);
+    }
+
+    /**
+     * 杞崲涓篵oolean<br>
+     * String鏀寔鐨勫�间负锛歵rue銆乫alse銆亂es銆乷k銆乶o锛�1,0 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Boolean toBool(Object value, Boolean defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Boolean)
+        {
+            return (Boolean) value;
+        }
+        String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        valueStr = valueStr.trim().toLowerCase();
+        switch (valueStr)
+        {
+            case "true":
+                return true;
+            case "false":
+                return false;
+            case "yes":
+                return true;
+            case "ok":
+                return true;
+            case "no":
+                return false;
+            case "1":
+                return true;
+            case "0":
+                return false;
+            default:
+                return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篵oolean<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Boolean toBool(Object value)
+    {
+        return toBool(value, null);
+    }
+
+    /**
+     * 杞崲涓篍num瀵硅薄<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 
+     * @param clazz Enum鐨凜lass
+     * @param value 鍊�
+     * @param defaultValue 榛樿鍊�
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (clazz.isAssignableFrom(value.getClass()))
+        {
+            @SuppressWarnings("unchecked")
+            E myE = (E) value;
+            return myE;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Enum.valueOf(clazz, valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篍num瀵硅薄<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 
+     * @param clazz Enum鐨凜lass
+     * @param value 鍊�
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
+    {
+        return toEnum(clazz, value, null);
+    }
+
+    /**
+     * 杞崲涓築igInteger<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigInteger)
+        {
+            return (BigInteger) value;
+        }
+        if (value instanceof Long)
+        {
+            return BigInteger.valueOf((Long) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigInteger(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓築igInteger<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static BigInteger toBigInteger(Object value)
+    {
+        return toBigInteger(value, null);
+    }
+
+    /**
+     * 杞崲涓築igDecimal<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal)
+        {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Long)
+        {
+            return new BigDecimal((Long) value);
+        }
+        if (value instanceof Double)
+        {
+            return new BigDecimal((Double) value);
+        }
+        if (value instanceof Integer)
+        {
+            return new BigDecimal((Integer) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigDecimal(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓築igDecimal<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static BigDecimal toBigDecimal(Object value)
+    {
+        return toBigDecimal(value, null);
+    }
+
+    /**
+     * 灏嗗璞¤浆涓哄瓧绗︿覆<br>
+     * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁� 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶
+     * 
+     * @param obj 瀵硅薄
+     * @return 瀛楃涓�
+     */
+    public static String utf8Str(Object obj)
+    {
+        return str(obj, CharsetKit.CHARSET_UTF_8);
+    }
+
+    /**
+     * 灏嗗璞¤浆涓哄瓧绗︿覆<br>
+     * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁� 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶
+     * 
+     * @param obj 瀵硅薄
+     * @param charsetName 瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(Object obj, String charsetName)
+    {
+        return str(obj, Charset.forName(charsetName));
+    }
+
+    /**
+     * 灏嗗璞¤浆涓哄瓧绗︿覆<br>
+     * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁� 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶
+     * 
+     * @param obj 瀵硅薄
+     * @param charset 瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(Object obj, Charset charset)
+    {
+        if (null == obj)
+        {
+            return null;
+        }
+
+        if (obj instanceof String)
+        {
+            return (String) obj;
+        }
+        else if (obj instanceof byte[] || obj instanceof Byte[])
+        {
+            return str(obj, charset);
+        }
+        else if (obj instanceof ByteBuffer)
+        {
+            return str((ByteBuffer) obj, charset);
+        }
+        return obj.toString();
+    }
+
+    /**
+     * 灏哹yte鏁扮粍杞负瀛楃涓�
+     * 
+     * @param bytes byte鏁扮粍
+     * @param charset 瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(byte[] bytes, String charset)
+    {
+        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * 瑙g爜瀛楄妭鐮�
+     * 
+     * @param data 瀛楃涓�
+     * @param charset 瀛楃闆嗭紝濡傛灉姝ゅ瓧娈典负绌猴紝鍒欒В鐮佺殑缁撴灉鍙栧喅浜庡钩鍙�
+     * @return 瑙g爜鍚庣殑瀛楃涓�
+     */
+    public static String str(byte[] data, Charset charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        if (null == charset)
+        {
+            return new String(data);
+        }
+        return new String(data, charset);
+    }
+
+    /**
+     * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆
+     * 
+     * @param data 鏁版嵁
+     * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(ByteBuffer data, String charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        return str(data, Charset.forName(charset));
+    }
+
+    /**
+     * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆
+     * 
+     * @param data 鏁版嵁
+     * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(ByteBuffer data, Charset charset)
+    {
+        if (null == charset)
+        {
+            charset = Charset.defaultCharset();
+        }
+        return charset.decode(data).toString();
+    }
+
+    // ----------------------------------------------------------------------- 鍏ㄨ鍗婅杞崲
+    /**
+     * 鍗婅杞叏瑙�
+     * 
+     * @param input String.
+     * @return 鍏ㄨ瀛楃涓�.
+     */
+    public static String toSBC(String input)
+    {
+        return toSBC(input, null);
+    }
+
+    /**
+     * 鍗婅杞叏瑙�
+     * 
+     * @param input String
+     * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎
+     * @return 鍏ㄨ瀛楃涓�.
+     */
+    public static String toSBC(String input, Set<Character> notConvertSet)
+    {
+        char[] c = input.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 璺宠繃涓嶆浛鎹㈢殑瀛楃
+                continue;
+            }
+
+            if (c[i] == ' ')
+            {
+                c[i] = '\u3000';
+            }
+            else if (c[i] < '\177')
+            {
+                c[i] = (char) (c[i] + 65248);
+
+            }
+        }
+        return new String(c);
+    }
+
+    /**
+     * 鍏ㄨ杞崐瑙�
+     * 
+     * @param input String.
+     * @return 鍗婅瀛楃涓�
+     */
+    public static String toDBC(String input)
+    {
+        return toDBC(input, null);
+    }
+
+    /**
+     * 鏇挎崲鍏ㄨ涓哄崐瑙�
+     * 
+     * @param text 鏂囨湰
+     * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎
+     * @return 鏇挎崲鍚庣殑瀛楃
+     */
+    public static String toDBC(String text, Set<Character> notConvertSet)
+    {
+        char[] c = text.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 璺宠繃涓嶆浛鎹㈢殑瀛楃
+                continue;
+            }
+
+            if (c[i] == '\u3000')
+            {
+                c[i] = ' ';
+            }
+            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
+            {
+                c[i] = (char) (c[i] - 65248);
+            }
+        }
+        String returnString = new String(c);
+
+        return returnString;
+    }
+
+    /**
+     * 鏁板瓧閲戦澶у啓杞崲 鍏堝啓涓畬鏁寸殑鐒跺悗灏嗗闆舵嬀鏇挎崲鎴愰浂
+     * 
+     * @param n 鏁板瓧
+     * @return 涓枃澶у啓鏁板瓧
+     */
+    public static String digitUppercase(double n)
+    {
+        String[] fraction = { "瑙�", "鍒�" };
+        String[] digit = { "闆�", "澹�", "璐�", "鍙�", "鑲�", "浼�", "闄�", "鏌�", "鎹�", "鐜�" };
+        String[][] unit = { { "鍏�", "涓�", "浜�" }, { "", "鎷�", "浣�", "浠�" } };
+
+        String head = n < 0 ? "璐�" : "";
+        n = Math.abs(n);
+
+        String s = "";
+        for (int i = 0; i < fraction.length; i++)
+        {
+            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(闆�.)+", "");
+        }
+        if (s.length() < 1)
+        {
+            s = "鏁�";
+        }
+        int integerPart = (int) Math.floor(n);
+
+        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
+        {
+            String p = "";
+            for (int j = 0; j < unit[1].length && n > 0; j++)
+            {
+                p = digit[integerPart % 10] + unit[1][j] + p;
+                integerPart = integerPart / 10;
+            }
+            s = p.replaceAll("(闆�.)*闆�$", "").replaceAll("^$", "闆�") + unit[0][i] + s;
+        }
+        return head + s.replaceAll("(闆�.)*闆跺厓", "鍏�").replaceFirst("(闆�.)+", "").replaceAll("(闆�.)+", "闆�").replaceAll("^鏁�$", "闆跺厓鏁�");
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/core/text/StrFormatter.java b/basic/src/main/java/com/dingzhuo/energy/common/core/text/StrFormatter.java
new file mode 100644
index 0000000..f000543
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/core/text/StrFormatter.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.common.core.text;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 瀛楃涓叉牸寮忓寲
+ * 
+ * @author ruoyi
+ */
+public class StrFormatter
+{
+    public static final String EMPTY_JSON = "{}";
+    public static final char C_BACKSLASH = '\\';
+    public static final char C_DELIM_START = '{';
+    public static final char C_DELIM_END = '}';
+
+    /**
+     * 鏍煎紡鍖栧瓧绗︿覆<br>
+     * 姝ゆ柟娉曞彧鏄畝鍗曞皢鍗犱綅绗� {} 鎸夌収椤哄簭鏇挎崲涓哄弬鏁�<br>
+     * 濡傛灉鎯宠緭鍑� {} 浣跨敤 \\杞箟 { 鍗冲彲锛屽鏋滄兂杈撳嚭 {} 涔嬪墠鐨� \ 浣跨敤鍙岃浆涔夌 \\\\ 鍗冲彲<br>
+     * 渚嬶細<br>
+     * 閫氬父浣跨敤锛歠ormat("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 杞箟{}锛� format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 杞箟\锛� format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param strPattern 瀛楃涓叉ā鏉�
+     * @param argArray 鍙傛暟鍒楄〃
+     * @return 缁撴灉
+     */
+    public static String format(final String strPattern, final Object... argArray)
+    {
+        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
+        {
+            return strPattern;
+        }
+        final int strPatternLength = strPattern.length();
+
+        // 鍒濆鍖栧畾涔夊ソ鐨勯暱搴︿互鑾峰緱鏇村ソ鐨勬�ц兘
+        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
+
+        int handledPosition = 0;
+        int delimIndex;// 鍗犱綅绗︽墍鍦ㄤ綅缃�
+        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
+        {
+            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
+            if (delimIndex == -1)
+            {
+                if (handledPosition == 0)
+                {
+                    return strPattern;
+                }
+                else
+                { // 瀛楃涓叉ā鏉垮墿浣欓儴鍒嗕笉鍐嶅寘鍚崰浣嶇锛屽姞鍏ュ墿浣欓儴鍒嗗悗杩斿洖缁撴灉
+                    sbuf.append(strPattern, handledPosition, strPatternLength);
+                    return sbuf.toString();
+                }
+            }
+            else
+            {
+                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
+                {
+                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
+                    {
+                        // 杞箟绗︿箣鍓嶈繕鏈変竴涓浆涔夌锛屽崰浣嶇渚濇棫鏈夋晥
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                        handledPosition = delimIndex + 2;
+                    }
+                    else
+                    {
+                        // 鍗犱綅绗﹁杞箟
+                        argIndex--;
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(C_DELIM_START);
+                        handledPosition = delimIndex + 1;
+                    }
+                }
+                else
+                {
+                    // 姝e父鍗犱綅绗�
+                    sbuf.append(strPattern, handledPosition, delimIndex);
+                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                    handledPosition = delimIndex + 2;
+                }
+            }
+        }
+        // 鍔犲叆鏈�鍚庝竴涓崰浣嶇鍚庢墍鏈夌殑瀛楃
+        sbuf.append(strPattern, handledPosition, strPattern.length());
+
+        return sbuf.toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/enums/HttpMethod.java b/basic/src/main/java/com/dingzhuo/energy/common/enums/HttpMethod.java
new file mode 100644
index 0000000..63a6c6a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/enums/HttpMethod.java
@@ -0,0 +1,36 @@
+package com.dingzhuo.energy.common.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.springframework.lang.Nullable;
+
+/**
+ * 璇锋眰鏂瑰紡
+ *
+ * @author ruoyi
+ */
+public enum HttpMethod
+{
+    GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
+
+    private static final Map<String, HttpMethod> mappings = new HashMap<>(16);
+
+    static
+    {
+        for (HttpMethod httpMethod : values())
+        {
+            mappings.put(httpMethod.name(), httpMethod);
+        }
+    }
+
+    @Nullable
+    public static HttpMethod resolve(@Nullable String method)
+    {
+        return (method != null ? mappings.get(method) : null);
+    }
+
+    public boolean matches(String method)
+    {
+        return (this == resolve(method));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/enums/UserStatus.java b/basic/src/main/java/com/dingzhuo/energy/common/enums/UserStatus.java
new file mode 100644
index 0000000..3d9592c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/enums/UserStatus.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.common.enums;
+
+/**
+ * 鐢ㄦ埛鐘舵��
+ * 
+ * @author ruoyi
+ */
+public enum UserStatus
+{
+    OK("0", "姝e父"), DISABLE("1", "鍋滅敤"), DELETED("2", "鍒犻櫎");
+
+    private final String code;
+    private final String info;
+
+    UserStatus(String code, String info)
+    {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/BaseException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/BaseException.java
new file mode 100644
index 0000000..558a806
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/BaseException.java
@@ -0,0 +1,97 @@
+package com.dingzhuo.energy.common.exception;
+
+import com.dingzhuo.energy.common.utils.MessageUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 鍩虹寮傚父
+ * 
+ * @author ruoyi
+ */
+public class BaseException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎵�灞炴ā鍧�
+     */
+    private String module;
+
+    /**
+     * 閿欒鐮�
+     */
+    private String code;
+
+    /**
+     * 閿欒鐮佸搴旂殑鍙傛暟
+     */
+    private Object[] args;
+
+    /**
+     * 閿欒娑堟伅
+     */
+    private String defaultMessage;
+
+    public BaseException(String module, String code, Object[] args, String defaultMessage)
+    {
+        this.module = module;
+        this.code = code;
+        this.args = args;
+        this.defaultMessage = defaultMessage;
+    }
+
+    public BaseException(String module, String code, Object[] args)
+    {
+        this(module, code, args, null);
+    }
+
+    public BaseException(String module, String defaultMessage)
+    {
+        this(module, null, null, defaultMessage);
+    }
+
+    public BaseException(String code, Object[] args)
+    {
+        this(null, code, args, null);
+    }
+
+    public BaseException(String defaultMessage)
+    {
+        this(null, null, null, defaultMessage);
+    }
+
+    @Override
+    public String getMessage()
+    {
+        String message = null;
+        if (!StringUtils.isEmpty(code))
+        {
+            message = MessageUtils.message(code, args);
+        }
+        if (message == null)
+        {
+            message = defaultMessage;
+        }
+        return message;
+    }
+
+    public String getModule()
+    {
+        return module;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+
+    public Object[] getArgs()
+    {
+        return args;
+    }
+
+    public String getDefaultMessage()
+    {
+        return defaultMessage;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/CustomException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/CustomException.java
new file mode 100644
index 0000000..b71891f
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/CustomException.java
@@ -0,0 +1,43 @@
+package com.dingzhuo.energy.common.exception;
+
+/**
+ * 鑷畾涔夊紓甯�
+ * 
+ * @author ruoyi
+ */
+public class CustomException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    private Integer code;
+
+    private String message;
+
+    public CustomException(String message)
+    {
+        this.message = message;
+    }
+
+    public CustomException(String message, Integer code)
+    {
+        this.message = message;
+        this.code = code;
+    }
+
+    public CustomException(String message, Throwable e)
+    {
+        super(message, e);
+        this.message = message;
+    }
+
+    @Override
+    public String getMessage()
+    {
+        return message;
+    }
+
+    public Integer getCode()
+    {
+        return code;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/DemoModeException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/DemoModeException.java
new file mode 100644
index 0000000..f85c9e2
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/DemoModeException.java
@@ -0,0 +1,15 @@
+package com.dingzhuo.energy.common.exception;
+
+/**
+ * 婕旂ず妯″紡寮傚父
+ * 
+ * @author ruoyi
+ */
+public class DemoModeException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+
+    public DemoModeException()
+    {
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/UtilException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/UtilException.java
new file mode 100644
index 0000000..f23460c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/UtilException.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.common.exception;
+
+/**
+ * 宸ュ叿绫诲紓甯�
+ * 
+ * @author ruoyi
+ */
+public class UtilException extends RuntimeException
+{
+    private static final long serialVersionUID = 8247610319171014183L;
+
+    public UtilException(Throwable e)
+    {
+        super(e.getMessage(), e);
+    }
+
+    public UtilException(String message)
+    {
+        super(message);
+    }
+
+    public UtilException(String message, Throwable throwable)
+    {
+        super(message, throwable);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileException.java
new file mode 100644
index 0000000..36b27a2
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileException.java
@@ -0,0 +1,19 @@
+package com.dingzhuo.energy.common.exception.file;
+
+import com.dingzhuo.energy.common.exception.BaseException;
+
+/**
+ * 鏂囦欢淇℃伅寮傚父绫�
+ * 
+ * @author ruoyi
+ */
+public class FileException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileException(String code, Object[] args)
+    {
+        super("file", code, args, null);
+    }
+
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileNameLengthLimitExceededException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileNameLengthLimitExceededException.java
new file mode 100644
index 0000000..421b9e3
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileNameLengthLimitExceededException.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.energy.common.exception.file;
+
+/**
+ * 鏂囦欢鍚嶇О瓒呴暱闄愬埗寮傚父绫�
+ * 
+ * @author ruoyi
+ */
+public class FileNameLengthLimitExceededException extends FileException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileNameLengthLimitExceededException(int defaultFileNameLength)
+    {
+        super("upload.filename.exceed.length", new Object[] { defaultFileNameLength });
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileSizeLimitExceededException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileSizeLimitExceededException.java
new file mode 100644
index 0000000..1b064d4
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/FileSizeLimitExceededException.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.energy.common.exception.file;
+
+/**
+ * 鏂囦欢鍚嶅ぇ灏忛檺鍒跺紓甯哥被
+ * 
+ * @author ruoyi
+ */
+public class FileSizeLimitExceededException extends FileException
+{
+    private static final long serialVersionUID = 1L;
+
+    public FileSizeLimitExceededException(long defaultMaxSize)
+    {
+        super("upload.exceed.maxSize", new Object[] { defaultMaxSize });
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/file/InvalidExtensionException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/InvalidExtensionException.java
new file mode 100644
index 0000000..978013f
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/file/InvalidExtensionException.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.common.exception.file;
+
+import java.util.Arrays;
+import org.apache.commons.fileupload.FileUploadException;
+
+/**
+ * 鏂囦欢涓婁紶 璇紓甯哥被
+ * 
+ * @author ruoyi
+ */
+public class InvalidExtensionException extends FileUploadException
+{
+    private static final long serialVersionUID = 1L;
+
+    private String[] allowedExtension;
+    private String extension;
+    private String filename;
+
+    public InvalidExtensionException(String[] allowedExtension, String extension, String filename)
+    {
+        super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");
+        this.allowedExtension = allowedExtension;
+        this.extension = extension;
+        this.filename = filename;
+    }
+
+    public String[] getAllowedExtension()
+    {
+        return allowedExtension;
+    }
+
+    public String getExtension()
+    {
+        return extension;
+    }
+
+    public String getFilename()
+    {
+        return filename;
+    }
+
+    public static class InvalidImageExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidFlashExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+
+    public static class InvalidMediaExtensionException extends InvalidExtensionException
+    {
+        private static final long serialVersionUID = 1L;
+
+        public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename)
+        {
+            super(allowedExtension, extension, filename);
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaException.java
new file mode 100644
index 0000000..220aedb
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaException.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.energy.common.exception.user;
+
+/**
+ * 楠岃瘉鐮侀敊璇紓甯哥被
+ * 
+ * @author ruoyi
+ */
+public class CaptchaException extends UserException
+{
+    private static final long serialVersionUID = 1L;
+
+    public CaptchaException()
+    {
+        super("user.jcaptcha.error", null);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaExpireException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaExpireException.java
new file mode 100644
index 0000000..58eb77c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/CaptchaExpireException.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.energy.common.exception.user;
+
+/**
+ * 楠岃瘉鐮佸け鏁堝紓甯哥被
+ * 
+ * @author ruoyi
+ */
+public class CaptchaExpireException extends UserException
+{
+    private static final long serialVersionUID = 1L;
+
+    public CaptchaExpireException()
+    {
+        super("user.jcaptcha.expire", null);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserException.java
new file mode 100644
index 0000000..db4dc73
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserException.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.common.exception.user;
+
+import com.dingzhuo.energy.common.exception.BaseException;
+
+/**
+ * 鐢ㄦ埛淇℃伅寮傚父绫�
+ * 
+ * @author ruoyi
+ */
+public class UserException extends BaseException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserException(String code, Object[] args)
+    {
+        super("user", code, args, null);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserPasswordNotMatchException.java b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserPasswordNotMatchException.java
new file mode 100644
index 0000000..c1e4499
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/exception/user/UserPasswordNotMatchException.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.energy.common.exception.user;
+
+/**
+ * 鐢ㄦ埛瀵嗙爜涓嶆纭垨涓嶇鍚堣鑼冨紓甯哥被
+ * 
+ * @author ruoyi
+ */
+public class UserPasswordNotMatchException extends UserException
+{
+    private static final long serialVersionUID = 1L;
+
+    public UserPasswordNotMatchException()
+    {
+        super("user.password.not.match", null);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/Arith.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/Arith.java
new file mode 100644
index 0000000..a003eb5
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/Arith.java
@@ -0,0 +1,114 @@
+package com.dingzhuo.energy.common.utils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * 绮剧‘鐨勬诞鐐规暟杩愮畻
+ * 
+ * @author ruoyi
+ */
+public class Arith
+{
+
+    /** 榛樿闄ゆ硶杩愮畻绮惧害 */
+    private static final int DEF_DIV_SCALE = 10;
+
+    /** 杩欎釜绫讳笉鑳藉疄渚嬪寲 */
+    private Arith()
+    {
+    }
+
+    /**
+     * 鎻愪緵绮剧‘鐨勫姞娉曡繍绠椼��
+     * @param v1 琚姞鏁�
+     * @param v2 鍔犳暟
+     * @return 涓や釜鍙傛暟鐨勫拰
+     */
+    public static double add(double v1, double v2)
+    {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.add(b2).doubleValue();
+    }
+
+    /**
+     * 鎻愪緵绮剧‘鐨勫噺娉曡繍绠椼��
+     * @param v1 琚噺鏁�
+     * @param v2 鍑忔暟
+     * @return 涓や釜鍙傛暟鐨勫樊
+     */
+    public static double sub(double v1, double v2)
+    {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.subtract(b2).doubleValue();
+    }
+
+    /**
+     * 鎻愪緵绮剧‘鐨勪箻娉曡繍绠椼��
+     * @param v1 琚箻鏁�
+     * @param v2 涔樻暟
+     * @return 涓や釜鍙傛暟鐨勭Н
+     */
+    public static double mul(double v1, double v2)
+    {
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        return b1.multiply(b2).doubleValue();
+    }
+
+    /**
+     * 鎻愪緵锛堢浉瀵癸級绮剧‘鐨勯櫎娉曡繍绠楋紝褰撳彂鐢熼櫎涓嶅敖鐨勬儏鍐垫椂锛岀簿纭埌
+     * 灏忔暟鐐逛互鍚�10浣嶏紝浠ュ悗鐨勬暟瀛楀洓鑸嶄簲鍏ャ��
+     * @param v1 琚櫎鏁�
+     * @param v2 闄ゆ暟
+     * @return 涓や釜鍙傛暟鐨勫晢
+     */
+    public static double div(double v1, double v2)
+    {
+        return div(v1, v2, DEF_DIV_SCALE);
+    }
+
+    /**
+     * 鎻愪緵锛堢浉瀵癸級绮剧‘鐨勯櫎娉曡繍绠椼�傚綋鍙戠敓闄や笉灏界殑鎯呭喌鏃讹紝鐢眘cale鍙傛暟鎸�
+     * 瀹氱簿搴︼紝浠ュ悗鐨勬暟瀛楀洓鑸嶄簲鍏ャ��
+     * @param v1 琚櫎鏁�
+     * @param v2 闄ゆ暟
+     * @param scale 琛ㄧず琛ㄧず闇�瑕佺簿纭埌灏忔暟鐐逛互鍚庡嚑浣嶃��
+     * @return 涓や釜鍙傛暟鐨勫晢
+     */
+    public static double div(double v1, double v2, int scale)
+    {
+        if (scale < 0)
+        {
+            throw new IllegalArgumentException(
+                    "The scale must be a positive integer or zero");
+        }
+        BigDecimal b1 = new BigDecimal(Double.toString(v1));
+        BigDecimal b2 = new BigDecimal(Double.toString(v2));
+        if (b1.compareTo(BigDecimal.ZERO) == 0)
+        {
+            return BigDecimal.ZERO.doubleValue();
+        }
+        return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();
+    }
+
+    /**
+     * 鎻愪緵绮剧‘鐨勫皬鏁颁綅鍥涜垗浜斿叆澶勭悊銆�
+     * @param v 闇�瑕佸洓鑸嶄簲鍏ョ殑鏁板瓧
+     * @param scale 灏忔暟鐐瑰悗淇濈暀鍑犱綅
+     * @return 鍥涜垗浜斿叆鍚庣殑缁撴灉
+     */
+    public static double round(double v, int scale)
+    {
+        if (scale < 0)
+        {
+            throw new IllegalArgumentException(
+                    "The scale must be a positive integer or zero");
+        }
+        BigDecimal b = new BigDecimal(Double.toString(v));
+        BigDecimal one = new BigDecimal("1");
+        return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/DateUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/DateUtils.java
new file mode 100644
index 0000000..f39262e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/DateUtils.java
@@ -0,0 +1,155 @@
+package com.dingzhuo.energy.common.utils;
+
+import java.lang.management.ManagementFactory;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import org.apache.commons.lang3.time.DateFormatUtils;
+
+/**
+ * 鏃堕棿宸ュ叿绫�
+ * 
+ * @author ruoyi
+ */
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils
+{
+    public static String YYYY = "yyyy";
+
+    public static String YYYY_MM = "yyyy-MM";
+
+    public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+
+    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+    
+    private static String[] parsePatterns = {
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
+            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+    /**
+     * 鑾峰彇褰撳墠Date鍨嬫棩鏈�
+     * 
+     * @return Date() 褰撳墠鏃ユ湡
+     */
+    public static Date getNowDate()
+    {
+        return new Date();
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃ユ湡, 榛樿鏍煎紡涓簓yyy-MM-dd
+     * 
+     * @return String
+     */
+    public static String getDate()
+    {
+        return dateTimeNow(YYYY_MM_DD);
+    }
+
+    public static final String getTime()
+    {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    public static final String dateTimeNow()
+    {
+        return dateTimeNow(YYYYMMDDHHMMSS);
+    }
+
+    public static final String dateTimeNow(final String format)
+    {
+        return parseDateToStr(format, new Date());
+    }
+
+    public static final String dateTime(final Date date)
+    {
+        return parseDateToStr(YYYY_MM_DD, date);
+    }
+
+    public static final String parseDateToStr(final String format, final Date date)
+    {
+        return new SimpleDateFormat(format).format(date);
+    }
+
+    public static final Date dateTime(final String format, final String ts)
+    {
+        try
+        {
+            return new SimpleDateFormat(format).parse(ts);
+        }
+        catch (ParseException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 鏃ユ湡璺緞 鍗冲勾/鏈�/鏃� 濡�2018/08/08
+     */
+    public static final String datePath()
+    {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyy/MM/dd");
+    }
+
+    /**
+     * 鏃ユ湡璺緞 鍗冲勾/鏈�/鏃� 濡�20180808
+     */
+    public static final String dateTime()
+    {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyyMMdd");
+    }
+
+    /**
+     * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈� 鏍煎紡
+     */
+    public static Date parseDate(Object str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        try
+        {
+            return parseDate(str.toString(), parsePatterns);
+        }
+        catch (ParseException e)
+        {
+            return null;
+        }
+    }
+    
+    /**
+     * 鑾峰彇鏈嶅姟鍣ㄥ惎鍔ㄦ椂闂�
+     */
+    public static Date getServerStartDate()
+    {
+        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+        return new Date(time);
+    }
+
+    /**
+     * 璁$畻涓や釜鏃堕棿宸�
+     */
+    public static String getDatePoor(Date endDate, Date nowDate)
+    {
+        long nd = 1000 * 24 * 60 * 60;
+        long nh = 1000 * 60 * 60;
+        long nm = 1000 * 60;
+        // long ns = 1000;
+        // 鑾峰緱涓や釜鏃堕棿鐨勬绉掓椂闂村樊寮�
+        long diff = endDate.getTime() - nowDate.getTime();
+        // 璁$畻宸灏戝ぉ
+        long day = diff / nd;
+        // 璁$畻宸灏戝皬鏃�
+        long hour = diff % nd / nh;
+        // 璁$畻宸灏戝垎閽�
+        long min = diff % nd % nh / nm;
+        // 璁$畻宸灏戠//杈撳嚭缁撴灉
+        // long sec = diff % nd % nh % nm / ns;
+        return day + "澶�" + hour + "灏忔椂" + min + "鍒嗛挓";
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/IdUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/IdUtils.java
new file mode 100644
index 0000000..37c0e72
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/IdUtils.java
@@ -0,0 +1,51 @@
+package com.dingzhuo.energy.common.utils;
+
+import com.dingzhuo.energy.common.core.lang.UUID;
+
+/**
+ * ID鐢熸垚鍣ㄥ伐鍏风被
+ * 
+ * @author ruoyi
+ */
+public class IdUtils
+{
+    /**
+     * 鑾峰彇闅忔満UUID
+     * 
+     * @return 闅忔満UUID
+     */
+    public static String randomUUID()
+    {
+        return UUID.randomUUID().toString();
+    }
+
+    /**
+     * 绠�鍖栫殑UUID锛屽幓鎺変簡妯嚎
+     * 
+     * @return 绠�鍖栫殑UUID锛屽幓鎺変簡妯嚎
+     */
+    public static String simpleUUID()
+    {
+        return UUID.randomUUID().toString(true);
+    }
+
+    /**
+     * 鑾峰彇闅忔満UUID锛屼娇鐢ㄦ�ц兘鏇村ソ鐨凾hreadLocalRandom鐢熸垚UUID
+     * 
+     * @return 闅忔満UUID
+     */
+    public static String fastUUID()
+    {
+        return UUID.fastUUID().toString();
+    }
+
+    /**
+     * 绠�鍖栫殑UUID锛屽幓鎺変簡妯嚎锛屼娇鐢ㄦ�ц兘鏇村ソ鐨凾hreadLocalRandom鐢熸垚UUID
+     * 
+     * @return 绠�鍖栫殑UUID锛屽幓鎺変簡妯嚎
+     */
+    public static String fastSimpleUUID()
+    {
+        return UUID.fastUUID().toString(true);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/LogUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/LogUtils.java
new file mode 100644
index 0000000..8abe4ec
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/LogUtils.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.common.utils;
+
+/**
+ * 澶勭悊骞惰褰曟棩蹇楁枃浠�
+ * 
+ * @author ruoyi
+ */
+public class LogUtils
+{
+    public static String getBlock(Object msg)
+    {
+        if (msg == null)
+        {
+            msg = "";
+        }
+        return "[" + msg.toString() + "]";
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/MessageUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/MessageUtils.java
new file mode 100644
index 0000000..91e8c14
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/MessageUtils.java
@@ -0,0 +1,27 @@
+package com.dingzhuo.energy.common.utils;
+
+import com.dingzhuo.energy.common.utils.spring.SpringUtils;
+import org.springframework.context.MessageSource;
+import org.springframework.context.i18n.LocaleContextHolder;
+import com.dingzhuo.energy.common.utils.spring.SpringUtils;
+
+/**
+ * 鑾峰彇i18n璧勬簮鏂囦欢
+ * 
+ * @author ruoyi
+ */
+public class MessageUtils
+{
+    /**
+     * 鏍规嵁娑堟伅閿拰鍙傛暟 鑾峰彇娑堟伅 濮旀墭缁檚pring messageSource
+     *
+     * @param code 娑堟伅閿�
+     * @param args 鍙傛暟
+     * @return 鑾峰彇鍥介檯鍖栫炕璇戝��
+     */
+    public static String message(String code, Object... args)
+    {
+        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
+        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/SecurityUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/SecurityUtils.java
new file mode 100644
index 0000000..54d8f8d
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/SecurityUtils.java
@@ -0,0 +1,89 @@
+package com.dingzhuo.energy.common.utils;
+
+import com.dingzhuo.energy.common.constant.HttpStatus;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+/**
+ * 瀹夊叏鏈嶅姟宸ュ叿绫�
+ *
+ * @author ruoyi
+ */
+public class SecurityUtils {
+
+  /**
+   * 鑾峰彇鐢ㄦ埛璐︽埛
+   **/
+  public static String getUsername() {
+    try {
+      return getLoginUser().getUsername();
+    } catch (Exception e) {
+      throw new CustomException("鑾峰彇鐢ㄦ埛璐︽埛寮傚父", HttpStatus.UNAUTHORIZED);
+    }
+  }
+
+  /**
+   * 鑾峰彇鐢ㄦ埛
+   **/
+  public static Long getUserId() {
+    try {
+      return getLoginUser().getUser().getUserId();
+    } catch (Exception e) {
+      throw new CustomException("鑾峰彇鐢ㄦ埛淇℃伅寮傚父", HttpStatus.UNAUTHORIZED);
+    }
+  }
+
+  /**
+   * 鑾峰彇鐢ㄦ埛
+   **/
+  public static LoginUser getLoginUser() {
+    try {
+      return (LoginUser) getAuthentication().getPrincipal();
+    } catch (Exception e) {
+      throw new CustomException("鑾峰彇鐢ㄦ埛淇℃伅寮傚父", HttpStatus.UNAUTHORIZED);
+    }
+  }
+
+  /**
+   * 鑾峰彇Authentication
+   */
+  public static Authentication getAuthentication() {
+    return SecurityContextHolder.getContext().getAuthentication();
+  }
+
+  /**
+   * 鐢熸垚BCryptPasswordEncoder瀵嗙爜
+   *
+   * @param password 瀵嗙爜
+   * @return 鍔犲瘑瀛楃涓�
+   */
+  public static String encryptPassword(String password) {
+    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+    return passwordEncoder.encode(password);
+  }
+
+  /**
+   * 鍒ゆ柇瀵嗙爜鏄惁鐩稿悓
+   *
+   * @param rawPassword     鐪熷疄瀵嗙爜
+   * @param encodedPassword 鍔犲瘑鍚庡瓧绗�
+   * @return 缁撴灉
+   */
+  public static boolean matchesPassword(String rawPassword, String encodedPassword) {
+    BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+    return passwordEncoder.matches(rawPassword, encodedPassword);
+  }
+
+  /**
+   * 鏄惁涓虹鐞嗗憳
+   *
+   * @param userId 鐢ㄦ埛ID
+   * @return 缁撴灉
+   */
+  public static boolean isAdmin(Long userId) {
+    return userId != null && 1L == userId;
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/ServletUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/ServletUtils.java
new file mode 100644
index 0000000..f42373a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/ServletUtils.java
@@ -0,0 +1,132 @@
+package com.dingzhuo.energy.common.utils;
+
+import java.io.IOException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import com.dingzhuo.energy.common.core.text.Convert;
+
+/**
+ * 瀹㈡埛绔伐鍏风被
+ * 
+ * @author ruoyi
+ */
+public class ServletUtils
+{
+    /**
+     * 鑾峰彇String鍙傛暟
+     */
+    public static String getParameter(String name)
+    {
+        return getRequest().getParameter(name);
+    }
+
+    /**
+     * 鑾峰彇String鍙傛暟
+     */
+    public static String getParameter(String name, String defaultValue)
+    {
+        return Convert.toStr(getRequest().getParameter(name), defaultValue);
+    }
+
+    /**
+     * 鑾峰彇Integer鍙傛暟
+     */
+    public static Integer getParameterToInt(String name)
+    {
+        return Convert.toInt(getRequest().getParameter(name));
+    }
+
+    /**
+     * 鑾峰彇Integer鍙傛暟
+     */
+    public static Integer getParameterToInt(String name, Integer defaultValue)
+    {
+        return Convert.toInt(getRequest().getParameter(name), defaultValue);
+    }
+
+    /**
+     * 鑾峰彇request
+     */
+    public static HttpServletRequest getRequest()
+    {
+        return getRequestAttributes().getRequest();
+    }
+
+    /**
+     * 鑾峰彇response
+     */
+    public static HttpServletResponse getResponse()
+    {
+        return getRequestAttributes().getResponse();
+    }
+
+    /**
+     * 鑾峰彇session
+     */
+    public static HttpSession getSession()
+    {
+        return getRequest().getSession();
+    }
+
+    public static ServletRequestAttributes getRequestAttributes()
+    {
+        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+        return (ServletRequestAttributes) attributes;
+    }
+
+    /**
+     * 灏嗗瓧绗︿覆娓叉煋鍒板鎴风
+     * 
+     * @param response 娓叉煋瀵硅薄
+     * @param string 寰呮覆鏌撶殑瀛楃涓�
+     * @return null
+     */
+    public static String renderString(HttpServletResponse response, String string)
+    {
+        try
+        {
+            response.setStatus(200);
+            response.setContentType("application/json");
+            response.setCharacterEncoding("utf-8");
+            response.getWriter().print(string);
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 鏄惁鏄疉jax寮傛璇锋眰
+     * 
+     * @param request
+     */
+    public static boolean isAjaxRequest(HttpServletRequest request)
+    {
+        String accept = request.getHeader("accept");
+        if (accept != null && accept.indexOf("application/json") != -1)
+        {
+            return true;
+        }
+
+        String xRequestedWith = request.getHeader("X-Requested-With");
+        if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
+        {
+            return true;
+        }
+
+        String uri = request.getRequestURI();
+        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
+        {
+            return true;
+        }
+
+        String ajax = request.getParameter("__ajax");
+      return StringUtils.inStringIgnoreCase(ajax, "json" , "xml");
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/StringUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/StringUtils.java
new file mode 100644
index 0000000..6112596
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/StringUtils.java
@@ -0,0 +1,453 @@
+package com.dingzhuo.energy.common.utils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import com.dingzhuo.energy.common.core.text.StrFormatter;
+
+/**
+ * 瀛楃涓插伐鍏风被
+ * 
+ * @author ruoyi
+ */
+public class StringUtils extends org.apache.commons.lang3.StringUtils
+{
+    /** 绌哄瓧绗︿覆 */
+    private static final String NULLSTR = "";
+
+    /** 涓嬪垝绾� */
+    private static final char SEPARATOR = '_';
+
+    /**
+     * 鑾峰彇鍙傛暟涓嶄负绌哄��
+     * 
+     * @param value defaultValue 瑕佸垽鏂殑value
+     * @return value 杩斿洖鍊�
+     */
+    public static <T> T nvl(T value, T defaultValue)
+    {
+        return value != null ? value : defaultValue;
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓狢ollection鏄惁涓虹┖锛� 鍖呭惈List锛孲et锛孮ueue
+     * 
+     * @param coll 瑕佸垽鏂殑Collection
+     * @return true锛氫负绌� false锛氶潪绌�
+     */
+    public static boolean isEmpty(Collection<?> coll)
+    {
+        return isNull(coll) || coll.isEmpty();
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓狢ollection鏄惁闈炵┖锛屽寘鍚獿ist锛孲et锛孮ueue
+     * 
+     * @param coll 瑕佸垽鏂殑Collection
+     * @return true锛氶潪绌� false锛氱┖
+     */
+    public static boolean isNotEmpty(Collection<?> coll)
+    {
+        return !isEmpty(coll);
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓璞℃暟缁勬槸鍚︿负绌�
+     * 
+     * @param objects 瑕佸垽鏂殑瀵硅薄鏁扮粍
+     ** @return true锛氫负绌� false锛氶潪绌�
+     */
+    public static boolean isEmpty(Object[] objects)
+    {
+        return isNull(objects) || (objects.length == 0);
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓璞℃暟缁勬槸鍚﹂潪绌�
+     * 
+     * @param objects 瑕佸垽鏂殑瀵硅薄鏁扮粍
+     * @return true锛氶潪绌� false锛氱┖
+     */
+    public static boolean isNotEmpty(Object[] objects)
+    {
+        return !isEmpty(objects);
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓狹ap鏄惁涓虹┖
+     * 
+     * @param map 瑕佸垽鏂殑Map
+     * @return true锛氫负绌� false锛氶潪绌�
+     */
+    public static boolean isEmpty(Map<?, ?> map)
+    {
+        return isNull(map) || map.isEmpty();
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓狹ap鏄惁涓虹┖
+     * 
+     * @param map 瑕佸垽鏂殑Map
+     * @return true锛氶潪绌� false锛氱┖
+     */
+    public static boolean isNotEmpty(Map<?, ?> map)
+    {
+        return !isEmpty(map);
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓瓧绗︿覆鏄惁涓虹┖涓�
+     * 
+     * @param str String
+     * @return true锛氫负绌� false锛氶潪绌�
+     */
+    public static boolean isEmpty(String str)
+    {
+        return isNull(str) || NULLSTR.equals(str.trim());
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓瓧绗︿覆鏄惁涓洪潪绌轰覆
+     * 
+     * @param str String
+     * @return true锛氶潪绌轰覆 false锛氱┖涓�
+     */
+    public static boolean isNotEmpty(String str)
+    {
+        return !isEmpty(str);
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓璞℃槸鍚︿负绌�
+     * 
+     * @param object Object
+     * @return true锛氫负绌� false锛氶潪绌�
+     */
+    public static boolean isNull(Object object)
+    {
+        return object == null;
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓璞℃槸鍚﹂潪绌�
+     * 
+     * @param object Object
+     * @return true锛氶潪绌� false锛氱┖
+     */
+    public static boolean isNotNull(Object object)
+    {
+        return !isNull(object);
+    }
+
+    /**
+     * * 鍒ゆ柇涓�涓璞℃槸鍚︽槸鏁扮粍绫诲瀷锛圝ava鍩烘湰鍨嬪埆鐨勬暟缁勶級
+     * 
+     * @param object 瀵硅薄
+     * @return true锛氭槸鏁扮粍 false锛氫笉鏄暟缁�
+     */
+    public static boolean isArray(Object object)
+    {
+        return isNotNull(object) && object.getClass().isArray();
+    }
+
+    /**
+     * 鍘荤┖鏍�
+     */
+    public static String trim(String str)
+    {
+        return (str == null ? "" : str.trim());
+    }
+
+    /**
+     * 鎴彇瀛楃涓�
+     * 
+     * @param str 瀛楃涓�
+     * @param start 寮�濮�
+     * @return 缁撴灉
+     */
+    public static String substring(final String str, int start)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (start > str.length())
+        {
+            return NULLSTR;
+        }
+
+        return str.substring(start);
+    }
+
+    /**
+     * 鎴彇瀛楃涓�
+     * 
+     * @param str 瀛楃涓�
+     * @param start 寮�濮�
+     * @param end 缁撴潫
+     * @return 缁撴灉
+     */
+    public static String substring(final String str, int start, int end)
+    {
+        if (str == null)
+        {
+            return NULLSTR;
+        }
+
+        if (end < 0)
+        {
+            end = str.length() + end;
+        }
+        if (start < 0)
+        {
+            start = str.length() + start;
+        }
+
+        if (end > str.length())
+        {
+            end = str.length();
+        }
+
+        if (start > end)
+        {
+            return NULLSTR;
+        }
+
+        if (start < 0)
+        {
+            start = 0;
+        }
+        if (end < 0)
+        {
+            end = 0;
+        }
+
+        return str.substring(start, end);
+    }
+
+    /**
+     * 鏍煎紡鍖栨枃鏈�, {} 琛ㄧず鍗犱綅绗�<br>
+     * 姝ゆ柟娉曞彧鏄畝鍗曞皢鍗犱綅绗� {} 鎸夌収椤哄簭鏇挎崲涓哄弬鏁�<br>
+     * 濡傛灉鎯宠緭鍑� {} 浣跨敤 \\杞箟 { 鍗冲彲锛屽鏋滄兂杈撳嚭 {} 涔嬪墠鐨� \ 浣跨敤鍙岃浆涔夌 \\\\ 鍗冲彲<br>
+     * 渚嬶細<br>
+     * 閫氬父浣跨敤锛歠ormat("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 杞箟{}锛� format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 杞箟\锛� format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param template 鏂囨湰妯℃澘锛岃鏇挎崲鐨勯儴鍒嗙敤 {} 琛ㄧず
+     * @param params 鍙傛暟鍊�
+     * @return 鏍煎紡鍖栧悗鐨勬枃鏈�
+     */
+    public static String format(String template, Object... params)
+    {
+        if (isEmpty(params) || isEmpty(template))
+        {
+            return template;
+        }
+        return StrFormatter.format(template, params);
+    }
+
+    /**
+     * 瀛楃涓茶浆set
+     * 
+     * @param str 瀛楃涓�
+     * @param sep 鍒嗛殧绗�
+     * @return set闆嗗悎
+     */
+    public static final Set<String> str2Set(String str, String sep)
+    {
+        return new HashSet<String>(str2List(str, sep, true, false));
+    }
+
+    /**
+     * 瀛楃涓茶浆list
+     * 
+     * @param str 瀛楃涓�
+     * @param sep 鍒嗛殧绗�
+     * @param filterBlank 杩囨护绾┖鐧�
+     * @param trim 鍘绘帀棣栧熬绌虹櫧
+     * @return list闆嗗悎
+     */
+    public static final List<String> str2List(String str, String sep, boolean filterBlank, boolean trim)
+    {
+        List<String> list = new ArrayList<String>();
+        if (StringUtils.isEmpty(str))
+        {
+            return list;
+        }
+
+        // 杩囨护绌虹櫧瀛楃涓�
+        if (filterBlank && StringUtils.isBlank(str))
+        {
+            return list;
+        }
+        String[] split = str.split(sep);
+        for (String string : split)
+        {
+            if (filterBlank && StringUtils.isBlank(string))
+            {
+                continue;
+            }
+            if (trim)
+            {
+                string = string.trim();
+            }
+            list.add(string);
+        }
+
+        return list;
+    }
+
+    /**
+     * 涓嬪垝绾胯浆椹煎嘲鍛藉悕
+     */
+    public static String toUnderScoreCase(String str)
+    {
+        if (str == null)
+        {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        // 鍓嶇疆瀛楃鏄惁澶у啓
+        boolean preCharIsUpperCase = true;
+        // 褰撳墠瀛楃鏄惁澶у啓
+        boolean curreCharIsUpperCase = true;
+        // 涓嬩竴瀛楃鏄惁澶у啓
+        boolean nexteCharIsUpperCase = true;
+        for (int i = 0; i < str.length(); i++)
+        {
+            char c = str.charAt(i);
+            if (i > 0)
+            {
+                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
+            }
+            else
+            {
+                preCharIsUpperCase = false;
+            }
+
+            curreCharIsUpperCase = Character.isUpperCase(c);
+
+            if (i < (str.length() - 1))
+            {
+                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
+            }
+
+            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
+            {
+                sb.append(SEPARATOR);
+            }
+            sb.append(Character.toLowerCase(c));
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * 鏄惁鍖呭惈瀛楃涓�
+     * 
+     * @param str 楠岃瘉瀛楃涓�
+     * @param strs 瀛楃涓茬粍
+     * @return 鍖呭惈杩斿洖true
+     */
+    public static boolean inStringIgnoreCase(String str, String... strs)
+    {
+        if (str != null && strs != null)
+        {
+            for (String s : strs)
+            {
+                if (str.equalsIgnoreCase(trim(s)))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 灏嗕笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆杞崲涓洪┘宄板紡銆傚鏋滆浆鎹㈠墠鐨勪笅鍒掔嚎澶у啓鏂瑰紡鍛藉悕鐨勫瓧绗︿覆涓虹┖锛屽垯杩斿洖绌哄瓧绗︿覆銆� 渚嬪锛欻ELLO_WORLD->HelloWorld
+     * 
+     * @param name 杞崲鍓嶇殑涓嬪垝绾垮ぇ鍐欐柟寮忓懡鍚嶇殑瀛楃涓�
+     * @return 杞崲鍚庣殑椹煎嘲寮忓懡鍚嶇殑瀛楃涓�
+     */
+    public static String convertToCamelCase(String name)
+    {
+        StringBuilder result = new StringBuilder();
+        // 蹇�熸鏌�
+        if (name == null || name.isEmpty())
+        {
+            // 娌″繀瑕佽浆鎹�
+            return "";
+        }
+        else if (!name.contains("_"))
+        {
+            // 涓嶅惈涓嬪垝绾匡紝浠呭皢棣栧瓧姣嶅ぇ鍐�
+            return name.substring(0, 1).toUpperCase() + name.substring(1);
+        }
+        // 鐢ㄤ笅鍒掔嚎灏嗗師濮嬪瓧绗︿覆鍒嗗壊
+        String[] camels = name.split("_");
+        for (String camel : camels)
+        {
+            // 璺宠繃鍘熷瀛楃涓蹭腑寮�澶淬�佺粨灏剧殑涓嬫崲绾挎垨鍙岄噸涓嬪垝绾�
+            if (camel.isEmpty())
+            {
+                continue;
+            }
+            // 棣栧瓧姣嶅ぇ鍐�
+            result.append(camel.substring(0, 1).toUpperCase());
+            result.append(camel.substring(1).toLowerCase());
+        }
+        return result.toString();
+    }
+
+    /**
+     * 椹煎嘲寮忓懡鍚嶆硶 渚嬪锛歶ser_name->userName
+     */
+    public static String toCamelCase(String s)
+    {
+        if (s == null)
+        {
+            return null;
+        }
+        s = s.toLowerCase();
+        StringBuilder sb = new StringBuilder(s.length());
+        boolean upperCase = false;
+        for (int i = 0; i < s.length(); i++)
+        {
+            char c = s.charAt(i);
+
+            if (c == SEPARATOR)
+            {
+                upperCase = true;
+            }
+            else if (upperCase)
+            {
+                sb.append(Character.toUpperCase(c));
+                upperCase = false;
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/Threads.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/Threads.java
new file mode 100644
index 0000000..e9bab18
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/Threads.java
@@ -0,0 +1,99 @@
+package com.dingzhuo.energy.common.utils;
+
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 绾跨▼鐩稿叧宸ュ叿绫�.
+ * 
+ * @author ruoyi
+ */
+public class Threads
+{
+    private static final Logger logger = LoggerFactory.getLogger(Threads.class);
+
+    /**
+     * sleep绛夊緟,鍗曚綅涓烘绉�
+     */
+    public static void sleep(long milliseconds)
+    {
+        try
+        {
+            Thread.sleep(milliseconds);
+        }
+        catch (InterruptedException e)
+        {
+            return;
+        }
+    }
+
+    /**
+     * 鍋滄绾跨▼姹�
+     * 鍏堜娇鐢╯hutdown, 鍋滄鎺ユ敹鏂颁换鍔″苟灏濊瘯瀹屾垚鎵�鏈夊凡瀛樺湪浠诲姟.
+     * 濡傛灉瓒呮椂, 鍒欒皟鐢╯hutdownNow, 鍙栨秷鍦╳orkQueue涓璓ending鐨勪换鍔�,骞朵腑鏂墍鏈夐樆濉炲嚱鏁�.
+     * 濡傛灉浠嶄汉瓒呮檪锛屽墖寮峰埗閫�鍑�.
+     * 鍙﹀鍦╯hutdown鏃剁嚎绋嬫湰韬璋冪敤涓柇鍋氫簡澶勭悊.
+     */
+    public static void shutdownAndAwaitTermination(ExecutorService pool)
+    {
+        if (pool != null && !pool.isShutdown())
+        {
+            pool.shutdown();
+            try
+            {
+                if (!pool.awaitTermination(120, TimeUnit.SECONDS))
+                {
+                    pool.shutdownNow();
+                    if (!pool.awaitTermination(120, TimeUnit.SECONDS))
+                    {
+                        logger.info("Pool did not terminate");
+                    }
+                }
+            }
+            catch (InterruptedException ie)
+            {
+                pool.shutdownNow();
+                Thread.currentThread().interrupt();
+            }
+        }
+    }
+
+    /**
+     * 鎵撳嵃绾跨▼寮傚父淇℃伅
+     */
+    public static void printException(Runnable r, Throwable t)
+    {
+        if (t == null && r instanceof Future<?>)
+        {
+            try
+            {
+                Future<?> future = (Future<?>) r;
+                if (future.isDone())
+                {
+                    future.get();
+                }
+            }
+            catch (CancellationException ce)
+            {
+                t = ce;
+            }
+            catch (ExecutionException ee)
+            {
+                t = ee.getCause();
+            }
+            catch (InterruptedException ie)
+            {
+                Thread.currentThread().interrupt();
+            }
+        }
+        if (t != null)
+        {
+            logger.error(t.getMessage(), t);
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/VerifyCodeUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/VerifyCodeUtils.java
new file mode 100644
index 0000000..e44bdf6
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/VerifyCodeUtils.java
@@ -0,0 +1,226 @@
+package com.dingzhuo.energy.common.utils;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.SecureRandom;
+import java.util.Arrays;
+import java.util.Random;
+import javax.imageio.ImageIO;
+
+/**
+ * 楠岃瘉鐮佸伐鍏风被
+ * 
+ * @author ruoyi
+ */
+public class VerifyCodeUtils
+{
+    // 浣跨敤鍒癆lgerian瀛椾綋锛岀郴缁熼噷娌℃湁鐨勮瘽闇�瑕佸畨瑁呭瓧浣擄紝瀛椾綋鍙樉绀哄ぇ鍐欙紝鍘绘帀浜�1,0,i,o鍑犱釜瀹规槗娣锋穯鐨勫瓧绗�
+    public static final String VERIFY_CODES = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ";
+
+    private static Random random = new SecureRandom();
+
+    /**
+     * 浣跨敤绯荤粺榛樿瀛楃婧愮敓鎴愰獙璇佺爜
+     * 
+     * @param verifySize 楠岃瘉鐮侀暱搴�
+     * @return
+     */
+    public static String generateVerifyCode(int verifySize)
+    {
+        return generateVerifyCode(verifySize, VERIFY_CODES);
+    }
+
+    /**
+     * 浣跨敤鎸囧畾婧愮敓鎴愰獙璇佺爜
+     * 
+     * @param verifySize 楠岃瘉鐮侀暱搴�
+     * @param sources 楠岃瘉鐮佸瓧绗︽簮
+     * @return
+     */
+    public static String generateVerifyCode(int verifySize, String sources)
+    {
+        if (sources == null || sources.length() == 0)
+        {
+            sources = VERIFY_CODES;
+        }
+        int codesLen = sources.length();
+        Random rand = new Random(System.currentTimeMillis());
+        StringBuilder verifyCode = new StringBuilder(verifySize);
+        for (int i = 0; i < verifySize; i++)
+        {
+            verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1)));
+        }
+        return verifyCode.toString();
+    }
+
+    /**
+     * 杈撳嚭鎸囧畾楠岃瘉鐮佸浘鐗囨祦
+     * 
+     * @param w
+     * @param h
+     * @param os
+     * @param code
+     * @throws IOException
+     */
+    public static void outputImage(int w, int h, OutputStream os, String code) throws IOException
+    {
+        int verifySize = code.length();
+        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Random rand = new Random();
+        Graphics2D g2 = image.createGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        Color[] colors = new Color[5];
+        Color[] colorSpaces = new Color[] { Color.WHITE, Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA,
+                Color.ORANGE, Color.PINK, Color.YELLOW };
+        float[] fractions = new float[colors.length];
+        for (int i = 0; i < colors.length; i++)
+        {
+            colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)];
+            fractions[i] = rand.nextFloat();
+        }
+        Arrays.sort(fractions);
+
+        g2.setColor(Color.GRAY);// 璁剧疆杈规鑹�
+        g2.fillRect(0, 0, w, h);
+
+        Color c = getRandColor(200, 250);
+        g2.setColor(c);// 璁剧疆鑳屾櫙鑹�
+        g2.fillRect(0, 2, w, h - 4);
+
+        // 缁樺埗骞叉壈绾�
+        Random random = new Random();
+        g2.setColor(getRandColor(160, 200));// 璁剧疆绾挎潯鐨勯鑹�
+        for (int i = 0; i < 20; i++)
+        {
+            int x = random.nextInt(w - 1);
+            int y = random.nextInt(h - 1);
+            int xl = random.nextInt(6) + 1;
+            int yl = random.nextInt(12) + 1;
+            g2.drawLine(x, y, x + xl + 40, y + yl + 20);
+        }
+
+        // 娣诲姞鍣偣
+        float yawpRate = 0.05f;// 鍣0鐜�
+        int area = (int) (yawpRate * w * h);
+        for (int i = 0; i < area; i++)
+        {
+            int x = random.nextInt(w);
+            int y = random.nextInt(h);
+            int rgb = getRandomIntColor();
+            image.setRGB(x, y, rgb);
+        }
+
+        shear(g2, w, h, c);// 浣垮浘鐗囨壄鏇�
+
+        g2.setColor(getRandColor(100, 160));
+        int fontSize = h - 4;
+        Font font = new Font("Algerian", Font.ITALIC, fontSize);
+        g2.setFont(font);
+        char[] chars = code.toCharArray();
+        for (int i = 0; i < verifySize; i++)
+        {
+            AffineTransform affine = new AffineTransform();
+            affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1),
+                    (w / verifySize) * i + fontSize / 2, h / 2);
+            g2.setTransform(affine);
+            g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10);
+        }
+
+        g2.dispose();
+        ImageIO.write(image, "jpg", os);
+    }
+
+    private static Color getRandColor(int fc, int bc)
+    {
+        if (fc > 255)
+            fc = 255;
+        if (bc > 255)
+            bc = 255;
+        int r = fc + random.nextInt(bc - fc);
+        int g = fc + random.nextInt(bc - fc);
+        int b = fc + random.nextInt(bc - fc);
+        return new Color(r, g, b);
+    }
+
+    private static int getRandomIntColor()
+    {
+        int[] rgb = getRandomRgb();
+        int color = 0;
+        for (int c : rgb)
+        {
+            color = color << 8;
+            color = color | c;
+        }
+        return color;
+    }
+
+    private static int[] getRandomRgb()
+    {
+        int[] rgb = new int[3];
+        for (int i = 0; i < 3; i++)
+        {
+            rgb[i] = random.nextInt(255);
+        }
+        return rgb;
+    }
+
+    private static void shear(Graphics g, int w1, int h1, Color color)
+    {
+        shearX(g, w1, h1, color);
+        shearY(g, w1, h1, color);
+    }
+
+    private static void shearX(Graphics g, int w1, int h1, Color color)
+    {
+
+        int period = random.nextInt(2);
+
+        boolean borderGap = true;
+        int frames = 1;
+        int phase = random.nextInt(2);
+
+        for (int i = 0; i < h1; i++)
+        {
+            double d = (double) (period >> 1)
+                    * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
+            g.copyArea(0, i, w1, 1, (int) d, 0);
+            if (borderGap)
+            {
+                g.setColor(color);
+                g.drawLine((int) d, i, 0, i);
+                g.drawLine((int) d + w1, i, w1, i);
+            }
+        }
+
+    }
+
+    private static void shearY(Graphics g, int w1, int h1, Color color)
+    {
+
+        int period = random.nextInt(40) + 10; // 50;
+
+        boolean borderGap = true;
+        int frames = 20;
+        int phase = 7;
+        for (int i = 0; i < w1; i++)
+        {
+            double d = (double) (period >> 1)
+                    * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames);
+            g.copyArea(i, 0, 1, h1, 0, (int) d);
+            if (borderGap)
+            {
+                g.setColor(color);
+                g.drawLine(i, (int) d, i, 0);
+                g.drawLine(i, (int) d + h1, i, h1);
+            }
+
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUploadUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUploadUtils.java
new file mode 100644
index 0000000..ca30701
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUploadUtils.java
@@ -0,0 +1,296 @@
+package com.dingzhuo.energy.common.utils.file;
+
+import java.io.File;
+import java.io.IOException;
+
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.exception.file.FileNameLengthLimitExceededException;
+import com.dingzhuo.energy.common.exception.file.FileSizeLimitExceededException;
+import com.dingzhuo.energy.common.exception.file.InvalidExtensionException;
+import com.dingzhuo.energy.common.utils.security.Md5Utils;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.web.multipart.MultipartFile;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.exception.file.FileNameLengthLimitExceededException;
+import com.dingzhuo.energy.common.exception.file.FileSizeLimitExceededException;
+import com.dingzhuo.energy.common.exception.file.InvalidExtensionException;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.security.Md5Utils;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+
+/**
+ * 鏂囦欢涓婁紶宸ュ叿绫�
+ *
+ * @author ruoyi
+ */
+public class FileUploadUtils {
+
+  /**
+   * 榛樿澶у皬 50M
+   */
+  public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
+
+  /**
+   * 榛樿鐨勬枃浠跺悕鏈�澶ч暱搴� 100
+   */
+  public static final int DEFAULT_FILE_NAME_LENGTH = 100;
+
+  /**
+   * 榛樿涓婁紶鐨勫湴鍧�
+   */
+  private static String defaultBaseDir = RuoYiConfig.getProfile();
+
+  private static int counter = 0;
+
+  public static void setDefaultBaseDir(String defaultBaseDir) {
+    FileUploadUtils.defaultBaseDir = defaultBaseDir;
+  }
+
+  public static String getDefaultBaseDir() {
+    return defaultBaseDir;
+  }
+
+  /**
+   * 浠ラ粯璁ら厤缃繘琛屾枃浠朵笂浼�
+   *
+   * @param file 涓婁紶鐨勬枃浠�
+   * @return 鏂囦欢鍚嶇О
+   * @throws Exception
+   */
+  public static final String upload(MultipartFile file) throws IOException {
+    try {
+      return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+    } catch (Exception e) {
+      throw new IOException(e.getMessage(), e);
+    }
+  }
+
+  /**
+   * 鏍规嵁鏂囦欢璺緞涓婁紶
+   *
+   * @param baseDir 鐩稿搴旂敤鐨勫熀鐩綍
+   * @param file    涓婁紶鐨勬枃浠�
+   * @return 鏂囦欢鍚嶇О
+   * @throws IOException
+   */
+  public static final String upload(String baseDir, MultipartFile file) throws IOException {
+    try {
+      return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+    } catch (Exception e) {
+      throw new IOException(e.getMessage(), e);
+    }
+  }
+
+  /**
+   * 鏍规嵁鏂囦欢璺緞涓婁紶浠绘剰鏂囦欢 2020.02.15
+   *
+   * @param baseDir 鐩稿搴旂敤鐨勫熀鐩綍
+   * @param file    涓婁紶鐨勬枃浠�
+   * @return 鏂囦欢鍚嶇О
+   * @throws IOException
+   */
+  public static final String uploadAll(String baseDir, MultipartFile file) throws IOException {
+    try {
+      return uploadAllFile(baseDir, file);
+    } catch (Exception e) {
+      throw new IOException(e.getMessage(), e);
+    }
+  }
+
+  /**
+   * 浠绘剰鏂囦欢涓婁紶 2020.02.15
+   *
+   * @param baseDir 鐩稿搴旂敤鐨勫熀鐩綍
+   * @param file    涓婁紶鐨勬枃浠�
+   * @return 杩斿洖涓婁紶鎴愬姛鐨勬枃浠跺悕
+   * @throws FileSizeLimitExceededException       濡傛灉瓒呭嚭鏈�澶уぇ灏�
+   * @throws FileNameLengthLimitExceededException 鏂囦欢鍚嶅お闀�
+   * @throws IOException                          姣斿璇诲啓鏂囦欢鍑洪敊鏃�
+   * @throws InvalidExtensionException            鏂囦欢鏍¢獙寮傚父
+   */
+  public static final String uploadAllFile(String baseDir, MultipartFile file)
+      throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+      InvalidExtensionException {
+    int fileNamelength = file.getOriginalFilename().length();
+    if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
+      throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+    }
+    //妫�娴嬩换鎰忔枃浠剁被鍨嬪ぇ灏忥紝涓嶆娴嬫枃浠剁被鍨�
+    assertAllowedNoExtension(file);
+    //鐢熸垚鏃ユ湡璺緞鐨勬枃浠跺強鏂版枃浠跺懡鍚嶇紪鐮侊紝閬垮厤瑕嗙洊
+    String fileName = extractFilename(file);
+    //妫�娴嬫枃浠惰矾寰勫強鏂囦欢骞跺 娌℃湁鐨勮矾寰勫拰鏂囦欢杩涜寤虹珛
+    getAbsoluteFilePath(baseDir + File.separator + fileName);
+    String saveFilePath = baseDir + File.separator + fileName;
+    File desc = new File(saveFilePath);
+    //灏嗕笂浼犳枃浠跺啓鍏ユ柊鏂囦欢
+    file.transferTo(desc);
+    //杩斿洖鍏ㄨ矾寰�
+    return saveFilePath;
+  }
+
+  /**
+   * 鏂囦欢涓婁紶
+   *
+   * @param baseDir          鐩稿搴旂敤鐨勫熀鐩綍
+   * @param file             涓婁紶鐨勬枃浠�
+   * @param allowedExtension 涓婁紶鏂囦欢绫诲瀷
+   * @return 杩斿洖涓婁紶鎴愬姛鐨勬枃浠跺悕
+   * @throws FileSizeLimitExceededException       濡傛灉瓒呭嚭鏈�澶уぇ灏�
+   * @throws FileNameLengthLimitExceededException 鏂囦欢鍚嶅お闀�
+   * @throws IOException                          姣斿璇诲啓鏂囦欢鍑洪敊鏃�
+   * @throws InvalidExtensionException            鏂囦欢鏍¢獙寮傚父
+   */
+  public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
+      throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+      InvalidExtensionException {
+    int fileNamelength = file.getOriginalFilename().length();
+    if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
+      throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+    }
+
+    assertAllowed(file, allowedExtension);
+
+    String fileName = extractFilename(file);
+
+    File desc = getAbsoluteFile(baseDir, fileName);
+    file.transferTo(desc);
+    String pathFileName = getPathFileName(baseDir, fileName);
+    return pathFileName;
+  }
+
+  /**
+   * 缂栫爜鏂囦欢鍚�
+   */
+  public static final String extractFilename(MultipartFile file) {
+    String fileName = file.getOriginalFilename();
+    String extension = getExtension(file);
+    fileName = DateUtils.datePath() + "/" + encodingFilename(fileName) + "." + extension;
+    return fileName;
+  }
+
+  private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
+    File desc = new File(uploadDir + File.separator + fileName);
+
+    if (!desc.getParentFile().exists()) {
+      desc.getParentFile().mkdirs();
+    }
+
+    return desc;
+  }
+
+  /**
+   * 鍒ゆ柇璺緞鏄惁瀛樺湪,涓嶅瓨鍦ㄥ垯鏂板缓
+   *
+   * @param uploadDir
+   * @return
+   * @throws IOException
+   */
+  public static final void getAbsoluteFilePath(String uploadDir) throws IOException {
+    File desc = new File(uploadDir);
+    if (!desc.getParentFile().exists()) {
+      desc.getParentFile().mkdirs();
+    }
+  }
+
+  private static final String getPathFileName(String uploadDir, String fileName)
+      throws IOException {
+    int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
+    String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
+    String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
+    return pathFileName;
+  }
+
+  /**
+   * 缂栫爜鏂囦欢鍚�
+   */
+  private static final String encodingFilename(String fileName) {
+    fileName = fileName.replace("_", " ");
+    fileName = Md5Utils.hash(fileName + System.nanoTime() + counter++);
+    return fileName;
+  }
+
+  /**
+   * 鏂囦欢澶у皬鏍¢獙
+   *
+   * @param file 涓婁紶鐨勬枃浠�
+   * @return
+   * @throws FileSizeLimitExceededException 濡傛灉瓒呭嚭鏈�澶уぇ灏�
+   * @throws InvalidExtensionException
+   */
+  public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
+      throws FileSizeLimitExceededException, InvalidExtensionException {
+    long size = file.getSize();
+    if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) {
+      throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
+    }
+
+    String fileName = file.getOriginalFilename();
+    String extension = getExtension(file);
+    if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) {
+      if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) {
+        throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension,
+            extension,
+            fileName);
+      } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) {
+        throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension,
+            extension,
+            fileName);
+      } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) {
+        throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension,
+            extension,
+            fileName);
+      } else {
+        throw new InvalidExtensionException(allowedExtension, extension, fileName);
+      }
+    }
+
+  }
+
+  /**
+   * 鏂囦欢澶у皬鏍¢獙 涓嶆娴嬬被鍨�
+   *
+   * @param file 涓婁紶鐨勬枃浠�
+   * @return
+   * @throws FileSizeLimitExceededException 濡傛灉瓒呭嚭鏈�澶уぇ灏�
+   */
+  public static final void assertAllowedNoExtension(MultipartFile file)
+      throws FileSizeLimitExceededException {
+    long size = file.getSize();
+    if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) {
+      throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
+    }
+  }
+
+  /**
+   * 鍒ゆ柇MIME绫诲瀷鏄惁鏄厑璁哥殑MIME绫诲瀷
+   *
+   * @param extension
+   * @param allowedExtension
+   * @return
+   */
+  public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {
+    for (String str : allowedExtension) {
+      if (str.equalsIgnoreCase(extension)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * 鑾峰彇鏂囦欢鍚嶇殑鍚庣紑
+   *
+   * @param file 琛ㄥ崟鏂囦欢
+   * @return 鍚庣紑鍚�
+   */
+  public static final String getExtension(MultipartFile file) {
+    String extension = FilenameUtils.getExtension(file.getOriginalFilename());
+    if (StringUtils.isEmpty(extension)) {
+      extension = MimeTypeUtils.getExtension(file.getContentType());
+    }
+    return extension;
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUtils.java
new file mode 100644
index 0000000..00a2ac7
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/file/FileUtils.java
@@ -0,0 +1,175 @@
+package com.dingzhuo.energy.common.utils.file;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import javax.servlet.http.HttpServletRequest;
+import java.io.FileReader;
+import java.io.BufferedReader;
+/**
+ * 鏂囦欢澶勭悊宸ュ叿绫�
+ * 
+ * @author ruoyi
+ */
+public class FileUtils
+{
+    public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
+
+    /**
+     * 杈撳嚭鎸囧畾鏂囦欢鐨刡yte鏁扮粍
+     * 
+     * @param filePath 鏂囦欢璺緞
+     * @param os 杈撳嚭娴�
+     * @return
+     */
+    public static void writeBytes(String filePath, OutputStream os) throws IOException
+    {
+        FileInputStream fis = null;
+        try
+        {
+            File file = new File(filePath);
+            if (!file.exists())
+            {
+                throw new FileNotFoundException(filePath);
+            }
+            fis = new FileInputStream(file);
+            byte[] b = new byte[1024];
+            int length;
+            while ((length = fis.read(b)) > 0)
+            {
+                os.write(b, 0, length);
+            }
+        }
+        catch (IOException e)
+        {
+            throw e;
+        }
+        finally
+        {
+            if (os != null)
+            {
+                try
+                {
+                    os.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+            if (fis != null)
+            {
+                try
+                {
+                    fis.close();
+                }
+                catch (IOException e1)
+                {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍒犻櫎鏂囦欢
+     * 
+     * @param filePath 鏂囦欢
+     * @return
+     */
+    public static boolean deleteFile(String filePath)
+    {
+        boolean flag = false;
+        File file = new File(filePath);
+        // 璺緞涓烘枃浠朵笖涓嶄负绌哄垯杩涜鍒犻櫎
+        if (file.isFile() && file.exists())
+        {
+            file.delete();
+            flag = true;
+        }
+        return flag;
+    }
+
+    /**
+     * 鏂囦欢鍚嶇О楠岃瘉
+     * 
+     * @param filename 鏂囦欢鍚嶇О
+     * @return true 姝e父 false 闈炴硶
+     */
+    public static boolean isValidFilename(String filename)
+    {
+        return filename.matches(FILENAME_PATTERN);
+    }
+
+    /**
+     * 涓嬭浇鏂囦欢鍚嶉噸鏂扮紪鐮�
+     * 
+     * @param request 璇锋眰瀵硅薄
+     * @param fileName 鏂囦欢鍚�
+     * @return 缂栫爜鍚庣殑鏂囦欢鍚�
+     */
+    public static String setFileDownloadHeader(HttpServletRequest request, String fileName)
+            throws UnsupportedEncodingException
+    {
+        final String agent = request.getHeader("USER-AGENT");
+        String filename = fileName;
+        if (agent.contains("MSIE"))
+        {
+            // IE娴忚鍣�
+            filename = URLEncoder.encode(filename, "utf-8");
+            filename = filename.replace("+", " ");
+        }
+        else if (agent.contains("Firefox"))
+        {
+            // 鐏嫄娴忚鍣�
+            filename = new String(fileName.getBytes(), "ISO8859-1");
+        }
+        else if (agent.contains("Chrome"))
+        {
+            // google娴忚鍣�
+            filename = URLEncoder.encode(filename, "utf-8");
+        }
+        else
+        {
+            // 鍏跺畠娴忚鍣�
+            filename = URLEncoder.encode(filename, "utf-8");
+        }
+        return filename;
+    }
+
+    /**
+     * 璇诲彇鏂囦欢鍐呭
+     *
+     * @param fileName 鏂囦欢鍚�
+     * @return 杩斿洖鏂囨湰鍐呭
+     */
+    public static String readFileContent(String fileName) {
+        File file = new File(fileName);
+        BufferedReader reader = null;
+        StringBuffer sbf = new StringBuffer();
+        try {
+            reader = new BufferedReader(new FileReader(file));
+            String tempStr;
+            while ((tempStr = reader.readLine()) != null) {
+                sbf.append(tempStr);
+            }
+            reader.close();
+            return sbf.toString();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+        }
+        return sbf.toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/file/MimeTypeUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/file/MimeTypeUtils.java
new file mode 100644
index 0000000..cf93597
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/file/MimeTypeUtils.java
@@ -0,0 +1,55 @@
+package com.dingzhuo.energy.common.utils.file;
+
+/**
+ * 濯掍綋绫诲瀷宸ュ叿绫�
+ *
+ * @author ruoyi
+ */
+public class MimeTypeUtils
+{
+    public static final String IMAGE_PNG = "image/png";
+
+    public static final String IMAGE_JPG = "image/jpg";
+
+    public static final String IMAGE_JPEG = "image/jpeg";
+
+    public static final String IMAGE_BMP = "image/bmp";
+
+    public static final String IMAGE_GIF = "image/gif";
+
+    public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
+
+    public static final String[] FLASH_EXTENSION = { "swf", "flv" };
+
+    public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
+            "asf", "rm", "rmvb" };
+
+    public static final String[] DEFAULT_ALLOWED_EXTENSION = {
+            // 鍥剧墖
+            "bmp", "gif", "jpg", "jpeg", "png","svg",
+            // word excel powerpoint
+            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
+            // 鍘嬬缉鏂囦欢
+            "rar", "zip", "gz", "bz2",
+            // pdf
+            "pdf" };
+
+    public static String getExtension(String prefix)
+    {
+        switch (prefix)
+        {
+            case IMAGE_PNG:
+                return "png";
+            case IMAGE_JPG:
+                return "jpg";
+            case IMAGE_JPEG:
+                return "jpeg";
+            case IMAGE_BMP:
+                return "bmp";
+            case IMAGE_GIF:
+                return "gif";
+            default:
+                return "";
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/html/EscapeUtil.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/html/EscapeUtil.java
new file mode 100644
index 0000000..18c1134
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/html/EscapeUtil.java
@@ -0,0 +1,152 @@
+package com.dingzhuo.energy.common.utils.html;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 杞箟鍜屽弽杞箟宸ュ叿绫�
+ * 
+ * @author ruoyi
+ */
+public class EscapeUtil
+{
+    public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
+
+    private static final char[][] TEXT = new char[64][];
+
+    static
+    {
+        for (int i = 0; i < 64; i++)
+        {
+            TEXT[i] = new char[] { (char) i };
+        }
+
+        // special HTML characters
+        TEXT['\''] = "&#039;".toCharArray(); // 鍗曞紩鍙�
+        TEXT['"'] = "&#34;".toCharArray(); // 鍗曞紩鍙�
+        TEXT['&'] = "&#38;".toCharArray(); // &绗�
+        TEXT['<'] = "&#60;".toCharArray(); // 灏忎簬鍙�
+        TEXT['>'] = "&#62;".toCharArray(); // 澶т簬鍙�
+    }
+
+    /**
+     * 杞箟鏂囨湰涓殑HTML瀛楃涓哄畨鍏ㄧ殑瀛楃
+     * 
+     * @param text 琚浆涔夌殑鏂囨湰
+     * @return 杞箟鍚庣殑鏂囨湰
+     */
+    public static String escape(String text)
+    {
+        return encode(text);
+    }
+
+    /**
+     * 杩樺師琚浆涔夌殑HTML鐗规畩瀛楃
+     * 
+     * @param content 鍖呭惈杞箟绗︾殑HTML鍐呭
+     * @return 杞崲鍚庣殑瀛楃涓�
+     */
+    public static String unescape(String content)
+    {
+        return decode(content);
+    }
+
+    /**
+     * 娓呴櫎鎵�鏈塇TML鏍囩锛屼絾鏄笉鍒犻櫎鏍囩鍐呯殑鍐呭
+     * 
+     * @param content 鏂囨湰
+     * @return 娓呴櫎鏍囩鍚庣殑鏂囨湰
+     */
+    public static String clean(String content)
+    {
+        return new HTMLFilter().filter(content);
+    }
+
+    /**
+     * Escape缂栫爜
+     * 
+     * @param text 琚紪鐮佺殑鏂囨湰
+     * @return 缂栫爜鍚庣殑瀛楃
+     */
+    private static String encode(String text)
+    {
+        int len;
+        if ((text == null) || ((len = text.length()) == 0))
+        {
+            return StringUtils.EMPTY;
+        }
+        StringBuilder buffer = new StringBuilder(len + (len >> 2));
+        char c;
+        for (int i = 0; i < len; i++)
+        {
+            c = text.charAt(i);
+            if (c < 64)
+            {
+                buffer.append(TEXT[c]);
+            }
+            else
+            {
+                buffer.append(c);
+            }
+        }
+        return buffer.toString();
+    }
+
+    /**
+     * Escape瑙g爜
+     * 
+     * @param content 琚浆涔夌殑鍐呭
+     * @return 瑙g爜鍚庣殑瀛楃涓�
+     */
+    public static String decode(String content)
+    {
+        if (StringUtils.isEmpty(content))
+        {
+            return content;
+        }
+
+        StringBuilder tmp = new StringBuilder(content.length());
+        int lastPos = 0, pos = 0;
+        char ch;
+        while (lastPos < content.length())
+        {
+            pos = content.indexOf("%", lastPos);
+            if (pos == lastPos)
+            {
+                if (content.charAt(pos + 1) == 'u')
+                {
+                    ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
+                    tmp.append(ch);
+                    lastPos = pos + 6;
+                }
+                else
+                {
+                    ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
+                    tmp.append(ch);
+                    lastPos = pos + 3;
+                }
+            }
+            else
+            {
+                if (pos == -1)
+                {
+                    tmp.append(content.substring(lastPos));
+                    lastPos = content.length();
+                }
+                else
+                {
+                    tmp.append(content, lastPos, pos);
+                    lastPos = pos;
+                }
+            }
+        }
+        return tmp.toString();
+    }
+
+    public static void main(String[] args)
+    {
+        String html = "<script>alert(1);</script>";
+        System.out.println(EscapeUtil.clean(html));
+        System.out.println(EscapeUtil.escape(html));
+        System.out.println(EscapeUtil.unescape(html));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/html/HTMLFilter.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/html/HTMLFilter.java
new file mode 100644
index 0000000..aff699a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/html/HTMLFilter.java
@@ -0,0 +1,569 @@
+package com.dingzhuo.energy.common.utils.html;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * HTML杩囨护鍣紝鐢ㄤ簬鍘婚櫎XSS婕忔礊闅愭偅銆�
+ *
+ * @author ruoyi
+ */
+public final class HTMLFilter
+{
+    /**
+     * regex flag union representing /si modifiers in php
+     **/
+    private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
+    private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);
+    private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);
+    private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);
+    private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
+    private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);
+    private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);
+    private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);
+    private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
+    private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");
+    private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");
+    private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
+    private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");
+    private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
+    private static final Pattern P_END_ARROW = Pattern.compile("^>");
+    private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");
+    private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");
+    private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");
+    private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");
+    private static final Pattern P_AMP = Pattern.compile("&");
+    private static final Pattern P_QUOTE = Pattern.compile("\"");
+    private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
+    private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
+    private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
+
+    // @xxx could grow large... maybe use sesat's ReferenceMap
+    private static final ConcurrentMap<String, Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>();
+    private static final ConcurrentMap<String, Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>();
+
+    /**
+     * set of allowed html elements, along with allowed attributes for each element
+     **/
+    private final Map<String, List<String>> vAllowed;
+    /**
+     * counts of open tags for each (allowable) html element
+     **/
+    private final Map<String, Integer> vTagCounts = new HashMap<>();
+
+    /**
+     * html elements which must always be self-closing (e.g. "<img />")
+     **/
+    private final String[] vSelfClosingTags;
+    /**
+     * html elements which must always have separate opening and closing tags (e.g. "<b></b>")
+     **/
+    private final String[] vNeedClosingTags;
+    /**
+     * set of disallowed html elements
+     **/
+    private final String[] vDisallowed;
+    /**
+     * attributes which should be checked for valid protocols
+     **/
+    private final String[] vProtocolAtts;
+    /**
+     * allowed protocols
+     **/
+    private final String[] vAllowedProtocols;
+    /**
+     * tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />")
+     **/
+    private final String[] vRemoveBlanks;
+    /**
+     * entities allowed within html markup
+     **/
+    private final String[] vAllowedEntities;
+    /**
+     * flag determining whether comments are allowed in input String.
+     */
+    private final boolean stripComment;
+    private final boolean encodeQuotes;
+    /**
+     * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "<b text </b>"
+     * becomes "<b> text </b>"). If set to false, unbalanced angle brackets will be html escaped.
+     */
+    private final boolean alwaysMakeTags;
+
+    /**
+     * Default constructor.
+     */
+    public HTMLFilter()
+    {
+        vAllowed = new HashMap<>();
+
+        final ArrayList<String> a_atts = new ArrayList<>();
+        a_atts.add("href");
+        a_atts.add("target");
+        vAllowed.put("a", a_atts);
+
+        final ArrayList<String> img_atts = new ArrayList<>();
+        img_atts.add("src");
+        img_atts.add("width");
+        img_atts.add("height");
+        img_atts.add("alt");
+        vAllowed.put("img", img_atts);
+
+        final ArrayList<String> no_atts = new ArrayList<>();
+        vAllowed.put("b", no_atts);
+        vAllowed.put("strong", no_atts);
+        vAllowed.put("i", no_atts);
+        vAllowed.put("em", no_atts);
+
+        vSelfClosingTags = new String[] { "img" };
+        vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" };
+        vDisallowed = new String[] {};
+        vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp.
+        vProtocolAtts = new String[] { "src", "href" };
+        vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" };
+        vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" };
+        stripComment = true;
+        encodeQuotes = true;
+        alwaysMakeTags = true;
+    }
+
+    /**
+     * Map-parameter configurable constructor.
+     *
+     * @param conf map containing configuration. keys match field names.
+     */
+    @SuppressWarnings("unchecked")
+    public HTMLFilter(final Map<String, Object> conf)
+    {
+
+        assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
+        assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
+        assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
+        assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
+        assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
+        assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
+        assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
+        assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
+
+        vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));
+        vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
+        vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
+        vDisallowed = (String[]) conf.get("vDisallowed");
+        vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
+        vProtocolAtts = (String[]) conf.get("vProtocolAtts");
+        vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
+        vAllowedEntities = (String[]) conf.get("vAllowedEntities");
+        stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
+        encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
+        alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
+    }
+
+    private void reset()
+    {
+        vTagCounts.clear();
+    }
+
+    // ---------------------------------------------------------------
+    // my versions of some PHP library functions
+    public static String chr(final int decimal)
+    {
+        return String.valueOf((char) decimal);
+    }
+
+    public static String htmlSpecialChars(final String s)
+    {
+        String result = s;
+        result = regexReplace(P_AMP, "&amp;", result);
+        result = regexReplace(P_QUOTE, "&quot;", result);
+        result = regexReplace(P_LEFT_ARROW, "&lt;", result);
+        result = regexReplace(P_RIGHT_ARROW, "&gt;", result);
+        return result;
+    }
+
+    // ---------------------------------------------------------------
+
+    /**
+     * given a user submitted input String, filter out any invalid or restricted html.
+     *
+     * @param input text (i.e. submitted by a user) than may contain html
+     * @return "clean" version of input, with only valid, whitelisted html elements allowed
+     */
+    public String filter(final String input)
+    {
+        reset();
+        String s = input;
+
+        s = escapeComments(s);
+
+        s = balanceHTML(s);
+
+        s = checkTags(s);
+
+        s = processRemoveBlanks(s);
+
+        s = validateEntities(s);
+
+        return s;
+    }
+
+    public boolean isAlwaysMakeTags()
+    {
+        return alwaysMakeTags;
+    }
+
+    public boolean isStripComments()
+    {
+        return stripComment;
+    }
+
+    private String escapeComments(final String s)
+    {
+        final Matcher m = P_COMMENTS.matcher(s);
+        final StringBuffer buf = new StringBuffer();
+        if (m.find())
+        {
+            final String match = m.group(1); // (.*?)
+            m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
+        }
+        m.appendTail(buf);
+
+        return buf.toString();
+    }
+
+    private String balanceHTML(String s)
+    {
+        if (alwaysMakeTags)
+        {
+            //
+            // try and form html
+            //
+            s = regexReplace(P_END_ARROW, "", s);
+            s = regexReplace(P_BODY_TO_END, "<$1>", s);
+            s = regexReplace(P_XML_CONTENT, "$1<$2", s);
+
+        }
+        else
+        {
+            //
+            // escape stray brackets
+            //
+            s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);
+            s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);
+
+            //
+            // the last regexp causes '<>' entities to appear
+            // (we need to do a lookahead assertion so that the last bracket can
+            // be used in the next pass of the regexp)
+            //
+            s = regexReplace(P_BOTH_ARROWS, "", s);
+        }
+
+        return s;
+    }
+
+    private String checkTags(String s)
+    {
+        Matcher m = P_TAGS.matcher(s);
+
+        final StringBuffer buf = new StringBuffer();
+        while (m.find())
+        {
+            String replaceStr = m.group(1);
+            replaceStr = processTag(replaceStr);
+            m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
+        }
+        m.appendTail(buf);
+
+        // these get tallied in processTag
+        // (remember to reset before subsequent calls to filter method)
+        final StringBuilder sBuilder = new StringBuilder(buf.toString());
+        for (String key : vTagCounts.keySet())
+        {
+            for (int ii = 0; ii < vTagCounts.get(key); ii++)
+            {
+                sBuilder.append("</").append(key).append(">");
+            }
+        }
+        s = sBuilder.toString();
+
+        return s;
+    }
+
+    private String processRemoveBlanks(final String s)
+    {
+        String result = s;
+        for (String tag : vRemoveBlanks)
+        {
+            if (!P_REMOVE_PAIR_BLANKS.containsKey(tag))
+            {
+                P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
+            }
+            result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
+            if (!P_REMOVE_SELF_BLANKS.containsKey(tag))
+            {
+                P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
+            }
+            result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
+        }
+
+        return result;
+    }
+
+    private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s)
+    {
+        Matcher m = regex_pattern.matcher(s);
+        return m.replaceAll(replacement);
+    }
+
+    private String processTag(final String s)
+    {
+        // ending tags
+        Matcher m = P_END_TAG.matcher(s);
+        if (m.find())
+        {
+            final String name = m.group(1).toLowerCase();
+            if (allowed(name))
+            {
+                if (false == inArray(name, vSelfClosingTags))
+                {
+                    if (vTagCounts.containsKey(name))
+                    {
+                        vTagCounts.put(name, vTagCounts.get(name) - 1);
+                        return "</" + name + ">";
+                    }
+                }
+            }
+        }
+
+        // starting tags
+        m = P_START_TAG.matcher(s);
+        if (m.find())
+        {
+            final String name = m.group(1).toLowerCase();
+            final String body = m.group(2);
+            String ending = m.group(3);
+
+            // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
+            if (allowed(name))
+            {
+                final StringBuilder params = new StringBuilder();
+
+                final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
+                final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
+                final List<String> paramNames = new ArrayList<>();
+                final List<String> paramValues = new ArrayList<>();
+                while (m2.find())
+                {
+                    paramNames.add(m2.group(1)); // ([a-z0-9]+)
+                    paramValues.add(m2.group(3)); // (.*?)
+                }
+                while (m3.find())
+                {
+                    paramNames.add(m3.group(1)); // ([a-z0-9]+)
+                    paramValues.add(m3.group(3)); // ([^\"\\s']+)
+                }
+
+                String paramName, paramValue;
+                for (int ii = 0; ii < paramNames.size(); ii++)
+                {
+                    paramName = paramNames.get(ii).toLowerCase();
+                    paramValue = paramValues.get(ii);
+
+                    // debug( "paramName='" + paramName + "'" );
+                    // debug( "paramValue='" + paramValue + "'" );
+                    // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
+
+                    if (allowedAttribute(name, paramName))
+                    {
+                        if (inArray(paramName, vProtocolAtts))
+                        {
+                            paramValue = processParamProtocol(paramValue);
+                        }
+                        params.append(' ').append(paramName).append("=\"").append(paramValue).append("\"");
+                    }
+                }
+
+                if (inArray(name, vSelfClosingTags))
+                {
+                    ending = " /";
+                }
+
+                if (inArray(name, vNeedClosingTags))
+                {
+                    ending = "";
+                }
+
+                if (ending == null || ending.length() < 1)
+                {
+                    if (vTagCounts.containsKey(name))
+                    {
+                        vTagCounts.put(name, vTagCounts.get(name) + 1);
+                    }
+                    else
+                    {
+                        vTagCounts.put(name, 1);
+                    }
+                }
+                else
+                {
+                    ending = " /";
+                }
+                return "<" + name + params + ending + ">";
+            }
+            else
+            {
+                return "";
+            }
+        }
+
+        // comments
+        m = P_COMMENT.matcher(s);
+        if (!stripComment && m.find())
+        {
+            return "<" + m.group() + ">";
+        }
+
+        return "";
+    }
+
+    private String processParamProtocol(String s)
+    {
+        s = decodeEntities(s);
+        final Matcher m = P_PROTOCOL.matcher(s);
+        if (m.find())
+        {
+            final String protocol = m.group(1);
+            if (!inArray(protocol, vAllowedProtocols))
+            {
+                // bad protocol, turn into local anchor link instead
+                s = "#" + s.substring(protocol.length() + 1);
+                if (s.startsWith("#//"))
+                {
+                    s = "#" + s.substring(3);
+                }
+            }
+        }
+
+        return s;
+    }
+
+    private String decodeEntities(String s)
+    {
+        StringBuffer buf = new StringBuffer();
+
+        Matcher m = P_ENTITY.matcher(s);
+        while (m.find())
+        {
+            final String match = m.group(1);
+            final int decimal = Integer.decode(match).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        buf = new StringBuffer();
+        m = P_ENTITY_UNICODE.matcher(s);
+        while (m.find())
+        {
+            final String match = m.group(1);
+            final int decimal = Integer.valueOf(match, 16).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        buf = new StringBuffer();
+        m = P_ENCODE.matcher(s);
+        while (m.find())
+        {
+            final String match = m.group(1);
+            final int decimal = Integer.valueOf(match, 16).intValue();
+            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
+        }
+        m.appendTail(buf);
+        s = buf.toString();
+
+        s = validateEntities(s);
+        return s;
+    }
+
+    private String validateEntities(final String s)
+    {
+        StringBuffer buf = new StringBuffer();
+
+        // validate entities throughout the string
+        Matcher m = P_VALID_ENTITIES.matcher(s);
+        while (m.find())
+        {
+            final String one = m.group(1); // ([^&;]*)
+            final String two = m.group(2); // (?=(;|&|$))
+            m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
+        }
+        m.appendTail(buf);
+
+        return encodeQuotes(buf.toString());
+    }
+
+    private String encodeQuotes(final String s)
+    {
+        if (encodeQuotes)
+        {
+            StringBuffer buf = new StringBuffer();
+            Matcher m = P_VALID_QUOTES.matcher(s);
+            while (m.find())
+            {
+                final String one = m.group(1); // (>|^)
+                final String two = m.group(2); // ([^<]+?)
+                final String three = m.group(3); // (<|$)
+                // 涓嶆浛鎹㈠弻寮曞彿涓�&quot;锛岄槻姝son鏍煎紡鏃犳晥 regexReplace(P_QUOTE, "&quot;", two)
+                m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three));
+            }
+            m.appendTail(buf);
+            return buf.toString();
+        }
+        else
+        {
+            return s;
+        }
+    }
+
+    private String checkEntity(final String preamble, final String term)
+    {
+
+        return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&amp;" + preamble;
+    }
+
+    private boolean isValidEntity(final String entity)
+    {
+        return inArray(entity, vAllowedEntities);
+    }
+
+    private static boolean inArray(final String s, final String[] array)
+    {
+        for (String item : array)
+        {
+            if (item != null && item.equals(s))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean allowed(final String name)
+    {
+        return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
+    }
+
+    private boolean allowedAttribute(final String name, final String paramName)
+    {
+        return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/http/HttpUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/http/HttpUtils.java
new file mode 100644
index 0000000..4d32110
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/http/HttpUtils.java
@@ -0,0 +1,249 @@
+package com.dingzhuo.energy.common.utils.http;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.ConnectException;
+import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.charset.StandardCharsets;
+import java.security.cert.X509Certificate;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 閫氱敤http鍙戦�佹柟娉�
+ * 
+ * @author ruoyi
+ */
+public class HttpUtils
+{
+    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
+
+    /**
+     * 鍚戞寚瀹� URL 鍙戦�丟ET鏂规硶鐨勮姹�
+     *
+     * @param url 鍙戦�佽姹傜殑 URL
+     * @param param 璇锋眰鍙傛暟锛岃姹傚弬鏁板簲璇ユ槸 name1=value1&name2=value2 鐨勫舰寮忋��
+     * @return 鎵�浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋�
+     */
+    public static String sendGet(String url, String param)
+    {
+        StringBuilder result = new StringBuilder();
+        BufferedReader in = null;
+        try
+        {
+            String urlNameString = url + "?" + param;
+            log.info("sendGet - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+            URLConnection connection = realUrl.openConnection();
+            connection.setRequestProperty("accept", "*/*");
+            connection.setRequestProperty("connection", "Keep-Alive");
+            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            connection.connect();
+            in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null)
+            {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        }
+        catch (ConnectException e)
+        {
+            log.error("璋冪敤HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("璋冪敤HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("璋冪敤HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("璋冪敤HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
+        }
+        finally
+        {
+            try
+            {
+                if (in != null)
+                {
+                    in.close();
+                }
+            }
+            catch (Exception ex)
+            {
+                log.error("璋冪敤in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
+    /**
+     * 鍚戞寚瀹� URL 鍙戦�丳OST鏂规硶鐨勮姹�
+     *
+     * @param url 鍙戦�佽姹傜殑 URL
+     * @param param 璇锋眰鍙傛暟锛岃姹傚弬鏁板簲璇ユ槸 name1=value1&name2=value2 鐨勫舰寮忋��
+     * @return 鎵�浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋�
+     */
+    public static String sendPost(String url, String param)
+    {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try
+        {
+            String urlNameString = url + "?" + param;
+            log.info("sendPost - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("contentType", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
+            String line;
+            while ((line = in.readLine()) != null)
+            {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        }
+        catch (ConnectException e)
+        {
+            log.error("璋冪敤HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("璋冪敤HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("璋冪敤HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("璋冪敤HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        }
+        finally
+        {
+            try
+            {
+                if (out != null)
+                {
+                    out.close();
+                }
+                if (in != null)
+                {
+                    in.close();
+                }
+            }
+            catch (IOException ex)
+            {
+                log.error("璋冪敤in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
+    public static String sendSSLPost(String url, String param)
+    {
+        StringBuilder result = new StringBuilder();
+        String urlNameString = url + "?" + param;
+        try
+        {
+            log.info("sendSSLPost - {}", urlNameString);
+            SSLContext sc = SSLContext.getInstance("SSL");
+            sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
+            URL console = new URL(urlNameString);
+            HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("contentType", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+
+            conn.setSSLSocketFactory(sc.getSocketFactory());
+            conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
+            conn.connect();
+            InputStream is = conn.getInputStream();
+            BufferedReader br = new BufferedReader(new InputStreamReader(is));
+            String ret = "";
+            while ((ret = br.readLine()) != null)
+            {
+                if (ret != null && !ret.trim().equals(""))
+                {
+                    result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
+                }
+            }
+            log.info("recv - {}", result);
+            conn.disconnect();
+            br.close();
+        }
+        catch (ConnectException e)
+        {
+            log.error("璋冪敤HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("璋冪敤HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("璋冪敤HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("璋冪敤HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
+        }
+        return result.toString();
+    }
+
+    private static class TrustAnyTrustManager implements X509TrustManager
+    {
+        @Override
+        public void checkClientTrusted(X509Certificate[] chain, String authType)
+        {
+        }
+
+        @Override
+        public void checkServerTrusted(X509Certificate[] chain, String authType)
+        {
+        }
+
+        @Override
+        public X509Certificate[] getAcceptedIssuers()
+        {
+            return new X509Certificate[] {};
+        }
+    }
+
+    private static class TrustAnyHostnameVerifier implements HostnameVerifier
+    {
+        @Override
+        public boolean verify(String hostname, SSLSession session)
+        {
+            return true;
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/ip/AddressUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/ip/AddressUtils.java
new file mode 100644
index 0000000..7ec7ef8
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/ip/AddressUtils.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.common.utils.ip;
+
+import com.dingzhuo.energy.common.utils.http.HttpUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.http.HttpUtils;
+
+/**
+ * 鑾峰彇鍦板潃绫�
+ * 
+ * @author ruoyi
+ */
+public class AddressUtils
+{
+    private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
+
+    public static final String IP_URL = "http://ip.taobao.com/service/getIpInfo.php";
+
+    public static String getRealAddressByIP(String ip)
+    {
+        String address = "XX XX";
+        // 鍐呯綉涓嶆煡璇�
+        if (IpUtils.internalIp(ip))
+        {
+            return "鍐呯綉IP";
+        }
+        String rspStr = HttpUtils.sendPost(IP_URL, "ip=" + ip);
+        if (StringUtils.isEmpty(rspStr))
+        {
+            log.error("鑾峰彇鍦扮悊浣嶇疆寮傚父 {}", ip);
+            return address;
+        }
+        JSONObject obj = JSONObject.parseObject(rspStr);
+        JSONObject data = obj.getObject("data", JSONObject.class);
+        String region = data.getString("region");
+        String city = data.getString("city");
+        address = region + " " + city;
+        return address;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/ip/IpUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/ip/IpUtils.java
new file mode 100644
index 0000000..e4fd09f
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/ip/IpUtils.java
@@ -0,0 +1,189 @@
+package com.dingzhuo.energy.common.utils.ip;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import javax.servlet.http.HttpServletRequest;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 鑾峰彇IP鏂规硶
+ * 
+ * @author ruoyi
+ */
+public class IpUtils
+{
+    public static String getIpAddr(HttpServletRequest request)
+    {
+        if (request == null)
+        {
+            return "unknown";
+        }
+        String ip = request.getHeader("x-forwarded-for");
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("X-Forwarded-For");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getHeader("X-Real-IP");
+        }
+
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
+        {
+            ip = request.getRemoteAddr();
+        }
+
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;
+    }
+
+    public static boolean internalIp(String ip)
+    {
+        byte[] addr = textToNumericFormatV4(ip);
+        return internalIp(addr) || "127.0.0.1".equals(ip);
+    }
+
+    private static boolean internalIp(byte[] addr)
+    {
+        if (StringUtils.isNull(addr) || addr.length < 2)
+        {
+            return true;
+        }
+        final byte b0 = addr[0];
+        final byte b1 = addr[1];
+        // 10.x.x.x/8
+        final byte SECTION_1 = 0x0A;
+        // 172.16.x.x/12
+        final byte SECTION_2 = (byte) 0xAC;
+        final byte SECTION_3 = (byte) 0x10;
+        final byte SECTION_4 = (byte) 0x1F;
+        // 192.168.x.x/16
+        final byte SECTION_5 = (byte) 0xC0;
+        final byte SECTION_6 = (byte) 0xA8;
+        switch (b0)
+        {
+            case SECTION_1:
+                return true;
+            case SECTION_2:
+                if (b1 >= SECTION_3 && b1 <= SECTION_4)
+                {
+                    return true;
+                }
+            case SECTION_5:
+                switch (b1)
+                {
+                    case SECTION_6:
+                        return true;
+                }
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 灏咺Pv4鍦板潃杞崲鎴愬瓧鑺�
+     * 
+     * @param text IPv4鍦板潃
+     * @return byte 瀛楄妭
+     */
+    public static byte[] textToNumericFormatV4(String text)
+    {
+        if (text.length() == 0)
+        {
+            return null;
+        }
+
+        byte[] bytes = new byte[4];
+        String[] elements = text.split("\\.", -1);
+        try
+        {
+            long l;
+            int i;
+            switch (elements.length)
+            {
+                case 1:
+                    l = Long.parseLong(elements[0]);
+                    if ((l < 0L) || (l > 4294967295L))
+                        return null;
+                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
+                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 2:
+                    l = Integer.parseInt(elements[0]);
+                    if ((l < 0L) || (l > 255L))
+                        return null;
+                    bytes[0] = (byte) (int) (l & 0xFF);
+                    l = Integer.parseInt(elements[1]);
+                    if ((l < 0L) || (l > 16777215L))
+                        return null;
+                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 3:
+                    for (i = 0; i < 2; ++i)
+                    {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L))
+                            return null;
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    l = Integer.parseInt(elements[2]);
+                    if ((l < 0L) || (l > 65535L))
+                        return null;
+                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 4:
+                    for (i = 0; i < 4; ++i)
+                    {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L))
+                            return null;
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    break;
+                default:
+                    return null;
+            }
+        }
+        catch (NumberFormatException e)
+        {
+            return null;
+        }
+        return bytes;
+    }
+
+    public static String getHostIp()
+    {
+        try
+        {
+            return InetAddress.getLocalHost().getHostAddress();
+        }
+        catch (UnknownHostException e)
+        {
+        }
+        return "127.0.0.1";
+    }
+
+    public static String getHostName()
+    {
+        try
+        {
+            return InetAddress.getLocalHost().getHostName();
+        }
+        catch (UnknownHostException e)
+        {
+        }
+        return "鏈煡";
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/poi/Comprehensive.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/poi/Comprehensive.java
new file mode 100644
index 0000000..3643d2c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/poi/Comprehensive.java
@@ -0,0 +1,387 @@
+package com.dingzhuo.energy.common.utils.poi;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public class Comprehensive implements Serializable {
+    private static final long serialVersionUID = -2777479013884125925L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "1")
+    private Double value1;
+    @Excel(name = "2")
+    private Double value2;
+    @Excel(name = "3")
+    private Double value3;
+    @Excel(name = "4")
+    private Double value4;
+    @Excel(name = "5")
+    private Double value5;
+    @Excel(name = "6")
+    private Double value6;
+    @Excel(name = "7")
+    private Double value7;
+    @Excel(name = "8")
+    private Double value8;
+    @Excel(name = "9")
+    private Double value9;
+    @Excel(name = "10")
+    private Double value10;
+    @Excel(name = "11")
+    private Double value11;
+    @Excel(name = "12")
+    private Double value12;
+    @Excel(name = "13")
+    private Double value13;
+    @Excel(name = "14")
+    private Double value14;
+    @Excel(name = "15")
+    private Double value15;
+    @Excel(name = "16")
+    private Double value16;
+    @Excel(name = "17")
+    private Double value17;
+    @Excel(name = "18")
+    private Double value18;
+    @Excel(name = "19")
+    private Double value19;
+    @Excel(name = "20")
+    private Double value20;
+    @Excel(name = "21")
+    private Double value21;
+    @Excel(name = "22")
+    private Double value22;
+    @Excel(name = "23")
+    private Double value23;
+    @Excel(name = "24")
+    private Double value24;
+    @Excel(name = "25")
+    private Double value25;
+    @Excel(name = "16")
+    private Double value26;
+    @Excel(name = "27")
+    private Double value27;
+    @Excel(name = "28")
+    private Double value28;
+    @Excel(name = "29")
+    private Double value29;
+    @Excel(name = "30")
+    private Double value30;
+    @Excel(name = "31")
+    private Double value31;
+    private List<Map> tablehead = new ArrayList<>();
+    private List<Comprehensive> tabledata = new ArrayList<>();
+
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue24() {
+        return value24;
+    }
+
+    public void setValue24(Double value24) {
+        this.value24 = value24;
+    }
+
+    public Double getValue25() {
+        return value25;
+    }
+
+    public void setValue25(Double value25) {
+        this.value25 = value25;
+    }
+
+    public Double getValue26() {
+        return value26;
+    }
+
+    public void setValue26(Double value26) {
+        this.value26 = value26;
+    }
+
+    public Double getValue27() {
+        return value27;
+    }
+
+    public void setValue27(Double value27) {
+        this.value27 = value27;
+    }
+
+    public Double getValue28() {
+        return value28;
+    }
+
+    public void setValue28(Double value28) {
+        this.value28 = value28;
+    }
+
+    public Double getValue29() {
+        return value29;
+    }
+
+    public void setValue29(Double value29) {
+        this.value29 = value29;
+    }
+
+    public Double getValue30() {
+        return value30;
+    }
+
+    public void setValue30(Double value30) {
+        this.value30 = value30;
+    }
+
+    public Double getValue31() {
+        return value31;
+    }
+
+    public void setValue31(Double value31) {
+        this.value31 = value31;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+
+    public List<Comprehensive> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<Comprehensive> tabledata) {
+        this.tabledata = tabledata;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/poi/ExcelUtil.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/poi/ExcelUtil.java
new file mode 100644
index 0000000..0140757
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/poi/ExcelUtil.java
@@ -0,0 +1,934 @@
+package com.dingzhuo.energy.common.utils.poi;
+
+import com.dingzhuo.energy.common.core.text.Convert;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.reflect.ReflectUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excels;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.poi.hssf.usermodel.HSSFDateUtil;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.charts.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+
+import java.io.*;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
+import java.util.*;
+
+/**
+ * Excel鐩稿叧澶勭悊
+ *
+ * @author ruoyi
+ */
+public class ExcelUtil<T> {
+
+    private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
+
+    /**
+     * Excel sheet鏈�澶ц鏁帮紝榛樿65536
+     */
+    public static final int sheetSize = 65536;
+
+    /**
+     * 宸ヤ綔琛ㄥ悕绉�
+     */
+    private String sheetName;
+
+    /**
+     * 瀵煎嚭绫诲瀷锛圗XPORT:瀵煎嚭鏁版嵁锛汭MPORT锛氬鍏ユā鏉匡級
+     */
+    private Excel.Type type;
+
+    /**
+     * 宸ヤ綔钖勫璞�
+     */
+    private Workbook wb;
+
+    /**
+     * 宸ヤ綔琛ㄥ璞�
+     */
+    private Sheet sheet;
+
+    /**
+     * 鏍峰紡鍒楄〃
+     */
+    private Map<String, CellStyle> styles;
+
+    /**
+     * 瀵煎叆瀵煎嚭鏁版嵁鍒楄〃
+     */
+    private List<T> list;
+
+    /**
+     * 娉ㄨВ鍒楄〃
+     */
+    private List<Object[]> fields;
+
+    /**
+     * 瀹炰綋瀵硅薄
+     */
+    public Class<T> clazz;
+
+    public ExcelUtil(Class<T> clazz) {
+        this.clazz = clazz;
+    }
+
+    public void init(List<T> list, String sheetName, Excel.Type type) {
+        if (list == null) {
+            list = new ArrayList<T>();
+        }
+        this.list = list;
+        this.sheetName = sheetName;
+        this.type = type;
+        createExcelField();
+        createWorkbook();
+    }
+
+    /**
+     * 瀵筫xcel琛ㄥ崟榛樿绗竴涓储寮曞悕杞崲鎴恖ist
+     *
+     * @param is 杈撳叆娴�
+     * @return 杞崲鍚庨泦鍚�
+     */
+    public List<T> importExcel(InputStream is) throws Exception {
+        return importExcel(StringUtils.EMPTY, is);
+    }
+
+    /**
+     * 瀵筫xcel琛ㄥ崟鎸囧畾琛ㄦ牸绱㈠紩鍚嶈浆鎹㈡垚list
+     *
+     * @param sheetName 琛ㄦ牸绱㈠紩鍚�
+     * @param is        杈撳叆娴�
+     * @return 杞崲鍚庨泦鍚�
+     */
+    public List<T> importExcel(String sheetName, InputStream is) throws Exception {
+        this.type = Excel.Type.IMPORT;
+        this.wb = WorkbookFactory.create(is);
+        List<T> list = new ArrayList<T>();
+        Sheet sheet = null;
+        if (StringUtils.isNotEmpty(sheetName)) {
+            // 濡傛灉鎸囧畾sheet鍚�,鍒欏彇鎸囧畾sheet涓殑鍐呭.
+            sheet = wb.getSheet(sheetName);
+        } else {
+            // 濡傛灉浼犲叆鐨剆heet鍚嶄笉瀛樺湪鍒欓粯璁ゆ寚鍚戠1涓猻heet.
+            sheet = wb.getSheetAt(0);
+        }
+
+        if (sheet == null) {
+            throw new IOException("鏂囦欢sheet涓嶅瓨鍦�");
+        }
+
+        int rows = sheet.getPhysicalNumberOfRows();
+
+        if (rows > 0) {
+            // 瀹氫箟涓�涓猰ap鐢ㄤ簬瀛樻斁excel鍒楃殑搴忓彿鍜宖ield.
+            Map<String, Integer> cellMap = new HashMap<String, Integer>();
+            // 鑾峰彇琛ㄥご
+            Row heard = sheet.getRow(0);
+            for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) {
+                Cell cell = heard.getCell(i);
+                if (StringUtils.isNotNull(cell != null)) {
+                    String value = this.getCellValue(heard, i).toString();
+                    cellMap.put(value, i);
+                } else {
+                    cellMap.put(null, i);
+                }
+            }
+            // 鏈夋暟鎹椂鎵嶅鐞� 寰楀埌绫荤殑鎵�鏈塮ield.
+            Field[] allFields = clazz.getDeclaredFields();
+            // 瀹氫箟涓�涓猰ap鐢ㄤ簬瀛樻斁鍒楃殑搴忓彿鍜宖ield.
+            Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>();
+            for (int col = 0; col < allFields.length; col++) {
+                Field field = allFields[col];
+                Excel attr = field.getAnnotation(Excel.class);
+                if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) {
+                    // 璁剧疆绫荤殑绉佹湁瀛楁灞炴�у彲璁块棶.
+                    field.setAccessible(true);
+                    Integer column = cellMap.get(attr.name());
+                    fieldsMap.put(column, field);
+                }
+            }
+            for (int i = 1; i < rows; i++) {
+                // 浠庣2琛屽紑濮嬪彇鏁版嵁,榛樿绗竴琛屾槸琛ㄥご.
+                Row row = sheet.getRow(i);
+                T entity = null;
+                for (Map.Entry<Integer, Field> entry : fieldsMap.entrySet()) {
+                    Object val = this.getCellValue(row, entry.getKey());
+
+                    // 濡傛灉涓嶅瓨鍦ㄥ疄渚嬪垯鏂板缓.
+                    entity = (entity == null ? clazz.newInstance() : entity);
+                    // 浠巑ap涓緱鍒板搴斿垪鐨刦ield.
+                    Field field = fieldsMap.get(entry.getKey());
+                    // 鍙栧緱绫诲瀷,骞舵牴鎹璞$被鍨嬭缃��.
+                    Class<?> fieldType = field.getType();
+                    if (String.class == fieldType) {
+                        String s = Convert.toStr(val);
+                        if (StringUtils.endsWith(s, ".0")) {
+                            val = StringUtils.substringBefore(s, ".0");
+                        } else {
+                            val = Convert.toStr(val);
+                        }
+                    } else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) {
+                        val = Convert.toInt(val);
+                    } else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {
+                        val = Convert.toLong(val);
+                    } else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) {
+                        val = Convert.toDouble(val);
+                    } else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) {
+                        val = Convert.toFloat(val);
+                    } else if (BigDecimal.class == fieldType) {
+                        val = Convert.toBigDecimal(val);
+                    } else if (Date.class == fieldType) {
+                        if (val instanceof String) {
+                            val = DateUtils.parseDate(val);
+                        } else if (val instanceof Double) {
+                            val = DateUtil.getJavaDate((Double) val);
+                        }
+                    }
+
+                    if (StringUtils.isNotNull(fieldType)) {
+                        Excel attr = field.getAnnotation(Excel.class);
+                        String propertyName = field.getName();
+                        if (StringUtils.isNotEmpty(attr.targetAttr())) {
+                            propertyName = field.getName() + "." + attr.targetAttr();
+                        } else if (StringUtils.isNotEmpty(attr.readConverterExp())) {
+                            val = reverseByExp(String.valueOf(val), attr.readConverterExp());
+                        }
+                        ReflectUtils.invokeSetter(entity, propertyName, val);
+                    }
+                }
+                list.add(entity);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟
+     *
+     * @param list      瀵煎嚭鏁版嵁闆嗗悎
+     * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О
+     * @return 缁撴灉
+     */
+    public AjaxResult exportExcel(List<T> list, String sheetName) {
+        this.init(list, sheetName, Excel.Type.EXPORT);
+        return exportRealTimeDataExcelZHZB();
+    }
+
+    public AjaxResult exportRealTimeDataExcel(List<T> list, String sheetName) {
+        this.init(list, sheetName, Excel.Type.EXPORT);
+        return exportRealTimeDataExcel();
+    }
+
+    /**
+     * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟
+     *
+     * @param sheetName 宸ヤ綔琛ㄧ殑鍚嶇О
+     * @return 缁撴灉
+     */
+    public AjaxResult importTemplateExcel(String sheetName) {
+        this.init(null, sheetName, Excel.Type.IMPORT);
+        return exportRealTimeDataExcelZHZB();
+    }
+
+    /**
+     * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟
+     *
+     * @return 缁撴灉
+     */
+    public AjaxResult exportExcel() {
+        OutputStream out = null;
+        try {
+            // 鍙栧嚭涓�鍏辨湁澶氬皯涓猻heet.
+            double sheetNo = Math.ceil(list.size() / sheetSize);
+            for (int index = 0; index <= sheetNo; index++) {
+                createSheet(sheetNo, index);
+
+                // 浜х敓涓�琛�
+                Row row = sheet.createRow(0);
+                int column = 0;
+                // 鍐欏叆鍚勪釜瀛楁鐨勫垪澶村悕绉�
+                for (Object[] os : fields) {
+                    Excel excel = (Excel) os[1];
+                    this.createCell(excel, row, column++);
+                }
+                if (Excel.Type.EXPORT.equals(type)) {
+                    fillExcelData(index, row);
+                }
+            }
+            String filename = encodingFilename(sheetName);
+            out = new FileOutputStream(getAbsoluteFile(filename));
+            wb.write(out);
+            return AjaxResult.success(filename);
+        } catch (Exception e) {
+            log.error("瀵煎嚭Excel寮傚父{}", e.getMessage());
+            throw new CustomException("瀵煎嚭Excel澶辫触锛岃鑱旂郴缃戠珯绠$悊鍛橈紒");
+        } finally {
+            if (wb != null) {
+                try {
+                    wb.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 瀹炴椂鏁版嵁瀵煎嚭excel甯︽姌绾垮浘
+     *
+     * @return
+     */
+    public AjaxResult exportRealTimeDataExcelZHZB() {
+        OutputStream out = null;
+        try {
+            // 鍙栧嚭涓�鍏辨湁澶氬皯涓猻heet.
+            double sheetNo = Math.ceil(list.size() / sheetSize);
+            for (int index = 0; index <= sheetNo; index++) {
+                createSheet(sheetNo, index);
+
+                // 浜х敓涓�琛�
+                Row row = sheet.createRow(0);
+                int column = 0;
+                // 鍐欏叆鍚勪釜瀛楁鐨勫垪澶村悕绉�
+                for (Object[] os : fields) {
+                    Excel excel = (Excel) os[1];
+                    this.createCell(excel, row, column++);
+                }
+                if (Excel.Type.EXPORT.equals(type)) {
+                    int startNo = index * sheetSize;
+                    int endNo = Math.min(startNo + sheetSize, list.size());
+                    for (int i = startNo; i < endNo; i++) {
+                        row = sheet.createRow(i + 1 - startNo);
+                        // 寰楀埌瀵煎嚭瀵硅薄.
+                        T vo = list.get(i);
+                        int rowColumn = 0;
+                        for (Object[] os : fields) {
+                            Field field = (Field) os[0];
+                            Excel excel = (Excel) os[1];
+                            // 璁剧疆瀹炰綋绫荤鏈夊睘鎬у彲璁块棶
+                            field.setAccessible(Boolean.TRUE);
+                            this.addRealTimeDataCell(excel, row, vo, field, rowColumn++);
+                        }
+                    }
+                }
+            }
+            // 鍒涘缓鍥捐〃瀵硅薄
+            Drawing<?> drawing = sheet.createDrawingPatriarch();
+            ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, fields.size() + 1, 0, list.size(), list.size());
+            Chart chart = drawing.createChart(anchor);
+            // 鍒涘缓鍥捐〃鏁版嵁闆�
+            CellRangeAddress xRay = new CellRangeAddress(0, 0, 1, fields.size() - 1);
+            ChartDataSource<Number> x = DataSources.fromNumericCellRange(sheet, xRay);
+
+            LineChartData data = chart.getChartDataFactory().createLineChartData();
+            for (int i = 0; i < list.size(); i++) {
+                Comprehensive comprehensive = new Comprehensive();
+                BeanUtils.copyProperties(list.get(i), comprehensive);
+                CellRangeAddress yRay = new CellRangeAddress(i + 1, i + 1, 1, fields.size() - 1);
+                ChartDataSource<Number> y = DataSources.fromNumericCellRange(sheet, yRay);
+                LineChartSeries series = data.addSeries(x, y);
+                series.setTitle(comprehensive.getIndexName());
+            }
+
+            // 璁剧疆鍥捐〃鏍峰紡
+            ChartAxis xAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
+            ChartAxis yAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.RIGHT);
+            yAxis.setCrosses(AxisCrosses.AUTO_ZERO);
+            // 灏嗗浘琛ㄦ坊鍔犲埌宸ヤ綔绨夸腑
+            chart.plot(data, xAxis, yAxis);
+
+            String filename = encodingFilename(sheetName);
+            out = new FileOutputStream(getAbsoluteFile(filename));
+            wb.write(out);
+            return AjaxResult.success(filename);
+        } catch (Exception e) {
+            log.error("瀵煎嚭Excel寮傚父{}", e.getMessage());
+            throw new CustomException("瀵煎嚭Excel澶辫触锛岃鑱旂郴缃戠珯绠$悊鍛橈紒");
+        } finally {
+            if (wb != null) {
+                try {
+                    wb.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 瀹炴椂鏁版嵁瀵煎嚭excel甯︽姌绾垮浘
+     *
+     * @return
+     */
+    public AjaxResult exportRealTimeDataExcel() {
+        OutputStream out = null;
+        try {
+            // 鍙栧嚭涓�鍏辨湁澶氬皯涓猻heet.
+            double sheetNo = Math.ceil(list.size() / sheetSize);
+            for (int index = 0; index <= sheetNo; index++) {
+                createSheet(sheetNo, index);
+
+                // 浜х敓涓�琛�
+                Row row = sheet.createRow(0);
+                int column = 0;
+                // 鍐欏叆鍚勪釜瀛楁鐨勫垪澶村悕绉�
+                for (Object[] os : fields) {
+                    Excel excel = (Excel) os[1];
+                    this.createCell(excel, row, column++);
+                }
+                if (Excel.Type.EXPORT.equals(type)) {
+                    int startNo = index * sheetSize;
+                    int endNo = Math.min(startNo + sheetSize, list.size());
+                    for (int i = startNo; i < endNo; i++) {
+                        row = sheet.createRow(i + 1 - startNo);
+                        // 寰楀埌瀵煎嚭瀵硅薄.
+                        T vo = list.get(i);
+                        int rowColumn = 0;
+                        for (Object[] os : fields) {
+                            Field field = (Field) os[0];
+                            Excel excel = (Excel) os[1];
+                            // 璁剧疆瀹炰綋绫荤鏈夊睘鎬у彲璁块棶
+                            field.setAccessible(Boolean.TRUE);
+                            this.addRealTimeDataCell(excel, row, vo, field, rowColumn++);
+                        }
+                    }
+                }
+            }
+            // 鍒涘缓鍥捐〃瀵硅薄
+            Drawing<?> drawing = sheet.createDrawingPatriarch();
+            ClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, fields.size(), 1, list.size(), 15);
+            Chart chart = drawing.createChart(anchor);
+            // 鍒涘缓鍥捐〃鏁版嵁闆�
+            CellRangeAddress xRay = new CellRangeAddress(1, this.list.size(), 0, 0);
+            CellRangeAddress yRay = new CellRangeAddress(1, this.list.size(), 1, 1);
+            ChartDataSource<Number> x = DataSources.fromNumericCellRange(sheet, xRay);
+            ChartDataSource<Number> y = DataSources.fromNumericCellRange(sheet, yRay);
+            LineChartData data = chart.getChartDataFactory().createLineChartData();
+            LineChartSeries series = data.addSeries(x, y);
+            series.setTitle("Data");
+            // 璁剧疆鍥捐〃鏍峰紡
+            ChartAxis xAxis = chart.getChartAxisFactory().createCategoryAxis(AxisPosition.BOTTOM);
+            ChartAxis yAxis = chart.getChartAxisFactory().createValueAxis(AxisPosition.RIGHT);
+            yAxis.setCrosses(AxisCrosses.AUTO_ZERO);
+            // 灏嗗浘琛ㄦ坊鍔犲埌宸ヤ綔绨夸腑
+            chart.plot(data, xAxis, yAxis);
+
+            String filename = encodingFilename(sheetName);
+            out = new FileOutputStream(getAbsoluteFile(filename));
+            wb.write(out);
+            return AjaxResult.success(filename);
+        } catch (Exception e) {
+            log.error("瀵煎嚭Excel寮傚父{}", e.getMessage());
+            throw new CustomException("瀵煎嚭Excel澶辫触锛岃鑱旂郴缃戠珯绠$悊鍛橈紒");
+        } finally {
+            if (wb != null) {
+                try {
+                    wb.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+            if (out != null) {
+                try {
+                    out.close();
+                } catch (IOException e1) {
+                    e1.printStackTrace();
+                }
+            }
+        }
+    }
+
+    /**
+     * 濉厖excel鏁版嵁
+     *
+     * @param index 搴忓彿
+     * @param row   鍗曞厓鏍艰
+     */
+    public void fillExcelData(int index, Row row) {
+        int startNo = index * sheetSize;
+        int endNo = Math.min(startNo + sheetSize, list.size());
+        for (int i = startNo; i < endNo; i++) {
+            row = sheet.createRow(i + 1 - startNo);
+            // 寰楀埌瀵煎嚭瀵硅薄.
+            T vo = list.get(i);
+            int column = 0;
+            for (Object[] os : fields) {
+                Field field = (Field) os[0];
+                Excel excel = (Excel) os[1];
+                // 璁剧疆瀹炰綋绫荤鏈夊睘鎬у彲璁块棶
+                field.setAccessible(true);
+                this.addCell(excel, row, vo, field, column++);
+            }
+        }
+    }
+
+    /**
+     * 鍒涘缓琛ㄦ牸鏍峰紡
+     *
+     * @param wb 宸ヤ綔钖勫璞�
+     * @return 鏍峰紡鍒楄〃
+     */
+    private Map<String, CellStyle> createStyles(Workbook wb) {
+        // 鍐欏叆鍚勬潯璁板綍,姣忔潯璁板綍瀵瑰簲excel琛ㄤ腑鐨勪竴琛�
+        Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
+        CellStyle style = wb.createCellStyle();
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        style.setBorderRight(BorderStyle.THIN);
+        style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setBorderLeft(BorderStyle.THIN);
+        style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setBorderTop(BorderStyle.THIN);
+        style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setBorderBottom(BorderStyle.THIN);
+        style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        Font dataFont = wb.createFont();
+        dataFont.setFontName("Arial");
+        dataFont.setFontHeightInPoints((short) 10);
+        style.setFont(dataFont);
+        styles.put("data", style);
+
+        style = wb.createCellStyle();
+        style.cloneStyleFrom(styles.get("data"));
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setVerticalAlignment(VerticalAlignment.CENTER);
+        style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
+        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
+        Font headerFont = wb.createFont();
+        headerFont.setFontName("Arial");
+        headerFont.setFontHeightInPoints((short) 10);
+        headerFont.setBold(true);
+        headerFont.setColor(IndexedColors.WHITE.getIndex());
+        style.setFont(headerFont);
+        styles.put("header", style);
+
+        return styles;
+    }
+
+    /**
+     * 鍒涘缓鍗曞厓鏍�
+     */
+    public Cell createCell(Excel attr, Row row, int column) {
+        // 鍒涘缓鍒�
+        Cell cell = row.createCell(column);
+        // 鍐欏叆鍒椾俊鎭�
+        cell.setCellValue(attr.name());
+        setDataValidation(attr, row, column);
+        cell.setCellStyle(styles.get("header"));
+        return cell;
+    }
+
+    /**
+     * 璁剧疆鍗曞厓鏍间俊鎭�
+     *
+     * @param value 鍗曞厓鏍煎��
+     * @param attr  娉ㄨВ鐩稿叧
+     * @param cell  鍗曞厓鏍间俊鎭�
+     */
+    public void setCellVo(Object value, Excel attr, Cell cell) {
+        if (Excel.ColumnType.STRING == attr.cellType()) {
+            cell.setCellType(CellType.NUMERIC);
+            cell.setCellValue(
+                    StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix());
+        } else if (Excel.ColumnType.NUMERIC == attr.cellType()) {
+            cell.setCellType(CellType.NUMERIC);
+            cell.setCellValue(Integer.parseInt(value + ""));
+        }
+    }
+
+    /**
+     * 鍒涘缓琛ㄦ牸鏍峰紡
+     */
+    public void setDataValidation(Excel attr, Row row, int column) {
+        if (attr.name().indexOf("娉細") >= 0) {
+            sheet.setColumnWidth(column, 6000);
+        } else {
+            // 璁剧疆鍒楀
+            sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256));
+            row.setHeight((short) (attr.height() * 20));
+        }
+        // 濡傛灉璁剧疆浜嗘彁绀轰俊鎭垯榧犳爣鏀句笂鍘绘彁绀�.
+        if (StringUtils.isNotEmpty(attr.prompt())) {
+            // 杩欓噷榛樿璁句簡2-101鍒楁彁绀�.
+            setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column);
+        }
+        // 濡傛灉璁剧疆浜哻ombo灞炴�у垯鏈垪鍙兘閫夋嫨涓嶈兘杈撳叆
+        if (attr.combo().length > 0) {
+            // 杩欓噷榛樿璁句簡2-101鍒楀彧鑳介�夋嫨涓嶈兘杈撳叆.
+            setXSSFValidation(sheet, attr.combo(), 1, 100, column, column);
+        }
+    }
+
+    /**
+     * 娣诲姞鍗曞厓鏍�
+     */
+    public Cell addCell(Excel attr, Row row, T vo, Field field, int column) {
+        Cell cell = null;
+        try {
+            // 璁剧疆琛岄珮
+            row.setHeight((short) (attr.height() * 20));
+            // 鏍规嵁Excel涓缃儏鍐靛喅瀹氭槸鍚﹀鍑�,鏈変簺鎯呭喌闇�瑕佷繚鎸佷负绌�,甯屾湜鐢ㄦ埛濉啓杩欎竴鍒�.
+            if (attr.isExport()) {
+                // 鍒涘缓cell
+                cell = row.createCell(column);
+                cell.setCellStyle(styles.get("data"));
+
+                // 鐢ㄤ簬璇诲彇瀵硅薄涓殑灞炴��
+                Object value = getTargetValue(vo, field, attr);
+                String dateFormat = attr.dateFormat();
+                String readConverterExp = attr.readConverterExp();
+                if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) {
+                    cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));
+                } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils
+                        .isNotNull(value)) {
+                    cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp));
+                } else {
+                    // 璁剧疆鍒楃被鍨�
+                    setCellVo(value, attr, cell);
+                }
+            }
+        } catch (Exception e) {
+            log.error("瀵煎嚭Excel澶辫触{}", e);
+        }
+        return cell;
+    }
+
+    public Cell addRealTimeDataCell(Excel attr, Row row, T vo, Field field, int column) {
+        Cell cell = null;
+        try {
+            // 璁剧疆琛岄珮
+            row.setHeight((short) (attr.height() * 20));
+            // 鏍规嵁Excel涓缃儏鍐靛喅瀹氭槸鍚﹀鍑�,鏈変簺鎯呭喌闇�瑕佷繚鎸佷负绌�,甯屾湜鐢ㄦ埛濉啓杩欎竴鍒�.
+            if (attr.isExport()) {
+                // 鍒涘缓cell
+                cell = row.createCell(column);
+                // 鐢ㄤ簬璇诲彇瀵硅薄涓殑灞炴��
+                Object value = getTargetValue(vo, field, attr);
+                if (ObjectUtils.isNotEmpty(value) && value.toString().matches("^(-?\\d+)(\\.\\d+)?$")) {
+                    DataFormat df = wb.createDataFormat();
+                    CellStyle cellStyle = wb.createCellStyle();
+                    cellStyle.setDataFormat(df.getFormat("0.00_ "));
+                    cell.setCellStyle(cellStyle);
+                } else {
+                    cell.setCellStyle(styles.get("data"));
+                }
+                String dateFormat = attr.dateFormat();
+                String readConverterExp = attr.readConverterExp();
+                if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) {
+                    cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));
+                } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils
+                        .isNotNull(value)) {
+                    cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp));
+                } else {
+                    cell.setCellType(CellType.NUMERIC);
+                    // 鍒ゆ柇鏄惁涓哄皬鏁�
+                    if (ObjectUtils.isNotEmpty(value) && value.toString().matches("^(-?\\d+)(\\.\\d+)?$")) {
+                        cell.setCellValue(new BigDecimal(value.toString()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                        // 鍒ゆ柇鏄惁涓烘暣鏁�
+                    } else if (ObjectUtils.isNotEmpty(value) && value.toString().matches("^[-\\+]?[\\d]*$")) {
+                        cell.setCellValue(Integer.parseInt(value + ""));
+                    } else {
+                        cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("瀵煎嚭Excel澶辫触{}", e);
+        }
+        return cell;
+    }
+
+    /**
+     * 璁剧疆 POI XSSFSheet 鍗曞厓鏍兼彁绀�
+     *
+     * @param sheet         琛ㄥ崟
+     * @param promptTitle   鎻愮ず鏍囬
+     * @param promptContent 鎻愮ず鍐呭
+     * @param firstRow      寮�濮嬭
+     * @param endRow        缁撴潫琛�
+     * @param firstCol      寮�濮嬪垪
+     * @param endCol        缁撴潫鍒�
+     */
+    public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow,
+                              int endRow,
+                              int firstCol, int endCol) {
+        DataValidationHelper helper = sheet.getDataValidationHelper();
+        DataValidationConstraint constraint = helper.createCustomConstraint("DD1");
+        CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
+        DataValidation dataValidation = helper.createValidation(constraint, regions);
+        dataValidation.createPromptBox(promptTitle, promptContent);
+        dataValidation.setShowPromptBox(true);
+        sheet.addValidationData(dataValidation);
+    }
+
+    /**
+     * 璁剧疆鏌愪簺鍒楃殑鍊煎彧鑳借緭鍏ラ鍒剁殑鏁版嵁,鏄剧ず涓嬫媺妗�.
+     *
+     * @param sheet    瑕佽缃殑sheet.
+     * @param textlist 涓嬫媺妗嗘樉绀虹殑鍐呭
+     * @param firstRow 寮�濮嬭
+     * @param endRow   缁撴潫琛�
+     * @param firstCol 寮�濮嬪垪
+     * @param endCol   缁撴潫鍒�
+     * @return 璁剧疆濂界殑sheet.
+     */
+    public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow,
+                                  int firstCol, int endCol) {
+        DataValidationHelper helper = sheet.getDataValidationHelper();
+        // 鍔犺浇涓嬫媺鍒楄〃鍐呭
+        DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist);
+        // 璁剧疆鏁版嵁鏈夋晥鎬у姞杞藉湪鍝釜鍗曞厓鏍间笂,鍥涗釜鍙傛暟鍒嗗埆鏄細璧峰琛屻�佺粓姝㈣銆佽捣濮嬪垪銆佺粓姝㈠垪
+        CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
+        // 鏁版嵁鏈夋晥鎬у璞�
+        DataValidation dataValidation = helper.createValidation(constraint, regions);
+        // 澶勭悊Excel鍏煎鎬ч棶棰�
+        if (dataValidation instanceof XSSFDataValidation) {
+            dataValidation.setSuppressDropDownArrow(true);
+            dataValidation.setShowErrorBox(true);
+        } else {
+            dataValidation.setSuppressDropDownArrow(false);
+        }
+
+        sheet.addValidationData(dataValidation);
+    }
+
+    /**
+     * 瑙f瀽瀵煎嚭鍊� 0=鐢�,1=濂�,2=鏈煡
+     *
+     * @param propertyValue 鍙傛暟鍊�
+     * @param converterExp  缈昏瘧娉ㄨВ
+     * @return 瑙f瀽鍚庡��
+     * @throws Exception
+     */
+    public static String convertByExp(String propertyValue, String converterExp) throws Exception {
+        try {
+            String[] convertSource = converterExp.split(",");
+            for (String item : convertSource) {
+                String[] itemArray = item.split("=");
+                if (itemArray[0].equals(propertyValue)) {
+                    return itemArray[1];
+                }
+            }
+        } catch (Exception e) {
+            throw e;
+        }
+        return propertyValue;
+    }
+
+    /**
+     * 鍙嶅悜瑙f瀽鍊� 鐢�=0,濂�=1,鏈煡=2
+     *
+     * @param propertyValue 鍙傛暟鍊�
+     * @param converterExp  缈昏瘧娉ㄨВ
+     * @return 瑙f瀽鍚庡��
+     * @throws Exception
+     */
+    public static String reverseByExp(String propertyValue, String converterExp) throws Exception {
+        try {
+            String[] convertSource = converterExp.split(",");
+            for (String item : convertSource) {
+                String[] itemArray = item.split("=");
+                if (itemArray[1].equals(propertyValue)) {
+                    return itemArray[0];
+                }
+            }
+        } catch (Exception e) {
+            throw e;
+        }
+        return propertyValue;
+    }
+
+    /**
+     * 缂栫爜鏂囦欢鍚�
+     */
+    public String encodingFilename(String filename) {
+        filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx";
+        return filename;
+    }
+
+    /**
+     * 鑾峰彇涓嬭浇璺緞
+     *
+     * @param filename 鏂囦欢鍚嶇О
+     */
+    public String getAbsoluteFile(String filename) {
+        String downloadPath = RuoYiConfig.getDownloadPath() + filename;
+        File desc = new File(downloadPath);
+        if (!desc.getParentFile().exists()) {
+            desc.getParentFile().mkdirs();
+        }
+        return downloadPath;
+    }
+
+    /**
+     * 鑾峰彇bean涓殑灞炴�у��
+     *
+     * @param vo    瀹炰綋瀵硅薄
+     * @param field 瀛楁
+     * @param excel 娉ㄨВ
+     * @return 鏈�缁堢殑灞炴�у��
+     * @throws Exception
+     */
+    private Object getTargetValue(T vo, Field field, Excel excel) throws Exception {
+        Object o = field.get(vo);
+        if (StringUtils.isNotEmpty(excel.targetAttr())) {
+            String target = excel.targetAttr();
+            if (target.indexOf(".") > -1) {
+                String[] targets = target.split("[.]");
+                for (String name : targets) {
+                    o = getValue(o, name);
+                }
+            } else {
+                o = getValue(o, target);
+            }
+        }
+        return o;
+    }
+
+    /**
+     * 浠ョ被鐨勫睘鎬х殑get鏂规硶鏂规硶褰㈠紡鑾峰彇鍊�
+     *
+     * @param o
+     * @param name
+     * @return value
+     * @throws Exception
+     */
+    private Object getValue(Object o, String name) throws Exception {
+        if (StringUtils.isNotEmpty(name)) {
+            Class<?> clazz = o.getClass();
+            String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
+            Method method = clazz.getMethod(methodName);
+            o = method.invoke(o);
+        }
+        return o;
+    }
+
+    /**
+     * 寰楀埌鎵�鏈夊畾涔夊瓧娈�
+     */
+    private void createExcelField() {
+        this.fields = new ArrayList<Object[]>();
+        List<Field> tempFields = new ArrayList<>();
+        tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
+        tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
+        for (Field field : tempFields) {
+            // 鍗曟敞瑙�
+            if (field.isAnnotationPresent(Excel.class)) {
+                putToField(field, field.getAnnotation(Excel.class));
+            }
+
+            // 澶氭敞瑙�
+            if (field.isAnnotationPresent(Excels.class)) {
+                Excels attrs = field.getAnnotation(Excels.class);
+                Excel[] excels = attrs.value();
+                for (Excel excel : excels) {
+                    putToField(field, excel);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鏀惧埌瀛楁闆嗗悎涓�
+     */
+    private void putToField(Field field, Excel attr) {
+        if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) {
+            this.fields.add(new Object[]{field, attr});
+        }
+    }
+
+    /**
+     * 鍒涘缓涓�涓伐浣滅翱
+     */
+    public void createWorkbook() {
+        this.wb = new SXSSFWorkbook(500);
+    }
+
+    /**
+     * 鍒涘缓宸ヤ綔琛�
+     *
+     * @param sheetNo sheet鏁伴噺
+     * @param index   搴忓彿
+     */
+    public void createSheet(double sheetNo, int index) {
+        this.sheet = wb.createSheet();
+        this.styles = createStyles(wb);
+        // 璁剧疆宸ヤ綔琛ㄧ殑鍚嶇О.
+        if (sheetNo == 0) {
+            wb.setSheetName(index, sheetName);
+        } else {
+            wb.setSheetName(index, sheetName + index);
+        }
+    }
+
+    /**
+     * 鑾峰彇鍗曞厓鏍煎��
+     *
+     * @param row    鑾峰彇鐨勮
+     * @param column 鑾峰彇鍗曞厓鏍煎垪鍙�
+     * @return 鍗曞厓鏍煎��
+     */
+    public Object getCellValue(Row row, int column) {
+        if (row == null) {
+            return row;
+        }
+        Object val = "";
+        try {
+            Cell cell = row.getCell(column);
+            if (cell != null) {
+                if (cell.getCellTypeEnum() == CellType.NUMERIC
+                        || cell.getCellTypeEnum() == CellType.FORMULA) {
+                    val = cell.getNumericCellValue();
+                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
+                        val = DateUtil.getJavaDate((Double) val); // POI Excel 鏃ユ湡鏍煎紡杞崲
+                    } else {
+                        if ((Double) val % 1 > 0) {
+                            val = new DecimalFormat("0.00").format(val);
+                        } else {
+                            val = new DecimalFormat("0").format(val);
+                        }
+                    }
+                } else if (cell.getCellTypeEnum() == CellType.STRING) {
+                    val = cell.getStringCellValue();
+                } else if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
+                    val = cell.getBooleanCellValue();
+                } else if (cell.getCellTypeEnum() == CellType.ERROR) {
+                    val = cell.getErrorCellValue();
+                }
+
+            }
+        } catch (Exception e) {
+            return val;
+        }
+        return val;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/reflect/ReflectUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/reflect/ReflectUtils.java
new file mode 100644
index 0000000..7188116
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/reflect/ReflectUtils.java
@@ -0,0 +1,328 @@
+package com.dingzhuo.energy.common.utils.reflect;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Date;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Validate;
+import org.apache.poi.ss.usermodel.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.dingzhuo.energy.common.core.text.Convert;
+import com.dingzhuo.energy.common.utils.DateUtils;
+
+/**
+ * 鍙嶅皠宸ュ叿绫�. 鎻愪緵璋冪敤getter/setter鏂规硶, 璁块棶绉佹湁鍙橀噺, 璋冪敤绉佹湁鏂规硶, 鑾峰彇娉涘瀷绫诲瀷Class, 琚獳OP杩囩殑鐪熷疄绫荤瓑宸ュ叿鍑芥暟.
+ *
+ * @author ruoyi
+ */
+@SuppressWarnings("rawtypes")
+public class ReflectUtils {
+
+  private static final String SETTER_PREFIX = "set";
+
+  private static final String GETTER_PREFIX = "get";
+
+  private static final String CGLIB_CLASS_SEPARATOR = "$$";
+
+  private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class);
+
+  /**
+   * 璋冪敤Getter鏂规硶. 鏀寔澶氱骇锛屽锛氬璞″悕.瀵硅薄鍚�.鏂规硶
+   */
+  @SuppressWarnings("unchecked")
+  public static <E> E invokeGetter(Object obj, String propertyName) {
+    Object object = obj;
+    for (String name : StringUtils.split(propertyName, ".")) {
+      String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name);
+      object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{});
+    }
+    return (E) object;
+  }
+
+  /**
+   * 璋冪敤Setter鏂规硶, 浠呭尮閰嶆柟娉曞悕銆� 鏀寔澶氱骇锛屽锛氬璞″悕.瀵硅薄鍚�.鏂规硶
+   */
+  public static <E> void invokeSetter(Object obj, String propertyName, E value) {
+    Object object = obj;
+    String[] names = StringUtils.split(propertyName, ".");
+    for (int i = 0; i < names.length; i++) {
+      if (i < names.length - 1) {
+        String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]);
+        object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{});
+      } else {
+        String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]);
+        invokeMethodByName(object, setterMethodName, new Object[]{value});
+      }
+    }
+  }
+
+  /**
+   * 鐩存帴璇诲彇瀵硅薄灞炴�у��, 鏃犺private/protected淇グ绗�, 涓嶇粡杩噂etter鍑芥暟.
+   */
+  @SuppressWarnings("unchecked")
+  public static <E> E getFieldValue(final Object obj, final String fieldName) {
+    Field field = getAccessibleField(obj, fieldName);
+    if (field == null) {
+      logger.debug("鍦� [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 ");
+      return null;
+    }
+    E result = null;
+    try {
+      result = (E) field.get(obj);
+    } catch (IllegalAccessException e) {
+      logger.error("涓嶅彲鑳芥姏鍑虹殑寮傚父{}", e.getMessage());
+    }
+    return result;
+  }
+
+  /**
+   * 鐩存帴璁剧疆瀵硅薄灞炴�у��, 鏃犺private/protected淇グ绗�, 涓嶇粡杩噑etter鍑芥暟.
+   */
+  public static <E> void setFieldValue(final Object obj, final String fieldName, final E value) {
+    Field field = getAccessibleField(obj, fieldName);
+    if (field == null) {
+      // throw new IllegalArgumentException("鍦� [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 ");
+      logger.debug("鍦� [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + fieldName + "] 瀛楁 ");
+      return;
+    }
+    try {
+      field.set(obj, value);
+    } catch (IllegalAccessException e) {
+      logger.error("涓嶅彲鑳芥姏鍑虹殑寮傚父: {}", e.getMessage());
+    }
+  }
+
+  /**
+   * 鐩存帴璋冪敤瀵硅薄鏂规硶, 鏃犺private/protected淇グ绗�. 鐢ㄤ簬涓�娆℃�ц皟鐢ㄧ殑鎯呭喌锛屽惁鍒欏簲浣跨敤getAccessibleMethod()鍑芥暟鑾峰緱Method鍚庡弽澶嶈皟鐢�.
+   * 鍚屾椂鍖归厤鏂规硶鍚�+鍙傛暟绫诲瀷锛�
+   */
+  @SuppressWarnings("unchecked")
+  public static <E> E invokeMethod(final Object obj, final String methodName,
+      final Class<?>[] parameterTypes,
+      final Object[] args) {
+    if (obj == null || methodName == null) {
+      return null;
+    }
+    Method method = getAccessibleMethod(obj, methodName, parameterTypes);
+    if (method == null) {
+      logger.debug("鍦� [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + methodName + "] 鏂规硶 ");
+      return null;
+    }
+    try {
+      return (E) method.invoke(obj, args);
+    } catch (Exception e) {
+      String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
+      throw convertReflectionExceptionToUnchecked(msg, e);
+    }
+  }
+
+  /**
+   * 鐩存帴璋冪敤瀵硅薄鏂规硶, 鏃犺private/protected淇グ绗︼紝 鐢ㄤ簬涓�娆℃�ц皟鐢ㄧ殑鎯呭喌锛屽惁鍒欏簲浣跨敤getAccessibleMethodByName()鍑芥暟鑾峰緱Method鍚庡弽澶嶈皟鐢�.
+   * 鍙尮閰嶅嚱鏁板悕锛屽鏋滄湁澶氫釜鍚屽悕鍑芥暟璋冪敤绗竴涓��
+   */
+  @SuppressWarnings("unchecked")
+  public static <E> E invokeMethodByName(final Object obj, final String methodName,
+      final Object[] args) {
+    Method method = getAccessibleMethodByName(obj, methodName, args.length);
+    if (method == null) {
+      // 濡傛灉涓虹┖涓嶆姤閿欙紝鐩存帴杩斿洖绌恒��
+      logger.debug("鍦� [" + obj.getClass() + "] 涓紝娌℃湁鎵惧埌 [" + methodName + "] 鏂规硶 ");
+      return null;
+    }
+    try {
+      // 绫诲瀷杞崲锛堝皢鍙傛暟鏁版嵁绫诲瀷杞崲涓虹洰鏍囨柟娉曞弬鏁扮被鍨嬶級
+      Class<?>[] cs = method.getParameterTypes();
+      for (int i = 0; i < cs.length; i++) {
+        if (args[i] != null && !args[i].getClass().equals(cs[i])) {
+          if (cs[i] == String.class) {
+            args[i] = Convert.toStr(args[i]);
+            if (StringUtils.endsWith((String) args[i], ".0")) {
+              args[i] = StringUtils.substringBefore((String) args[i], ".0");
+            }
+          } else if (cs[i] == Integer.class) {
+            args[i] = Convert.toInt(args[i]);
+          } else if (cs[i] == Long.class) {
+            args[i] = Convert.toLong(args[i]);
+          } else if (cs[i] == Double.class) {
+            args[i] = Convert.toDouble(args[i]);
+          } else if (cs[i] == Float.class) {
+            args[i] = Convert.toFloat(args[i]);
+          } else if (cs[i] == Date.class) {
+            if (args[i] instanceof String) {
+              args[i] = DateUtils.parseDate(args[i]);
+            } else {
+              args[i] = DateUtil.getJavaDate((Double) args[i]);
+            }
+          } else if (Enum.class.isAssignableFrom(cs[i])) {
+            args[i] = String.valueOf(args[i]);
+          }
+        }
+      }
+      return (E) method.invoke(obj, args);
+    } catch (Exception e) {
+      String msg = "method: " + method + ", obj: " + obj + ", args: " + args + "";
+      throw convertReflectionExceptionToUnchecked(msg, e);
+    }
+  }
+
+  /**
+   * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredField, 骞跺己鍒惰缃负鍙闂�. 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒�, 杩斿洖null.
+   */
+  public static Field getAccessibleField(final Object obj, final String fieldName) {
+    // 涓虹┖涓嶆姤閿欍�傜洿鎺ヨ繑鍥� null
+    if (obj == null) {
+      return null;
+    }
+    Validate.notBlank(fieldName, "fieldName can't be blank");
+    for (Class<?> superClass = obj.getClass(); superClass != Object.class;
+        superClass = superClass.getSuperclass()) {
+      try {
+        Field field = superClass.getDeclaredField(fieldName);
+        makeAccessible(field);
+        return field;
+      } catch (NoSuchFieldException e) {
+        continue;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredMethod,骞跺己鍒惰缃负鍙闂�. 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒�, 杩斿洖null. 鍖归厤鍑芥暟鍚�+鍙傛暟绫诲瀷銆� 鐢ㄤ簬鏂规硶闇�瑕佽澶氭璋冪敤鐨勬儏鍐�.
+   * 鍏堜娇鐢ㄦ湰鍑芥暟鍏堝彇寰桵ethod,鐒跺悗璋冪敤Method.invoke(Object obj, Object... args)
+   */
+  public static Method getAccessibleMethod(final Object obj, final String methodName,
+      final Class<?>... parameterTypes) {
+    // 涓虹┖涓嶆姤閿欍�傜洿鎺ヨ繑鍥� null
+    if (obj == null) {
+      return null;
+    }
+    Validate.notBlank(methodName, "methodName can't be blank");
+    for (Class<?> searchType = obj.getClass(); searchType != Object.class;
+        searchType = searchType.getSuperclass()) {
+      try {
+        Method method = searchType.getDeclaredMethod(methodName, parameterTypes);
+        makeAccessible(method);
+        return method;
+      } catch (NoSuchMethodException e) {
+        continue;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * 寰幆鍚戜笂杞瀷, 鑾峰彇瀵硅薄鐨凞eclaredMethod,骞跺己鍒惰缃负鍙闂�. 濡傚悜涓婅浆鍨嬪埌Object浠嶆棤娉曟壘鍒�, 杩斿洖null. 鍙尮閰嶅嚱鏁板悕銆� 鐢ㄤ簬鏂规硶闇�瑕佽澶氭璋冪敤鐨勬儏鍐�.
+   * 鍏堜娇鐢ㄦ湰鍑芥暟鍏堝彇寰桵ethod,鐒跺悗璋冪敤Method.invoke(Object obj, Object... args)
+   */
+  public static Method getAccessibleMethodByName(final Object obj, final String methodName,
+      int argsNum) {
+    // 涓虹┖涓嶆姤閿欍�傜洿鎺ヨ繑鍥� null
+    if (obj == null) {
+      return null;
+    }
+    Validate.notBlank(methodName, "methodName can't be blank");
+    for (Class<?> searchType = obj.getClass(); searchType != Object.class;
+        searchType = searchType.getSuperclass()) {
+      Method[] methods = searchType.getDeclaredMethods();
+      for (Method method : methods) {
+        if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) {
+          makeAccessible(method);
+          return method;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * 鏀瑰彉private/protected鐨勬柟娉曚负public锛屽敖閲忎笉璋冪敤瀹為檯鏀瑰姩鐨勮鍙ワ紝閬垮厤JDK鐨凷ecurityManager鎶辨�ㄣ��
+   */
+  public static void makeAccessible(Method method) {
+    if ((!Modifier.isPublic(method.getModifiers()) || !Modifier
+        .isPublic(method.getDeclaringClass().getModifiers()))
+        && !method.isAccessible()) {
+      method.setAccessible(true);
+    }
+  }
+
+  /**
+   * 鏀瑰彉private/protected鐨勬垚鍛樺彉閲忎负public锛屽敖閲忎笉璋冪敤瀹為檯鏀瑰姩鐨勮鍙ワ紝閬垮厤JDK鐨凷ecurityManager鎶辨�ㄣ��
+   */
+  public static void makeAccessible(Field field) {
+    if ((!Modifier.isPublic(field.getModifiers()) || !Modifier
+        .isPublic(field.getDeclaringClass().getModifiers())
+        || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) {
+      field.setAccessible(true);
+    }
+  }
+
+  /**
+   * 閫氳繃鍙嶅皠, 鑾峰緱Class瀹氫箟涓0鏄庣殑娉涘瀷鍙傛暟鐨勭被鍨�, 娉ㄦ剰娉涘瀷蹇呴』瀹氫箟鍦ㄧ埗绫诲 濡傛棤娉曟壘鍒�, 杩斿洖Object.class.
+   */
+  @SuppressWarnings("unchecked")
+  public static <T> Class<T> getClassGenricType(final Class clazz) {
+    return getClassGenricType(clazz, 0);
+  }
+
+  /**
+   * 閫氳繃鍙嶅皠, 鑾峰緱Class瀹氫箟涓0鏄庣殑鐖剁被鐨勬硾鍨嬪弬鏁扮殑绫诲瀷. 濡傛棤娉曟壘鍒�, 杩斿洖Object.class.
+   */
+  public static Class getClassGenricType(final Class clazz, final int index) {
+    Type genType = clazz.getGenericSuperclass();
+
+    if (!(genType instanceof ParameterizedType)) {
+      logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType");
+      return Object.class;
+    }
+
+    Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
+
+    if (index >= params.length || index < 0) {
+      logger.debug(
+          "Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: "
+              + params.length);
+      return Object.class;
+    }
+    if (!(params[index] instanceof Class)) {
+      logger.debug(
+          clazz.getSimpleName() + " not set the actual class on superclass generic parameter");
+      return Object.class;
+    }
+
+    return (Class) params[index];
+  }
+
+  public static Class<?> getUserClass(Object instance) {
+    if (instance == null) {
+      throw new RuntimeException("Instance must not be null");
+    }
+    Class clazz = instance.getClass();
+    if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) {
+      Class<?> superClass = clazz.getSuperclass();
+      if (superClass != null && !Object.class.equals(superClass)) {
+        return superClass;
+      }
+    }
+    return clazz;
+
+  }
+
+  /**
+   * 灏嗗弽灏勬椂鐨刢hecked exception杞崲涓簎nchecked exception.
+   */
+  public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) {
+    if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException
+        || e instanceof NoSuchMethodException) {
+      return new IllegalArgumentException(msg, e);
+    } else if (e instanceof InvocationTargetException) {
+      return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException());
+    }
+    return new RuntimeException(msg, e);
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/security/Md5Utils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/security/Md5Utils.java
new file mode 100644
index 0000000..bd5cf73
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/security/Md5Utils.java
@@ -0,0 +1,67 @@
+package com.dingzhuo.energy.common.utils.security;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Md5鍔犲瘑鏂规硶
+ * 
+ * @author ruoyi
+ */
+public class Md5Utils
+{
+    private static final Logger log = LoggerFactory.getLogger(Md5Utils.class);
+
+    private static byte[] md5(String s)
+    {
+        MessageDigest algorithm;
+        try
+        {
+            algorithm = MessageDigest.getInstance("MD5");
+            algorithm.reset();
+            algorithm.update(s.getBytes(StandardCharsets.UTF_8));
+            byte[] messageDigest = algorithm.digest();
+            return messageDigest;
+        }
+        catch (Exception e)
+        {
+            log.error("MD5 Error...", e);
+        }
+        return null;
+    }
+
+    private static final String toHex(byte[] hash)
+    {
+        if (hash == null)
+        {
+            return null;
+        }
+        StringBuffer buf = new StringBuffer(hash.length * 2);
+        int i;
+
+        for (i = 0; i < hash.length; i++)
+        {
+            if ((hash[i] & 0xff) < 0x10)
+            {
+                buf.append("0");
+            }
+            buf.append(Long.toString(hash[i] & 0xff, 16));
+        }
+        return buf.toString();
+    }
+
+    public static String hash(String s)
+    {
+        try
+        {
+            return new String(toHex(md5(s)).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
+        }
+        catch (Exception e)
+        {
+            log.error("not supported charset...{}", e);
+            return s;
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/sign/Base64.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/sign/Base64.java
new file mode 100644
index 0000000..cc79b66
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/sign/Base64.java
@@ -0,0 +1,291 @@
+package com.dingzhuo.energy.common.utils.sign;
+
+/**
+ * Base64宸ュ叿绫�
+ * 
+ * @author ruoyi
+ */
+public final class Base64
+{
+    static private final int     BASELENGTH           = 128;
+    static private final int     LOOKUPLENGTH         = 64;
+    static private final int     TWENTYFOURBITGROUP   = 24;
+    static private final int     EIGHTBIT             = 8;
+    static private final int     SIXTEENBIT           = 16;
+    static private final int     FOURBYTE             = 4;
+    static private final int     SIGN                 = -128;
+    static private final char    PAD                  = '=';
+    static final private byte[]  base64Alphabet       = new byte[BASELENGTH];
+    static final private char[]  lookUpBase64Alphabet = new char[LOOKUPLENGTH];
+
+    static
+    {
+        for (int i = 0; i < BASELENGTH; ++i)
+        {
+            base64Alphabet[i] = -1;
+        }
+        for (int i = 'Z'; i >= 'A'; i--)
+        {
+            base64Alphabet[i] = (byte) (i - 'A');
+        }
+        for (int i = 'z'; i >= 'a'; i--)
+        {
+            base64Alphabet[i] = (byte) (i - 'a' + 26);
+        }
+
+        for (int i = '9'; i >= '0'; i--)
+        {
+            base64Alphabet[i] = (byte) (i - '0' + 52);
+        }
+
+        base64Alphabet['+'] = 62;
+        base64Alphabet['/'] = 63;
+
+        for (int i = 0; i <= 25; i++)
+        {
+            lookUpBase64Alphabet[i] = (char) ('A' + i);
+        }
+
+        for (int i = 26, j = 0; i <= 51; i++, j++)
+        {
+            lookUpBase64Alphabet[i] = (char) ('a' + j);
+        }
+
+        for (int i = 52, j = 0; i <= 61; i++, j++)
+        {
+            lookUpBase64Alphabet[i] = (char) ('0' + j);
+        }
+        lookUpBase64Alphabet[62] = '+';
+        lookUpBase64Alphabet[63] = '/';
+    }
+
+    private static boolean isWhiteSpace(char octect)
+    {
+        return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9);
+    }
+
+    private static boolean isPad(char octect)
+    {
+        return (octect == PAD);
+    }
+
+    private static boolean isData(char octect)
+    {
+        return (octect < BASELENGTH && base64Alphabet[octect] != -1);
+    }
+
+    /**
+     * Encodes hex octects into Base64
+     *
+     * @param binaryData Array containing binaryData
+     * @return Encoded Base64 array
+     */
+    public static String encode(byte[] binaryData)
+    {
+        if (binaryData == null)
+        {
+            return null;
+        }
+
+        int lengthDataBits = binaryData.length * EIGHTBIT;
+        if (lengthDataBits == 0)
+        {
+            return "";
+        }
+
+        int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
+        int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
+        int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
+        char[] encodedData = null;
+
+        encodedData = new char[numberQuartet * 4];
+
+        byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
+
+        int encodedIndex = 0;
+        int dataIndex = 0;
+
+        for (int i = 0; i < numberTriplets; i++)
+        {
+            b1 = binaryData[dataIndex++];
+            b2 = binaryData[dataIndex++];
+            b3 = binaryData[dataIndex++];
+
+            l = (byte) (b2 & 0x0f);
+            k = (byte) (b1 & 0x03);
+
+            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
+            byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
+
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
+        }
+
+        // form integral number of 6-bit groups
+        if (fewerThan24bits == EIGHTBIT)
+        {
+            b1 = binaryData[dataIndex];
+            k = (byte) (b1 & 0x03);
+            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
+            encodedData[encodedIndex++] = PAD;
+            encodedData[encodedIndex++] = PAD;
+        }
+        else if (fewerThan24bits == SIXTEENBIT)
+        {
+            b1 = binaryData[dataIndex];
+            b2 = binaryData[dataIndex + 1];
+            l = (byte) (b2 & 0x0f);
+            k = (byte) (b1 & 0x03);
+
+            byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
+            byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
+
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
+            encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
+            encodedData[encodedIndex++] = PAD;
+        }
+        return new String(encodedData);
+    }
+
+    /**
+     * Decodes Base64 data into octects
+     *
+     * @param encoded string containing Base64 data
+     * @return Array containind decoded data.
+     */
+    public static byte[] decode(String encoded)
+    {
+        if (encoded == null)
+        {
+            return null;
+        }
+
+        char[] base64Data = encoded.toCharArray();
+        // remove white spaces
+        int len = removeWhiteSpace(base64Data);
+
+        if (len % FOURBYTE != 0)
+        {
+            return null;// should be divisible by four
+        }
+
+        int numberQuadruple = (len / FOURBYTE);
+
+        if (numberQuadruple == 0)
+        {
+            return new byte[0];
+        }
+
+        byte[] decodedData = null;
+        byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
+        char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
+
+        int i = 0;
+        int encodedIndex = 0;
+        int dataIndex = 0;
+        decodedData = new byte[(numberQuadruple) * 3];
+
+        for (; i < numberQuadruple - 1; i++)
+        {
+
+            if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
+                    || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++])))
+            {
+                return null;
+            } // if found "no data" just return null
+
+            b1 = base64Alphabet[d1];
+            b2 = base64Alphabet[d2];
+            b3 = base64Alphabet[d3];
+            b4 = base64Alphabet[d4];
+
+            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
+        }
+
+        if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])))
+        {
+            return null;// if found "no data" just return null
+        }
+
+        b1 = base64Alphabet[d1];
+        b2 = base64Alphabet[d2];
+
+        d3 = base64Data[dataIndex++];
+        d4 = base64Data[dataIndex++];
+        if (!isData((d3)) || !isData((d4)))
+        {// Check if they are PAD characters
+            if (isPad(d3) && isPad(d4))
+            {
+                if ((b2 & 0xf) != 0)// last 4 bits should be zero
+                {
+                    return null;
+                }
+                byte[] tmp = new byte[i * 3 + 1];
+                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
+                tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
+                return tmp;
+            }
+            else if (!isPad(d3) && isPad(d4))
+            {
+                b3 = base64Alphabet[d3];
+                if ((b3 & 0x3) != 0)// last 2 bits should be zero
+                {
+                    return null;
+                }
+                byte[] tmp = new byte[i * 3 + 2];
+                System.arraycopy(decodedData, 0, tmp, 0, i * 3);
+                tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+                tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+                return tmp;
+            }
+            else
+            {
+                return null;
+            }
+        }
+        else
+        { // No PAD e.g 3cQl
+            b3 = base64Alphabet[d3];
+            b4 = base64Alphabet[d4];
+            decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
+            decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
+            decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
+
+        }
+        return decodedData;
+    }
+
+    /**
+     * remove WhiteSpace from MIME containing encoded Base64 data.
+     *
+     * @param data the byte array of base64 data (with WS)
+     * @return the new length
+     */
+    private static int removeWhiteSpace(char[] data)
+    {
+        if (data == null)
+        {
+            return 0;
+        }
+
+        // count characters that's not whitespace
+        int newSize = 0;
+        int len = data.length;
+        for (int i = 0; i < len; i++)
+        {
+            if (!isWhiteSpace(data[i]))
+            {
+                data[newSize++] = data[i];
+            }
+        }
+        return newSize;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/spring/SpringUtils.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/spring/SpringUtils.java
new file mode 100644
index 0000000..17655c4
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/spring/SpringUtils.java
@@ -0,0 +1,114 @@
+package com.dingzhuo.energy.common.utils.spring;
+
+import org.springframework.aop.framework.AopContext;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
+import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring宸ュ叿绫� 鏂逛究鍦ㄩ潪spring绠$悊鐜涓幏鍙朾ean
+ * 
+ * @author ruoyi
+ */
+@Component
+public final class SpringUtils implements BeanFactoryPostProcessor
+{
+    /** Spring搴旂敤涓婁笅鏂囩幆澧� */
+    private static ConfigurableListableBeanFactory beanFactory;
+
+    @Override
+    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
+    {
+        SpringUtils.beanFactory = beanFactory;
+    }
+
+    /**
+     * 鑾峰彇瀵硅薄
+     *
+     * @param name
+     * @return Object 涓�涓互鎵�缁欏悕瀛楁敞鍐岀殑bean鐨勫疄渚�
+     * @throws org.springframework.beans.BeansException
+     *
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getBean(String name) throws BeansException
+    {
+        return (T) beanFactory.getBean(name);
+    }
+
+    /**
+     * 鑾峰彇绫诲瀷涓簉equiredType鐨勫璞�
+     *
+     * @param clz
+     * @return
+     * @throws org.springframework.beans.BeansException
+     *
+     */
+    public static <T> T getBean(Class<T> clz) throws BeansException
+    {
+        T result = beanFactory.getBean(clz);
+        return result;
+    }
+
+    /**
+     * 濡傛灉BeanFactory鍖呭惈涓�涓笌鎵�缁欏悕绉板尮閰嶇殑bean瀹氫箟锛屽垯杩斿洖true
+     *
+     * @param name
+     * @return boolean
+     */
+    public static boolean containsBean(String name)
+    {
+        return beanFactory.containsBean(name);
+    }
+
+    /**
+     * 鍒ゆ柇浠ョ粰瀹氬悕瀛楁敞鍐岀殑bean瀹氫箟鏄竴涓猻ingleton杩樻槸涓�涓猵rototype銆� 濡傛灉涓庣粰瀹氬悕瀛楃浉搴旂殑bean瀹氫箟娌℃湁琚壘鍒帮紝灏嗕細鎶涘嚭涓�涓紓甯革紙NoSuchBeanDefinitionException锛�
+     *
+     * @param name
+     * @return boolean
+     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+     *
+     */
+    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.isSingleton(name);
+    }
+
+    /**
+     * @param name
+     * @return Class 娉ㄥ唽瀵硅薄鐨勭被鍨�
+     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+     *
+     */
+    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getType(name);
+    }
+
+    /**
+     * 濡傛灉缁欏畾鐨刡ean鍚嶅瓧鍦╞ean瀹氫箟涓湁鍒悕锛屽垯杩斿洖杩欎簺鍒悕
+     *
+     * @param name
+     * @return
+     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
+     *
+     */
+    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
+    {
+        return beanFactory.getAliases(name);
+    }
+
+    /**
+     * 鑾峰彇aop浠g悊瀵硅薄
+     * 
+     * @param invoker
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T getAopProxy(T invoker)
+    {
+        return (T) AopContext.currentProxy();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/sql/SqlUtil.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/sql/SqlUtil.java
new file mode 100644
index 0000000..5e492d7
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/sql/SqlUtil.java
@@ -0,0 +1,36 @@
+package com.dingzhuo.energy.common.utils.sql;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * sql鎿嶄綔宸ュ叿绫�
+ * 
+ * @author ruoyi
+ */
+public class SqlUtil
+{
+    /**
+     * 浠呮敮鎸佸瓧姣嶃�佹暟瀛椼�佷笅鍒掔嚎銆佺┖鏍笺�侀�楀彿锛堟敮鎸佸涓瓧娈垫帓搴忥級
+     */
+    public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,]+";
+
+    /**
+     * 妫�鏌ュ瓧绗︼紝闃叉娉ㄥ叆缁曡繃
+     */
+    public static String escapeOrderBySql(String value)
+    {
+        if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
+        {
+            return StringUtils.EMPTY;
+        }
+        return value;
+    }
+
+    /**
+     * 楠岃瘉 order by 璇硶鏄惁绗﹀悎瑙勮寖
+     */
+    public static boolean isValidOrderBySql(String value)
+    {
+        return value.matches(SQL_PATTERN);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/text/CharsetKit.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/text/CharsetKit.java
new file mode 100644
index 0000000..b7f63fd
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/text/CharsetKit.java
@@ -0,0 +1,87 @@
+package com.dingzhuo.energy.common.utils.text;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 瀛楃闆嗗伐鍏风被
+ * 
+ * @author ruoyi
+ *
+ */
+public class CharsetKit
+{
+    /** ISO-8859-1 */
+    public static final String ISO_8859_1 = "ISO-8859-1";
+    /** UTF-8 */
+    public static final String UTF_8 = "UTF-8";
+    /** GBK */
+    public static final String GBK = "GBK";
+
+    /** ISO-8859-1 */
+    public static final Charset CHARSET_ISO_8859_1 = StandardCharsets.ISO_8859_1;
+    /** UTF-8 */
+    public static final Charset CHARSET_UTF_8 = StandardCharsets.UTF_8;
+    /** GBK */
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
+
+    /**
+     * 杞崲涓篊harset瀵硅薄
+     * 
+     * @param charset 瀛楃闆嗭紝涓虹┖鍒欒繑鍥為粯璁ゅ瓧绗﹂泦
+     * @return Charset
+     */
+    public static Charset charset(String charset)
+    {
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
+    }
+
+    /**
+     * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮�
+     * 
+     * @param source 瀛楃涓�
+     * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1
+     * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8
+     * @return 杞崲鍚庣殑瀛楃闆�
+     */
+    public static String convert(String source, String srcCharset, String destCharset)
+    {
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
+    }
+
+    /**
+     * 杞崲瀛楃涓茬殑瀛楃闆嗙紪鐮�
+     * 
+     * @param source 瀛楃涓�
+     * @param srcCharset 婧愬瓧绗﹂泦锛岄粯璁SO-8859-1
+     * @param destCharset 鐩爣瀛楃闆嗭紝榛樿UTF-8
+     * @return 杞崲鍚庣殑瀛楃闆�
+     */
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
+    {
+        if (null == srcCharset)
+        {
+            srcCharset = StandardCharsets.ISO_8859_1;
+        }
+
+        if (null == destCharset)
+        {
+            srcCharset = StandardCharsets.UTF_8;
+        }
+
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
+        {
+            return source;
+        }
+        return new String(source.getBytes(srcCharset), destCharset);
+    }
+
+    /**
+     * @return 绯荤粺瀛楃闆嗙紪鐮�
+     */
+    public static String systemCharset()
+    {
+        return Charset.defaultCharset().name();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/text/Convert.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/text/Convert.java
new file mode 100644
index 0000000..5de0b36
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/text/Convert.java
@@ -0,0 +1,999 @@
+package com.dingzhuo.energy.common.utils.text;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+import java.text.NumberFormat;
+import java.util.Set;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 绫诲瀷杞崲鍣�
+ * 
+ * @author ruoyi
+ */
+public class Convert
+{
+    /**
+     * 杞崲涓哄瓧绗︿覆<br>
+     * 濡傛灉缁欏畾鐨勫�间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static String toStr(Object value, String defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof String)
+        {
+            return (String) value;
+        }
+        return value.toString();
+    }
+
+    /**
+     * 杞崲涓哄瓧绗︿覆<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static String toStr(Object value)
+    {
+        return toStr(value, null);
+    }
+
+    /**
+     * 杞崲涓哄瓧绗�<br>
+     * 濡傛灉缁欏畾鐨勫�间负null锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Character toChar(Object value, Character defaultValue)
+    {
+        if (null == value)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Character)
+        {
+            return (Character) value;
+        }
+
+        final String valueStr = toStr(value, null);
+        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
+    }
+
+    /**
+     * 杞崲涓哄瓧绗�<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Character toChar(Object value)
+    {
+        return toChar(value, null);
+    }
+
+    /**
+     * 杞崲涓篵yte<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Byte toByte(Object value, Byte defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Byte)
+        {
+            return (Byte) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).byteValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Byte.parseByte(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篵yte<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Byte toByte(Object value)
+    {
+        return toByte(value, null);
+    }
+
+    /**
+     * 杞崲涓篠hort<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Short toShort(Object value, Short defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Short)
+        {
+            return (Short) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).shortValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Short.parseShort(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篠hort<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Short toShort(Object value)
+    {
+        return toShort(value, null);
+    }
+
+    /**
+     * 杞崲涓篘umber<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Number toNumber(Object value, Number defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Number)
+        {
+            return (Number) value;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return NumberFormat.getInstance().parse(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篘umber<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Number toNumber(Object value)
+    {
+        return toNumber(value, null);
+    }
+
+    /**
+     * 杞崲涓篿nt<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Integer toInt(Object value, Integer defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Integer)
+        {
+            return (Integer) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).intValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Integer.parseInt(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篿nt<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Integer toInt(Object value)
+    {
+        return toInt(value, null);
+    }
+
+    /**
+     * 杞崲涓篒nteger鏁扮粍<br>
+     * 
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Integer[] toIntArray(String str)
+    {
+        return toIntArray(",", str);
+    }
+
+    /**
+     * 杞崲涓篖ong鏁扮粍<br>
+     * 
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Long[] toLongArray(String str)
+    {
+        return toLongArray(",", str);
+    }
+
+    /**
+     * 杞崲涓篒nteger鏁扮粍<br>
+     * 
+     * @param split 鍒嗛殧绗�
+     * @param split 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Integer[] toIntArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Integer[] {};
+        }
+        String[] arr = str.split(split);
+        final Integer[] ints = new Integer[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Integer v = toInt(arr[i], 0);
+            ints[i] = v;
+        }
+        return ints;
+    }
+
+    /**
+     * 杞崲涓篖ong鏁扮粍<br>
+     * 
+     * @param split 鍒嗛殧绗�
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Long[] toLongArray(String split, String str)
+    {
+        if (StringUtils.isEmpty(str))
+        {
+            return new Long[] {};
+        }
+        String[] arr = str.split(split);
+        final Long[] longs = new Long[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Long v = toLong(arr[i], null);
+            longs[i] = v;
+        }
+        return longs;
+    }
+
+    /**
+     * 杞崲涓篠tring鏁扮粍<br>
+     * 
+     * @param str 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static String[] toStrArray(String str)
+    {
+        return toStrArray(",", str);
+    }
+
+    /**
+     * 杞崲涓篠tring鏁扮粍<br>
+     * 
+     * @param split 鍒嗛殧绗�
+     * @param split 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static String[] toStrArray(String split, String str)
+    {
+        return str.split(split);
+    }
+
+    /**
+     * 杞崲涓簂ong<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Long toLong(Object value, Long defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Long)
+        {
+            return (Long) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).longValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 鏀寔绉戝璁℃暟娉�
+            return new BigDecimal(valueStr.trim()).longValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓簂ong<br>
+     * 濡傛灉缁欏畾鐨勫�间负<code>null</code>锛屾垨鑰呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Long toLong(Object value)
+    {
+        return toLong(value, null);
+    }
+
+    /**
+     * 杞崲涓篸ouble<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Double toDouble(Object value, Double defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Double)
+        {
+            return (Double) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).doubleValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 鏀寔绉戝璁℃暟娉�
+            return new BigDecimal(valueStr.trim()).doubleValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篸ouble<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Double toDouble(Object value)
+    {
+        return toDouble(value, null);
+    }
+
+    /**
+     * 杞崲涓篎loat<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Float toFloat(Object value, Float defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Float)
+        {
+            return (Float) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).floatValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Float.parseFloat(valueStr.trim());
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篎loat<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Float toFloat(Object value)
+    {
+        return toFloat(value, null);
+    }
+
+    /**
+     * 杞崲涓篵oolean<br>
+     * String鏀寔鐨勫�间负锛歵rue銆乫alse銆亂es銆乷k銆乶o锛�1,0 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static Boolean toBool(Object value, Boolean defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Boolean)
+        {
+            return (Boolean) value;
+        }
+        String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        valueStr = valueStr.trim().toLowerCase();
+        switch (valueStr)
+        {
+            case "true":
+                return true;
+            case "false":
+                return false;
+            case "yes":
+                return true;
+            case "ok":
+                return true;
+            case "no":
+                return false;
+            case "1":
+                return true;
+            case "0":
+                return false;
+            default:
+                return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篵oolean<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static Boolean toBool(Object value)
+    {
+        return toBool(value, null);
+    }
+
+    /**
+     * 杞崲涓篍num瀵硅薄<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 
+     * @param clazz Enum鐨凜lass
+     * @param value 鍊�
+     * @param defaultValue 榛樿鍊�
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (clazz.isAssignableFrom(value.getClass()))
+        {
+            @SuppressWarnings("unchecked")
+            E myE = (E) value;
+            return myE;
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return Enum.valueOf(clazz, valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓篍num瀵硅薄<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 
+     * @param clazz Enum鐨凜lass
+     * @param value 鍊�
+     * @return Enum
+     */
+    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
+    {
+        return toEnum(clazz, value, null);
+    }
+
+    /**
+     * 杞崲涓築igInteger<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigInteger)
+        {
+            return (BigInteger) value;
+        }
+        if (value instanceof Long)
+        {
+            return BigInteger.valueOf((Long) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigInteger(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓築igInteger<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<code>null</code><br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static BigInteger toBigInteger(Object value)
+    {
+        return toBigInteger(value, null);
+    }
+
+    /**
+     * 杞崲涓築igDecimal<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @param defaultValue 杞崲閿欒鏃剁殑榛樿鍊�
+     * @return 缁撴灉
+     */
+    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal)
+        {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Long)
+        {
+            return new BigDecimal((Long) value);
+        }
+        if (value instanceof Double)
+        {
+            return new BigDecimal((Double) value);
+        }
+        if (value instanceof Integer)
+        {
+            return new BigDecimal((Integer) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StringUtils.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigDecimal(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+
+    /**
+     * 杞崲涓築igDecimal<br>
+     * 濡傛灉缁欏畾鐨勫�间负绌猴紝鎴栬�呰浆鎹㈠け璐ワ紝杩斿洖榛樿鍊�<br>
+     * 杞崲澶辫触涓嶄細鎶ラ敊
+     * 
+     * @param value 琚浆鎹㈢殑鍊�
+     * @return 缁撴灉
+     */
+    public static BigDecimal toBigDecimal(Object value)
+    {
+        return toBigDecimal(value, null);
+    }
+
+    /**
+     * 灏嗗璞¤浆涓哄瓧绗︿覆<br>
+     * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁� 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶
+     * 
+     * @param obj 瀵硅薄
+     * @return 瀛楃涓�
+     */
+    public static String utf8Str(Object obj)
+    {
+        return str(obj, CharsetKit.CHARSET_UTF_8);
+    }
+
+    /**
+     * 灏嗗璞¤浆涓哄瓧绗︿覆<br>
+     * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁� 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶
+     * 
+     * @param obj 瀵硅薄
+     * @param charsetName 瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(Object obj, String charsetName)
+    {
+        return str(obj, Charset.forName(charsetName));
+    }
+
+    /**
+     * 灏嗗璞¤浆涓哄瓧绗︿覆<br>
+     * 1銆丅yte鏁扮粍鍜孊yteBuffer浼氳杞崲涓哄搴斿瓧绗︿覆鐨勬暟缁� 2銆佸璞℃暟缁勪細璋冪敤Arrays.toString鏂规硶
+     * 
+     * @param obj 瀵硅薄
+     * @param charset 瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(Object obj, Charset charset)
+    {
+        if (null == obj)
+        {
+            return null;
+        }
+
+        if (obj instanceof String)
+        {
+            return (String) obj;
+        }
+        else if (obj instanceof byte[] || obj instanceof Byte[])
+        {
+            return str(obj, charset);
+        }
+        else if (obj instanceof ByteBuffer)
+        {
+            return str((ByteBuffer) obj, charset);
+        }
+        return obj.toString();
+    }
+
+    /**
+     * 灏哹yte鏁扮粍杞负瀛楃涓�
+     * 
+     * @param bytes byte鏁扮粍
+     * @param charset 瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(byte[] bytes, String charset)
+    {
+        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
+    }
+
+    /**
+     * 瑙g爜瀛楄妭鐮�
+     * 
+     * @param data 瀛楃涓�
+     * @param charset 瀛楃闆嗭紝濡傛灉姝ゅ瓧娈典负绌猴紝鍒欒В鐮佺殑缁撴灉鍙栧喅浜庡钩鍙�
+     * @return 瑙g爜鍚庣殑瀛楃涓�
+     */
+    public static String str(byte[] data, Charset charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        if (null == charset)
+        {
+            return new String(data);
+        }
+        return new String(data, charset);
+    }
+
+    /**
+     * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆
+     * 
+     * @param data 鏁版嵁
+     * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(ByteBuffer data, String charset)
+    {
+        if (data == null)
+        {
+            return null;
+        }
+
+        return str(data, Charset.forName(charset));
+    }
+
+    /**
+     * 灏嗙紪鐮佺殑byteBuffer鏁版嵁杞崲涓哄瓧绗︿覆
+     * 
+     * @param data 鏁版嵁
+     * @param charset 瀛楃闆嗭紝濡傛灉涓虹┖浣跨敤褰撳墠绯荤粺瀛楃闆�
+     * @return 瀛楃涓�
+     */
+    public static String str(ByteBuffer data, Charset charset)
+    {
+        if (null == charset)
+        {
+            charset = Charset.defaultCharset();
+        }
+        return charset.decode(data).toString();
+    }
+
+    // ----------------------------------------------------------------------- 鍏ㄨ鍗婅杞崲
+    /**
+     * 鍗婅杞叏瑙�
+     * 
+     * @param input String.
+     * @return 鍏ㄨ瀛楃涓�.
+     */
+    public static String toSBC(String input)
+    {
+        return toSBC(input, null);
+    }
+
+    /**
+     * 鍗婅杞叏瑙�
+     * 
+     * @param input String
+     * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎
+     * @return 鍏ㄨ瀛楃涓�.
+     */
+    public static String toSBC(String input, Set<Character> notConvertSet)
+    {
+        char[] c = input.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 璺宠繃涓嶆浛鎹㈢殑瀛楃
+                continue;
+            }
+
+            if (c[i] == ' ')
+            {
+                c[i] = '\u3000';
+            }
+            else if (c[i] < '\177')
+            {
+                c[i] = (char) (c[i] + 65248);
+
+            }
+        }
+        return new String(c);
+    }
+
+    /**
+     * 鍏ㄨ杞崐瑙�
+     * 
+     * @param input String.
+     * @return 鍗婅瀛楃涓�
+     */
+    public static String toDBC(String input)
+    {
+        return toDBC(input, null);
+    }
+
+    /**
+     * 鏇挎崲鍏ㄨ涓哄崐瑙�
+     * 
+     * @param text 鏂囨湰
+     * @param notConvertSet 涓嶆浛鎹㈢殑瀛楃闆嗗悎
+     * @return 鏇挎崲鍚庣殑瀛楃
+     */
+    public static String toDBC(String text, Set<Character> notConvertSet)
+    {
+        char[] c = text.toCharArray();
+        for (int i = 0; i < c.length; i++)
+        {
+            if (null != notConvertSet && notConvertSet.contains(c[i]))
+            {
+                // 璺宠繃涓嶆浛鎹㈢殑瀛楃
+                continue;
+            }
+
+            if (c[i] == '\u3000')
+            {
+                c[i] = ' ';
+            }
+            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
+            {
+                c[i] = (char) (c[i] - 65248);
+            }
+        }
+        String returnString = new String(c);
+
+        return returnString;
+    }
+
+    /**
+     * 鏁板瓧閲戦澶у啓杞崲 鍏堝啓涓畬鏁寸殑鐒跺悗灏嗗闆舵嬀鏇挎崲鎴愰浂
+     * 
+     * @param n 鏁板瓧
+     * @return 涓枃澶у啓鏁板瓧
+     */
+    public static String digitUppercase(double n)
+    {
+        String[] fraction = { "瑙�", "鍒�" };
+        String[] digit = { "闆�", "澹�", "璐�", "鍙�", "鑲�", "浼�", "闄�", "鏌�", "鎹�", "鐜�" };
+        String[][] unit = { { "鍏�", "涓�", "浜�" }, { "", "鎷�", "浣�", "浠�" } };
+
+        String head = n < 0 ? "璐�" : "";
+        n = Math.abs(n);
+
+        String s = "";
+        for (int i = 0; i < fraction.length; i++)
+        {
+            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(闆�.)+", "");
+        }
+        if (s.length() < 1)
+        {
+            s = "鏁�";
+        }
+        int integerPart = (int) Math.floor(n);
+
+        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
+        {
+            String p = "";
+            for (int j = 0; j < unit[1].length && n > 0; j++)
+            {
+                p = digit[integerPart % 10] + unit[1][j] + p;
+                integerPart = integerPart / 10;
+            }
+            s = p.replaceAll("(闆�.)*闆�$", "").replaceAll("^$", "闆�") + unit[0][i] + s;
+        }
+        return head + s.replaceAll("(闆�.)*闆跺厓", "鍏�").replaceFirst("(闆�.)+", "").replaceAll("(闆�.)+", "闆�").replaceAll("^鏁�$", "闆跺厓鏁�");
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/text/StrFormatter.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/text/StrFormatter.java
new file mode 100644
index 0000000..5524b5b
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/text/StrFormatter.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.common.utils.text;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 瀛楃涓叉牸寮忓寲
+ * 
+ * @author ruoyi
+ */
+public class StrFormatter
+{
+    public static final String EMPTY_JSON = "{}";
+    public static final char C_BACKSLASH = '\\';
+    public static final char C_DELIM_START = '{';
+    public static final char C_DELIM_END = '}';
+
+    /**
+     * 鏍煎紡鍖栧瓧绗︿覆<br>
+     * 姝ゆ柟娉曞彧鏄畝鍗曞皢鍗犱綅绗� {} 鎸夌収椤哄簭鏇挎崲涓哄弬鏁�<br>
+     * 濡傛灉鎯宠緭鍑� {} 浣跨敤 \\杞箟 { 鍗冲彲锛屽鏋滄兂杈撳嚭 {} 涔嬪墠鐨� \ 浣跨敤鍙岃浆涔夌 \\\\ 鍗冲彲<br>
+     * 渚嬶細<br>
+     * 閫氬父浣跨敤锛歠ormat("this is {} for {}", "a", "b") -> this is a for b<br>
+     * 杞箟{}锛� format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
+     * 杞箟\锛� format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
+     * 
+     * @param strPattern 瀛楃涓叉ā鏉�
+     * @param argArray 鍙傛暟鍒楄〃
+     * @return 缁撴灉
+     */
+    public static String format(final String strPattern, final Object... argArray)
+    {
+        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
+        {
+            return strPattern;
+        }
+        final int strPatternLength = strPattern.length();
+
+        // 鍒濆鍖栧畾涔夊ソ鐨勯暱搴︿互鑾峰緱鏇村ソ鐨勬�ц兘
+        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
+
+        int handledPosition = 0;
+        int delimIndex;// 鍗犱綅绗︽墍鍦ㄤ綅缃�
+        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
+        {
+            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
+            if (delimIndex == -1)
+            {
+                if (handledPosition == 0)
+                {
+                    return strPattern;
+                }
+                else
+                { // 瀛楃涓叉ā鏉垮墿浣欓儴鍒嗕笉鍐嶅寘鍚崰浣嶇锛屽姞鍏ュ墿浣欓儴鍒嗗悗杩斿洖缁撴灉
+                    sbuf.append(strPattern, handledPosition, strPatternLength);
+                    return sbuf.toString();
+                }
+            }
+            else
+            {
+                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
+                {
+                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
+                    {
+                        // 杞箟绗︿箣鍓嶈繕鏈変竴涓浆涔夌锛屽崰浣嶇渚濇棫鏈夋晥
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                        handledPosition = delimIndex + 2;
+                    }
+                    else
+                    {
+                        // 鍗犱綅绗﹁杞箟
+                        argIndex--;
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
+                        sbuf.append(C_DELIM_START);
+                        handledPosition = delimIndex + 1;
+                    }
+                }
+                else
+                {
+                    // 姝e父鍗犱綅绗�
+                    sbuf.append(strPattern, handledPosition, delimIndex);
+                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
+                    handledPosition = delimIndex + 2;
+                }
+            }
+        }
+        // append the characters following the last {} pair.
+        // 鍔犲叆鏈�鍚庝竴涓崰浣嶇鍚庢墍鏈夌殑瀛楃
+        sbuf.append(strPattern, handledPosition, strPattern.length());
+
+        return sbuf.toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeManager.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeManager.java
new file mode 100644
index 0000000..05d1049
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeManager.java
@@ -0,0 +1,148 @@
+package com.dingzhuo.energy.common.utils.time;
+
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
+import java.util.Date;
+
+public class TimeManager {
+
+  public static final TimeType[] typeArray = {TimeType.LIVE, TimeType.DAY, TimeType.HOUR,
+      TimeType.MONTH, TimeType.SCHEDULING, TimeType.YEAR};
+  private static final DateTimeFormatter pastDataFormat = DateTimeFormat.forPattern
+      ("yyyyMMddHHmmss");
+  private static final DateTimeFormatter hourFormat = DateTimeFormat.forPattern("yyyyMMddHH");
+  private static final DateTimeFormatter dayFormat = DateTimeFormat.forPattern("yyyyMMdd");
+  private static final DateTimeFormatter monthFormat = DateTimeFormat.forPattern("yyyyMM");
+  private static final DateTimeFormatter yearFormat = DateTimeFormat.forPattern("yyyy");
+
+  private static final String livePrefix = "L";
+  private static final String hourPrefix = "H";
+  private static final String dayPrefix = "D";
+  private static final String monthPrefix = "M";
+  private static final String yearPrefix = "Y";
+
+  public static String getExecuteTimeCode(Date time, TimeType type, int delayTime) {
+    DateTime dateTime = new DateTime(time).plusSeconds(-delayTime);
+    return getTimeCode(dateTime.toDate(), type);
+  }
+
+  public static String getTimeCode(Date time, TimeType type) {
+    switch (type) {
+      case LIVE:
+        return livePrefix;
+      case DAY:
+        return dayPrefix + dayFormat.print(new DateTime(time));
+      case HOUR:
+        return hourPrefix + hourFormat.print(new DateTime(time));
+      case MONTH:
+        return monthPrefix + monthFormat.print(new DateTime(time));
+      case YEAR:
+        return yearPrefix + yearFormat.print(new DateTime(time));
+      default:
+        return null;
+    }
+  }
+
+  public static Date getBeginTime(String timeCode) {
+    Date beginTime = getTime(timeCode, 0);
+    if (getTimeType(timeCode) == TimeType.DAY) {
+      beginTime = new DateTime(beginTime).plusHours(9).toDate();
+    }
+
+    return beginTime;
+  }
+
+  public static Date getEndTime(String timeCode) {
+    Date endTime = getTime(timeCode, 1);
+    if (getTimeType(timeCode) == TimeType.DAY) {
+      endTime = new DateTime(endTime).plusHours(9).toDate();
+    }
+
+    return endTime;
+  }
+
+  public static Date getTime(String timeCode) {
+    return getTime(timeCode, 0);
+  }
+
+  public static Date getTime(String timeCode, int offset) {
+    TimeType type = getTimeType(timeCode);
+    String timeStr = timeCode.substring(1);
+    Date result = null;
+    DateTime dateTime;
+
+    try {
+      if (type == null) {
+        result = pastDataFormat.parseDateTime(timeStr).toDate();
+        if (offset != 0) {
+          dateTime = new DateTime(result);
+          dateTime = dateTime.plusSeconds(offset);
+          result = dateTime.toDate();
+        }
+      } else {
+        switch (type) {
+          case LIVE:
+            result = new Date();
+            break;
+          case DAY:
+            result = dayFormat.parseDateTime(timeStr).toDate();
+            if (offset != 0) {
+              dateTime = new DateTime(result);
+              dateTime = dateTime.plusDays(offset);
+              result = dateTime.toDate();
+            }
+            break;
+          case HOUR:
+            result = hourFormat.parseDateTime(timeStr).toDate();
+            if (offset != 0) {
+              dateTime = new DateTime(result);
+              dateTime = dateTime.plusHours(offset);
+              result = dateTime.toDate();
+            }
+            break;
+          case MONTH:
+            result = monthFormat.parseDateTime(timeStr).toDate();
+            if (offset != 0) {
+              dateTime = new DateTime(result);
+              dateTime = dateTime.plusMonths(offset);
+              result = dateTime.toDate();
+            }
+            break;
+          case YEAR:
+            result = yearFormat.parseDateTime(timeStr).toDate();
+            if (offset != 0) {
+              dateTime = new DateTime(result);
+              dateTime = dateTime.plusYears(offset);
+              result = dateTime.toDate();
+            }
+            break;
+          default:
+            break;
+        }
+      }
+    } catch (IllegalArgumentException e) {
+      e.printStackTrace();
+    }
+
+    return result;
+  }
+
+  public static TimeType getTimeType(String timeCode) {
+    switch (timeCode.substring(0, 1).toUpperCase()) {
+      case livePrefix:
+        return TimeType.LIVE;
+      case hourPrefix:
+        return TimeType.HOUR;
+      case dayPrefix:
+        return TimeType.DAY;
+      case monthPrefix:
+        return TimeType.MONTH;
+      case yearPrefix:
+        return TimeType.YEAR;
+      default:
+        return null;
+    }
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeType.java b/basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeType.java
new file mode 100644
index 0000000..05b443e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/utils/time/TimeType.java
@@ -0,0 +1,33 @@
+package com.dingzhuo.energy.common.utils.time;
+
+public enum TimeType {
+
+  /**
+   * 瀹炴椂
+   */
+  LIVE,
+  /**
+   * 灏忔椂
+   */
+  HOUR,
+  /**
+   * 澶�
+   */
+  DAY,
+  /**
+   * 鏈�
+   */
+  MONTH,
+  /**
+   * 骞�
+   */
+  YEAR,
+  /**
+   * 瀛e害
+   */
+  QUARTER,
+  /**
+   * 鎺掔彮
+   */
+  SCHEDULING
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/xss/XssFilter.java b/basic/src/main/java/com/dingzhuo/energy/common/xss/XssFilter.java
new file mode 100644
index 0000000..fad3a68
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/xss/XssFilter.java
@@ -0,0 +1,99 @@
+package com.dingzhuo.energy.common.xss;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 闃叉XSS鏀诲嚮鐨勮繃婊ゅ櫒
+ * 
+ * @author ruoyi
+ */
+public class XssFilter implements Filter
+{
+    /**
+     * 鎺掗櫎閾炬帴
+     */
+    public List<String> excludes = new ArrayList<>();
+
+    /**
+     * xss杩囨护寮�鍏�
+     */
+    public boolean enabled = false;
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException
+    {
+        String tempExcludes = filterConfig.getInitParameter("excludes");
+        String tempEnabled = filterConfig.getInitParameter("enabled");
+        if (StringUtils.isNotEmpty(tempExcludes))
+        {
+            String[] url = tempExcludes.split(",");
+            for (int i = 0; url != null && i < url.length; i++)
+            {
+                excludes.add(url[i]);
+            }
+        }
+        if (StringUtils.isNotEmpty(tempEnabled))
+        {
+            enabled = Boolean.valueOf(tempEnabled);
+        }
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException
+    {
+        HttpServletRequest req = (HttpServletRequest) request;
+        HttpServletResponse resp = (HttpServletResponse) response;
+        if (handleExcludeURL(req, resp))
+        {
+            chain.doFilter(request, response);
+            return;
+        }
+        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
+        chain.doFilter(xssRequest, response);
+    }
+
+    private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response)
+    {
+        if (!enabled)
+        {
+            return true;
+        }
+        if (excludes == null || excludes.isEmpty())
+        {
+            return false;
+        }
+        String url = request.getServletPath();
+        for (String pattern : excludes)
+        {
+            Pattern p = Pattern.compile("^" + pattern);
+            Matcher m = p.matcher(url);
+            if (m.find())
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void destroy()
+    {
+
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/common/xss/XssHttpServletRequestWrapper.java b/basic/src/main/java/com/dingzhuo/energy/common/xss/XssHttpServletRequestWrapper.java
new file mode 100644
index 0000000..a0a5624
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/common/xss/XssHttpServletRequestWrapper.java
@@ -0,0 +1,109 @@
+package com.dingzhuo.energy.common.xss;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.html.EscapeUtil;
+import org.apache.commons.io.IOUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.html.EscapeUtil;
+
+/**
+ * XSS杩囨护澶勭悊
+ * 
+ * @author ruoyi
+ */
+public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper
+{
+    /**
+     * @param request
+     */
+    public XssHttpServletRequestWrapper(HttpServletRequest request)
+    {
+        super(request);
+    }
+
+    @Override
+    public String[] getParameterValues(String name)
+    {
+        String[] values = super.getParameterValues(name);
+        if (values != null)
+        {
+            int length = values.length;
+            String[] escapseValues = new String[length];
+            for (int i = 0; i < length; i++)
+            {
+                // 闃瞲ss鏀诲嚮鍜岃繃婊ゅ墠鍚庣┖鏍�
+                escapseValues[i] = EscapeUtil.clean(values[i]).trim();
+            }
+            return escapseValues;
+        }
+        return super.getParameterValues(name);
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException
+    {
+        // 闈瀓son绫诲瀷锛岀洿鎺ヨ繑鍥�
+        if (!isJsonRequest())
+        {
+            return super.getInputStream();
+        }
+
+        // 涓虹┖锛岀洿鎺ヨ繑鍥�
+        String json = IOUtils.toString(super.getInputStream(), StandardCharsets.UTF_8);
+        if (StringUtils.isEmpty(json))
+        {
+            return super.getInputStream();
+        }
+
+        // xss杩囨护
+        json = EscapeUtil.clean(json).trim();
+        final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
+        return new ServletInputStream()
+        {
+            @Override
+            public boolean isFinished()
+            {
+                return true;
+            }
+
+            @Override
+            public boolean isReady()
+            {
+                return true;
+            }
+
+            @Override
+            public void setReadListener(ReadListener readListener)
+            {
+            }
+
+            @Override
+            public int read() throws IOException
+            {
+                return bis.read();
+            }
+        };
+    }
+
+    /**
+     * 鏄惁鏄疛son璇锋眰
+     * 
+     * @param request
+     */
+    public boolean isJsonRequest()
+    {
+        String header = super.getHeader(HttpHeaders.CONTENT_TYPE);
+        return MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(header)
+                || MediaType.APPLICATION_JSON_UTF8_VALUE.equalsIgnoreCase(header);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataScopeAspect.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataScopeAspect.java
new file mode 100644
index 0000000..d245975
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataScopeAspect.java
@@ -0,0 +1,164 @@
+package com.dingzhuo.energy.framework.aspectj;
+
+import java.lang.reflect.Method;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.spring.SpringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.project.system.domain.SysRole;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+
+/**
+ * 鏁版嵁杩囨护澶勭悊
+ * 
+ * @author ruoyi
+ */
+@Aspect
+@Component
+public class DataScopeAspect
+{
+    /**
+     * 鍏ㄩ儴鏁版嵁鏉冮檺
+     */
+    public static final String DATA_SCOPE_ALL = "1";
+
+    /**
+     * 鑷畾鏁版嵁鏉冮檺
+     */
+    public static final String DATA_SCOPE_CUSTOM = "2";
+
+    /**
+     * 閮ㄩ棬鏁版嵁鏉冮檺
+     */
+    public static final String DATA_SCOPE_DEPT = "3";
+
+    /**
+     * 閮ㄩ棬鍙婁互涓嬫暟鎹潈闄�
+     */
+    public static final String DATA_SCOPE_DEPT_AND_CHILD = "4";
+
+    /**
+     * 浠呮湰浜烘暟鎹潈闄�
+     */
+    public static final String DATA_SCOPE_SELF = "5";
+
+    // 閰嶇疆缁囧叆鐐�
+    @Pointcut("@annotation(com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope)")
+    public void dataScopePointCut()
+    {
+    }
+
+    @Before("dataScopePointCut()")
+    public void doBefore(JoinPoint point) throws Throwable
+    {
+        handleDataScope(point);
+    }
+
+    protected void handleDataScope(final JoinPoint joinPoint)
+    {
+        // 鑾峰緱娉ㄨВ
+        DataScope controllerDataScope = getAnnotationLog(joinPoint);
+        if (controllerDataScope == null)
+        {
+            return;
+        }
+        // 鑾峰彇褰撳墠鐨勭敤鎴�
+        LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
+        SysUser currentUser = loginUser.getUser();
+        if (currentUser != null)
+        {
+            // 濡傛灉鏄秴绾х鐞嗗憳锛屽垯涓嶈繃婊ゆ暟鎹�
+            if (!currentUser.isAdmin())
+            {
+                dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(),
+                        controllerDataScope.userAlias());
+            }
+        }
+    }
+
+    /**
+     * 鏁版嵁鑼冨洿杩囨护
+     * 
+     * @param joinPoint 鍒囩偣
+     * @param user 鐢ㄦ埛
+     * @param alias 鍒悕
+     */
+    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
+    {
+        StringBuilder sqlString = new StringBuilder();
+
+        for (SysRole role : user.getRoles())
+        {
+            String dataScope = role.getDataScope();
+            if (DATA_SCOPE_ALL.equals(dataScope))
+            {
+                sqlString = new StringBuilder();
+                break;
+            }
+            else if (DATA_SCOPE_CUSTOM.equals(dataScope))
+            {
+                sqlString.append(StringUtils.format(
+                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
+                        role.getRoleId()));
+            }
+            else if (DATA_SCOPE_DEPT.equals(dataScope))
+            {
+                sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
+            }
+            else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
+            {
+                sqlString.append(StringUtils.format(
+                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
+                        deptAlias, user.getDeptId(), user.getDeptId()));
+            }
+            else if (DATA_SCOPE_SELF.equals(dataScope))
+            {
+                if (StringUtils.isNotBlank(userAlias))
+                {
+                    sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
+                }
+                else
+                {
+                    // 鏁版嵁鏉冮檺涓轰粎鏈汉涓旀病鏈塽serAlias鍒悕涓嶆煡璇换浣曟暟鎹�
+                    sqlString.append(" OR 1=0 ");
+                }
+            }
+        }
+
+        if (StringUtils.isNotBlank(sqlString.toString()))
+        {
+            BaseEntity baseEntity = (BaseEntity) joinPoint.getArgs()[0];
+            baseEntity.setDataScope(" AND (" + sqlString.substring(4) + ")");
+        }
+    }
+
+    /**
+     * 鏄惁瀛樺湪娉ㄨВ锛屽鏋滃瓨鍦ㄥ氨鑾峰彇
+     */
+    private DataScope getAnnotationLog(JoinPoint joinPoint)
+    {
+        Signature signature = joinPoint.getSignature();
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = methodSignature.getMethod();
+
+        if (method != null)
+        {
+            return method.getAnnotation(DataScope.class);
+        }
+        return null;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataSourceAspect.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataSourceAspect.java
new file mode 100644
index 0000000..0a2cedd
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/DataSourceAspect.java
@@ -0,0 +1,79 @@
+package com.dingzhuo.energy.framework.aspectj;
+
+import java.lang.reflect.Method;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataSource;
+import com.dingzhuo.energy.framework.datasource.DynamicDataSourceContextHolder;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataSource;
+import com.dingzhuo.energy.framework.datasource.DynamicDataSourceContextHolder;
+
+/**
+ * 澶氭暟鎹簮澶勭悊
+ * 
+ * @author ruoyi
+ */
+@Aspect
+@Order(1)
+@Component
+public class DataSourceAspect
+{
+    protected Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Pointcut("@annotation(com.dingzhuo.energy.framework.aspectj.lang.annotation.DataSource)"
+            + "|| @within(com.dingzhuo.energy.framework.aspectj.lang.annotation.DataSource)")
+    public void dsPointCut()
+    {
+
+    }
+
+    @Around("dsPointCut()")
+    public Object around(ProceedingJoinPoint point) throws Throwable
+    {
+        DataSource dataSource = getDataSource(point);
+
+        if (StringUtils.isNotNull(dataSource))
+        {
+            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
+        }
+
+        try
+        {
+            return point.proceed();
+        }
+        finally
+        {
+            // 閿�姣佹暟鎹簮 鍦ㄦ墽琛屾柟娉曚箣鍚�
+            DynamicDataSourceContextHolder.clearDataSourceType();
+        }
+    }
+
+    /**
+     * 鑾峰彇闇�瑕佸垏鎹㈢殑鏁版嵁婧�
+     */
+    public DataSource getDataSource(ProceedingJoinPoint point)
+    {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        Class<? extends Object> targetClass = point.getTarget().getClass();
+        DataSource targetDataSource = targetClass.getAnnotation(DataSource.class);
+        if (StringUtils.isNotNull(targetDataSource))
+        {
+            return targetDataSource;
+        }
+        else
+        {
+            Method method = signature.getMethod();
+            DataSource dataSource = method.getAnnotation(DataSource.class);
+            return dataSource;
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/LogAspect.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/LogAspect.java
new file mode 100644
index 0000000..6bdcae9
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/LogAspect.java
@@ -0,0 +1,224 @@
+package com.dingzhuo.energy.framework.aspectj;
+
+import java.lang.reflect.Method;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessStatus;
+import com.dingzhuo.energy.framework.manager.AsyncManager;
+import com.dingzhuo.energy.framework.manager.factory.AsyncFactory;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.HandlerMapping;
+import com.alibaba.fastjson.JSON;
+import com.dingzhuo.energy.common.enums.HttpMethod;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.ip.IpUtils;
+import com.dingzhuo.energy.common.utils.spring.SpringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessStatus;
+import com.dingzhuo.energy.framework.manager.AsyncManager;
+import com.dingzhuo.energy.framework.manager.factory.AsyncFactory;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.project.monitor.domain.SysOperLog;
+
+/**
+ * 鎿嶄綔鏃ュ織璁板綍澶勭悊
+ * 
+ * @author ruoyi
+ */
+@Aspect
+@Component
+public class LogAspect
+{
+    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
+
+    // 閰嶇疆缁囧叆鐐�
+    @Pointcut("@annotation(com.dingzhuo.energy.framework.aspectj.lang.annotation.Log)")
+    public void logPointCut()
+    {
+    }
+
+    /**
+     * 澶勭悊瀹岃姹傚悗鎵ц
+     *
+     * @param joinPoint 鍒囩偣
+     */
+    @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
+    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult)
+    {
+        handleLog(joinPoint, null, jsonResult);
+    }
+
+    /**
+     * 鎷︽埅寮傚父鎿嶄綔
+     * 
+     * @param joinPoint 鍒囩偣
+     * @param e 寮傚父
+     */
+    @AfterThrowing(value = "logPointCut()", throwing = "e")
+    public void doAfterThrowing(JoinPoint joinPoint, Exception e)
+    {
+        handleLog(joinPoint, e, null);
+    }
+
+    protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult)
+    {
+        try
+        {
+            // 鑾峰緱娉ㄨВ
+            Log controllerLog = getAnnotationLog(joinPoint);
+            if (controllerLog == null)
+            {
+                return;
+            }
+
+            // 鑾峰彇褰撳墠鐨勭敤鎴�
+            LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
+
+            // *========鏁版嵁搴撴棩蹇�=========*//
+            SysOperLog operLog = new SysOperLog();
+            operLog.setStatus(BusinessStatus.SUCCESS.ordinal());
+            // 璇锋眰鐨勫湴鍧�
+            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+            operLog.setOperIp(ip);
+            // 杩斿洖鍙傛暟
+            operLog.setJsonResult(JSON.toJSONString(jsonResult));
+
+            operLog.setOperUrl(ServletUtils.getRequest().getRequestURI());
+            if (loginUser != null)
+            {
+                operLog.setOperName(loginUser.getUsername());
+            }
+
+            if (e != null)
+            {
+                operLog.setStatus(BusinessStatus.FAIL.ordinal());
+                operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
+            }
+            // 璁剧疆鏂规硶鍚嶇О
+            String className = joinPoint.getTarget().getClass().getName();
+            String methodName = joinPoint.getSignature().getName();
+            operLog.setMethod(className + "." + methodName + "()");
+            // 璁剧疆璇锋眰鏂瑰紡
+            operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
+            // 澶勭悊璁剧疆娉ㄨВ涓婄殑鍙傛暟
+            getControllerMethodDescription(joinPoint, controllerLog, operLog);
+            // 淇濆瓨鏁版嵁搴�
+            AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
+        }
+        catch (Exception exp)
+        {
+            // 璁板綍鏈湴寮傚父鏃ュ織
+            log.error("==鍓嶇疆閫氱煡寮傚父==");
+            log.error("寮傚父淇℃伅:{}", exp.getMessage());
+            exp.printStackTrace();
+        }
+    }
+
+    /**
+     * 鑾峰彇娉ㄨВ涓鏂规硶鐨勬弿杩颁俊鎭� 鐢ㄤ簬Controller灞傛敞瑙�
+     * 
+     * @param log 鏃ュ織
+     * @param operLog 鎿嶄綔鏃ュ織
+     * @throws Exception
+     */
+    public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog) throws Exception
+    {
+        // 璁剧疆action鍔ㄤ綔
+        operLog.setBusinessType(log.businessType().ordinal());
+        // 璁剧疆鏍囬
+        operLog.setTitle(log.title());
+        // 璁剧疆鎿嶄綔浜虹被鍒�
+        operLog.setOperatorType(log.operatorType().ordinal());
+        // 鏄惁闇�瑕佷繚瀛榬equest锛屽弬鏁板拰鍊�
+        if (log.isSaveRequestData())
+        {
+            // 鑾峰彇鍙傛暟鐨勪俊鎭紝浼犲叆鍒版暟鎹簱涓��
+            setRequestValue(joinPoint, operLog);
+        }
+    }
+
+    /**
+     * 鑾峰彇璇锋眰鐨勫弬鏁帮紝鏀惧埌log涓�
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織
+     * @throws Exception 寮傚父
+     */
+    private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception
+    {
+        String requestMethod = operLog.getRequestMethod();
+        if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
+        {
+            String params = argsArrayToString(joinPoint.getArgs());
+            operLog.setOperParam(StringUtils.substring(params, 0, 2000));
+        }
+        else
+        {
+            Map<?, ?> paramsMap = (Map<?, ?>) ServletUtils.getRequest().getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
+            operLog.setOperParam(StringUtils.substring(paramsMap.toString(), 0, 2000));
+        }
+    }
+
+    /**
+     * 鏄惁瀛樺湪娉ㄨВ锛屽鏋滃瓨鍦ㄥ氨鑾峰彇
+     */
+    private Log getAnnotationLog(JoinPoint joinPoint) throws Exception
+    {
+        Signature signature = joinPoint.getSignature();
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = methodSignature.getMethod();
+
+        if (method != null)
+        {
+            return method.getAnnotation(Log.class);
+        }
+        return null;
+    }
+
+    /**
+     * 鍙傛暟鎷艰
+     */
+    private String argsArrayToString(Object[] paramsArray)
+    {
+        String params = "";
+        if (paramsArray != null && paramsArray.length > 0)
+        {
+            for (int i = 0; i < paramsArray.length; i++)
+            {
+                if (!isFilterObject(paramsArray[i]))
+                {
+                    Object jsonObj = JSON.toJSON(paramsArray[i]);
+                    params += jsonObj.toString() + " ";
+                }
+            }
+        }
+        return params.trim();
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁闇�瑕佽繃婊ょ殑瀵硅薄銆�
+     * 
+     * @param o 瀵硅薄淇℃伅銆�
+     * @return 濡傛灉鏄渶瑕佽繃婊ょ殑瀵硅薄锛屽垯杩斿洖true锛涘惁鍒欒繑鍥瀎alse銆�
+     */
+    public boolean isFilterObject(final Object o)
+    {
+        return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataScope.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataScope.java
new file mode 100644
index 0000000..95b2a09
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataScope.java
@@ -0,0 +1,28 @@
+package com.dingzhuo.energy.framework.aspectj.lang.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 鏁版嵁鏉冮檺杩囨护娉ㄨВ
+ * 
+ * @author ruoyi
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DataScope
+{
+    /**
+     * 閮ㄩ棬琛ㄧ殑鍒悕
+     */
+    String deptAlias() default "";
+
+    /**
+     * 鐢ㄦ埛琛ㄧ殑鍒悕
+     */
+    String userAlias() default "";
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataSource.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataSource.java
new file mode 100644
index 0000000..f74bdd2
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/DataSource.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.framework.aspectj.lang.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.DataSourceType;
+
+/**
+ * 鑷畾涔夊鏁版嵁婧愬垏鎹㈡敞瑙�
+ * 
+ * @author ruoyi
+ */
+@Target({ ElementType.METHOD, ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface DataSource
+{
+    /**
+     * 鍒囨崲鏁版嵁婧愬悕绉�
+     */
+    DataSourceType value() default DataSourceType.MASTER;
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excel.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excel.java
new file mode 100644
index 0000000..01d3e45
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excel.java
@@ -0,0 +1,113 @@
+package com.dingzhuo.energy.framework.aspectj.lang.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 鑷畾涔夊鍑篍xcel鏁版嵁娉ㄨВ
+ * 
+ * @author ruoyi
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface Excel
+{
+    /**
+     * 瀵煎嚭鍒癊xcel涓殑鍚嶅瓧.
+     */
+    String name() default "";
+
+    /**
+     * 鏃ユ湡鏍煎紡, 濡�: yyyy-MM-dd
+     */
+    String dateFormat() default "";
+
+    /**
+     * 璇诲彇鍐呭杞〃杈惧紡 (濡�: 0=鐢�,1=濂�,2=鏈煡)
+     */
+    String readConverterExp() default "";
+
+    /**
+     * 瀵煎嚭绫诲瀷锛�0鏁板瓧 1瀛楃涓诧級
+     */
+    ColumnType cellType() default ColumnType.STRING;
+
+    /**
+     * 瀵煎嚭鏃跺湪excel涓瘡涓垪鐨勯珮搴� 鍗曚綅涓哄瓧绗�
+     */
+    double height() default 14;
+
+    /**
+     * 瀵煎嚭鏃跺湪excel涓瘡涓垪鐨勫 鍗曚綅涓哄瓧绗�
+     */
+    double width() default 16;
+
+    /**
+     * 鏂囧瓧鍚庣紑,濡�% 90 鍙樻垚90%
+     */
+    String suffix() default "";
+
+    /**
+     * 褰撳�间负绌烘椂,瀛楁鐨勯粯璁ゅ��
+     */
+    String defaultValue() default "";
+
+    /**
+     * 鎻愮ず淇℃伅
+     */
+    String prompt() default "";
+
+    /**
+     * 璁剧疆鍙兘閫夋嫨涓嶈兘杈撳叆鐨勫垪鍐呭.
+     */
+    String[] combo() default {};
+
+    /**
+     * 鏄惁瀵煎嚭鏁版嵁,搴斿闇�姹�:鏈夋椂鎴戜滑闇�瑕佸鍑轰竴浠芥ā鏉�,杩欐槸鏍囬闇�瑕佷絾鍐呭闇�瑕佺敤鎴锋墜宸ュ~鍐�.
+     */
+    boolean isExport() default true;
+
+    /**
+     * 鍙︿竴涓被涓殑灞炴�у悕绉�,鏀寔澶氱骇鑾峰彇,浠ュ皬鏁扮偣闅斿紑
+     */
+    String targetAttr() default "";
+
+    /**
+     * 瀛楁绫诲瀷锛�0锛氬鍑哄鍏ワ紱1锛氫粎瀵煎嚭锛�2锛氫粎瀵煎叆锛�
+     */
+    Type type() default Type.ALL;
+
+    enum Type
+    {
+        ALL(0), EXPORT(1), IMPORT(2);
+        private final int value;
+
+        Type(int value)
+        {
+            this.value = value;
+        }
+
+        public int value()
+        {
+            return this.value;
+        }
+    }
+
+    enum ColumnType
+    {
+        NUMERIC(0), STRING(1);
+        private final int value;
+
+        ColumnType(int value)
+        {
+            this.value = value;
+        }
+
+        public int value()
+        {
+            return this.value;
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excels.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excels.java
new file mode 100644
index 0000000..b72b952
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Excels.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.framework.aspectj.lang.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Excel娉ㄨВ闆�
+ * 
+ * @author ruoyi
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Excels
+{
+    Excel[] value();
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Log.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Log.java
new file mode 100644
index 0000000..a71668e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/annotation/Log.java
@@ -0,0 +1,41 @@
+package com.dingzhuo.energy.framework.aspectj.lang.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.OperatorType;
+
+/**
+ * 鑷畾涔夋搷浣滄棩蹇楄褰曟敞瑙�
+ * 
+ * @author ruoyi
+ *
+ */
+@Target({ ElementType.PARAMETER, ElementType.METHOD })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log
+{
+    /**
+     * 妯″潡 
+     */
+    String title() default "";
+
+    /**
+     * 鍔熻兘
+     */
+    BusinessType businessType() default BusinessType.OTHER;
+
+    /**
+     * 鎿嶄綔浜虹被鍒�
+     */
+    OperatorType operatorType() default OperatorType.MANAGE;
+
+    /**
+     * 鏄惁淇濆瓨璇锋眰鐨勫弬鏁�
+     */
+    boolean isSaveRequestData() default true;
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessStatus.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessStatus.java
new file mode 100644
index 0000000..928d2b1
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessStatus.java
@@ -0,0 +1,20 @@
+package com.dingzhuo.energy.framework.aspectj.lang.enums;
+
+/**
+ * 鎿嶄綔鐘舵��
+ * 
+ * @author ruoyi
+ *
+ */
+public enum BusinessStatus
+{
+    /**
+     * 鎴愬姛
+     */
+    SUCCESS,
+
+    /**
+     * 澶辫触
+     */
+    FAIL,
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessType.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessType.java
new file mode 100644
index 0000000..587914e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/BusinessType.java
@@ -0,0 +1,59 @@
+package com.dingzhuo.energy.framework.aspectj.lang.enums;
+
+/**
+ * 涓氬姟鎿嶄綔绫诲瀷
+ * 
+ * @author ruoyi
+ */
+public enum BusinessType
+{
+    /**
+     * 鍏跺畠
+     */
+    OTHER,
+
+    /**
+     * 鏂板
+     */
+    INSERT,
+
+    /**
+     * 淇敼
+     */
+    UPDATE,
+
+    /**
+     * 鍒犻櫎
+     */
+    DELETE,
+
+    /**
+     * 鎺堟潈
+     */
+    GRANT,
+
+    /**
+     * 瀵煎嚭
+     */
+    EXPORT,
+
+    /**
+     * 瀵煎叆
+     */
+    IMPORT,
+
+    /**
+     * 寮洪��
+     */
+    FORCE,
+
+    /**
+     * 鐢熸垚浠g爜
+     */
+    GENCODE,
+    
+    /**
+     * 娓呯┖鏁版嵁
+     */
+    CLEAN,
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/DataSourceType.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/DataSourceType.java
new file mode 100644
index 0000000..81ed83e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/DataSourceType.java
@@ -0,0 +1,19 @@
+package com.dingzhuo.energy.framework.aspectj.lang.enums;
+
+/**
+ * 鏁版嵁婧�
+ * 
+ * @author ruoyi
+ */
+public enum DataSourceType
+{
+    /**
+     * 涓诲簱
+     */
+    MASTER,
+
+    /**
+     * 浠庡簱
+     */
+    SLAVE
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/OperatorType.java b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/OperatorType.java
new file mode 100644
index 0000000..9241ec0
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/aspectj/lang/enums/OperatorType.java
@@ -0,0 +1,24 @@
+package com.dingzhuo.energy.framework.aspectj.lang.enums;
+
+/**
+ * 鎿嶄綔浜虹被鍒�
+ * 
+ * @author ruoyi
+ */
+public enum OperatorType
+{
+    /**
+     * 鍏跺畠
+     */
+    OTHER,
+
+    /**
+     * 鍚庡彴鐢ㄦ埛
+     */
+    MANAGE,
+
+    /**
+     * 鎵嬫満绔敤鎴�
+     */
+    MOBILE
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/ApplicationConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/ApplicationConfig.java
new file mode 100644
index 0000000..555f6e9
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/ApplicationConfig.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.framework.config;
+
+import java.util.TimeZone;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+
+/**
+ * 绋嬪簭娉ㄨВ閰嶇疆
+ *
+ * @author ruoyi
+ */
+@Configuration
+// 琛ㄧず閫氳繃aop妗嗘灦鏆撮湶璇ヤ唬鐞嗗璞�,AopContext鑳藉璁块棶
+@EnableAspectJAutoProxy(exposeProxy = true)
+// 鎸囧畾瑕佹壂鎻忕殑Mapper绫荤殑鍖呯殑璺緞
+@MapperScan("com.dingzhuo.energy.**.mapper")
+public class ApplicationConfig
+{
+    /**
+     * 鏃跺尯閰嶇疆
+     */
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization()
+    {
+        return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault());
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/DruidConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/DruidConfig.java
new file mode 100644
index 0000000..cdd0709
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/DruidConfig.java
@@ -0,0 +1,130 @@
+package com.dingzhuo.energy.framework.config;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.sql.DataSource;
+
+import com.dingzhuo.energy.framework.aspectj.lang.enums.DataSourceType;
+import com.dingzhuo.energy.framework.config.properties.DruidProperties;
+import com.dingzhuo.energy.framework.datasource.DynamicDataSource;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
+import com.alibaba.druid.util.Utils;
+import com.dingzhuo.energy.common.utils.spring.SpringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.DataSourceType;
+import com.dingzhuo.energy.framework.config.properties.DruidProperties;
+import com.dingzhuo.energy.framework.datasource.DynamicDataSource;
+
+/**
+ * druid 閰嶇疆澶氭暟鎹簮
+ * 
+ * @author ruoyi
+ */
+@Configuration
+public class DruidConfig
+{
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.master")
+    public DataSource masterDataSource(DruidProperties druidProperties)
+    {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        return druidProperties.dataSource(dataSource);
+    }
+
+    @Bean
+    @ConfigurationProperties("spring.datasource.druid.slave")
+    @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true")
+    public DataSource slaveDataSource(DruidProperties druidProperties)
+    {
+        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
+        return druidProperties.dataSource(dataSource);
+    }
+
+    @Bean(name = "dynamicDataSource")
+    @Primary
+    public DynamicDataSource dataSource(DataSource masterDataSource)
+    {
+        Map<Object, Object> targetDataSources = new HashMap<>();
+        targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource);
+        setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource");
+        return new DynamicDataSource(masterDataSource, targetDataSources);
+    }
+    
+    /**
+     * 璁剧疆鏁版嵁婧�
+     * 
+     * @param targetDataSources 澶囬�夋暟鎹簮闆嗗悎
+     * @param sourceName 鏁版嵁婧愬悕绉�
+     * @param beanName bean鍚嶇О
+     */
+    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, String beanName)
+    {
+        try
+        {
+            DataSource dataSource = SpringUtils.getBean(beanName);
+            targetDataSources.put(sourceName, dataSource);
+        }
+        catch (Exception e)
+        {
+        }
+    }
+
+    /**
+     * 鍘婚櫎鐩戞帶椤甸潰搴曢儴鐨勫箍鍛�
+     */
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Bean
+    @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true")
+    public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties)
+    {
+        // 鑾峰彇web鐩戞帶椤甸潰鐨勫弬鏁�
+        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
+        // 鎻愬彇common.js鐨勯厤缃矾寰�
+        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
+        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");
+        final String filePath = "support/http/resources/js/common.js";
+        // 鍒涘缓filter杩涜杩囨护
+        Filter filter = new Filter()
+        {
+            @Override
+            public void init(javax.servlet.FilterConfig filterConfig) throws ServletException
+            {
+            }
+            @Override
+            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+                    throws IOException, ServletException
+            {
+                chain.doFilter(request, response);
+                // 閲嶇疆缂撳啿鍖猴紝鍝嶅簲澶翠笉浼氳閲嶇疆
+                response.resetBuffer();
+                // 鑾峰彇common.js
+                String text = Utils.readFromResource(filePath);
+                // 姝e垯鏇挎崲banner, 闄ゅ幓搴曢儴鐨勫箍鍛婁俊鎭�
+                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
+                text = text.replaceAll("powered.*?shrek.wang</a>", "");
+                response.getWriter().write(text);
+            }
+            @Override
+            public void destroy()
+            {
+            }
+        };
+        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
+        registrationBean.setFilter(filter);
+        registrationBean.addUrlPatterns(commonJsPattern);
+        return registrationBean;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/FastJson2JsonRedisSerializer.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/FastJson2JsonRedisSerializer.java
new file mode 100644
index 0000000..9ca43eb
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/FastJson2JsonRedisSerializer.java
@@ -0,0 +1,70 @@
+package com.dingzhuo.energy.framework.config;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+import com.alibaba.fastjson.parser.ParserConfig;
+import org.springframework.util.Assert;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Redis浣跨敤FastJson搴忓垪鍖�
+ * 
+ * @author ruoyi
+ */
+public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
+{
+    @SuppressWarnings("unused")
+    private ObjectMapper objectMapper = new ObjectMapper();
+
+    public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
+
+    private Class<T> clazz;
+
+    static
+    {
+        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
+    }
+
+    public FastJson2JsonRedisSerializer(Class<T> clazz)
+    {
+        super();
+        this.clazz = clazz;
+    }
+
+    public byte[] serialize(T t) throws SerializationException
+    {
+        if (t == null)
+        {
+            return new byte[0];
+        }
+        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
+    }
+
+    public T deserialize(byte[] bytes) throws SerializationException
+    {
+        if (bytes == null || bytes.length <= 0)
+        {
+            return null;
+        }
+        String str = new String(bytes, DEFAULT_CHARSET);
+
+        return JSON.parseObject(str, clazz);
+    }
+
+    public void setObjectMapper(ObjectMapper objectMapper)
+    {
+        Assert.notNull(objectMapper, "'objectMapper' must not be null");
+        this.objectMapper = objectMapper;
+    }
+
+    protected JavaType getJavaType(Class<?> clazz)
+    {
+        return TypeFactory.defaultInstance().constructType(clazz);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/FilterConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/FilterConfig.java
new file mode 100644
index 0000000..a3bbb5e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/FilterConfig.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.framework.config;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.DispatcherType;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.xss.XssFilter;
+
+/**
+ * Filter閰嶇疆
+ *
+ * @author ruoyi
+ */
+@Configuration
+public class FilterConfig
+{
+    @Value("${xss.enabled}")
+    private String enabled;
+
+    @Value("${xss.excludes}")
+    private String excludes;
+
+    @Value("${xss.urlPatterns}")
+    private String urlPatterns;
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    @Bean
+    public FilterRegistrationBean xssFilterRegistration()
+    {
+        FilterRegistrationBean registration = new FilterRegistrationBean();
+        registration.setDispatcherTypes(DispatcherType.REQUEST);
+        registration.setFilter(new XssFilter());
+        registration.addUrlPatterns(StringUtils.split(urlPatterns, ","));
+        registration.setName("xssFilter");
+        registration.setOrder(Integer.MAX_VALUE);
+        Map<String, String> initParameters = new HashMap<String, String>();
+        initParameters.put("excludes", excludes);
+        initParameters.put("enabled", enabled);
+        registration.setInitParameters(initParameters);
+        return registration;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/GenConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/GenConfig.java
new file mode 100644
index 0000000..ab399eb
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/GenConfig.java
@@ -0,0 +1,66 @@
+package com.dingzhuo.energy.framework.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 璇诲彇浠g爜鐢熸垚鐩稿叧閰嶇疆
+ * 
+ * @author ruoyi
+ */
+@Component
+@ConfigurationProperties(prefix = "gen")
+public class GenConfig
+{
+    /** 浣滆�� */
+    public static String author;
+
+    /** 鐢熸垚鍖呰矾寰� */
+    public static String packageName;
+
+    /** 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true */
+    public static boolean autoRemovePre;
+
+    /** 琛ㄥ墠缂�(绫诲悕涓嶄細鍖呭惈琛ㄥ墠缂�) */
+    public static String tablePrefix;
+
+    public static String getAuthor()
+    {
+        return author;
+    }
+
+    public void setAuthor(String author)
+    {
+        GenConfig.author = author;
+    }
+
+    public static String getPackageName()
+    {
+        return packageName;
+    }
+
+    public void setPackageName(String packageName)
+    {
+        GenConfig.packageName = packageName;
+    }
+
+    public static boolean getAutoRemovePre()
+    {
+        return autoRemovePre;
+    }
+
+    public void setAutoRemovePre(boolean autoRemovePre)
+    {
+        GenConfig.autoRemovePre = autoRemovePre;
+    }
+
+    public static String getTablePrefix()
+    {
+        return tablePrefix;
+    }
+
+    public void setTablePrefix(String tablePrefix)
+    {
+        GenConfig.tablePrefix = tablePrefix;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/MyBatisConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/MyBatisConfig.java
new file mode 100644
index 0000000..a843fc9
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/MyBatisConfig.java
@@ -0,0 +1,105 @@
+package com.dingzhuo.energy.framework.config;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import javax.sql.DataSource;
+import org.apache.ibatis.io.VFS;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.core.type.classreading.CachingMetadataReaderFactory;
+import org.springframework.core.type.classreading.MetadataReader;
+import org.springframework.core.type.classreading.MetadataReaderFactory;
+import org.springframework.util.ClassUtils;
+
+/**
+ * Mybatis鏀寔*鍖归厤鎵弿鍖�
+ * 
+ * @author ruoyi
+ */
+@Configuration
+public class MyBatisConfig
+{
+    @Autowired
+    private Environment env;
+
+    static final String DEFAULT_RESOURCE_PATTERN = "**/*.class";
+
+    public static String setTypeAliasesPackage(String typeAliasesPackage)
+    {
+        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+        MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver);
+        List<String> allResult = new ArrayList<String>();
+        try
+        {
+            for (String aliasesPackage : typeAliasesPackage.split(","))
+            {
+                List<String> result = new ArrayList<String>();
+                aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+                        + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN;
+                Resource[] resources = resolver.getResources(aliasesPackage);
+                if (resources != null && resources.length > 0)
+                {
+                    MetadataReader metadataReader = null;
+                    for (Resource resource : resources)
+                    {
+                        if (resource.isReadable())
+                        {
+                            metadataReader = metadataReaderFactory.getMetadataReader(resource);
+                            try
+                            {
+                                result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName());
+                            }
+                            catch (ClassNotFoundException e)
+                            {
+                                e.printStackTrace();
+                            }
+                        }
+                    }
+                }
+                if (result.size() > 0)
+                {
+                    HashSet<String> hashResult = new HashSet<String>(result);
+                    allResult.addAll(hashResult);
+                }
+            }
+            if (allResult.size() > 0)
+            {
+                typeAliasesPackage = String.join(",", allResult.toArray(new String[0]));
+            }
+            else
+            {
+                throw new RuntimeException("mybatis typeAliasesPackage 璺緞鎵弿閿欒,鍙傛暟typeAliasesPackage:" + typeAliasesPackage + "鏈壘鍒颁换浣曞寘");
+            }
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+        return typeAliasesPackage;
+    }
+
+    @Bean
+    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
+    {
+        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
+        String mapperLocations = env.getProperty("mybatis.mapperLocations");
+        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
+        VFS.addImplClass(SpringBootVFS.class);
+
+        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
+        sessionFactory.setDataSource(dataSource);
+        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
+        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
+        return sessionFactory.getObject();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/RedisConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/RedisConfig.java
new file mode 100644
index 0000000..2319a89
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/RedisConfig.java
@@ -0,0 +1,43 @@
+package com.dingzhuo.energy.framework.config;
+
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * redis閰嶇疆
+ * 
+ * @author ruoyi
+ */
+@Configuration
+@EnableCaching
+public class RedisConfig extends CachingConfigurerSupport
+{
+    @Bean
+    @SuppressWarnings(value = { "unchecked", "rawtypes" })
+    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
+    {
+        RedisTemplate<Object, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(connectionFactory);
+
+        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
+
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        serializer.setObjectMapper(mapper);
+
+        template.setValueSerializer(serializer);
+        // 浣跨敤StringRedisSerializer鏉ュ簭鍒楀寲鍜屽弽搴忓垪鍖杛edis鐨刱ey鍊�
+        template.setKeySerializer(new StringRedisSerializer());
+        template.afterPropertiesSet();
+        return template;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/ResourcesConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/ResourcesConfig.java
new file mode 100644
index 0000000..b45950a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/ResourcesConfig.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.framework.config;
+
+import com.dingzhuo.energy.framework.interceptor.RepeatSubmitInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.framework.interceptor.RepeatSubmitInterceptor;
+
+/**
+ * 閫氱敤閰嶇疆
+ * 
+ * @author ruoyi
+ */
+@Configuration
+public class ResourcesConfig implements WebMvcConfigurer
+{
+    @Autowired
+    private RepeatSubmitInterceptor repeatSubmitInterceptor;
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry)
+    {
+        /** 鏈湴鏂囦欢涓婁紶璺緞 */
+        registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");
+
+        /** swagger閰嶇疆 */
+        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+    }
+
+    /**
+     * 鑷畾涔夋嫤鎴鍒�
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry)
+    {
+        registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/RtdbConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/RtdbConfig.java
new file mode 100644
index 0000000..c654235
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/RtdbConfig.java
@@ -0,0 +1,48 @@
+package com.dingzhuo.energy.framework.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanxinfu
+ */
+@Component
+@ConfigurationProperties(prefix = "rtdb")
+public class RtdbConfig {
+  public String host;
+  public Integer port;
+  public String user;
+  public String password;
+
+  public String getHost() {
+    return host;
+  }
+
+  public void setHost(String host) {
+    this.host = host;
+  }
+
+  public Integer getPort() {
+    return port;
+  }
+
+  public void setPort(Integer port) {
+    this.port = port;
+  }
+
+  public String getUser() {
+    return user;
+  }
+
+  public void setUser(String user) {
+    this.user = user;
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/RuoYiConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/RuoYiConfig.java
new file mode 100644
index 0000000..191b0a3
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/RuoYiConfig.java
@@ -0,0 +1,117 @@
+package com.dingzhuo.energy.framework.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 璇诲彇椤圭洰鐩稿叧閰嶇疆
+ *
+ * @author ruoyi
+ */
+@Component
+@ConfigurationProperties(prefix = "ruoyi")
+public class RuoYiConfig {
+
+  /**
+   * 椤圭洰鍚嶇О
+   */
+  private String name;
+
+  /**
+   * 鐗堟湰
+   */
+  private String version;
+
+  /**
+   * 鐗堟潈骞翠唤
+   */
+  private String copyrightYear;
+
+  /**
+   * 瀹炰緥婕旂ず寮�鍏�
+   */
+  private boolean demoEnabled;
+
+  /**
+   * 涓婁紶璺緞
+   */
+  private static String profile;
+
+  /**
+   * 鑾峰彇鍦板潃寮�鍏�
+   */
+  private static boolean addressEnabled;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getVersion() {
+    return version;
+  }
+
+  public void setVersion(String version) {
+    this.version = version;
+  }
+
+  public String getCopyrightYear() {
+    return copyrightYear;
+  }
+
+  public void setCopyrightYear(String copyrightYear) {
+    this.copyrightYear = copyrightYear;
+  }
+
+  public boolean isDemoEnabled() {
+    return demoEnabled;
+  }
+
+  public void setDemoEnabled(boolean demoEnabled) {
+    this.demoEnabled = demoEnabled;
+  }
+
+  public static String getProfile() {
+    return profile;
+  }
+
+  public void setProfile(String profile) {
+    RuoYiConfig.profile = profile;
+  }
+
+  public static boolean isAddressEnabled() {
+    return addressEnabled;
+  }
+
+  public void setAddressEnabled(boolean addressEnabled) {
+    RuoYiConfig.addressEnabled = addressEnabled;
+  }
+
+  /**
+   * 鑾峰彇澶村儚涓婁紶璺緞
+   */
+  public static String getAvatarPath() {
+    return getProfile() + "/avatar";
+  }
+
+  /**
+   * 鑾峰彇涓嬭浇璺緞
+   */
+  public static String getDownloadPath() {
+    return getProfile() + "/download/";
+  }
+
+  /**
+   * 鑾峰彇涓婁紶璺緞
+   */
+  public static String getUploadPath() {
+    return getProfile() + "/upload";
+  }
+
+  public static String getConfigurePath() {
+    return getProfile() + "/configure";
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/SecurityConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/SecurityConfig.java
new file mode 100644
index 0000000..1f70102
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/SecurityConfig.java
@@ -0,0 +1,126 @@
+package com.dingzhuo.energy.framework.config;
+
+import com.dingzhuo.energy.framework.security.filter.JwtAuthenticationTokenFilter;
+import com.dingzhuo.energy.framework.security.handle.AuthenticationEntryPointImpl;
+import com.dingzhuo.energy.framework.security.handle.LogoutSuccessHandlerImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.HttpMethod;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+
+/**
+ * spring security閰嶇疆
+ *
+ * @author ruoyi
+ */
+@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
+public class SecurityConfig extends WebSecurityConfigurerAdapter {
+
+  /**
+   * 鑷畾涔夌敤鎴疯璇侀�昏緫
+   */
+  @Autowired
+  private UserDetailsService userDetailsService;
+
+  /**
+   * 璁よ瘉澶辫触澶勭悊绫�
+   */
+  @Autowired
+  private AuthenticationEntryPointImpl unauthorizedHandler;
+
+  /**
+   * 閫�鍑哄鐞嗙被
+   */
+  @Autowired
+  private LogoutSuccessHandlerImpl logoutSuccessHandler;
+
+  /**
+   * token璁よ瘉杩囨护鍣�
+   */
+  @Autowired
+  private JwtAuthenticationTokenFilter authenticationTokenFilter;
+
+  /**
+   * 瑙e喅 鏃犳硶鐩存帴娉ㄥ叆 AuthenticationManager
+   *
+   * @return
+   * @throws Exception
+   */
+  @Bean
+  @Override
+  public AuthenticationManager authenticationManagerBean() throws Exception {
+    return super.authenticationManagerBean();
+  }
+
+  /**
+   * anyRequest          |   鍖归厤鎵�鏈夎姹傝矾寰� access              |   SpringEl琛ㄨ揪寮忕粨鏋滀负true鏃跺彲浠ヨ闂� anonymous |
+   * 鍖垮悕鍙互璁块棶 denyAll             |   鐢ㄦ埛涓嶈兘璁块棶 fullyAuthenticated  | 鐢ㄦ埛瀹屽叏璁よ瘉鍙互璁块棶锛堥潪remember-me涓嬭嚜鍔ㄧ櫥褰曪級
+   * hasAnyAuthority     |   濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず鏉冮檺锛屽垯鍏朵腑浠讳綍涓�涓潈闄愬彲浠ヨ闂� hasAnyRole |   濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず瑙掕壊锛屽垯鍏朵腑浠讳綍涓�涓鑹插彲浠ヨ闂�
+   * hasAuthority        |   濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず鏉冮檺锛屽垯鍏舵潈闄愬彲浠ヨ闂� hasIpAddress |   濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧずIP鍦板潃锛屽鏋滅敤鎴稩P鍜屽弬鏁板尮閰嶏紝鍒欏彲浠ヨ闂�
+   * hasRole             |   濡傛灉鏈夊弬鏁帮紝鍙傛暟琛ㄧず瑙掕壊锛屽垯鍏惰鑹插彲浠ヨ闂� permitAll           |   鐢ㄦ埛鍙互浠绘剰璁块棶 rememberMe
+   * |   鍏佽閫氳繃remember-me鐧诲綍鐨勭敤鎴疯闂� authenticated |   鐢ㄦ埛鐧诲綍鍚庡彲璁块棶
+   */
+  @Override
+  protected void configure(HttpSecurity httpSecurity) throws Exception {
+    httpSecurity
+        // CRSF绂佺敤锛屽洜涓轰笉浣跨敤session
+        .csrf().disable()
+        // 璁よ瘉澶辫触澶勭悊绫�
+        .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
+        // 鍩轰簬token锛屾墍浠ヤ笉闇�瑕乻ession
+        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
+        // 杩囨护璇锋眰
+        .authorizeRequests()
+        // 瀵逛簬鐧诲綍login 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶
+        .antMatchers("/login", "/captchaImage").anonymous()
+        .antMatchers(
+            HttpMethod.GET,
+            "/*.html",
+            "/**/*.html",
+            "/**/*.css",
+            "/**/*.js"
+        ).permitAll()
+        .antMatchers("/profile/**").anonymous()
+        .antMatchers("/common/download**").anonymous()
+        .antMatchers("/swagger-ui.html").anonymous()
+        .antMatchers("/swagger-resources/**").anonymous()
+        .antMatchers("/webjars/**").anonymous()
+        .antMatchers("/*/api-docs").anonymous()
+        .antMatchers("/druid/**").anonymous()
+//                .antMatchers("/energyAlarm/**").anonymous()
+        // 闄や笂闈㈠鐨勬墍鏈夎姹傚叏閮ㄩ渶瑕侀壌鏉冭璇�
+        .anyRequest().authenticated()
+//        .anyRequest().anonymous()
+        .and()
+        .headers().frameOptions().disable();
+    httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
+    // 娣诲姞JWT filter
+    httpSecurity
+        .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
+  }
+
+
+  /**
+   * 寮烘暎鍒楀搱甯屽姞瀵嗗疄鐜�
+   */
+  @Bean
+  public BCryptPasswordEncoder bCryptPasswordEncoder() {
+    return new BCryptPasswordEncoder();
+  }
+
+  /**
+   * 韬唤璁よ瘉鎺ュ彛
+   */
+  @Override
+  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
+    auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/ServerConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/ServerConfig.java
new file mode 100644
index 0000000..030a339
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/ServerConfig.java
@@ -0,0 +1,32 @@
+package com.dingzhuo.energy.framework.config;
+
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.stereotype.Component;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+
+/**
+ * 鏈嶅姟鐩稿叧閰嶇疆
+ * 
+ * @author ruoyi
+ */
+@Component
+public class ServerConfig
+{
+    /**
+     * 鑾峰彇瀹屾暣鐨勮姹傝矾寰勶紝鍖呮嫭锛氬煙鍚嶏紝绔彛锛屼笂涓嬫枃璁块棶璺緞
+     * 
+     * @return 鏈嶅姟鍦板潃
+     */
+    public String getUrl()
+    {
+        HttpServletRequest request = ServletUtils.getRequest();
+        return getDomain(request);
+    }
+
+    public static String getDomain(HttpServletRequest request)
+    {
+        StringBuffer url = request.getRequestURL();
+        String contextPath = request.getServletContext().getContextPath();
+        return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/SwaggerConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/SwaggerConfig.java
new file mode 100644
index 0000000..147b3c8
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/SwaggerConfig.java
@@ -0,0 +1,113 @@
+package com.dingzhuo.energy.framework.config;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import io.swagger.annotations.ApiOperation;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.Contact;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * Swagger2鐨勬帴鍙i厤缃�
+ *
+ * @author ruoyi
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig
+{
+    /** 绯荤粺鍩虹閰嶇疆 */
+    @Autowired
+    private RuoYiConfig ruoyiConfig;
+
+    /**
+     * 鍒涘缓API
+     */
+    @Bean
+    public Docket createRestApi()
+    {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .pathMapping("/dev-api")
+                // 鐢ㄦ潵鍒涘缓璇PI鐨勫熀鏈俊鎭紝灞曠ず鍦ㄦ枃妗g殑椤甸潰涓紙鑷畾涔夊睍绀虹殑淇℃伅锛�
+                .apiInfo(apiInfo())
+                // 璁剧疆鍝簺鎺ュ彛鏆撮湶缁橲wagger灞曠ず
+                .select()
+                // 鎵弿鎵�鏈夋湁娉ㄨВ鐨刟pi锛岀敤杩欑鏂瑰紡鏇寸伒娲�
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                // 鎵弿鎸囧畾鍖呬腑鐨剆wagger娉ㄨВ
+                //.apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
+                // 鎵弿鎵�鏈� .apis(RequestHandlerSelectors.any())
+                .paths(PathSelectors.any())
+                .build()
+                /* 璁剧疆瀹夊叏妯″紡锛宻wagger鍙互璁剧疆璁块棶token */
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts());
+    }
+
+    /**
+     * 瀹夊叏妯″紡锛岃繖閲屾寚瀹歵oken閫氳繃Authorization澶磋姹傚ご浼犻��
+     */
+    private List<ApiKey> securitySchemes()
+    {
+        List<ApiKey> apiKeyList = new ArrayList<ApiKey>();
+        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
+        return apiKeyList;
+    }
+
+    /**
+     * 瀹夊叏涓婁笅鏂�
+     */
+    private List<SecurityContext> securityContexts()
+    {
+        List<SecurityContext> securityContexts = new ArrayList<>();
+        securityContexts.add(
+                SecurityContext.builder()
+                        .securityReferences(defaultAuth())
+                        .forPaths(PathSelectors.regex("^(?!auth).*$"))
+                        .build());
+        return securityContexts;
+    }
+
+    /**
+     * 榛樿鐨勫畨鍏ㄤ笂寮曠敤
+     */
+    private List<SecurityReference> defaultAuth()
+    {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        List<SecurityReference> securityReferences = new ArrayList<>();
+        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
+        return securityReferences;
+    }
+
+    /**
+     * 娣诲姞鎽樿淇℃伅
+     */
+    private ApiInfo apiInfo()
+    {
+        // 鐢ˋpiInfoBuilder杩涜瀹氬埗
+        return new ApiInfoBuilder()
+                // 璁剧疆鏍囬
+                .title("鑳芥簮绠$悊绯荤粺_鎺ュ彛鏂囨。")
+                // 鎻忚堪
+                .description("")
+                // 浣滆�呬俊鎭�
+                .contact(new Contact(ruoyiConfig.getName(), null, null))
+                // 鐗堟湰
+                .version("鐗堟湰鍙�:" + ruoyiConfig.getVersion())
+                .build();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/SystemConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/SystemConfig.java
new file mode 100644
index 0000000..1428af5
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/SystemConfig.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.energy.framework.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author zhaow
+ * 搴炲反杩郴缁熼厤缃�
+ */
+@Component
+@ConfigurationProperties(prefix = "sysconfig")
+public class SystemConfig {
+  /**  棣栭〉IFrame鍔犺浇鍦板潃 **/
+  public static String indexUrl;
+
+  public static String getIndexUrl() {
+    return indexUrl;
+  }
+
+  public void setIndexUrl(String indexUrl) {
+    SystemConfig.indexUrl = indexUrl;
+  }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/ThreadPoolConfig.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/ThreadPoolConfig.java
new file mode 100644
index 0000000..211f856
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/ThreadPoolConfig.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.framework.config;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadPoolExecutor;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import com.dingzhuo.energy.common.utils.Threads;
+
+/**
+ * 绾跨▼姹犻厤缃�
+ *
+ * @author ruoyi
+ **/
+@Configuration
+public class ThreadPoolConfig
+{
+    // 鏍稿績绾跨▼姹犲ぇ灏�
+    private int corePoolSize = 50;
+
+    // 鏈�澶у彲鍒涘缓鐨勭嚎绋嬫暟
+    private int maxPoolSize = 200;
+
+    // 闃熷垪鏈�澶ч暱搴�
+    private int queueCapacity = 1000;
+
+    // 绾跨▼姹犵淮鎶ょ嚎绋嬫墍鍏佽鐨勭┖闂叉椂闂�
+    private int keepAliveSeconds = 300;
+
+    @Bean(name = "threadPoolTaskExecutor")
+    public ThreadPoolTaskExecutor threadPoolTaskExecutor()
+    {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setMaxPoolSize(maxPoolSize);
+        executor.setCorePoolSize(corePoolSize);
+        executor.setQueueCapacity(queueCapacity);
+        executor.setKeepAliveSeconds(keepAliveSeconds);
+        // 绾跨▼姹犲鎷掔粷浠诲姟(鏃犵嚎绋嬪彲鐢�)鐨勫鐞嗙瓥鐣�
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        return executor;
+    }
+
+    /**
+     * 鎵ц鍛ㄦ湡鎬ф垨瀹氭椂浠诲姟
+     */
+    @Bean(name = "scheduledExecutorService")
+    protected ScheduledExecutorService scheduledExecutorService()
+    {
+        return new ScheduledThreadPoolExecutor(corePoolSize,
+                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build())
+        {
+            @Override
+            protected void afterExecute(Runnable r, Throwable t)
+            {
+                super.afterExecute(r, t);
+                Threads.printException(r, t);
+            }
+        };
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/config/properties/DruidProperties.java b/basic/src/main/java/com/dingzhuo/energy/framework/config/properties/DruidProperties.java
new file mode 100644
index 0000000..74f1c47
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/config/properties/DruidProperties.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.framework.config.properties;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import com.alibaba.druid.pool.DruidDataSource;
+
+/**
+ * druid 閰嶇疆灞炴��
+ * 
+ * @author ruoyi
+ */
+@Configuration
+public class DruidProperties
+{
+    @Value("${spring.datasource.druid.initialSize}")
+    private int initialSize;
+
+    @Value("${spring.datasource.druid.minIdle}")
+    private int minIdle;
+
+    @Value("${spring.datasource.druid.maxActive}")
+    private int maxActive;
+
+    @Value("${spring.datasource.druid.maxWait}")
+    private int maxWait;
+
+    @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}")
+    private int timeBetweenEvictionRunsMillis;
+
+    @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}")
+    private int minEvictableIdleTimeMillis;
+
+    @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}")
+    private int maxEvictableIdleTimeMillis;
+
+    @Value("${spring.datasource.druid.validationQuery}")
+    private String validationQuery;
+
+    @Value("${spring.datasource.druid.testWhileIdle}")
+    private boolean testWhileIdle;
+
+    @Value("${spring.datasource.druid.testOnBorrow}")
+    private boolean testOnBorrow;
+
+    @Value("${spring.datasource.druid.testOnReturn}")
+    private boolean testOnReturn;
+
+    public DruidDataSource dataSource(DruidDataSource datasource)
+    {
+        /** 閰嶇疆鍒濆鍖栧ぇ灏忋�佹渶灏忋�佹渶澶� */
+        datasource.setInitialSize(initialSize);
+        datasource.setMaxActive(maxActive);
+        datasource.setMinIdle(minIdle);
+
+        /** 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂� */
+        datasource.setMaxWait(maxWait);
+
+        /** 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣 */
+        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
+
+        /** 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忋�佹渶澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣 */
+        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
+        datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis);
+
+        /**
+         * 鐢ㄦ潵妫�娴嬭繛鎺ユ槸鍚︽湁鏁堢殑sql锛岃姹傛槸涓�涓煡璇㈣鍙ワ紝甯哥敤select 'x'銆傚鏋渧alidationQuery涓簄ull锛宼estOnBorrow銆乼estOnReturn銆乼estWhileIdle閮戒笉浼氳捣浣滅敤銆�
+         */
+        datasource.setValidationQuery(validationQuery);
+        /** 寤鸿閰嶇疆涓簍rue锛屼笉褰卞搷鎬ц兘锛屽苟涓斾繚璇佸畨鍏ㄦ�с�傜敵璇疯繛鎺ョ殑鏃跺�欐娴嬶紝濡傛灉绌洪棽鏃堕棿澶т簬timeBetweenEvictionRunsMillis锛屾墽琛寁alidationQuery妫�娴嬭繛鎺ユ槸鍚︽湁鏁堛�� */
+        datasource.setTestWhileIdle(testWhileIdle);
+        /** 鐢宠杩炴帴鏃舵墽琛寁alidationQuery妫�娴嬭繛鎺ユ槸鍚︽湁鏁堬紝鍋氫簡杩欎釜閰嶇疆浼氶檷浣庢�ц兘銆� */
+        datasource.setTestOnBorrow(testOnBorrow);
+        /** 褰掕繕杩炴帴鏃舵墽琛寁alidationQuery妫�娴嬭繛鎺ユ槸鍚︽湁鏁堬紝鍋氫簡杩欎釜閰嶇疆浼氶檷浣庢�ц兘銆� */
+        datasource.setTestOnReturn(testOnReturn);
+        return datasource;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSource.java b/basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSource.java
new file mode 100644
index 0000000..d8b789e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSource.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.framework.datasource;
+
+import java.util.Map;
+import javax.sql.DataSource;
+import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
+
+/**
+ * 鍔ㄦ�佹暟鎹簮
+ * 
+ * @author ruoyi
+ */
+public class DynamicDataSource extends AbstractRoutingDataSource
+{
+    public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources)
+    {
+        super.setDefaultTargetDataSource(defaultTargetDataSource);
+        super.setTargetDataSources(targetDataSources);
+        super.afterPropertiesSet();
+    }
+
+    @Override
+    protected Object determineCurrentLookupKey()
+    {
+        return DynamicDataSourceContextHolder.getDataSourceType();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSourceContextHolder.java b/basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSourceContextHolder.java
new file mode 100644
index 0000000..853067b
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/datasource/DynamicDataSourceContextHolder.java
@@ -0,0 +1,45 @@
+package com.dingzhuo.energy.framework.datasource;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 鏁版嵁婧愬垏鎹㈠鐞�
+ * 
+ * @author ruoyi
+ */
+public class DynamicDataSourceContextHolder
+{
+    public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class);
+
+    /**
+     * 浣跨敤ThreadLocal缁存姢鍙橀噺锛孴hreadLocal涓烘瘡涓娇鐢ㄨ鍙橀噺鐨勭嚎绋嬫彁渚涚嫭绔嬬殑鍙橀噺鍓湰锛�
+     *  鎵�浠ユ瘡涓�涓嚎绋嬮兘鍙互鐙珛鍦版敼鍙樿嚜宸辩殑鍓湰锛岃�屼笉浼氬奖鍝嶅叾瀹冪嚎绋嬫墍瀵瑰簲鐨勫壇鏈��
+     */
+    private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
+
+    /**
+     * 璁剧疆鏁版嵁婧愮殑鍙橀噺
+     */
+    public static void setDataSourceType(String dsType)
+    {
+        log.info("鍒囨崲鍒皗}鏁版嵁婧�", dsType);
+        CONTEXT_HOLDER.set(dsType);
+    }
+
+    /**
+     * 鑾峰緱鏁版嵁婧愮殑鍙橀噺
+     */
+    public static String getDataSourceType()
+    {
+        return CONTEXT_HOLDER.get();
+    }
+
+    /**
+     * 娓呯┖鏁版嵁婧愬彉閲�
+     */
+    public static void clearDataSourceType()
+    {
+        CONTEXT_HOLDER.remove();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/RepeatSubmitInterceptor.java b/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/RepeatSubmitInterceptor.java
new file mode 100644
index 0000000..6121fef
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/RepeatSubmitInterceptor.java
@@ -0,0 +1,57 @@
+package com.dingzhuo.energy.framework.interceptor;
+
+import java.lang.reflect.Method;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.framework.interceptor.annotation.RepeatSubmit;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.framework.interceptor.annotation.RepeatSubmit;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 闃叉閲嶅鎻愪氦鎷︽埅鍣�
+ * 
+ * @author ruoyi
+ */
+@Component
+public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter
+{
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
+    {
+        if (handler instanceof HandlerMethod)
+        {
+            HandlerMethod handlerMethod = (HandlerMethod) handler;
+            Method method = handlerMethod.getMethod();
+            RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class);
+            if (annotation != null)
+            {
+                if (this.isRepeatSubmit(request))
+                {
+                    AjaxResult ajaxResult = AjaxResult.error("涓嶅厑璁搁噸澶嶆彁浜わ紝璇风◢鍚庡啀璇�");
+                    ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult));
+                    return false;
+                }
+            }
+            return true;
+        }
+        else
+        {
+            return super.preHandle(request, response, handler);
+        }
+    }
+
+    /**
+     * 楠岃瘉鏄惁閲嶅鎻愪氦鐢卞瓙绫诲疄鐜板叿浣撶殑闃查噸澶嶆彁浜ょ殑瑙勫垯
+     * 
+     * @param httpServletRequest
+     * @return
+     * @throws Exception
+     */
+    public abstract boolean isRepeatSubmit(HttpServletRequest request);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/annotation/RepeatSubmit.java b/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/annotation/RepeatSubmit.java
new file mode 100644
index 0000000..b762154
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/annotation/RepeatSubmit.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.energy.framework.interceptor.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 鑷畾涔夋敞瑙i槻姝㈣〃鍗曢噸澶嶆彁浜�
+ * 
+ * @author ruoyi
+ *
+ */
+@Inherited
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface RepeatSubmit
+{
+
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/impl/SameUrlDataInterceptor.java b/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/impl/SameUrlDataInterceptor.java
new file mode 100644
index 0000000..ad79f39
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/interceptor/impl/SameUrlDataInterceptor.java
@@ -0,0 +1,90 @@
+package com.dingzhuo.energy.framework.interceptor.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import org.springframework.stereotype.Component;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.framework.interceptor.RepeatSubmitInterceptor;
+
+/**
+ * 鍒ゆ柇璇锋眰url鍜屾暟鎹槸鍚﹀拰涓婁竴娆$浉鍚岋紝 
+ * 濡傛灉鍜屼笂娆$浉鍚岋紝鍒欐槸閲嶅鎻愪氦琛ㄥ崟銆� 鏈夋晥鏃堕棿涓�10绉掑唴銆�
+ * 
+ * @author ruoyi
+ */
+@Component
+public class SameUrlDataInterceptor extends RepeatSubmitInterceptor
+{
+    public final String REPEAT_PARAMS = "repeatParams";
+
+    public final String REPEAT_TIME = "repeatTime";
+
+    public final String SESSION_REPEAT_KEY = "repeatData";
+
+    /**
+     * 闂撮殧鏃堕棿锛屽崟浣�:绉� 榛樿10绉�
+     * 
+     * 涓ゆ鐩稿悓鍙傛暟鐨勮姹傦紝濡傛灉闂撮殧鏃堕棿澶т簬璇ュ弬鏁帮紝绯荤粺涓嶄細璁ゅ畾涓洪噸澶嶆彁浜ょ殑鏁版嵁
+     */
+    private int intervalTime = 10;
+
+    public void setIntervalTime(int intervalTime)
+    {
+        this.intervalTime = intervalTime;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public boolean isRepeatSubmit(HttpServletRequest request)
+    {
+        // 鏈鍙傛暟鍙婄郴缁熸椂闂�
+        String nowParams = JSONObject.toJSONString(request.getParameterMap());
+        Map<String, Object> nowDataMap = new HashMap<String, Object>();
+        nowDataMap.put(REPEAT_PARAMS, nowParams);
+        nowDataMap.put(REPEAT_TIME, System.currentTimeMillis());
+
+        // 璇锋眰鍦板潃锛堜綔涓哄瓨鏀緎ession鐨刱ey鍊硷級
+        String url = request.getRequestURI();
+
+        HttpSession session = request.getSession();
+        Object sessionObj = session.getAttribute(SESSION_REPEAT_KEY);
+        if (sessionObj != null)
+        {
+            Map<String, Object> sessionMap = (Map<String, Object>) sessionObj;
+            if (sessionMap.containsKey(url))
+            {
+                Map<String, Object> preDataMap = (Map<String, Object>) sessionMap.get(url);
+                if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap))
+                {
+                    return true;
+                }
+            }
+        }
+        Map<String, Object> sessionMap = new HashMap<String, Object>();
+        sessionMap.put(url, nowDataMap);
+        session.setAttribute(SESSION_REPEAT_KEY, sessionMap);
+        return false;
+    }
+
+    /**
+     * 鍒ゆ柇鍙傛暟鏄惁鐩稿悓
+     */
+    private boolean compareParams(Map<String, Object> nowMap, Map<String, Object> preMap)
+    {
+        String nowParams = (String) nowMap.get(REPEAT_PARAMS);
+        String preParams = (String) preMap.get(REPEAT_PARAMS);
+        return nowParams.equals(preParams);
+    }
+
+    /**
+     * 鍒ゆ柇涓ゆ闂撮殧鏃堕棿
+     */
+    private boolean compareTime(Map<String, Object> nowMap, Map<String, Object> preMap)
+    {
+        long time1 = (Long) nowMap.get(REPEAT_TIME);
+        long time2 = (Long) preMap.get(REPEAT_TIME);
+      return (time1 - time2) < (this.intervalTime * 1000);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/manager/AsyncManager.java b/basic/src/main/java/com/dingzhuo/energy/framework/manager/AsyncManager.java
new file mode 100644
index 0000000..90f3b06
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/manager/AsyncManager.java
@@ -0,0 +1,55 @@
+package com.dingzhuo.energy.framework.manager;
+
+import java.util.TimerTask;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import com.dingzhuo.energy.common.utils.Threads;
+import com.dingzhuo.energy.common.utils.spring.SpringUtils;
+
+/**
+ * 寮傛浠诲姟绠$悊鍣�
+ * 
+ * @author ruoyi
+ */
+public class AsyncManager
+{
+    /**
+     * 鎿嶄綔寤惰繜10姣
+     */
+    private final int OPERATE_DELAY_TIME = 10;
+
+    /**
+     * 寮傛鎿嶄綔浠诲姟璋冨害绾跨▼姹�
+     */
+    private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
+
+    /**
+     * 鍗曚緥妯″紡
+     */
+    private AsyncManager(){}
+
+    private static AsyncManager me = new AsyncManager();
+
+    public static AsyncManager me()
+    {
+        return me;
+    }
+
+    /**
+     * 鎵ц浠诲姟
+     * 
+     * @param task 浠诲姟
+     */
+    public void execute(TimerTask task)
+    {
+        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * 鍋滄浠诲姟绾跨▼姹�
+     */
+    public void shutdown()
+    {
+        Threads.shutdownAndAwaitTermination(executor);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/manager/ShutdownManager.java b/basic/src/main/java/com/dingzhuo/energy/framework/manager/ShutdownManager.java
new file mode 100644
index 0000000..b2465cb
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/manager/ShutdownManager.java
@@ -0,0 +1,39 @@
+package com.dingzhuo.energy.framework.manager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import javax.annotation.PreDestroy;
+
+/**
+ * 纭繚搴旂敤閫�鍑烘椂鑳藉叧闂悗鍙扮嚎绋�
+ *
+ * @author ruoyi
+ */
+@Component
+public class ShutdownManager
+{
+    private static final Logger logger = LoggerFactory.getLogger("sys-user");
+
+    @PreDestroy
+    public void destroy()
+    {
+        shutdownAsyncManager();
+    }
+
+    /**
+     * 鍋滄寮傛鎵ц浠诲姟
+     */
+    private void shutdownAsyncManager()
+    {
+        try
+        {
+            logger.info("====鍏抽棴鍚庡彴浠诲姟浠诲姟绾跨▼姹�====");
+            AsyncManager.me().shutdown();
+        }
+        catch (Exception e)
+        {
+            logger.error(e.getMessage(), e);
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/manager/factory/AsyncFactory.java b/basic/src/main/java/com/dingzhuo/energy/framework/manager/factory/AsyncFactory.java
new file mode 100644
index 0000000..cff2a46
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/manager/factory/AsyncFactory.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.framework.manager.factory;
+
+import java.util.TimerTask;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.utils.LogUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.ip.AddressUtils;
+import com.dingzhuo.energy.common.utils.ip.IpUtils;
+import com.dingzhuo.energy.common.utils.spring.SpringUtils;
+import com.dingzhuo.energy.project.monitor.domain.SysLogininfor;
+import com.dingzhuo.energy.project.monitor.domain.SysOperLog;
+import com.dingzhuo.energy.project.monitor.service.ISysLogininforService;
+import com.dingzhuo.energy.project.monitor.service.ISysOperLogService;
+import eu.bitwalker.useragentutils.UserAgent;
+
+/**
+ * 寮傛宸ュ巶锛堜骇鐢熶换鍔$敤锛�
+ * 
+ * @author ruoyi
+ */
+public class AsyncFactory
+{
+    private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
+
+    /**
+     * 璁板綍鐧婚檰淇℃伅
+     * 
+     * @param username 鐢ㄦ埛鍚�
+     * @param status 鐘舵��
+     * @param message 娑堟伅
+     * @param args 鍒楄〃
+     * @return 浠诲姟task
+     */
+    public static TimerTask recordLogininfor(final String username, final String status, final String message,
+            final Object... args)
+    {
+        final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
+        final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+        return new TimerTask()
+        {
+            @Override
+            public void run()
+            {
+                String address = AddressUtils.getRealAddressByIP(ip);
+                StringBuilder s = new StringBuilder();
+                s.append(LogUtils.getBlock(ip));
+                s.append(address);
+                s.append(LogUtils.getBlock(username));
+                s.append(LogUtils.getBlock(status));
+                s.append(LogUtils.getBlock(message));
+                // 鎵撳嵃淇℃伅鍒版棩蹇�
+                sys_user_logger.info(s.toString(), args);
+                // 鑾峰彇瀹㈡埛绔搷浣滅郴缁�
+                String os = userAgent.getOperatingSystem().getName();
+                // 鑾峰彇瀹㈡埛绔祻瑙堝櫒
+                String browser = userAgent.getBrowser().getName();
+                // 灏佽瀵硅薄
+                SysLogininfor logininfor = new SysLogininfor();
+                logininfor.setUserName(username);
+                logininfor.setIpaddr(ip);
+                logininfor.setLoginLocation(address);
+                logininfor.setBrowser(browser);
+                logininfor.setOs(os);
+                logininfor.setMsg(message);
+                // 鏃ュ織鐘舵��
+                if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status))
+                {
+                    logininfor.setStatus(Constants.SUCCESS);
+                }
+                else if (Constants.LOGIN_FAIL.equals(status))
+                {
+                    logininfor.setStatus(Constants.FAIL);
+                }
+                // 鎻掑叆鏁版嵁
+                SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
+            }
+        };
+    }
+
+    /**
+     * 鎿嶄綔鏃ュ織璁板綍
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織淇℃伅
+     * @return 浠诲姟task
+     */
+    public static TimerTask recordOper(final SysOperLog operLog)
+    {
+        return new TimerTask()
+        {
+            @Override
+            public void run()
+            {
+                // 杩滅▼鏌ヨ鎿嶄綔鍦扮偣
+                operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
+                SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
+            }
+        };
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/redis/RedisCache.java b/basic/src/main/java/com/dingzhuo/energy/framework/redis/RedisCache.java
new file mode 100644
index 0000000..f9c8d79
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/redis/RedisCache.java
@@ -0,0 +1,207 @@
+package com.dingzhuo.energy.framework.redis;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.BoundSetOperations;
+import org.springframework.data.redis.core.HashOperations;
+import org.springframework.data.redis.core.ListOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+/**
+ * spring redis 宸ュ叿绫�
+ * 
+ * @author ruoyi
+ **/
+@SuppressWarnings(value = { "unchecked", "rawtypes" })
+@Component
+public class RedisCache
+{
+    @Autowired
+    public RedisTemplate redisTemplate;
+
+    /**
+     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @param value 缂撳瓨鐨勫��
+     * @return 缂撳瓨鐨勫璞�
+     */
+    public <T> ValueOperations<String, T> setCacheObject(String key, T value)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        operation.set(key, value);
+        return operation;
+    }
+
+    /**
+     * 缂撳瓨鍩烘湰鐨勫璞★紝Integer銆丼tring銆佸疄浣撶被绛�
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @param value 缂撳瓨鐨勫��
+     * @param timeout 鏃堕棿
+     * @param timeUnit 鏃堕棿棰楃矑搴�
+     * @return 缂撳瓨鐨勫璞�
+     */
+    public <T> ValueOperations<String, T> setCacheObject(String key, T value, Integer timeout, TimeUnit timeUnit)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        operation.set(key, value, timeout, timeUnit);
+        return operation;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨勫熀鏈璞°��
+     *
+     * @param key 缂撳瓨閿��
+     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
+     */
+    public <T> T getCacheObject(String key)
+    {
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
+        return operation.get(key);
+    }
+
+    /**
+     * 鍒犻櫎鍗曚釜瀵硅薄
+     *
+     * @param key
+     */
+    public void deleteObject(String key)
+    {
+        redisTemplate.delete(key);
+    }
+
+    /**
+     * 鍒犻櫎闆嗗悎瀵硅薄
+     *
+     * @param collection
+     */
+    public void deleteObject(Collection collection)
+    {
+        redisTemplate.delete(collection);
+    }
+
+    /**
+     * 缂撳瓨List鏁版嵁
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @param dataList 寰呯紦瀛樼殑List鏁版嵁
+     * @return 缂撳瓨鐨勫璞�
+     */
+    public <T> ListOperations<String, T> setCacheList(String key, List<T> dataList)
+    {
+        ListOperations listOperation = redisTemplate.opsForList();
+        if (null != dataList)
+        {
+            int size = dataList.size();
+            for (int i = 0; i < size; i++)
+            {
+                listOperation.leftPush(key, dataList.get(i));
+            }
+        }
+        return listOperation;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨刲ist瀵硅薄
+     *
+     * @param key 缂撳瓨鐨勯敭鍊�
+     * @return 缂撳瓨閿�煎搴旂殑鏁版嵁
+     */
+    public <T> List<T> getCacheList(String key)
+    {
+        List<T> dataList = new ArrayList<T>();
+        ListOperations<String, T> listOperation = redisTemplate.opsForList();
+        Long size = listOperation.size(key);
+
+        for (int i = 0; i < size; i++)
+        {
+            dataList.add(listOperation.index(key, i));
+        }
+        return dataList;
+    }
+
+    /**
+     * 缂撳瓨Set
+     *
+     * @param key 缂撳瓨閿��
+     * @param dataSet 缂撳瓨鐨勬暟鎹�
+     * @return 缂撳瓨鏁版嵁鐨勫璞�
+     */
+    public <T> BoundSetOperations<String, T> setCacheSet(String key, Set<T> dataSet)
+    {
+        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
+        Iterator<T> it = dataSet.iterator();
+        while (it.hasNext())
+        {
+            setOperation.add(it.next());
+        }
+        return setOperation;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨剆et
+     *
+     * @param key
+     * @return
+     */
+    public <T> Set<T> getCacheSet(String key)
+    {
+        Set<T> dataSet = new HashSet<T>();
+        BoundSetOperations<String, T> operation = redisTemplate.boundSetOps(key);
+        dataSet = operation.members();
+        return dataSet;
+    }
+
+    /**
+     * 缂撳瓨Map
+     *
+     * @param key
+     * @param dataMap
+     * @return
+     */
+    public <T> HashOperations<String, String, T> setCacheMap(String key, Map<String, T> dataMap)
+    {
+        HashOperations hashOperations = redisTemplate.opsForHash();
+        if (null != dataMap)
+        {
+            for (Map.Entry<String, T> entry : dataMap.entrySet())
+            {
+                hashOperations.put(key, entry.getKey(), entry.getValue());
+            }
+        }
+        return hashOperations;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨凪ap
+     *
+     * @param key
+     * @return
+     */
+    public <T> Map<String, T> getCacheMap(String key)
+    {
+        Map<String, T> map = redisTemplate.opsForHash().entries(key);
+        return map;
+    }
+
+    /**
+     * 鑾峰緱缂撳瓨鐨勫熀鏈璞″垪琛�
+     * 
+     * @param pattern 瀛楃涓插墠缂�
+     * @return 瀵硅薄鍒楄〃
+     */
+    public Collection<String> keys(String pattern)
+    {
+        return redisTemplate.keys(pattern);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/LoginUser.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/LoginUser.java
new file mode 100644
index 0000000..e7e9b0c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/LoginUser.java
@@ -0,0 +1,228 @@
+package com.dingzhuo.energy.framework.security;
+
+import java.util.Collection;
+import java.util.Set;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+
+/**
+ * 鐧诲綍鐢ㄦ埛韬唤鏉冮檺
+ * 
+ * @author ruoyi
+ */
+public class LoginUser implements UserDetails
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鐢ㄦ埛鍞竴鏍囪瘑
+     */
+    private String token;
+
+    /**
+     * 鐧婚檰鏃堕棿
+     */
+    private Long loginTime;
+
+    /**
+     * 杩囨湡鏃堕棿
+     */
+    private Long expireTime;
+
+    /**
+     * 鐧诲綍IP鍦板潃
+     */
+    private String ipaddr;
+
+    /**
+     * 鐧诲綍鍦扮偣
+     */
+    private String loginLocation;
+
+    /**
+     * 娴忚鍣ㄧ被鍨�
+     */
+    private String browser;
+
+    /**
+     * 鎿嶄綔绯荤粺
+     */
+    private String os;
+
+    /**
+     * 鏉冮檺鍒楄〃
+     */
+    private Set<String> permissions;
+
+    /**
+     * 鐢ㄦ埛淇℃伅
+     */
+    private SysUser user;
+
+    public String getToken()
+    {
+        return token;
+    }
+
+    public void setToken(String token)
+    {
+        this.token = token;
+    }
+
+    public LoginUser()
+    {
+    }
+
+    public LoginUser(SysUser user, Set<String> permissions)
+    {
+        this.user = user;
+        this.permissions = permissions;
+    }
+
+    @JsonIgnore
+    @Override
+    public String getPassword()
+    {
+        return user.getPassword();
+    }
+
+    @Override
+    public String getUsername()
+    {
+        return user.getUserName();
+    }
+
+    /**
+     * 璐︽埛鏄惁鏈繃鏈�,杩囨湡鏃犳硶楠岃瘉
+     */
+    @JsonIgnore
+    @Override
+    public boolean isAccountNonExpired()
+    {
+        return true;
+    }
+
+    /**
+     * 鎸囧畾鐢ㄦ埛鏄惁瑙i攣,閿佸畾鐨勭敤鎴锋棤娉曡繘琛岃韩浠介獙璇�
+     * 
+     * @return
+     */
+    @JsonIgnore
+    @Override
+    public boolean isAccountNonLocked()
+    {
+        return true;
+    }
+
+    /**
+     * 鎸囩ず鏄惁宸茶繃鏈熺殑鐢ㄦ埛鐨勫嚟鎹�(瀵嗙爜),杩囨湡鐨勫嚟鎹槻姝㈣璇�
+     * 
+     * @return
+     */
+    @JsonIgnore
+    @Override
+    public boolean isCredentialsNonExpired()
+    {
+        return true;
+    }
+
+    /**
+     * 鏄惁鍙敤 ,绂佺敤鐨勭敤鎴蜂笉鑳借韩浠介獙璇�
+     * 
+     * @return
+     */
+    @JsonIgnore
+    @Override
+    public boolean isEnabled()
+    {
+        return true;
+    }
+
+    public Long getLoginTime()
+    {
+        return loginTime;
+    }
+
+    public void setLoginTime(Long loginTime)
+    {
+        this.loginTime = loginTime;
+    }
+
+    public String getIpaddr()
+    {
+        return ipaddr;
+    }
+
+    public void setIpaddr(String ipaddr)
+    {
+        this.ipaddr = ipaddr;
+    }
+
+    public String getLoginLocation()
+    {
+        return loginLocation;
+    }
+
+    public void setLoginLocation(String loginLocation)
+    {
+        this.loginLocation = loginLocation;
+    }
+
+    public String getBrowser()
+    {
+        return browser;
+    }
+
+    public void setBrowser(String browser)
+    {
+        this.browser = browser;
+    }
+
+    public String getOs()
+    {
+        return os;
+    }
+
+    public void setOs(String os)
+    {
+        this.os = os;
+    }
+
+    public Long getExpireTime()
+    {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime)
+    {
+        this.expireTime = expireTime;
+    }
+
+    public Set<String> getPermissions()
+    {
+        return permissions;
+    }
+
+    public void setPermissions(Set<String> permissions)
+    {
+        this.permissions = permissions;
+    }
+
+    public SysUser getUser()
+    {
+        return user;
+    }
+
+    public void setUser(SysUser user)
+    {
+        this.user = user;
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities()
+    {
+        return null;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/filter/JwtAuthenticationTokenFilter.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/filter/JwtAuthenticationTokenFilter.java
new file mode 100644
index 0000000..6a157ee
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/filter/JwtAuthenticationTokenFilter.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.framework.security.filter;
+
+import java.io.IOException;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.stereotype.Component;
+import org.springframework.web.filter.OncePerRequestFilter;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+
+/**
+ * token杩囨护鍣� 楠岃瘉token鏈夋晥鎬�
+ * 
+ * @author ruoyi
+ */
+@Component
+public class JwtAuthenticationTokenFilter extends OncePerRequestFilter
+{
+    @Autowired
+    private TokenService tokenService;
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
+            throws ServletException, IOException
+    {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
+        {
+            tokenService.verifyToken(loginUser);
+            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
+            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
+        }
+        chain.doFilter(request, response);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/handle/AuthenticationEntryPointImpl.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/handle/AuthenticationEntryPointImpl.java
new file mode 100644
index 0000000..7a0bb3a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/handle/AuthenticationEntryPointImpl.java
@@ -0,0 +1,34 @@
+package com.dingzhuo.energy.framework.security.handle;
+
+import java.io.IOException;
+import java.io.Serializable;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+import com.alibaba.fastjson.JSON;
+import com.dingzhuo.energy.common.constant.HttpStatus;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 璁よ瘉澶辫触澶勭悊绫� 杩斿洖鏈巿鏉�
+ * 
+ * @author ruoyi
+ */
+@Component
+public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable
+{
+    private static final long serialVersionUID = -8970718410437077606L;
+
+    @Override
+    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)
+            throws IOException
+    {
+        int code = HttpStatus.UNAUTHORIZED;
+        String msg = StringUtils.format("璇锋眰璁块棶锛歿}锛岃璇佸け璐ワ紝鏃犳硶璁块棶绯荤粺璧勬簮", request.getRequestURI());
+        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg)));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/handle/LogoutSuccessHandlerImpl.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/handle/LogoutSuccessHandlerImpl.java
new file mode 100644
index 0000000..027f6aa
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/handle/LogoutSuccessHandlerImpl.java
@@ -0,0 +1,55 @@
+package com.dingzhuo.energy.framework.security.handle;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import com.alibaba.fastjson.JSON;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.constant.HttpStatus;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.manager.AsyncManager;
+import com.dingzhuo.energy.framework.manager.factory.AsyncFactory;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 鑷畾涔夐��鍑哄鐞嗙被 杩斿洖鎴愬姛
+ * 
+ * @author ruoyi
+ */
+@Configuration
+public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
+{
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 閫�鍑哄鐞�
+     * 
+     * @return
+     */
+    @Override
+    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
+            throws IOException, ServletException
+    {
+        LoginUser loginUser = tokenService.getLoginUser(request);
+        if (StringUtils.isNotNull(loginUser))
+        {
+            String userName = loginUser.getUsername();
+            // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍
+            tokenService.delLoginUser(loginUser.getToken());
+            // 璁板綍鐢ㄦ埛閫�鍑烘棩蹇�
+            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "閫�鍑烘垚鍔�"));
+        }
+        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, "閫�鍑烘垚鍔�")));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/service/PermissionService.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/PermissionService.java
new file mode 100644
index 0000000..04f8f80
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/PermissionService.java
@@ -0,0 +1,170 @@
+package com.dingzhuo.energy.framework.security.service;
+
+import java.util.Set;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.system.domain.SysRole;
+
+/**
+ * RuoYi棣栧垱 鑷畾涔夋潈闄愬疄鐜帮紝ss鍙栬嚜SpringSecurity棣栧瓧姣�
+ * 
+ * @author ruoyi
+ */
+@Service("ss")
+public class PermissionService
+{
+    /** 鎵�鏈夋潈闄愭爣璇� */
+    private static final String ALL_PERMISSION = "*:*:*";
+
+    /** 绠$悊鍛樿鑹叉潈闄愭爣璇� */
+    private static final String SUPER_ADMIN = "admin";
+
+    private static final String ROLE_DELIMETER = ",";
+
+    private static final String PERMISSION_DELIMETER = ",";
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 楠岃瘉鐢ㄦ埛鏄惁鍏峰鏌愭潈闄�
+     * 
+     * @param permission 鏉冮檺瀛楃涓�
+     * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄�
+     */
+    public boolean hasPermi(String permission)
+    {
+        if (StringUtils.isEmpty(permission))
+        {
+            return false;
+        }
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()))
+        {
+            return false;
+        }
+        return hasPermissions(loginUser.getPermissions(), permission);
+    }
+
+    /**
+     * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺锛屼笌 hasPermi閫昏緫鐩稿弽
+     *
+     * @param permission 鏉冮檺瀛楃涓�
+     * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇鏉冮檺
+     */
+    public boolean lacksPermi(String permission)
+    {
+        return hasPermi(permission) != true;
+    }
+
+    /**
+     * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓潈闄�
+     *
+     * @param permissions 浠� PERMISSION_NAMES_DELIMETER 涓哄垎闅旂鐨勬潈闄愬垪琛�
+     * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓潈闄�
+     */
+    public boolean hasAnyPermi(String permissions)
+    {
+        if (StringUtils.isEmpty(permissions))
+        {
+            return false;
+        }
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions()))
+        {
+            return false;
+        }
+        Set<String> authorities = loginUser.getPermissions();
+        for (String permission : permissions.split(PERMISSION_DELIMETER))
+        {
+            if (permission != null && hasPermissions(authorities, permission))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 鍒ゆ柇鐢ㄦ埛鏄惁鎷ユ湁鏌愪釜瑙掕壊
+     * 
+     * @param role 瑙掕壊瀛楃涓�
+     * @return 鐢ㄦ埛鏄惁鍏峰鏌愯鑹�
+     */
+    public boolean hasRole(String role)
+    {
+        if (StringUtils.isEmpty(role))
+        {
+            return false;
+        }
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
+        {
+            return false;
+        }
+        for (SysRole sysRole : loginUser.getUser().getRoles())
+        {
+            String roleKey = sysRole.getRoleKey();
+            if (SUPER_ADMIN.contains(roleKey) || roleKey.contains(StringUtils.trim(role)))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 楠岃瘉鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊锛屼笌 isRole閫昏緫鐩稿弽銆�
+     *
+     * @param role 瑙掕壊鍚嶇О
+     * @return 鐢ㄦ埛鏄惁涓嶅叿澶囨煇瑙掕壊
+     */
+    public boolean lacksRole(String role)
+    {
+        return hasRole(role) != true;
+    }
+
+    /**
+     * 楠岃瘉鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓鑹�
+     *
+     * @param roles 浠� ROLE_NAMES_DELIMETER 涓哄垎闅旂鐨勮鑹插垪琛�
+     * @return 鐢ㄦ埛鏄惁鍏锋湁浠ヤ笅浠绘剰涓�涓鑹�
+     */
+    public boolean hasAnyRoles(String roles)
+    {
+        if (StringUtils.isEmpty(roles))
+        {
+            return false;
+        }
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
+        {
+            return false;
+        }
+        for (String role : roles.split(ROLE_DELIMETER))
+        {
+            if (hasRole(role))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁鍖呭惈鏉冮檺
+     * 
+     * @param permissions 鏉冮檺鍒楄〃
+     * @param permission 鏉冮檺瀛楃涓�
+     * @return 鐢ㄦ埛鏄惁鍏峰鏌愭潈闄�
+     */
+    private boolean hasPermissions(Set<String> permissions, String permission)
+    {
+        //return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));
+        return true;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysLoginService.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysLoginService.java
new file mode 100644
index 0000000..2d1333d
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysLoginService.java
@@ -0,0 +1,88 @@
+package com.dingzhuo.energy.framework.security.service;
+
+import javax.annotation.Resource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.stereotype.Component;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.exception.user.CaptchaException;
+import com.dingzhuo.energy.common.exception.user.CaptchaExpireException;
+import com.dingzhuo.energy.common.exception.user.UserPasswordNotMatchException;
+import com.dingzhuo.energy.common.utils.MessageUtils;
+import com.dingzhuo.energy.framework.manager.AsyncManager;
+import com.dingzhuo.energy.framework.manager.factory.AsyncFactory;
+import com.dingzhuo.energy.framework.redis.RedisCache;
+import com.dingzhuo.energy.framework.security.LoginUser;
+
+/**
+ * 鐧诲綍鏍¢獙鏂规硶
+ * 
+ * @author ruoyi
+ */
+@Component
+public class SysLoginService
+{
+    @Autowired
+    private TokenService tokenService;
+
+    @Resource
+    private AuthenticationManager authenticationManager;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    /**
+     * 鐧诲綍楠岃瘉
+     * 
+     * @param username 鐢ㄦ埛鍚�
+     * @param password 瀵嗙爜
+     * @param captcha 楠岃瘉鐮�
+     * @param uuid 鍞竴鏍囪瘑
+     * @return 缁撴灉
+     */
+    public String login(String username, String password, String code, String uuid)
+    {
+        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
+        String captcha = redisCache.getCacheObject(verifyKey);
+        redisCache.deleteObject(verifyKey);
+//        if (captcha == null)
+//        {
+//            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")));
+//            throw new CaptchaExpireException();
+//        }
+//        if (!code.equalsIgnoreCase(captcha))
+//        {
+//            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")));
+//            throw new CaptchaException();
+//        }
+        // 鐢ㄦ埛楠岃瘉
+        Authentication authentication = null;
+        try
+        {
+            // 璇ユ柟娉曚細鍘昏皟鐢║serDetailsServiceImpl.loadUserByUsername
+            authentication = authenticationManager
+                    .authenticate(new UsernamePasswordAuthenticationToken(username, password));
+        }
+        catch (Exception e)
+        {
+            if (e instanceof BadCredentialsException)
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));
+                throw new UserPasswordNotMatchException();
+            }
+            else
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+                throw new CustomException(e.getMessage());
+            }
+        }
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
+        LoginUser loginUser = (LoginUser) authentication.getPrincipal();
+        // 鐢熸垚token
+        return tokenService.createToken(loginUser);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysPermissionService.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysPermissionService.java
new file mode 100644
index 0000000..184af97
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/SysPermissionService.java
@@ -0,0 +1,66 @@
+package com.dingzhuo.energy.framework.security.service;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import com.dingzhuo.energy.project.system.service.ISysMenuService;
+import com.dingzhuo.energy.project.system.service.ISysRoleService;
+
+/**
+ * 鐢ㄦ埛鏉冮檺澶勭悊
+ * 
+ * @author ruoyi
+ */
+@Component
+public class SysPermissionService
+{
+    @Autowired
+    private ISysRoleService roleService;
+
+    @Autowired
+    private ISysMenuService menuService;
+
+    /**
+     * 鑾峰彇瑙掕壊鏁版嵁鏉冮檺
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 瑙掕壊鏉冮檺淇℃伅
+     */
+    public Set<String> getRolePermission(SysUser user)
+    {
+        Set<String> roles = new HashSet<String>();
+        // 绠$悊鍛樻嫢鏈夋墍鏈夋潈闄�
+        if (user.isAdmin())
+        {
+            roles.add("admin");
+        }
+        else
+        {
+            roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId()));
+        }
+        return roles;
+    }
+
+    /**
+     * 鑾峰彇鑿滃崟鏁版嵁鏉冮檺
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鑿滃崟鏉冮檺淇℃伅
+     */
+    public Set<String> getMenuPermission(SysUser user)
+    {
+        Set<String> roles = new HashSet<String>();
+        // 绠$悊鍛樻嫢鏈夋墍鏈夋潈闄�
+        if (user.isAdmin())
+        {
+            roles.add("*:*:*");
+        }
+        else
+        {
+            roles.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
+        }
+        return roles;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/service/TokenService.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/TokenService.java
new file mode 100644
index 0000000..6f45655
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/TokenService.java
@@ -0,0 +1,220 @@
+package com.dingzhuo.energy.framework.security.service;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.ip.AddressUtils;
+import com.dingzhuo.energy.common.utils.ip.IpUtils;
+import com.dingzhuo.energy.framework.redis.RedisCache;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import eu.bitwalker.useragentutils.UserAgent;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+/**
+ * token楠岃瘉澶勭悊
+ * 
+ * @author ruoyi
+ */
+@Component
+public class TokenService
+{
+    // 浠ょ墝鑷畾涔夋爣璇�
+    @Value("${token.header}")
+    private String header;
+
+    // 浠ょ墝绉橀挜
+    @Value("${token.secret}")
+    private String secret;
+
+    // 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+    @Value("${token.expireTime}")
+    private int expireTime;
+
+    protected static final long MILLIS_SECOND = 1000;
+
+    protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
+
+    private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛韬唤淇℃伅
+     * 
+     * @return 鐢ㄦ埛淇℃伅
+     */
+    public LoginUser getLoginUser(HttpServletRequest request)
+    {
+        // 鑾峰彇璇锋眰鎼哄甫鐨勪护鐗�
+        String token = getToken(request);
+        if (StringUtils.isNotEmpty(token))
+        {
+            Claims claims = parseToken(token);
+            // 瑙f瀽瀵瑰簲鐨勬潈闄愪互鍙婄敤鎴蜂俊鎭�
+            String uuid = (String) claims.get(Constants.LOGIN_USER_KEY);
+            String userKey = getTokenKey(uuid);
+            LoginUser user = redisCache.getCacheObject(userKey);
+            return user;
+        }
+        return null;
+    }
+
+    /**
+     * 璁剧疆鐢ㄦ埛韬唤淇℃伅
+     */
+    public void setLoginUser(LoginUser loginUser)
+    {
+        if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken()))
+        {
+            String userKey = getTokenKey(loginUser.getToken());
+            redisCache.setCacheObject(userKey, loginUser);
+        }
+    }
+
+    /**
+     * 鍒犻櫎鐢ㄦ埛韬唤淇℃伅
+     */
+    public void delLoginUser(String token)
+    {
+        if (StringUtils.isNotEmpty(token))
+        {
+            String userKey = getTokenKey(token);
+            redisCache.deleteObject(userKey);
+        }
+    }
+
+    /**
+     * 鍒涘缓浠ょ墝
+     * 
+     * @param loginUser 鐢ㄦ埛淇℃伅
+     * @return 浠ょ墝
+     */
+    public String createToken(LoginUser loginUser)
+    {
+        String token = IdUtils.fastUUID();
+        loginUser.setToken(token);
+        setUserAgent(loginUser);
+        refreshToken(loginUser);
+
+        Map<String, Object> claims = new HashMap<>();
+        claims.put(Constants.LOGIN_USER_KEY, token);
+        return createToken(claims);
+    }
+
+    /**
+     * 楠岃瘉浠ょ墝鏈夋晥鏈燂紝鐩稿樊涓嶈冻20鍒嗛挓锛岃嚜鍔ㄥ埛鏂扮紦瀛�
+     * 
+     * @param token 浠ょ墝
+     * @return 浠ょ墝
+     */
+    public void verifyToken(LoginUser loginUser)
+    {
+        long expireTime = loginUser.getExpireTime();
+        long currentTime = System.currentTimeMillis();
+        if (expireTime - currentTime <= MILLIS_MINUTE_TEN)
+        {
+            refreshToken(loginUser);
+        }
+    }
+
+    /**
+     * 鍒锋柊浠ょ墝鏈夋晥鏈�
+     * 
+     * @param loginUser 鐧诲綍淇℃伅
+     */
+    public void refreshToken(LoginUser loginUser)
+    {
+        loginUser.setLoginTime(System.currentTimeMillis());
+        loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE);
+        // 鏍规嵁uuid灏唋oginUser缂撳瓨
+        String userKey = getTokenKey(loginUser.getToken());
+        redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES);
+    }
+    
+    /**
+     * 璁剧疆鐢ㄦ埛浠g悊淇℃伅
+     * 
+     * @param loginUser 鐧诲綍淇℃伅
+     */
+    public void setUserAgent(LoginUser loginUser)
+    {
+        UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
+        String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
+        loginUser.setIpaddr(ip);
+        loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
+        loginUser.setBrowser(userAgent.getBrowser().getName());
+        loginUser.setOs(userAgent.getOperatingSystem().getName());
+    }
+    
+    /**
+     * 浠庢暟鎹0鏄庣敓鎴愪护鐗�
+     *
+     * @param claims 鏁版嵁澹版槑
+     * @return 浠ょ墝
+     */
+    private String createToken(Map<String, Object> claims)
+    {
+        String token = Jwts.builder()
+                .setClaims(claims)
+                .signWith(SignatureAlgorithm.HS512, secret).compact();
+        return token;
+    }
+
+    /**
+     * 浠庝护鐗屼腑鑾峰彇鏁版嵁澹版槑
+     *
+     * @param token 浠ょ墝
+     * @return 鏁版嵁澹版槑
+     */
+    private Claims parseToken(String token)
+    {
+        return Jwts.parser()
+                .setSigningKey(secret)
+                .parseClaimsJws(token)
+                .getBody();
+    }
+
+    /**
+     * 浠庝护鐗屼腑鑾峰彇鐢ㄦ埛鍚�
+     *
+     * @param token 浠ょ墝
+     * @return 鐢ㄦ埛鍚�
+     */
+    public String getUsernameFromToken(String token)
+    {
+        Claims claims = parseToken(token);
+        return claims.getSubject();
+    }
+
+    /**
+     * 鑾峰彇璇锋眰token
+     *
+     * @param request
+     * @return token
+     */
+    private String getToken(HttpServletRequest request)
+    {
+        String token = request.getHeader(header);
+        if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX))
+        {
+            token = token.replace(Constants.TOKEN_PREFIX, "");
+        }
+        return token;
+    }
+
+    private String getTokenKey(String uuid)
+    {
+        return Constants.LOGIN_TOKEN_KEY + uuid;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/security/service/UserDetailsServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/UserDetailsServiceImpl.java
new file mode 100644
index 0000000..0bf5a54
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/security/service/UserDetailsServiceImpl.java
@@ -0,0 +1,60 @@
+package com.dingzhuo.energy.framework.security.service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.common.enums.UserStatus;
+import com.dingzhuo.energy.common.exception.BaseException;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import com.dingzhuo.energy.project.system.service.ISysUserService;
+
+/**
+ * 鐢ㄦ埛楠岃瘉澶勭悊
+ *
+ * @author ruoyi
+ */
+@Service
+public class UserDetailsServiceImpl implements UserDetailsService
+{
+    private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private SysPermissionService permissionService;
+
+    @Override
+    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
+    {
+        SysUser user = userService.selectUserByUserName(username);
+        if (StringUtils.isNull(user))
+        {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 涓嶅瓨鍦�.", username);
+            throw new UsernameNotFoundException("鐧诲綍鐢ㄦ埛锛�" + username + " 涓嶅瓨鍦�");
+        }
+        else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
+        {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍒犻櫎.", username);
+            throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛�" + username + " 宸茶鍒犻櫎");
+        }
+        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+        {
+            log.info("鐧诲綍鐢ㄦ埛锛歿} 宸茶鍋滅敤.", username);
+            throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛�" + username + " 宸插仠鐢�");
+        }
+
+        return createLoginUser(user);
+    }
+
+    public UserDetails createLoginUser(SysUser user)
+    {
+        return new LoginUser(user, permissionService.getMenuPermission(user));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/controller/BaseController.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/controller/BaseController.java
new file mode 100644
index 0000000..687a435
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/controller/BaseController.java
@@ -0,0 +1,85 @@
+package com.dingzhuo.energy.framework.web.controller;
+
+import java.beans.PropertyEditorSupport;
+import java.util.Date;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.dingzhuo.energy.common.constant.HttpStatus;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.sql.SqlUtil;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.PageDomain;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.framework.web.page.TableSupport;
+
+/**
+ * web灞傞�氱敤鏁版嵁澶勭悊
+ * 
+ * @author ruoyi
+ */
+public class BaseController
+{
+    protected final Logger logger = LoggerFactory.getLogger(BaseController.class);
+
+    /**
+     * 灏嗗墠鍙颁紶閫掕繃鏉ョ殑鏃ユ湡鏍煎紡鐨勫瓧绗︿覆锛岃嚜鍔ㄨ浆鍖栦负Date绫诲瀷
+     */
+    @InitBinder
+    public void initBinder(WebDataBinder binder)
+    {
+        // Date 绫诲瀷杞崲
+        binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
+        {
+            @Override
+            public void setAsText(String text)
+            {
+                setValue(DateUtils.parseDate(text));
+            }
+        });
+    }
+
+    /**
+     * 璁剧疆璇锋眰鍒嗛〉鏁版嵁
+     */
+    protected void startPage()
+    {
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
+        {
+            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
+            PageHelper.startPage(pageNum, pageSize, orderBy);
+        }
+    }
+
+    /**
+     * 鍝嶅簲璇锋眰鍒嗛〉鏁版嵁
+     */
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    protected TableDataInfo getDataTable(List<?> list)
+    {
+        TableDataInfo rspData = new TableDataInfo();
+        rspData.setCode(HttpStatus.SUCCESS);
+        rspData.setRows(list);
+        rspData.setTotal(new PageInfo(list).getTotal());
+        return rspData;
+    }
+
+    /**
+     * 鍝嶅簲杩斿洖缁撴灉
+     * 
+     * @param rows 褰卞搷琛屾暟
+     * @return 鎿嶄綔缁撴灉
+     */
+    protected AjaxResult toAjax(int rows)
+    {
+        return rows > 0 ? AjaxResult.success() : AjaxResult.error();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/AjaxResult.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/AjaxResult.java
new file mode 100644
index 0000000..ba9f73c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/AjaxResult.java
@@ -0,0 +1,148 @@
+package com.dingzhuo.energy.framework.web.domain;
+
+import java.util.HashMap;
+import com.dingzhuo.energy.common.constant.HttpStatus;
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 鎿嶄綔娑堟伅鎻愰啋
+ * 
+ * @author ruoyi
+ */
+public class AjaxResult extends HashMap<String, Object>
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鐘舵�佺爜 */
+    public static final String CODE_TAG = "code";
+
+    /** 杩斿洖鍐呭 */
+    public static final String MSG_TAG = "msg";
+
+    /** 鏁版嵁瀵硅薄 */
+    public static final String DATA_TAG = "data";
+
+    /**
+     * 鍒濆鍖栦竴涓柊鍒涘缓鐨� AjaxResult 瀵硅薄锛屼娇鍏惰〃绀轰竴涓┖娑堟伅銆�
+     */
+    public AjaxResult()
+    {
+    }
+
+    /**
+     * 鍒濆鍖栦竴涓柊鍒涘缓鐨� AjaxResult 瀵硅薄
+     * 
+     * @param code 鐘舵�佺爜
+     * @param msg 杩斿洖鍐呭
+     */
+    public AjaxResult(int code, String msg)
+    {
+        super.put(CODE_TAG, code);
+        super.put(MSG_TAG, msg);
+    }
+
+    /**
+     * 鍒濆鍖栦竴涓柊鍒涘缓鐨� AjaxResult 瀵硅薄
+     * 
+     * @param code 鐘舵�佺爜
+     * @param msg 杩斿洖鍐呭
+     * @param data 鏁版嵁瀵硅薄
+     */
+    public AjaxResult(int code, String msg, Object data)
+    {
+        super.put(CODE_TAG, code);
+        super.put(MSG_TAG, msg);
+        if (StringUtils.isNotNull(data))
+        {
+            super.put(DATA_TAG, data);
+        }
+    }
+
+    /**
+     * 杩斿洖鎴愬姛娑堟伅
+     * 
+     * @return 鎴愬姛娑堟伅
+     */
+    public static AjaxResult success()
+    {
+        return AjaxResult.success("鎿嶄綔鎴愬姛");
+    }
+
+    /**
+     * 杩斿洖鎴愬姛鏁版嵁
+     * 
+     * @return 鎴愬姛娑堟伅
+     */
+    public static AjaxResult success(Object data)
+    {
+        return AjaxResult.success("鎿嶄綔鎴愬姛", data);
+    }
+
+    /**
+     * 杩斿洖鎴愬姛娑堟伅
+     * 
+     * @param msg 杩斿洖鍐呭
+     * @return 鎴愬姛娑堟伅
+     */
+    public static AjaxResult success(String msg)
+    {
+        return AjaxResult.success(msg, null);
+    }
+
+    /**
+     * 杩斿洖鎴愬姛娑堟伅
+     * 
+     * @param msg 杩斿洖鍐呭
+     * @param data 鏁版嵁瀵硅薄
+     * @return 鎴愬姛娑堟伅
+     */
+    public static AjaxResult success(String msg, Object data)
+    {
+        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
+    }
+
+    /**
+     * 杩斿洖閿欒娑堟伅
+     * 
+     * @return
+     */
+    public static AjaxResult error()
+    {
+        return AjaxResult.error("鎿嶄綔澶辫触");
+    }
+
+    /**
+     * 杩斿洖閿欒娑堟伅
+     * 
+     * @param msg 杩斿洖鍐呭
+     * @return 璀﹀憡娑堟伅
+     */
+    public static AjaxResult error(String msg)
+    {
+        return AjaxResult.error(msg, null);
+    }
+
+    /**
+     * 杩斿洖閿欒娑堟伅
+     * 
+     * @param msg 杩斿洖鍐呭
+     * @param data 鏁版嵁瀵硅薄
+     * @return 璀﹀憡娑堟伅
+     */
+    public static AjaxResult error(String msg, Object data)
+    {
+        return new AjaxResult(HttpStatus.ERROR, msg, data);
+    }
+
+    /**
+     * 杩斿洖閿欒娑堟伅
+     * 
+     * @param code 鐘舵�佺爜
+     * @param msg 杩斿洖鍐呭
+     * @return 璀﹀憡娑堟伅
+     */
+    public static AjaxResult error(int code, String msg)
+    {
+        return new AjaxResult(code, msg, null);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/BaseEntity.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/BaseEntity.java
new file mode 100644
index 0000000..b074aa1
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/BaseEntity.java
@@ -0,0 +1,168 @@
+package com.dingzhuo.energy.framework.web.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * Entity鍩虹被
+ *
+ * @author ruoyi
+ */
+public class BaseEntity implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鎼滅储鍊� */
+    @ApiModelProperty(value = "鎼滅储鍊�")
+    private String searchValue;
+
+    /** 鍒涘缓鑰� */
+    @ApiModelProperty(value = "鍒涘缓鑰�")
+    private String createBy;
+
+    /** 鍒涘缓鏃堕棿 */
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 鏇存柊鑰� */
+    @ApiModelProperty(value = "鏇存柊鑰�")
+    private String updateBy;
+
+    /** 鏇存柊鏃堕棿 */
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 澶囨敞 */
+    @ApiModelProperty(value = "澶囨敞")
+    private String remark;
+
+    /** 鏁版嵁鏉冮檺 */
+    @ApiModelProperty(value = "鏁版嵁鏉冮檺")
+    private String dataScope;
+
+    /** 寮�濮嬫椂闂� */
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    @JsonIgnore
+    private String beginTime;
+
+    /** 缁撴潫鏃堕棿 */
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    @JsonIgnore
+    private String endTime;
+
+    /** 璇锋眰鍙傛暟 */
+    @ApiModelProperty(value = "璇锋眰鍙傛暟")
+    private Map<String, Object> params;
+
+    public String getSearchValue()
+    {
+        return searchValue;
+    }
+
+    public void setSearchValue(String searchValue)
+    {
+        this.searchValue = searchValue;
+    }
+
+    public String getCreateBy()
+    {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy)
+    {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime()
+    {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime)
+    {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateBy()
+    {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy)
+    {
+        this.updateBy = updateBy;
+    }
+
+    public Date getUpdateTime()
+    {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime)
+    {
+        this.updateTime = updateTime;
+    }
+
+    public String getRemark()
+    {
+        return remark;
+    }
+
+    public void setRemark(String remark)
+    {
+        this.remark = remark;
+    }
+
+    public String getDataScope()
+    {
+        return dataScope;
+    }
+
+    public void setDataScope(String dataScope)
+    {
+        this.dataScope = dataScope;
+    }
+
+    public String getBeginTime()
+    {
+        return beginTime;
+    }
+
+    public void setBeginTime(String beginTime)
+    {
+        this.beginTime = beginTime;
+    }
+
+    public String getEndTime()
+    {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime)
+    {
+        this.endTime = endTime;
+    }
+
+    public Map<String, Object> getParams()
+    {
+        if (params == null)
+        {
+            params = new HashMap<>();
+        }
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params)
+    {
+        this.params = params;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/Server.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/Server.java
new file mode 100644
index 0000000..11c8048
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/Server.java
@@ -0,0 +1,245 @@
+package com.dingzhuo.energy.framework.web.domain;
+
+import java.net.UnknownHostException;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+
+import com.dingzhuo.energy.framework.web.domain.server.Cpu;
+import com.dingzhuo.energy.framework.web.domain.server.Jvm;
+import com.dingzhuo.energy.framework.web.domain.server.SysFile;
+import com.dingzhuo.energy.common.utils.Arith;
+import com.dingzhuo.energy.common.utils.ip.IpUtils;
+import com.dingzhuo.energy.framework.web.domain.server.Cpu;
+import com.dingzhuo.energy.framework.web.domain.server.Jvm;
+import com.dingzhuo.energy.framework.web.domain.server.Mem;
+import com.dingzhuo.energy.framework.web.domain.server.Sys;
+import com.dingzhuo.energy.framework.web.domain.server.SysFile;
+import oshi.SystemInfo;
+import oshi.hardware.CentralProcessor;
+import oshi.hardware.CentralProcessor.TickType;
+import oshi.hardware.GlobalMemory;
+import oshi.hardware.HardwareAbstractionLayer;
+import oshi.software.os.FileSystem;
+import oshi.software.os.OSFileStore;
+import oshi.software.os.OperatingSystem;
+import oshi.util.Util;
+
+/**
+ * 鏈嶅姟鍣ㄧ浉鍏充俊鎭�
+ * 
+ * @author ruoyi
+ */
+public class Server
+{
+    
+    private static final int OSHI_WAIT_SECOND = 1000;
+    
+    /**
+     * CPU鐩稿叧淇℃伅
+     */
+    private Cpu cpu = new Cpu();
+
+    /**
+     * 鍏у瓨鐩稿叧淇℃伅
+     */
+    private Mem mem = new Mem();
+
+    /**
+     * JVM鐩稿叧淇℃伅
+     */
+    private Jvm jvm = new Jvm();
+
+    /**
+     * 鏈嶅姟鍣ㄧ浉鍏充俊鎭�
+     */
+    private Sys sys = new Sys();
+
+    /**
+     * 纾佺洏鐩稿叧淇℃伅
+     */
+    private List<SysFile> sysFiles = new LinkedList<SysFile>();
+
+    public Cpu getCpu()
+    {
+        return cpu;
+    }
+
+    public void setCpu(Cpu cpu)
+    {
+        this.cpu = cpu;
+    }
+
+    public Mem getMem()
+    {
+        return mem;
+    }
+
+    public void setMem(Mem mem)
+    {
+        this.mem = mem;
+    }
+
+    public Jvm getJvm()
+    {
+        return jvm;
+    }
+
+    public void setJvm(Jvm jvm)
+    {
+        this.jvm = jvm;
+    }
+
+    public Sys getSys()
+    {
+        return sys;
+    }
+
+    public void setSys(Sys sys)
+    {
+        this.sys = sys;
+    }
+
+    public List<SysFile> getSysFiles()
+    {
+        return sysFiles;
+    }
+
+    public void setSysFiles(List<SysFile> sysFiles)
+    {
+        this.sysFiles = sysFiles;
+    }
+
+    public void copyTo() throws Exception
+    {
+        SystemInfo si = new SystemInfo();
+        HardwareAbstractionLayer hal = si.getHardware();
+
+        setCpuInfo(hal.getProcessor());
+
+        setMemInfo(hal.getMemory());
+
+        setSysInfo();
+
+        setJvmInfo();
+
+        setSysFiles(si.getOperatingSystem());
+    }
+
+    /**
+     * 璁剧疆CPU淇℃伅
+     */
+    private void setCpuInfo(CentralProcessor processor)
+    {
+        // CPU淇℃伅
+        long[] prevTicks = processor.getSystemCpuLoadTicks();
+        Util.sleep(OSHI_WAIT_SECOND);
+        long[] ticks = processor.getSystemCpuLoadTicks();
+        long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];
+        long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];
+        long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];
+        long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];
+        long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];
+        long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];
+        long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];
+        long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];
+        long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
+        cpu.setCpuNum(processor.getLogicalProcessorCount());
+        cpu.setTotal(totalCpu);
+        cpu.setSys(cSys);
+        cpu.setUsed(user);
+        cpu.setWait(iowait);
+        cpu.setFree(idle);
+    }
+
+    /**
+     * 璁剧疆鍐呭瓨淇℃伅
+     */
+    private void setMemInfo(GlobalMemory memory)
+    {
+        mem.setTotal(memory.getTotal());
+        mem.setUsed(memory.getTotal() - memory.getAvailable());
+        mem.setFree(memory.getAvailable());
+    }
+
+    /**
+     * 璁剧疆鏈嶅姟鍣ㄤ俊鎭�
+     */
+    private void setSysInfo()
+    {
+        Properties props = System.getProperties();
+        sys.setComputerName(IpUtils.getHostName());
+        sys.setComputerIp(IpUtils.getHostIp());
+        sys.setOsName(props.getProperty("os.name"));
+        sys.setOsArch(props.getProperty("os.arch"));
+        sys.setUserDir(props.getProperty("user.dir"));
+    }
+
+    /**
+     * 璁剧疆Java铏氭嫙鏈�
+     */
+    private void setJvmInfo() throws UnknownHostException
+    {
+        Properties props = System.getProperties();
+        jvm.setTotal(Runtime.getRuntime().totalMemory());
+        jvm.setMax(Runtime.getRuntime().maxMemory());
+        jvm.setFree(Runtime.getRuntime().freeMemory());
+        jvm.setVersion(props.getProperty("java.version"));
+        jvm.setHome(props.getProperty("java.home"));
+    }
+
+    /**
+     * 璁剧疆纾佺洏淇℃伅
+     */
+    private void setSysFiles(OperatingSystem os)
+    {
+        FileSystem fileSystem = os.getFileSystem();
+        OSFileStore[] fsArray = fileSystem.getFileStores();
+        for (OSFileStore fs : fsArray)
+        {
+            long free = fs.getUsableSpace();
+            long total = fs.getTotalSpace();
+            long used = total - free;
+            SysFile sysFile = new SysFile();
+            sysFile.setDirName(fs.getMount());
+            sysFile.setSysTypeName(fs.getType());
+            sysFile.setTypeName(fs.getName());
+            sysFile.setTotal(convertFileSize(total));
+            sysFile.setFree(convertFileSize(free));
+            sysFile.setUsed(convertFileSize(used));
+            sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100));
+            sysFiles.add(sysFile);
+        }
+    }
+
+    /**
+     * 瀛楄妭杞崲
+     * 
+     * @param size 瀛楄妭澶у皬
+     * @return 杞崲鍚庡��
+     */
+    public String convertFileSize(long size)
+    {
+        long kb = 1024;
+        long mb = kb * 1024;
+        long gb = mb * 1024;
+        if (size >= gb)
+        {
+            return String.format("%.1f GB", (float) size / gb);
+        }
+        else if (size >= mb)
+        {
+            float f = (float) size / mb;
+            return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
+        }
+        else if (size >= kb)
+        {
+            float f = (float) size / kb;
+            return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
+        }
+        else
+        {
+            return String.format("%d B", size);
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/TreeSelect.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/TreeSelect.java
new file mode 100644
index 0000000..c5fb615
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/TreeSelect.java
@@ -0,0 +1,78 @@
+package com.dingzhuo.energy.framework.web.domain;
+
+import com.dingzhuo.energy.project.system.domain.SysDept;
+import com.dingzhuo.energy.project.system.domain.SysMenu;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Treeselect鏍戠粨鏋勫疄浣撶被
+ * 
+ * @author ruoyi
+ */
+public class TreeSelect implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鑺傜偣ID */
+    private Long id;
+
+    /** 鑺傜偣鍚嶇О */
+    private String label;
+
+    /** 瀛愯妭鐐� */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<TreeSelect> children;
+
+    public TreeSelect()
+    {
+
+    }
+
+    public TreeSelect(SysDept dept)
+    {
+        this.id = dept.getDeptId();
+        this.label = dept.getDeptName();
+        this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    public TreeSelect(SysMenu menu)
+    {
+        this.id = menu.getMenuId();
+        this.label = menu.getMenuName();
+        this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public String getLabel()
+    {
+        return label;
+    }
+
+    public void setLabel(String label)
+    {
+        this.label = label;
+    }
+
+    public List<TreeSelect> getChildren()
+    {
+        return children;
+    }
+
+    public void setChildren(List<TreeSelect> children)
+    {
+        this.children = children;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Cpu.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Cpu.java
new file mode 100644
index 0000000..6db7f3a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Cpu.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.framework.web.domain.server;
+
+import com.dingzhuo.energy.common.utils.Arith;
+
+/**
+ * CPU鐩稿叧淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class Cpu
+{
+    /**
+     * 鏍稿績鏁�
+     */
+    private int cpuNum;
+
+    /**
+     * CPU鎬荤殑浣跨敤鐜�
+     */
+    private double total;
+
+    /**
+     * CPU绯荤粺浣跨敤鐜�
+     */
+    private double sys;
+
+    /**
+     * CPU鐢ㄦ埛浣跨敤鐜�
+     */
+    private double used;
+
+    /**
+     * CPU褰撳墠绛夊緟鐜�
+     */
+    private double wait;
+
+    /**
+     * CPU褰撳墠绌洪棽鐜�
+     */
+    private double free;
+
+    public int getCpuNum()
+    {
+        return cpuNum;
+    }
+
+    public void setCpuNum(int cpuNum)
+    {
+        this.cpuNum = cpuNum;
+    }
+
+    public double getTotal()
+    {
+        return Arith.round(Arith.mul(total, 100), 2);
+    }
+
+    public void setTotal(double total)
+    {
+        this.total = total;
+    }
+
+    public double getSys()
+    {
+        return Arith.round(Arith.mul(sys / total, 100), 2);
+    }
+
+    public void setSys(double sys)
+    {
+        this.sys = sys;
+    }
+
+    public double getUsed()
+    {
+        return Arith.round(Arith.mul(used / total, 100), 2);
+    }
+
+    public void setUsed(double used)
+    {
+        this.used = used;
+    }
+
+    public double getWait()
+    {
+        return Arith.round(Arith.mul(wait / total, 100), 2);
+    }
+
+    public void setWait(double wait)
+    {
+        this.wait = wait;
+    }
+
+    public double getFree()
+    {
+        return Arith.round(Arith.mul(free / total, 100), 2);
+    }
+
+    public void setFree(double free)
+    {
+        this.free = free;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Jvm.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Jvm.java
new file mode 100644
index 0000000..d553685
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Jvm.java
@@ -0,0 +1,122 @@
+package com.dingzhuo.energy.framework.web.domain.server;
+
+import java.lang.management.ManagementFactory;
+import com.dingzhuo.energy.common.utils.Arith;
+import com.dingzhuo.energy.common.utils.DateUtils;
+
+/**
+ * JVM鐩稿叧淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class Jvm
+{
+    /**
+     * 褰撳墠JVM鍗犵敤鐨勫唴瀛樻�绘暟(M)
+     */
+    private double total;
+
+    /**
+     * JVM鏈�澶у彲鐢ㄥ唴瀛樻�绘暟(M)
+     */
+    private double max;
+
+    /**
+     * JVM绌洪棽鍐呭瓨(M)
+     */
+    private double free;
+
+    /**
+     * JDK鐗堟湰
+     */
+    private String version;
+
+    /**
+     * JDK璺緞
+     */
+    private String home;
+
+    public double getTotal()
+    {
+        return Arith.div(total, (1024 * 1024), 2);
+    }
+
+    public void setTotal(double total)
+    {
+        this.total = total;
+    }
+
+    public double getMax()
+    {
+        return Arith.div(max, (1024 * 1024), 2);
+    }
+
+    public void setMax(double max)
+    {
+        this.max = max;
+    }
+
+    public double getFree()
+    {
+        return Arith.div(free, (1024 * 1024), 2);
+    }
+
+    public void setFree(double free)
+    {
+        this.free = free;
+    }
+
+    public double getUsed()
+    {
+        return Arith.div(total - free, (1024 * 1024), 2);
+    }
+
+    public double getUsage()
+    {
+        return Arith.mul(Arith.div(total - free, total, 4), 100);
+    }
+
+    /**
+     * 鑾峰彇JDK鍚嶇О
+     */
+    public String getName()
+    {
+        return ManagementFactory.getRuntimeMXBean().getVmName();
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+
+    public String getHome()
+    {
+        return home;
+    }
+
+    public void setHome(String home)
+    {
+        this.home = home;
+    }
+
+    /**
+     * JDK鍚姩鏃堕棿
+     */
+    public String getStartTime()
+    {
+        return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate());
+    }
+
+    /**
+     * JDK杩愯鏃堕棿
+     */
+    public String getRunTime()
+    {
+        return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate());
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Mem.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Mem.java
new file mode 100644
index 0000000..2393e09
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Mem.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.framework.web.domain.server;
+
+import com.dingzhuo.energy.common.utils.Arith;
+
+/**
+ * 鍏у瓨鐩稿叧淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class Mem
+{
+    /**
+     * 鍐呭瓨鎬婚噺
+     */
+    private double total;
+
+    /**
+     * 宸茬敤鍐呭瓨
+     */
+    private double used;
+
+    /**
+     * 鍓╀綑鍐呭瓨
+     */
+    private double free;
+
+    public double getTotal()
+    {
+        return Arith.div(total, (1024 * 1024 * 1024), 2);
+    }
+
+    public void setTotal(long total)
+    {
+        this.total = total;
+    }
+
+    public double getUsed()
+    {
+        return Arith.div(used, (1024 * 1024 * 1024), 2);
+    }
+
+    public void setUsed(long used)
+    {
+        this.used = used;
+    }
+
+    public double getFree()
+    {
+        return Arith.div(free, (1024 * 1024 * 1024), 2);
+    }
+
+    public void setFree(long free)
+    {
+        this.free = free;
+    }
+
+    public double getUsage()
+    {
+        return Arith.mul(Arith.div(used, total, 4), 100);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Sys.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Sys.java
new file mode 100644
index 0000000..e6d92ed
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/Sys.java
@@ -0,0 +1,84 @@
+package com.dingzhuo.energy.framework.web.domain.server;
+
+/**
+ * 绯荤粺鐩稿叧淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class Sys
+{
+    /**
+     * 鏈嶅姟鍣ㄥ悕绉�
+     */
+    private String computerName;
+
+    /**
+     * 鏈嶅姟鍣↖p
+     */
+    private String computerIp;
+
+    /**
+     * 椤圭洰璺緞
+     */
+    private String userDir;
+
+    /**
+     * 鎿嶄綔绯荤粺
+     */
+    private String osName;
+
+    /**
+     * 绯荤粺鏋舵瀯
+     */
+    private String osArch;
+
+    public String getComputerName()
+    {
+        return computerName;
+    }
+
+    public void setComputerName(String computerName)
+    {
+        this.computerName = computerName;
+    }
+
+    public String getComputerIp()
+    {
+        return computerIp;
+    }
+
+    public void setComputerIp(String computerIp)
+    {
+        this.computerIp = computerIp;
+    }
+
+    public String getUserDir()
+    {
+        return userDir;
+    }
+
+    public void setUserDir(String userDir)
+    {
+        this.userDir = userDir;
+    }
+
+    public String getOsName()
+    {
+        return osName;
+    }
+
+    public void setOsName(String osName)
+    {
+        this.osName = osName;
+    }
+
+    public String getOsArch()
+    {
+        return osArch;
+    }
+
+    public void setOsArch(String osArch)
+    {
+        this.osArch = osArch;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/SysFile.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/SysFile.java
new file mode 100644
index 0000000..eb38323
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/domain/server/SysFile.java
@@ -0,0 +1,114 @@
+package com.dingzhuo.energy.framework.web.domain.server;
+
+/**
+ * 绯荤粺鏂囦欢鐩稿叧淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class SysFile
+{
+    /**
+     * 鐩樼璺緞
+     */
+    private String dirName;
+
+    /**
+     * 鐩樼绫诲瀷
+     */
+    private String sysTypeName;
+
+    /**
+     * 鏂囦欢绫诲瀷
+     */
+    private String typeName;
+
+    /**
+     * 鎬诲ぇ灏�
+     */
+    private String total;
+
+    /**
+     * 鍓╀綑澶у皬
+     */
+    private String free;
+
+    /**
+     * 宸茬粡浣跨敤閲�
+     */
+    private String used;
+
+    /**
+     * 璧勬簮鐨勪娇鐢ㄧ巼
+     */
+    private double usage;
+
+    public String getDirName()
+    {
+        return dirName;
+    }
+
+    public void setDirName(String dirName)
+    {
+        this.dirName = dirName;
+    }
+
+    public String getSysTypeName()
+    {
+        return sysTypeName;
+    }
+
+    public void setSysTypeName(String sysTypeName)
+    {
+        this.sysTypeName = sysTypeName;
+    }
+
+    public String getTypeName()
+    {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName)
+    {
+        this.typeName = typeName;
+    }
+
+    public String getTotal()
+    {
+        return total;
+    }
+
+    public void setTotal(String total)
+    {
+        this.total = total;
+    }
+
+    public String getFree()
+    {
+        return free;
+    }
+
+    public void setFree(String free)
+    {
+        this.free = free;
+    }
+
+    public String getUsed()
+    {
+        return used;
+    }
+
+    public void setUsed(String used)
+    {
+        this.used = used;
+    }
+
+    public double getUsage()
+    {
+        return usage;
+    }
+
+    public void setUsage(double usage)
+    {
+        this.usage = usage;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/exception/GlobalExceptionHandler.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..d3fa37f
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/exception/GlobalExceptionHandler.java
@@ -0,0 +1,117 @@
+package com.dingzhuo.energy.framework.web.exception;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.AccessDeniedException;
+import org.springframework.security.authentication.AccountExpiredException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.validation.BindException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.NoHandlerFoundException;
+import com.dingzhuo.energy.common.constant.HttpStatus;
+import com.dingzhuo.energy.common.exception.BaseException;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.exception.DemoModeException;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 鍏ㄥ眬寮傚父澶勭悊鍣�
+ * 
+ * @author ruoyi
+ */
+@RestControllerAdvice
+public class GlobalExceptionHandler
+{
+    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+    /**
+     * 鍩虹寮傚父
+     */
+    @ExceptionHandler(BaseException.class)
+    public AjaxResult baseException(BaseException e)
+    {
+        return AjaxResult.error(e.getMessage());
+    }
+
+    /**
+     * 涓氬姟寮傚父
+     */
+    @ExceptionHandler(CustomException.class)
+    public AjaxResult businessException(CustomException e)
+    {
+        if (StringUtils.isNull(e.getCode()))
+        {
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.error(e.getCode(), e.getMessage());
+    }
+
+    @ExceptionHandler(NoHandlerFoundException.class)
+    public AjaxResult handlerNoFoundException(Exception e)
+    {
+        log.error(e.getMessage(), e);
+        return AjaxResult.error(HttpStatus.NOT_FOUND, "璺緞涓嶅瓨鍦紝璇锋鏌ヨ矾寰勬槸鍚︽纭�");
+    }
+
+    @ExceptionHandler(AccessDeniedException.class)
+    public AjaxResult handleAuthorizationException(AccessDeniedException e)
+    {
+        log.error(e.getMessage());
+        return AjaxResult.error(HttpStatus.FORBIDDEN, "娌℃湁鏉冮檺锛岃鑱旂郴绠$悊鍛樻巿鏉�");
+    }
+
+    @ExceptionHandler(AccountExpiredException.class)
+    public AjaxResult handleAccountExpiredException(AccountExpiredException e)
+    {
+        log.error(e.getMessage(), e);
+        return AjaxResult.error(e.getMessage());
+    }
+
+    @ExceptionHandler(UsernameNotFoundException.class)
+    public AjaxResult handleUsernameNotFoundException(UsernameNotFoundException e)
+    {
+        log.error(e.getMessage(), e);
+        return AjaxResult.error(e.getMessage());
+    }
+
+    @ExceptionHandler(Exception.class)
+    public AjaxResult handleException(Exception e)
+    {
+        log.error(e.getMessage(), e);
+        return AjaxResult.error(e.getMessage());
+    }
+
+    /**
+     * 鑷畾涔夐獙璇佸紓甯�
+     */
+    @ExceptionHandler(BindException.class)
+    public AjaxResult validatedBindException(BindException e)
+    {
+        log.error(e.getMessage(), e);
+        String message = e.getAllErrors().get(0).getDefaultMessage();
+        return AjaxResult.error(message);
+    }
+
+    /**
+     * 鑷畾涔夐獙璇佸紓甯�
+     */
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public Object validExceptionHandler(MethodArgumentNotValidException e)
+    {
+        log.error(e.getMessage(), e);
+        String message = e.getBindingResult().getFieldError().getDefaultMessage();
+        return AjaxResult.error(message);
+    }
+
+    /**
+     * 婕旂ず妯″紡寮傚父
+     */
+    @ExceptionHandler(DemoModeException.class)
+    public AjaxResult demoModeException(DemoModeException e)
+    {
+        return AjaxResult.error("婕旂ず妯″紡锛屼笉鍏佽鎿嶄綔");
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/page/PageDomain.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/page/PageDomain.java
new file mode 100644
index 0000000..0a92873
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/page/PageDomain.java
@@ -0,0 +1,69 @@
+package com.dingzhuo.energy.framework.web.page;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+
+/**
+ * 鍒嗛〉鏁版嵁
+ * 
+ * @author ruoyi
+ */
+public class PageDomain
+{
+    /** 褰撳墠璁板綍璧峰绱㈠紩 */
+    private Integer pageNum;
+    /** 姣忛〉鏄剧ず璁板綍鏁� */
+    private Integer pageSize;
+    /** 鎺掑簭鍒� */
+    private String orderByColumn;
+    /** 鎺掑簭鐨勬柟鍚� "desc" 鎴栬�� "asc". */
+    private String isAsc;
+
+    public String getOrderBy()
+    {
+        if (StringUtils.isEmpty(orderByColumn))
+        {
+            return "";
+        }
+        return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
+    }
+
+    public Integer getPageNum()
+    {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum)
+    {
+        this.pageNum = pageNum;
+    }
+
+    public Integer getPageSize()
+    {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize)
+    {
+        this.pageSize = pageSize;
+    }
+
+    public String getOrderByColumn()
+    {
+        return orderByColumn;
+    }
+
+    public void setOrderByColumn(String orderByColumn)
+    {
+        this.orderByColumn = orderByColumn;
+    }
+
+    public String getIsAsc()
+    {
+        return isAsc;
+    }
+
+    public void setIsAsc(String isAsc)
+    {
+        this.isAsc = isAsc;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableDataInfo.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableDataInfo.java
new file mode 100644
index 0000000..b141dc3
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableDataInfo.java
@@ -0,0 +1,85 @@
+package com.dingzhuo.energy.framework.web.page;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 琛ㄦ牸鍒嗛〉鏁版嵁瀵硅薄
+ * 
+ * @author ruoyi
+ */
+public class TableDataInfo implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鎬昏褰曟暟 */
+    private long total;
+
+    /** 鍒楄〃鏁版嵁 */
+    private List<?> rows;
+
+    /** 娑堟伅鐘舵�佺爜 */
+    private int code;
+
+    /** 娑堟伅鍐呭 */
+    private int msg;
+
+    /**
+     * 琛ㄦ牸鏁版嵁瀵硅薄
+     */
+    public TableDataInfo()
+    {
+    }
+
+    /**
+     * 鍒嗛〉
+     * 
+     * @param list 鍒楄〃鏁版嵁
+     * @param total 鎬昏褰曟暟
+     */
+    public TableDataInfo(List<?> list, int total)
+    {
+        this.rows = list;
+        this.total = total;
+    }
+
+    public long getTotal()
+    {
+        return total;
+    }
+
+    public void setTotal(long total)
+    {
+        this.total = total;
+    }
+
+    public List<?> getRows()
+    {
+        return rows;
+    }
+
+    public void setRows(List<?> rows)
+    {
+        this.rows = rows;
+    }
+
+    public int getCode()
+    {
+        return code;
+    }
+
+    public void setCode(int code)
+    {
+        this.code = code;
+    }
+
+    public int getMsg()
+    {
+        return msg;
+    }
+
+    public void setMsg(int msg)
+    {
+        this.msg = msg;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableSupport.java b/basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableSupport.java
new file mode 100644
index 0000000..f3ad0e1
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/framework/web/page/TableSupport.java
@@ -0,0 +1,49 @@
+package com.dingzhuo.energy.framework.web.page;
+
+import com.dingzhuo.energy.common.utils.ServletUtils;
+
+/**
+ * 琛ㄦ牸鏁版嵁澶勭悊
+ * 
+ * @author ruoyi
+ */
+public class TableSupport
+{
+    /**
+     * 褰撳墠璁板綍璧峰绱㈠紩
+     */
+    public static final String PAGE_NUM = "pageNum";
+
+    /**
+     * 姣忛〉鏄剧ず璁板綍鏁�
+     */
+    public static final String PAGE_SIZE = "pageSize";
+
+    /**
+     * 鎺掑簭鍒�
+     */
+    public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+    /**
+     * 鎺掑簭鐨勬柟鍚� "desc" 鎴栬�� "asc".
+     */
+    public static final String IS_ASC = "isAsc";
+
+    /**
+     * 灏佽鍒嗛〉瀵硅薄
+     */
+    public static PageDomain getPageDomain()
+    {
+        PageDomain pageDomain = new PageDomain();
+        pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM));
+        pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE));
+        pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
+        pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
+        return pageDomain;
+    }
+
+    public static PageDomain buildPageRequest()
+    {
+        return getPageDomain();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/common/CaptchaController.java b/basic/src/main/java/com/dingzhuo/energy/project/common/CaptchaController.java
new file mode 100644
index 0000000..2bf11d0
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/common/CaptchaController.java
@@ -0,0 +1,65 @@
+package com.dingzhuo.energy.project.common;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.framework.redis.RedisCache;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.VerifyCodeUtils;
+import com.dingzhuo.energy.common.utils.sign.Base64;
+import com.dingzhuo.energy.framework.redis.RedisCache;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 楠岃瘉鐮佹搷浣滃鐞�
+ * 
+ * @author ruoyi
+ */
+@RestController
+public class CaptchaController
+{
+    @Autowired
+    private RedisCache redisCache;
+
+    /**
+     * 鐢熸垚楠岃瘉鐮�
+     */
+    @GetMapping("/captchaImage")
+    public AjaxResult getCode(HttpServletResponse response) throws IOException
+    {
+        // 鐢熸垚闅忔満瀛椾覆
+        String verifyCode = VerifyCodeUtils.generateVerifyCode(4);
+        // 鍞竴鏍囪瘑
+        String uuid = IdUtils.simpleUUID();
+        String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid;
+
+        redisCache.setCacheObject(verifyKey, verifyCode, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
+        // 鐢熸垚鍥剧墖
+        int w = 111, h = 36;
+        ByteArrayOutputStream stream = new ByteArrayOutputStream();
+        VerifyCodeUtils.outputImage(w, h, stream, verifyCode);
+        try
+        {
+            AjaxResult ajax = AjaxResult.success();
+            ajax.put("uuid", uuid);
+            ajax.put("img", Base64.encode(stream.toByteArray()));
+            return ajax;
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+        finally
+        {
+            stream.close();
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/common/CommonController.java b/basic/src/main/java/com/dingzhuo/energy/project/common/CommonController.java
new file mode 100644
index 0000000..0ab7642
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/common/CommonController.java
@@ -0,0 +1,123 @@
+package com.dingzhuo.energy.project.common;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.config.ServerConfig;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.common.utils.file.FileUtils;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.config.ServerConfig;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 閫氱敤璇锋眰澶勭悊
+ * 
+ * @author ruoyi
+ */
+@RestController
+public class CommonController
+{
+    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
+
+    @Autowired
+    private ServerConfig serverConfig;
+
+    /**
+     * 閫氱敤涓嬭浇璇锋眰
+     * 
+     * @param fileName 鏂囦欢鍚嶇О
+     * @param delete 鏄惁鍒犻櫎
+     */
+    @GetMapping("common/download")
+    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
+    {
+        try
+        {
+            if (!FileUtils.isValidFilename(fileName))
+            {
+                throw new Exception(StringUtils.format("鏂囦欢鍚嶇О({})闈炴硶锛屼笉鍏佽涓嬭浇銆� ", fileName));
+            }
+            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
+            String filePath = RuoYiConfig.getDownloadPath() + fileName;
+
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition",
+                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName));
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+            if (delete)
+            {
+                FileUtils.deleteFile(filePath);
+            }
+        }
+        catch (Exception e)
+        {
+            log.error("涓嬭浇鏂囦欢澶辫触", e);
+        }
+    }
+
+    /**
+     * 閫氱敤涓婁紶璇锋眰
+     */
+    @PostMapping("/common/upload")
+    public AjaxResult uploadFile(MultipartFile file) throws Exception
+    {
+        try
+        {
+            // 涓婁紶鏂囦欢璺緞
+            String filePath = RuoYiConfig.getUploadPath();
+            // 涓婁紶骞惰繑鍥炴柊鏂囦欢鍚嶇О
+            String fileName = FileUploadUtils.upload(filePath, file);
+            String url = serverConfig.getUrl() + fileName;
+            AjaxResult ajax = AjaxResult.success();
+            ajax.put("fileName", fileName);
+            ajax.put("url", url);
+            return ajax;
+        }
+        catch (Exception e)
+        {
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    /**
+     * 閫氱敤鎸囧畾鏂囦欢涓嬭浇璇锋眰
+     *
+     * @param showFileName 涓嬭浇灞曠ず鏂囦欢鍚嶇О
+     * @param filePath 涓嬭浇鏂囦欢缁濆璺緞 甯� 鏂囦欢鐪熷疄鍚嶅瓧鍙婅矾寰�
+     * @param delete 鏄惁鍒犻櫎/
+     */
+    @GetMapping("common/downloadAssign")
+    public void fileAssignDownload(String showFileName, String filePath,Boolean delete, HttpServletResponse response, HttpServletRequest request)
+    {
+        try
+        {
+            response.setCharacterEncoding("utf-8");
+            response.setContentType("multipart/form-data");
+            response.setHeader("Content-Disposition",
+                    "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, showFileName));
+            FileUtils.writeBytes(filePath, response.getOutputStream());
+//            if (delete)
+//            {
+//                FileUtils.deleteFile(filePath);
+//            }
+            log.error("涓嬭浇鎴愬姛", "aa");
+        }
+        catch (Exception e)
+        {
+            log.error("涓嬭浇鏂囦欢澶辫触", e);
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/ServerController.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/ServerController.java
new file mode 100644
index 0000000..14c356e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/ServerController.java
@@ -0,0 +1,31 @@
+package com.dingzhuo.energy.project.monitor.controller;
+
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.domain.Server;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.domain.Server;
+
+/**
+ * 鏈嶅姟鍣ㄧ洃鎺�
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/server")
+public class ServerController extends BaseController
+{
+    @PreAuthorize("@ss.hasPermi('monitor:server:list')")
+    @GetMapping()
+    public AjaxResult getInfo() throws Exception
+    {
+        Server server = new Server();
+        server.copyTo();
+        return AjaxResult.success(server);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysLogininforController.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysLogininforController.java
new file mode 100644
index 0000000..31f4b04
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysLogininforController.java
@@ -0,0 +1,73 @@
+package com.dingzhuo.energy.project.monitor.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.monitor.domain.SysLogininfor;
+import com.dingzhuo.energy.project.monitor.service.ISysLogininforService;
+
+/**
+ * 绯荤粺璁块棶璁板綍
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/logininfor")
+public class SysLogininforController extends BaseController
+{
+    @Autowired
+    private ISysLogininforService logininforService;
+
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysLogininfor logininfor)
+    {
+        startPage();
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
+        return getDataTable(list);
+    }
+
+    @Log(title = "鐧婚檰鏃ュ織", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysLogininfor logininfor)
+    {
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
+        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
+        return util.exportExcel(list, "鐧婚檰鏃ュ織");
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
+    @Log(title = "鐧婚檰鏃ュ織", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{infoIds}")
+    public AjaxResult remove(@PathVariable Long[] infoIds)
+    {
+        return toAjax(logininforService.deleteLogininforByIds(infoIds));
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
+    @Log(title = "鐧婚檰鏃ュ織", businessType = BusinessType.CLEAN)
+    @DeleteMapping("/clean")
+    public AjaxResult clean()
+    {
+        logininforService.cleanLogininfor();
+        return AjaxResult.success();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysOperlogController.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysOperlogController.java
new file mode 100644
index 0000000..b7e47f7
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysOperlogController.java
@@ -0,0 +1,72 @@
+package com.dingzhuo.energy.project.monitor.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.monitor.domain.SysOperLog;
+import com.dingzhuo.energy.project.monitor.service.ISysOperLogService;
+
+/**
+ * 鎿嶄綔鏃ュ織璁板綍
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/operlog")
+public class SysOperlogController extends BaseController
+{
+    @Autowired
+    private ISysOperLogService operLogService;
+
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysOperLog operLog)
+    {
+        startPage();
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        return getDataTable(list);
+    }
+
+    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysOperLog operLog)
+    {
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
+        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
+        return util.exportExcel(list, "鎿嶄綔鏃ュ織");
+    }
+
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/{operIds}")
+    public AjaxResult remove(@PathVariable Long[] operIds)
+    {
+        return toAjax(operLogService.deleteOperLogByIds(operIds));
+    }
+
+    @Log(title = "鎿嶄綔鏃ュ織", businessType = BusinessType.CLEAN)
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
+    @DeleteMapping("/clean")
+    public AjaxResult clean()
+    {
+        operLogService.cleanOperLog();
+        return AjaxResult.success();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysUserOnlineController.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysUserOnlineController.java
new file mode 100644
index 0000000..bf1df7d
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/controller/SysUserOnlineController.java
@@ -0,0 +1,100 @@
+package com.dingzhuo.energy.project.monitor.controller;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.redis.RedisCache;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.redis.RedisCache;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.monitor.domain.SysUserOnline;
+import com.dingzhuo.energy.project.system.service.ISysUserOnlineService;
+
+/**
+ * 鍦ㄧ嚎鐢ㄦ埛鐩戞帶
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/monitor/online")
+public class SysUserOnlineController extends BaseController
+{
+    @Autowired
+    private ISysUserOnlineService userOnlineService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(String ipaddr, String userName)
+    {
+        Collection<String> keys = redisCache.keys(Constants.LOGIN_TOKEN_KEY + "*");
+        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
+        for (String key : keys)
+        {
+            LoginUser user = redisCache.getCacheObject(key);
+            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
+            {
+                if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
+                {
+                    userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
+                }
+            }
+            else if (StringUtils.isNotEmpty(ipaddr))
+            {
+                if (StringUtils.equals(ipaddr, user.getIpaddr()))
+                {
+                    userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
+                }
+            }
+            else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
+            {
+                if (StringUtils.equals(userName, user.getUsername()))
+                {
+                    userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
+                }
+            }
+            else
+            {
+                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
+            }
+        }
+        Collections.reverse(userOnlineList);
+        userOnlineList.removeAll(Collections.singleton(null));
+        return getDataTable(userOnlineList);
+    }
+
+    /**
+     * 寮洪��鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
+    @Log(title = "鍦ㄧ嚎鐢ㄦ埛", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{tokenId}")
+    public AjaxResult forceLogout(@PathVariable String tokenId)
+    {
+        redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId);
+        return AjaxResult.success();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysLogininfor.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysLogininfor.java
new file mode 100644
index 0000000..78f1004
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysLogininfor.java
@@ -0,0 +1,145 @@
+package com.dingzhuo.energy.project.monitor.domain;
+
+import java.util.Date;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 绯荤粺璁块棶璁板綍琛� sys_logininfor
+ * 
+ * @author ruoyi
+ */
+public class SysLogininfor extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** ID */
+    @Excel(name = "搴忓彿", cellType = Excel.ColumnType.NUMERIC)
+    private Long infoId;
+
+    /** 鐢ㄦ埛璐﹀彿 */
+    @Excel(name = "鐢ㄦ埛璐﹀彿")
+    private String userName;
+
+    /** 鐧诲綍鐘舵�� 0鎴愬姛 1澶辫触 */
+    @Excel(name = "鐧诲綍鐘舵��", readConverterExp = "0=鎴愬姛,1=澶辫触")
+    private String status;
+
+    /** 鐧诲綍IP鍦板潃 */
+    @Excel(name = "鐧诲綍鍦板潃")
+    private String ipaddr;
+
+    /** 鐧诲綍鍦扮偣 */
+    @Excel(name = "鐧诲綍鍦扮偣")
+    private String loginLocation;
+
+    /** 娴忚鍣ㄧ被鍨� */
+    @Excel(name = "娴忚鍣�")
+    private String browser;
+
+    /** 鎿嶄綔绯荤粺 */
+    @Excel(name = "鎿嶄綔绯荤粺")
+    private String os;
+
+    /** 鎻愮ず娑堟伅 */
+    @Excel(name = "鎻愮ず娑堟伅")
+    private String msg;
+
+    /** 璁块棶鏃堕棿 */
+    @Excel(name = "璁块棶鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date loginTime;
+
+    public Long getInfoId()
+    {
+        return infoId;
+    }
+
+    public void setInfoId(Long infoId)
+    {
+        this.infoId = infoId;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getIpaddr()
+    {
+        return ipaddr;
+    }
+
+    public void setIpaddr(String ipaddr)
+    {
+        this.ipaddr = ipaddr;
+    }
+
+    public String getLoginLocation()
+    {
+        return loginLocation;
+    }
+
+    public void setLoginLocation(String loginLocation)
+    {
+        this.loginLocation = loginLocation;
+    }
+
+    public String getBrowser()
+    {
+        return browser;
+    }
+
+    public void setBrowser(String browser)
+    {
+        this.browser = browser;
+    }
+
+    public String getOs()
+    {
+        return os;
+    }
+
+    public void setOs(String os)
+    {
+        this.os = os;
+    }
+
+    public String getMsg()
+    {
+        return msg;
+    }
+
+    public void setMsg(String msg)
+    {
+        this.msg = msg;
+    }
+
+    public Date getLoginTime()
+    {
+        return loginTime;
+    }
+
+    public void setLoginTime(Date loginTime)
+    {
+        this.loginTime = loginTime;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysOperLog.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysOperLog.java
new file mode 100644
index 0000000..df41daa
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysOperLog.java
@@ -0,0 +1,256 @@
+package com.dingzhuo.energy.project.monitor.domain;
+
+import java.util.Date;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鎿嶄綔鏃ュ織璁板綍琛� oper_log
+ * 
+ * @author ruoyi
+ */
+public class SysOperLog extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鏃ュ織涓婚敭 */
+    @Excel(name = "鎿嶄綔搴忓彿", cellType = Excel.ColumnType.NUMERIC)
+    private Long operId;
+
+    /** 鎿嶄綔妯″潡 */
+    @Excel(name = "鎿嶄綔妯″潡")
+    private String title;
+
+    /** 涓氬姟绫诲瀷锛�0鍏跺畠 1鏂板 2淇敼 3鍒犻櫎锛� */
+    @Excel(name = "涓氬姟绫诲瀷", readConverterExp = "0=鍏跺畠,1=鏂板,2=淇敼,3=鍒犻櫎,4=鎺堟潈,5=瀵煎嚭,6=瀵煎叆,7=寮洪��,8=鐢熸垚浠g爜,9=娓呯┖鏁版嵁")
+    private Integer businessType;
+
+    /** 涓氬姟绫诲瀷鏁扮粍 */
+    private Integer[] businessTypes;
+
+    /** 璇锋眰鏂规硶 */
+    @Excel(name = "璇锋眰鏂规硶")
+    private String method;
+
+    /** 璇锋眰鏂瑰紡 */
+    @Excel(name = "璇锋眰鏂瑰紡")
+    private String requestMethod;
+
+    /** 鎿嶄綔绫诲埆锛�0鍏跺畠 1鍚庡彴鐢ㄦ埛 2鎵嬫満绔敤鎴凤級 */
+    @Excel(name = "鎿嶄綔绫诲埆", readConverterExp = "0=鍏跺畠,1=鍚庡彴鐢ㄦ埛,2=鎵嬫満绔敤鎴�")
+    private Integer operatorType;
+
+    /** 鎿嶄綔浜哄憳 */
+    @Excel(name = "鎿嶄綔浜哄憳")
+    private String operName;
+
+    /** 閮ㄩ棬鍚嶇О */
+    @Excel(name = "閮ㄩ棬鍚嶇О")
+    private String deptName;
+
+    /** 璇锋眰url */
+    @Excel(name = "璇锋眰鍦板潃")
+    private String operUrl;
+
+    /** 鎿嶄綔鍦板潃 */
+    @Excel(name = "鎿嶄綔鍦板潃")
+    private String operIp;
+
+    /** 鎿嶄綔鍦扮偣 */
+    @Excel(name = "鎿嶄綔鍦扮偣")
+    private String operLocation;
+
+    /** 璇锋眰鍙傛暟 */
+    @Excel(name = "璇锋眰鍙傛暟")
+    private String operParam;
+
+    /** 杩斿洖鍙傛暟 */
+    @Excel(name = "杩斿洖鍙傛暟")
+    private String jsonResult;
+
+    /** 鎿嶄綔鐘舵�侊紙0姝e父 1寮傚父锛� */
+    @Excel(name = "鐘舵��", readConverterExp = "0=姝e父,1=寮傚父")
+    private Integer status;
+
+    /** 閿欒娑堟伅 */
+    @Excel(name = "閿欒娑堟伅")
+    private String errorMsg;
+
+    /** 鎿嶄綔鏃堕棿 */
+    @Excel(name = "鎿嶄綔鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date operTime;
+
+    public Long getOperId()
+    {
+        return operId;
+    }
+
+    public void setOperId(Long operId)
+    {
+        this.operId = operId;
+    }
+
+    public String getTitle()
+    {
+        return title;
+    }
+
+    public void setTitle(String title)
+    {
+        this.title = title;
+    }
+
+    public Integer getBusinessType()
+    {
+        return businessType;
+    }
+
+    public void setBusinessType(Integer businessType)
+    {
+        this.businessType = businessType;
+    }
+
+    public Integer[] getBusinessTypes()
+    {
+        return businessTypes;
+    }
+
+    public void setBusinessTypes(Integer[] businessTypes)
+    {
+        this.businessTypes = businessTypes;
+    }
+
+    public String getMethod()
+    {
+        return method;
+    }
+
+    public void setMethod(String method)
+    {
+        this.method = method;
+    }
+
+    public String getRequestMethod()
+    {
+        return requestMethod;
+    }
+
+    public void setRequestMethod(String requestMethod)
+    {
+        this.requestMethod = requestMethod;
+    }
+
+    public Integer getOperatorType()
+    {
+        return operatorType;
+    }
+
+    public void setOperatorType(Integer operatorType)
+    {
+        this.operatorType = operatorType;
+    }
+
+    public String getOperName()
+    {
+        return operName;
+    }
+
+    public void setOperName(String operName)
+    {
+        this.operName = operName;
+    }
+
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
+
+    public String getOperUrl()
+    {
+        return operUrl;
+    }
+
+    public void setOperUrl(String operUrl)
+    {
+        this.operUrl = operUrl;
+    }
+
+    public String getOperIp()
+    {
+        return operIp;
+    }
+
+    public void setOperIp(String operIp)
+    {
+        this.operIp = operIp;
+    }
+
+    public String getOperLocation()
+    {
+        return operLocation;
+    }
+
+    public void setOperLocation(String operLocation)
+    {
+        this.operLocation = operLocation;
+    }
+
+    public String getOperParam()
+    {
+        return operParam;
+    }
+
+    public void setOperParam(String operParam)
+    {
+        this.operParam = operParam;
+    }
+
+    public String getJsonResult()
+    {
+        return jsonResult;
+    }
+
+    public void setJsonResult(String jsonResult)
+    {
+        this.jsonResult = jsonResult;
+    }
+
+    public Integer getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(Integer status)
+    {
+        this.status = status;
+    }
+
+    public String getErrorMsg()
+    {
+        return errorMsg;
+    }
+
+    public void setErrorMsg(String errorMsg)
+    {
+        this.errorMsg = errorMsg;
+    }
+
+    public Date getOperTime()
+    {
+        return operTime;
+    }
+
+    public void setOperTime(Date operTime)
+    {
+        this.operTime = operTime;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysUserOnline.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysUserOnline.java
new file mode 100644
index 0000000..96fb66a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/domain/SysUserOnline.java
@@ -0,0 +1,113 @@
+package com.dingzhuo.energy.project.monitor.domain;
+
+/**
+ * 褰撳墠鍦ㄧ嚎浼氳瘽
+ * 
+ * @author ruoyi
+ */
+public class SysUserOnline
+{
+    /** 浼氳瘽缂栧彿 */
+    private String tokenId;
+
+    /** 閮ㄩ棬鍚嶇О */
+    private String deptName;
+
+    /** 鐢ㄦ埛鍚嶇О */
+    private String userName;
+
+    /** 鐧诲綍IP鍦板潃 */
+    private String ipaddr;
+
+    /** 鐧诲綍鍦板潃 */
+    private String loginLocation;
+
+    /** 娴忚鍣ㄧ被鍨� */
+    private String browser;
+
+    /** 鎿嶄綔绯荤粺 */
+    private String os;
+
+    /** 鐧诲綍鏃堕棿 */
+    private Long loginTime;
+
+    public String getTokenId()
+    {
+        return tokenId;
+    }
+
+    public void setTokenId(String tokenId)
+    {
+        this.tokenId = tokenId;
+    }
+
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
+
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    public String getIpaddr()
+    {
+        return ipaddr;
+    }
+
+    public void setIpaddr(String ipaddr)
+    {
+        this.ipaddr = ipaddr;
+    }
+
+    public String getLoginLocation()
+    {
+        return loginLocation;
+    }
+
+    public void setLoginLocation(String loginLocation)
+    {
+        this.loginLocation = loginLocation;
+    }
+
+    public String getBrowser()
+    {
+        return browser;
+    }
+
+    public void setBrowser(String browser)
+    {
+        this.browser = browser;
+    }
+
+    public String getOs()
+    {
+        return os;
+    }
+
+    public void setOs(String os)
+    {
+        this.os = os;
+    }
+
+    public Long getLoginTime()
+    {
+        return loginTime;
+    }
+
+    public void setLoginTime(Long loginTime)
+    {
+        this.loginTime = loginTime;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysLogininforMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysLogininforMapper.java
new file mode 100644
index 0000000..67129be
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysLogininforMapper.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.project.monitor.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.monitor.domain.SysLogininfor;
+
+/**
+ * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysLogininforMapper
+{
+    /**
+     * 鏂板绯荤粺鐧诲綍鏃ュ織
+     * 
+     * @param logininfor 璁块棶鏃ュ織瀵硅薄
+     */
+    void insertLogininfor(SysLogininfor logininfor);
+
+    /**
+     * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎
+     * 
+     * @param logininfor 璁块棶鏃ュ織瀵硅薄
+     * @return 鐧诲綍璁板綍闆嗗悎
+     */
+    List<SysLogininfor> selectLogininforList(SysLogininfor logininfor);
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織
+     * 
+     * @param infoIds 闇�瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID
+     * @return 缁撴灉
+     */
+    int deleteLogininforByIds(Long[] infoIds);
+
+    /**
+     * 娓呯┖绯荤粺鐧诲綍鏃ュ織
+     * 
+     * @return 缁撴灉
+     */
+    int cleanLogininfor();
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysOperLogMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysOperLogMapper.java
new file mode 100644
index 0000000..a9032af
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/mapper/SysOperLogMapper.java
@@ -0,0 +1,50 @@
+package com.dingzhuo.energy.project.monitor.mapper;
+
+import java.util.List;
+
+import com.dingzhuo.energy.project.monitor.domain.SysOperLog;
+import com.dingzhuo.energy.project.monitor.domain.SysOperLog;
+
+/**
+ * 鎿嶄綔鏃ュ織 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysOperLogMapper
+{
+    /**
+     * 鏂板鎿嶄綔鏃ュ織
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織瀵硅薄
+     */
+    void insertOperlog(SysOperLog operLog);
+
+    /**
+     * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織瀵硅薄
+     * @return 鎿嶄綔鏃ュ織闆嗗悎
+     */
+    List<SysOperLog> selectOperLogList(SysOperLog operLog);
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織
+     * 
+     * @param operIds 闇�瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID
+     * @return 缁撴灉
+     */
+    int deleteOperLogByIds(Long[] operIds);
+
+    /**
+     * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏
+     * 
+     * @param operId 鎿嶄綔ID
+     * @return 鎿嶄綔鏃ュ織瀵硅薄
+     */
+    SysOperLog selectOperLogById(Long operId);
+
+    /**
+     * 娓呯┖鎿嶄綔鏃ュ織
+     */
+    void cleanOperLog();
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysLogininforService.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysLogininforService.java
new file mode 100644
index 0000000..53a7504
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysLogininforService.java
@@ -0,0 +1,40 @@
+package com.dingzhuo.energy.project.monitor.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.monitor.domain.SysLogininfor;
+
+/**
+ * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysLogininforService
+{
+    /**
+     * 鏂板绯荤粺鐧诲綍鏃ュ織
+     * 
+     * @param logininfor 璁块棶鏃ュ織瀵硅薄
+     */
+    void insertLogininfor(SysLogininfor logininfor);
+
+    /**
+     * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎
+     * 
+     * @param logininfor 璁块棶鏃ュ織瀵硅薄
+     * @return 鐧诲綍璁板綍闆嗗悎
+     */
+    List<SysLogininfor> selectLogininforList(SysLogininfor logininfor);
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織
+     * 
+     * @param infoIds 闇�瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID
+     * @return
+     */
+    int deleteLogininforByIds(Long[] infoIds);
+
+    /**
+     * 娓呯┖绯荤粺鐧诲綍鏃ュ織
+     */
+    void cleanLogininfor();
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysOperLogService.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysOperLogService.java
new file mode 100644
index 0000000..fc3be4a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/ISysOperLogService.java
@@ -0,0 +1,48 @@
+package com.dingzhuo.energy.project.monitor.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.monitor.domain.SysOperLog;
+
+/**
+ * 鎿嶄綔鏃ュ織 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysOperLogService
+{
+    /**
+     * 鏂板鎿嶄綔鏃ュ織
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織瀵硅薄
+     */
+    void insertOperlog(SysOperLog operLog);
+
+    /**
+     * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織瀵硅薄
+     * @return 鎿嶄綔鏃ュ織闆嗗悎
+     */
+    List<SysOperLog> selectOperLogList(SysOperLog operLog);
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織
+     * 
+     * @param operIds 闇�瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID
+     * @return 缁撴灉
+     */
+    int deleteOperLogByIds(Long[] operIds);
+
+    /**
+     * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏
+     * 
+     * @param operId 鎿嶄綔ID
+     * @return 鎿嶄綔鏃ュ織瀵硅薄
+     */
+    SysOperLog selectOperLogById(Long operId);
+
+    /**
+     * 娓呯┖鎿嶄綔鏃ュ織
+     */
+    void cleanOperLog();
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysLogininforServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysLogininforServiceImpl.java
new file mode 100644
index 0000000..8ebf6ae
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysLogininforServiceImpl.java
@@ -0,0 +1,65 @@
+package com.dingzhuo.energy.project.monitor.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.monitor.domain.SysLogininfor;
+import com.dingzhuo.energy.project.monitor.mapper.SysLogininforMapper;
+import com.dingzhuo.energy.project.monitor.service.ISysLogininforService;
+
+/**
+ * 绯荤粺璁块棶鏃ュ織鎯呭喌淇℃伅 鏈嶅姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysLogininforServiceImpl implements ISysLogininforService
+{
+
+    @Autowired
+    private SysLogininforMapper logininforMapper;
+
+    /**
+     * 鏂板绯荤粺鐧诲綍鏃ュ織
+     * 
+     * @param logininfor 璁块棶鏃ュ織瀵硅薄
+     */
+    @Override
+    public void insertLogininfor(SysLogininfor logininfor)
+    {
+        logininforMapper.insertLogininfor(logininfor);
+    }
+
+    /**
+     * 鏌ヨ绯荤粺鐧诲綍鏃ュ織闆嗗悎
+     * 
+     * @param logininfor 璁块棶鏃ュ織瀵硅薄
+     * @return 鐧诲綍璁板綍闆嗗悎
+     */
+    @Override
+    public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor)
+    {
+        return logininforMapper.selectLogininforList(logininfor);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鐧诲綍鏃ュ織
+     * 
+     * @param infoIds 闇�瑕佸垹闄ょ殑鐧诲綍鏃ュ織ID
+     * @return
+     */
+    @Override
+    public int deleteLogininforByIds(Long[] infoIds)
+    {
+        return logininforMapper.deleteLogininforByIds(infoIds);
+    }
+
+    /**
+     * 娓呯┖绯荤粺鐧诲綍鏃ュ織
+     */
+    @Override
+    public void cleanLogininfor()
+    {
+        logininforMapper.cleanLogininfor();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysOperLogServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysOperLogServiceImpl.java
new file mode 100644
index 0000000..8365dd4
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/monitor/service/impl/SysOperLogServiceImpl.java
@@ -0,0 +1,75 @@
+package com.dingzhuo.energy.project.monitor.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.monitor.domain.SysOperLog;
+import com.dingzhuo.energy.project.monitor.mapper.SysOperLogMapper;
+import com.dingzhuo.energy.project.monitor.service.ISysOperLogService;
+
+/**
+ * 鎿嶄綔鏃ュ織 鏈嶅姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysOperLogServiceImpl implements ISysOperLogService
+{
+    @Autowired
+    private SysOperLogMapper operLogMapper;
+
+    /**
+     * 鏂板鎿嶄綔鏃ュ織
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織瀵硅薄
+     */
+    @Override
+    public void insertOperlog(SysOperLog operLog)
+    {
+        operLogMapper.insertOperlog(operLog);
+    }
+
+    /**
+     * 鏌ヨ绯荤粺鎿嶄綔鏃ュ織闆嗗悎
+     * 
+     * @param operLog 鎿嶄綔鏃ュ織瀵硅薄
+     * @return 鎿嶄綔鏃ュ織闆嗗悎
+     */
+    @Override
+    public List<SysOperLog> selectOperLogList(SysOperLog operLog)
+    {
+        return operLogMapper.selectOperLogList(operLog);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鎿嶄綔鏃ュ織
+     * 
+     * @param operIds 闇�瑕佸垹闄ょ殑鎿嶄綔鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteOperLogByIds(Long[] operIds)
+    {
+        return operLogMapper.deleteOperLogByIds(operIds);
+    }
+
+    /**
+     * 鏌ヨ鎿嶄綔鏃ュ織璇︾粏
+     * 
+     * @param operId 鎿嶄綔ID
+     * @return 鎿嶄綔鏃ュ織瀵硅薄
+     */
+    @Override
+    public SysOperLog selectOperLogById(Long operId)
+    {
+        return operLogMapper.selectOperLogById(operId);
+    }
+
+    /**
+     * 娓呯┖鎿嶄綔鏃ュ織
+     */
+    @Override
+    public void cleanOperLog()
+    {
+        operLogMapper.cleanOperLog();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysConfigController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysConfigController.java
new file mode 100644
index 0000000..acc02a9
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysConfigController.java
@@ -0,0 +1,127 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysConfig;
+import com.dingzhuo.energy.project.system.service.ISysConfigService;
+
+/**
+ * 鍙傛暟閰嶇疆 淇℃伅鎿嶄綔澶勭悊
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/config")
+public class SysConfigController extends BaseController
+{
+    @Autowired
+    private ISysConfigService configService;
+
+    /**
+     * 鑾峰彇鍙傛暟閰嶇疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysConfig config)
+    {
+        startPage();
+        List<SysConfig> list = configService.selectConfigList(config);
+        return getDataTable(list);
+    }
+
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:config:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysConfig config)
+    {
+        List<SysConfig> list = configService.selectConfigList(config);
+        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
+        return util.exportExcel(list, "鍙傛暟鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:query')")
+    @GetMapping(value = "/{configId}")
+    public AjaxResult getInfo(@PathVariable Long configId)
+    {
+        return AjaxResult.success(configService.selectConfigById(configId));
+    }
+
+    /**
+     * 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊�
+     */
+    @GetMapping(value = "/configKey/{configKey}")
+    public AjaxResult getConfigKey(@PathVariable String configKey)
+    {
+        return AjaxResult.success(configService.selectConfigByKey(configKey));
+    }
+
+    /**
+     * 鏂板鍙傛暟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysConfig config)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
+        {
+            return AjaxResult.error("鏂板鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪");
+        }
+        config.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(configService.insertConfig(config));
+    }
+
+    /**
+     * 淇敼鍙傛暟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:edit')")
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysConfig config)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config)))
+        {
+            return AjaxResult.error("淇敼鍙傛暟'" + config.getConfigName() + "'澶辫触锛屽弬鏁伴敭鍚嶅凡瀛樺湪");
+        }
+        config.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(configService.updateConfig(config));
+    }
+
+    /**
+     * 鍒犻櫎鍙傛暟閰嶇疆
+     */
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
+    @Log(title = "鍙傛暟绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{configIds}")
+    public AjaxResult remove(@PathVariable Long[] configIds)
+    {
+        return toAjax(configService.deleteConfigByIds(configIds));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDeptController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDeptController.java
new file mode 100644
index 0000000..da65418
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDeptController.java
@@ -0,0 +1,135 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+import com.dingzhuo.energy.project.system.service.ISysDeptService;
+
+/**
+ * 閮ㄩ棬淇℃伅
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/dept")
+public class SysDeptController extends BaseController
+{
+    @Autowired
+    private ISysDeptService deptService;
+
+    /**
+     * 鑾峰彇閮ㄩ棬鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
+    @GetMapping("/list")
+    public AjaxResult list(SysDept dept)
+    {
+        List<SysDept> depts = deptService.selectDeptList(dept);
+        return AjaxResult.success(deptService.buildDeptTree(depts));
+    }
+
+    /**
+     * 鏍规嵁閮ㄩ棬缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:query')")
+    @GetMapping(value = "/{deptId}")
+    public AjaxResult getInfo(@PathVariable Long deptId)
+    {
+        return AjaxResult.success(deptService.selectDeptById(deptId));
+    }
+
+    /**
+     * 鑾峰彇閮ㄩ棬涓嬫媺鏍戝垪琛�
+     */
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(SysDept dept)
+    {
+        List<SysDept> depts = deptService.selectDeptList(dept);
+        return AjaxResult.success(deptService.buildDeptTreeSelect(depts));
+    }
+
+    /**
+     * 鍔犺浇瀵瑰簲瑙掕壊閮ㄩ棬鍒楄〃鏍�
+     */
+    @GetMapping(value = "/roleDeptTreeselect/{roleId}")
+    public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId)
+    {
+        return AjaxResult.success(deptService.selectDeptListByRoleId(roleId));
+    }
+
+    /**
+     * 鏂板閮ㄩ棬
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:add')")
+    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysDept dept)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
+        {
+            return AjaxResult.error("鏂板閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
+        }
+        dept.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(deptService.insertDept(dept));
+    }
+
+    /**
+     * 淇敼閮ㄩ棬
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
+    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysDept dept)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept)))
+        {
+            return AjaxResult.error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛岄儴闂ㄥ悕绉板凡瀛樺湪");
+        }
+        else if (dept.getParentId().equals(dept.getDeptId()))
+        {
+            return AjaxResult.error("淇敼閮ㄩ棬'" + dept.getDeptName() + "'澶辫触锛屼笂绾ч儴闂ㄤ笉鑳芥槸鑷繁");
+        }
+        dept.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(deptService.updateDept(dept));
+    }
+
+    /**
+     * 鍒犻櫎閮ㄩ棬
+     */
+    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
+    @Log(title = "閮ㄩ棬绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{deptId}")
+    public AjaxResult remove(@PathVariable Long deptId)
+    {
+        if (deptService.hasChildByDeptId(deptId))
+        {
+            return AjaxResult.error("瀛樺湪涓嬬骇閮ㄩ棬,涓嶅厑璁稿垹闄�");
+        }
+        if (deptService.checkDeptExistUser(deptId))
+        {
+            return AjaxResult.error("閮ㄩ棬瀛樺湪鐢ㄦ埛,涓嶅厑璁稿垹闄�");
+        }
+        return toAjax(deptService.deleteDeptById(deptId));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictDataController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictDataController.java
new file mode 100644
index 0000000..692995e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictDataController.java
@@ -0,0 +1,115 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.service.ISysDictDataService;
+
+/**
+ * 鏁版嵁瀛楀吀淇℃伅
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/dict/data")
+public class SysDictDataController extends BaseController
+{
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysDictData dictData)
+    {
+        startPage();
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        return getDataTable(list);
+    }
+
+    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysDictData dictData)
+    {
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
+        return util.exportExcel(list, "瀛楀吀鏁版嵁");
+    }
+
+    /**
+     * 鏌ヨ瀛楀吀鏁版嵁璇︾粏
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictCode}")
+    public AjaxResult getInfo(@PathVariable Long dictCode)
+    {
+        return AjaxResult.success(dictDataService.selectDictDataById(dictCode));
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
+     */
+    @GetMapping(value = "/dictType/{dictType}")
+    public AjaxResult dictType(@PathVariable String dictType)
+    {
+        return AjaxResult.success(dictDataService.selectDictDataByType(dictType));
+    }
+
+    /**
+     * 鏂板瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysDictData dict)
+    {
+        dict.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(dictDataService.insertDictData(dict));
+    }
+
+    /**
+     * 淇敼淇濆瓨瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "瀛楀吀鏁版嵁", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysDictData dict)
+    {
+        dict.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(dictDataService.updateDictData(dict));
+    }
+
+    /**
+     * 鍒犻櫎瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{dictCodes}")
+    public AjaxResult remove(@PathVariable Long[] dictCodes)
+    {
+        return toAjax(dictDataService.deleteDictDataByIds(dictCodes));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictTypeController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictTypeController.java
new file mode 100644
index 0000000..3179bc0
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysDictTypeController.java
@@ -0,0 +1,125 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysDictType;
+import com.dingzhuo.energy.project.system.service.ISysDictTypeService;
+
+/**
+ * 鏁版嵁瀛楀吀淇℃伅
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/dict/type")
+public class SysDictTypeController extends BaseController
+{
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysDictType dictType)
+    {
+        startPage();
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        return getDataTable(list);
+    }
+
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysDictType dictType)
+    {
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
+        return util.exportExcel(list, "瀛楀吀绫诲瀷");
+    }
+
+    /**
+     * 鏌ヨ瀛楀吀绫诲瀷璇︾粏
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictId}")
+    public AjaxResult getInfo(@PathVariable Long dictId)
+    {
+        return AjaxResult.success(dictTypeService.selectDictTypeById(dictId));
+    }
+
+    /**
+     * 鏂板瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysDictType dict)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
+        {
+            return AjaxResult.error("鏂板瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪");
+        }
+        dict.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(dictTypeService.insertDictType(dict));
+    }
+
+    /**
+     * 淇敼瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysDictType dict)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict)))
+        {
+            return AjaxResult.error("淇敼瀛楀吀'" + dict.getDictName() + "'澶辫触锛屽瓧鍏哥被鍨嬪凡瀛樺湪");
+        }
+        dict.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(dictTypeService.updateDictType(dict));
+    }
+
+    /**
+     * 鍒犻櫎瀛楀吀绫诲瀷
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @Log(title = "瀛楀吀绫诲瀷", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{dictIds}")
+    public AjaxResult remove(@PathVariable Long[] dictIds)
+    {
+        return toAjax(dictTypeService.deleteDictTypeByIds(dictIds));
+    }
+
+    /**
+     * 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛�
+     */
+    @GetMapping("/optionselect")
+    public AjaxResult optionselect()
+    {
+        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
+        return AjaxResult.success(dictTypes);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysLoginController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysLoginController.java
new file mode 100644
index 0000000..3c8029c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysLoginController.java
@@ -0,0 +1,100 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+import java.util.Set;
+
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.SysLoginService;
+import com.dingzhuo.energy.framework.security.service.SysPermissionService;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.SysLoginService;
+import com.dingzhuo.energy.framework.security.service.SysPermissionService;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.system.domain.SysMenu;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import com.dingzhuo.energy.project.system.service.ISysMenuService;
+
+/**
+ * 鐧诲綍楠岃瘉
+ * 
+ * @author ruoyi
+ */
+@RestController
+public class SysLoginController
+{
+    @Autowired
+    private SysLoginService loginService;
+
+    @Autowired
+    private ISysMenuService menuService;
+
+    @Autowired
+    private SysPermissionService permissionService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 鐧诲綍鏂规硶
+     * 
+     * @param username 鐢ㄦ埛鍚�
+     * @param password 瀵嗙爜
+     * @param captcha 楠岃瘉鐮�
+     * @param uuid 鍞竴鏍囪瘑
+     * @return 缁撴灉
+     */
+    @PostMapping("/login")
+    public AjaxResult login(String username, String password, String code, String uuid)
+    {
+        AjaxResult ajax = AjaxResult.success();
+        // 鐢熸垚浠ょ墝
+        String token = loginService.login(username, password, code, uuid);
+        ajax.put(Constants.TOKEN, token);
+        return ajax;
+    }
+
+    /**
+     * 鑾峰彇鐢ㄦ埛淇℃伅
+     * 
+     * @return 鐢ㄦ埛淇℃伅
+     */
+    @GetMapping("getInfo")
+    public AjaxResult getInfo()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        SysUser user = loginUser.getUser();
+        // 瑙掕壊闆嗗悎
+        Set<String> roles = permissionService.getRolePermission(user);
+        // 鏉冮檺闆嗗悎
+        Set<String> permissions = permissionService.getMenuPermission(user);
+        AjaxResult ajax = AjaxResult.success();
+        ajax.put("user", user);
+        ajax.put("roles", roles);
+        ajax.put("permissions", permissions);
+        return ajax;
+    }
+
+    /**
+     * 鑾峰彇璺敱淇℃伅
+     * 
+     * @return 璺敱淇℃伅
+     */
+    @GetMapping("getRouters")
+    public AjaxResult getRouters()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        // 鐢ㄦ埛淇℃伅
+        SysUser user = loginUser.getUser();
+        List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());
+        return AjaxResult.success(menuService.buildMenus(menus));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysMenuController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysMenuController.java
new file mode 100644
index 0000000..806e2c2
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysMenuController.java
@@ -0,0 +1,131 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.system.domain.SysMenu;
+import com.dingzhuo.energy.project.system.service.ISysMenuService;
+
+/**
+ * 鑿滃崟淇℃伅
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/menu")
+public class SysMenuController extends BaseController
+{
+    @Autowired
+    private ISysMenuService menuService;
+
+    /**
+     * 鑾峰彇鑿滃崟鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
+    @GetMapping("/list")
+    public AjaxResult list(SysMenu menu)
+    {
+        List<SysMenu> menus = menuService.selectMenuList(menu);
+        return AjaxResult.success(menuService.buildMenuTree(menus));
+    }
+
+    /**
+     * 鏍规嵁鑿滃崟缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:query')")
+    @GetMapping(value = "/{menuId}")
+    public AjaxResult getInfo(@PathVariable Long menuId)
+    {
+        return AjaxResult.success(menuService.selectMenuById(menuId));
+    }
+
+    /**
+     * 鑾峰彇鑿滃崟涓嬫媺鏍戝垪琛�
+     */
+    @GetMapping("/treeselect")
+    public AjaxResult treeselect(SysMenu dept)
+    {
+        List<SysMenu> menus = menuService.selectMenuList(dept);
+        return AjaxResult.success(menuService.buildMenuTreeSelect(menus));
+    }
+
+    /**
+     * 鍔犺浇瀵瑰簲瑙掕壊鑿滃崟鍒楄〃鏍�
+     */
+    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
+    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
+    {
+        return AjaxResult.success(menuService.selectMenuListByRoleId(roleId));
+    }
+
+    /**
+     * 鏂板鑿滃崟
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:add')")
+    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysMenu menu)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
+        {
+            return AjaxResult.error("鏂板鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪");
+        }
+        menu.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(menuService.insertMenu(menu));
+    }
+
+    /**
+     * 淇敼鑿滃崟
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
+    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysMenu menu)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
+        {
+            return AjaxResult.error("淇敼鑿滃崟'" + menu.getMenuName() + "'澶辫触锛岃彍鍗曞悕绉板凡瀛樺湪");
+        }
+        menu.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(menuService.updateMenu(menu));
+    }
+
+    /**
+     * 鍒犻櫎鑿滃崟
+     */
+    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
+    @Log(title = "鑿滃崟绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{menuId}")
+    public AjaxResult remove(@PathVariable("menuId") Long menuId)
+    {
+        if (menuService.hasChildByMenuId(menuId))
+        {
+            return AjaxResult.error("瀛樺湪瀛愯彍鍗�,涓嶅厑璁稿垹闄�");
+        }
+        if (menuService.checkMenuExistRole(menuId))
+        {
+            return AjaxResult.error("鑿滃崟宸插垎閰�,涓嶅厑璁稿垹闄�");
+        }
+        return toAjax(menuService.deleteMenuById(menuId));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysNoticeController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysNoticeController.java
new file mode 100644
index 0000000..85a7a94
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysNoticeController.java
@@ -0,0 +1,98 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysNotice;
+import com.dingzhuo.energy.project.system.service.ISysNoticeService;
+
+/**
+ * 鍏憡 淇℃伅鎿嶄綔澶勭悊
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/notice")
+public class SysNoticeController extends BaseController
+{
+    @Autowired
+    private ISysNoticeService noticeService;
+
+    /**
+     * 鑾峰彇閫氱煡鍏憡鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:notice:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysNotice notice)
+    {
+        startPage();
+        List<SysNotice> list = noticeService.selectNoticeList(notice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏍规嵁閫氱煡鍏憡缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:notice:query')")
+    @GetMapping(value = "/{noticeId}")
+    public AjaxResult getInfo(@PathVariable Long noticeId)
+    {
+        return AjaxResult.success(noticeService.selectNoticeById(noticeId));
+    }
+
+    /**
+     * 鏂板閫氱煡鍏憡
+     */
+    @PreAuthorize("@ss.hasPermi('system:notice:add')")
+    @Log(title = "閫氱煡鍏憡", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysNotice notice)
+    {
+        notice.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(noticeService.insertNotice(notice));
+    }
+
+    /**
+     * 淇敼閫氱煡鍏憡
+     */
+    @PreAuthorize("@ss.hasPermi('system:notice:edit')")
+    @Log(title = "閫氱煡鍏憡", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysNotice notice)
+    {
+        notice.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(noticeService.updateNotice(notice));
+    }
+
+    /**
+     * 鍒犻櫎閫氱煡鍏憡
+     */
+    @PreAuthorize("@ss.hasPermi('system:notice:remove')")
+    @Log(title = "閫氱煡鍏憡", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{noticeId}")
+    public AjaxResult remove(@PathVariable Long noticeId)
+    {
+        return toAjax(noticeService.deleteNoticeById(noticeId));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysPostController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysPostController.java
new file mode 100644
index 0000000..75d8b80
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysPostController.java
@@ -0,0 +1,136 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysPost;
+import com.dingzhuo.energy.project.system.service.ISysPostService;
+
+/**
+ * 宀椾綅淇℃伅鎿嶄綔澶勭悊
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/post")
+public class SysPostController extends BaseController
+{
+    @Autowired
+    private ISysPostService postService;
+
+    /**
+     * 鑾峰彇宀椾綅鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysPost post)
+    {
+        startPage();
+        List<SysPost> list = postService.selectPostList(post);
+        return getDataTable(list);
+    }
+    
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:config:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysPost post)
+    {
+        List<SysPost> list = postService.selectPostList(post);
+        ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
+        return util.exportExcel(list, "宀椾綅鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁宀椾綅缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:query')")
+    @GetMapping(value = "/{postId}")
+    public AjaxResult getInfo(@PathVariable Long postId)
+    {
+        return AjaxResult.success(postService.selectPostById(postId));
+    }
+
+    /**
+     * 鏂板宀椾綅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:add')")
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysPost post)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
+        {
+            return AjaxResult.error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
+        {
+            return AjaxResult.error("鏂板宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪");
+        }
+        post.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(postService.insertPost(post));
+    }
+
+    /**
+     * 淇敼宀椾綅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:edit')")
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysPost post)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post)))
+        {
+            return AjaxResult.error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶅悕绉板凡瀛樺湪");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post)))
+        {
+            return AjaxResult.error("淇敼宀椾綅'" + post.getPostName() + "'澶辫触锛屽矖浣嶇紪鐮佸凡瀛樺湪");
+        }
+        post.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(postService.updatePost(post));
+    }
+
+    /**
+     * 鍒犻櫎宀椾綅
+     */
+    @PreAuthorize("@ss.hasPermi('system:post:remove')")
+    @Log(title = "宀椾綅绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{postIds}")
+    public AjaxResult remove(@PathVariable Long[] postIds)
+    {
+        return toAjax(postService.deletePostByIds(postIds));
+    }
+
+    /**
+     * 鑾峰彇宀椾綅閫夋嫨妗嗗垪琛�
+     */
+    @GetMapping("/optionselect")
+    public AjaxResult optionselect()
+    {
+        List<SysPost> posts = postService.selectPostAll();
+        return AjaxResult.success(posts);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysProfileController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysProfileController.java
new file mode 100644
index 0000000..5ad6922
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysProfileController.java
@@ -0,0 +1,116 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.io.IOException;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import com.dingzhuo.energy.project.system.service.ISysUserService;
+
+/**
+ * 涓汉淇℃伅 涓氬姟澶勭悊
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/user/profile")
+public class SysProfileController extends BaseController
+{
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 涓汉淇℃伅
+     */
+    @GetMapping
+    public AjaxResult profile()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        SysUser user = loginUser.getUser();
+        AjaxResult ajax = AjaxResult.success(user);
+        ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
+        ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
+        return ajax;
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛
+     */
+    @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult updateProfile(@RequestBody SysUser user)
+    {
+        return toAjax(userService.updateUserProfile(user));
+    }
+
+    /**
+     * 閲嶇疆瀵嗙爜
+     */
+    @Log(title = "涓汉淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping("/updatePwd")
+    public AjaxResult updatePwd(String oldPassword, String newPassword)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String userName = loginUser.getUsername();
+        String password = loginUser.getPassword();
+        if (!SecurityUtils.matchesPassword(oldPassword, password))
+        {
+            return AjaxResult.error("淇敼瀵嗙爜澶辫触锛屾棫瀵嗙爜閿欒");
+        }
+        if (SecurityUtils.matchesPassword(newPassword, password))
+        {
+            return AjaxResult.error("鏂板瘑鐮佷笉鑳戒笌鏃у瘑鐮佺浉鍚�");
+        }
+        return toAjax(userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)));
+    }
+
+    /**
+     * 澶村儚涓婁紶
+     */
+    @Log(title = "鐢ㄦ埛澶村儚", businessType = BusinessType.UPDATE)
+    @PostMapping("/avatar")
+    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException
+    {
+        if (!file.isEmpty())
+        {
+            LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+            String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file);
+            if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
+            {
+                AjaxResult ajax = AjaxResult.success();
+                ajax.put("imgUrl", avatar);
+                loginUser.getUser().setAvatar(avatar);
+                tokenService.setLoginUser(loginUser);
+                return ajax;
+            }
+        }
+        return AjaxResult.error("涓婁紶鍥剧墖寮傚父锛岃鑱旂郴绠$悊鍛�");
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysRoleController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysRoleController.java
new file mode 100644
index 0000000..70f95db
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysRoleController.java
@@ -0,0 +1,160 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysRole;
+import com.dingzhuo.energy.project.system.service.ISysRoleService;
+
+/**
+ * 瑙掕壊淇℃伅
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/role")
+public class SysRoleController extends BaseController
+{
+    @Autowired
+    private ISysRoleService roleService;
+
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysRole role)
+    {
+        startPage();
+        List<SysRole> list = roleService.selectRoleList(role);
+        return getDataTable(list);
+    }
+
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:role:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysRole role)
+    {
+        List<SysRole> list = roleService.selectRoleList(role);
+        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
+        return util.exportExcel(list, "瑙掕壊鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁瑙掕壊缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping(value = "/{roleId}")
+    public AjaxResult getInfo(@PathVariable Long roleId)
+    {
+        return AjaxResult.success(roleService.selectRoleById(roleId));
+    }
+
+    /**
+     * 鏂板瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:add')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysRole role)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
+        {
+            return AjaxResult.error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
+        {
+            return AjaxResult.error("鏂板瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪");
+        }
+        role.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(roleService.insertRole(role));
+
+    }
+
+    /**
+     * 淇敼淇濆瓨瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
+        {
+            return AjaxResult.error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹插悕绉板凡瀛樺湪");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
+        {
+            return AjaxResult.error("淇敼瑙掕壊'" + role.getRoleName() + "'澶辫触锛岃鑹叉潈闄愬凡瀛樺湪");
+        }
+        role.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(roleService.updateRole(role));
+    }
+
+    /**
+     * 淇敼淇濆瓨鏁版嵁鏉冮檺
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/dataScope")
+    public AjaxResult dataScope(@RequestBody SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        return toAjax(roleService.authDataScope(role));
+    }
+
+    /**
+     * 鐘舵�佷慨鏀�
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public AjaxResult changeStatus(@RequestBody SysRole role)
+    {
+        roleService.checkRoleAllowed(role);
+        role.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(roleService.updateRoleStatus(role));
+    }
+
+    /**
+     * 鍒犻櫎瑙掕壊
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:remove')")
+    @Log(title = "瑙掕壊绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{roleIds}")
+    public AjaxResult remove(@PathVariable Long[] roleIds)
+    {
+        return toAjax(roleService.deleteRoleByIds(roleIds));
+    }
+
+    /**
+     * 鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
+    @GetMapping("/optionselect")
+    public AjaxResult optionselect()
+    {
+        return AjaxResult.success(roleService.selectRoleAll());
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysUserController.java b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysUserController.java
new file mode 100644
index 0000000..e83c4f3
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/controller/SysUserController.java
@@ -0,0 +1,206 @@
+package com.dingzhuo.energy.project.system.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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 org.springframework.web.multipart.MultipartFile;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import com.dingzhuo.energy.project.system.service.ISysPostService;
+import com.dingzhuo.energy.project.system.service.ISysRoleService;
+import com.dingzhuo.energy.project.system.service.ISysUserService;
+
+/**
+ * 鐢ㄦ埛淇℃伅
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/system/user")
+public class SysUserController extends BaseController
+{
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private ISysRoleService roleService;
+
+    @Autowired
+    private ISysPostService postService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysUser user)
+    {
+        startPage();
+        List<SysUser> list = userService.selectUserList(user);
+        return getDataTable(list);
+    }
+
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
+    @GetMapping("/export")
+    public AjaxResult export(SysUser user)
+    {
+        List<SysUser> list = userService.selectUserList(user);
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        return util.exportExcel(list, "鐢ㄦ埛鏁版嵁");
+    }
+
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('system:user:import')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
+    {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        List<SysUser> userList = util.importExcel(file.getInputStream());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String operName = loginUser.getUsername();
+        String message = userService.importUser(userList, updateSupport, operName);
+        return AjaxResult.success(message);
+    }
+
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate()
+    {
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
+        return util.importTemplateExcel("鐢ㄦ埛鏁版嵁");
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛缂栧彿鑾峰彇璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
+    @GetMapping(value = { "/", "/{userId}" })
+    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
+    {
+        AjaxResult ajax = AjaxResult.success();
+        ajax.put("roles", roleService.selectRoleAll());
+        ajax.put("posts", postService.selectPostAll());
+        if (StringUtils.isNotNull(userId))
+        {
+            ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId));
+            ajax.put("postIds", postService.selectPostListByUserId(userId));
+            ajax.put("roleIds", roleService.selectRoleListByUserId(userId));
+        }
+        return ajax;
+    }
+
+    /**
+     * 鏂板鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@Validated @RequestBody SysUser user)
+    {
+        if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName())))
+        {
+            return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岀櫥褰曡处鍙峰凡瀛樺湪");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
+        {
+            return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+        {
+            return AjaxResult.error("鏂板鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
+        }
+        user.setCreateBy(SecurityUtils.getUsername());
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        return toAjax(userService.insertUser(user));
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@Validated @RequestBody SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
+        {
+            return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛屾墜鏈哄彿鐮佸凡瀛樺湪");
+        }
+        else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
+        {
+            return AjaxResult.error("淇敼鐢ㄦ埛'" + user.getUserName() + "'澶辫触锛岄偖绠辫处鍙峰凡瀛樺湪");
+        }
+        user.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(userService.updateUser(user));
+    }
+
+    /**
+     * 鍒犻櫎鐢ㄦ埛
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{userIds}")
+    public AjaxResult remove(@PathVariable Long[] userIds)
+    {
+        return toAjax(userService.deleteUserByIds(userIds));
+    }
+
+    /**
+     * 閲嶇疆瀵嗙爜
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/resetPwd")
+    public AjaxResult resetPwd(@RequestBody SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
+        user.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(userService.resetPwd(user));
+    }
+
+    /**
+     * 鐘舵�佷慨鏀�
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "鐢ㄦ埛绠$悊", businessType = BusinessType.UPDATE)
+    @PutMapping("/changeStatus")
+    public AjaxResult changeStatus(@RequestBody SysUser user)
+    {
+        userService.checkUserAllowed(user);
+        user.setUpdateBy(SecurityUtils.getUsername());
+        return toAjax(userService.updateUserStatus(user));
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysConfig.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysConfig.java
new file mode 100644
index 0000000..a6ec5c5
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysConfig.java
@@ -0,0 +1,114 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鍙傛暟閰嶇疆琛� sys_config
+ * 
+ * @author ruoyi
+ */
+public class SysConfig extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鍙傛暟涓婚敭 */
+    @Excel(name = "鍙傛暟涓婚敭", cellType = Excel.ColumnType.NUMERIC)
+    private Long configId;
+
+    /** 鍙傛暟鍚嶇О */
+    @Excel(name = "鍙傛暟鍚嶇О")
+    private String configName;
+
+    /** 鍙傛暟閿悕 */
+    @Excel(name = "鍙傛暟閿悕")
+    private String configKey;
+
+    /** 鍙傛暟閿�� */
+    @Excel(name = "鍙傛暟閿��")
+    private String configValue;
+
+    /** 绯荤粺鍐呯疆锛圷鏄� N鍚︼級 */
+    @Excel(name = "绯荤粺鍐呯疆", readConverterExp = "Y=鏄�,N=鍚�")
+    private String configType;
+
+    public Long getConfigId()
+    {
+        return configId;
+    }
+
+    public void setConfigId(Long configId)
+    {
+        this.configId = configId;
+    }
+
+    @NotBlank(message = "鍙傛暟鍚嶇О涓嶈兘涓虹┖")
+    @Size(min = 0, max = 100, message = "鍙傛暟鍚嶇О涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getConfigName()
+    {
+        return configName;
+    }
+
+    public void setConfigName(String configName)
+    {
+        this.configName = configName;
+    }
+
+    @NotBlank(message = "鍙傛暟閿悕闀垮害涓嶈兘涓虹┖")
+    @Size(min = 0, max = 100, message = "鍙傛暟閿悕闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getConfigKey()
+    {
+        return configKey;
+    }
+
+    public void setConfigKey(String configKey)
+    {
+        this.configKey = configKey;
+    }
+
+    @NotBlank(message = "鍙傛暟閿�间笉鑳戒负绌�")
+    @Size(min = 0, max = 500, message = "鍙傛暟閿�奸暱搴︿笉鑳借秴杩�500涓瓧绗�")
+    public String getConfigValue()
+    {
+        return configValue;
+    }
+
+    public void setConfigValue(String configValue)
+    {
+        this.configValue = configValue;
+    }
+
+    public String getConfigType()
+    {
+        return configType;
+    }
+
+    public void setConfigType(String configType)
+    {
+        this.configType = configType;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("configId", getConfigId())
+            .append("configName", getConfigName())
+            .append("configKey", getConfigKey())
+            .append("configValue", getConfigValue())
+            .append("configType", getConfigType())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDept.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDept.java
new file mode 100644
index 0000000..0c828c8
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDept.java
@@ -0,0 +1,205 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 閮ㄩ棬琛� sys_dept
+ * 
+ * @author ruoyi
+ */
+public class SysDept extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 閮ㄩ棬ID */
+    private Long deptId;
+
+    /** 鐖堕儴闂↖D */
+    private Long parentId;
+
+    /** 绁栫骇鍒楄〃 */
+    private String ancestors;
+
+    /** 閮ㄩ棬鍚嶇О */
+    private String deptName;
+
+    /** 鏄剧ず椤哄簭 */
+    private Integer orderNum;
+
+    /** 璐熻矗浜� */
+    private String leader;
+
+    /** 鑱旂郴鐢佃瘽 */
+    private String phone;
+
+    /** 閭 */
+    private String email;
+
+    /** 閮ㄩ棬鐘舵��:0姝e父,1鍋滅敤 */
+    private String status;
+
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    private String delFlag;
+
+    /** 鐖堕儴闂ㄥ悕绉� */
+    private String parentName;
+    
+    /** 瀛愰儴闂� */
+    private List<SysDept> children = new ArrayList<SysDept>();
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    public Long getParentId()
+    {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId)
+    {
+        this.parentId = parentId;
+    }
+
+    public String getAncestors()
+    {
+        return ancestors;
+    }
+
+    public void setAncestors(String ancestors)
+    {
+        this.ancestors = ancestors;
+    }
+
+    @NotBlank(message = "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖")
+    @Size(min = 0, max = 30, message = "閮ㄩ棬鍚嶇О闀垮害涓嶈兘瓒呰繃30涓瓧绗�")
+    public String getDeptName()
+    {
+        return deptName;
+    }
+
+    public void setDeptName(String deptName)
+    {
+        this.deptName = deptName;
+    }
+
+    @NotNull(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖")
+    public Integer getOrderNum()
+    {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum)
+    {
+        this.orderNum = orderNum;
+    }
+
+    public String getLeader()
+    {
+        return leader;
+    }
+
+    public void setLeader(String leader)
+    {
+        this.leader = leader;
+    }
+
+    @Size(min = 0, max = 11, message = "鑱旂郴鐢佃瘽闀垮害涓嶈兘瓒呰繃11涓瓧绗�")
+    public String getPhone()
+    {
+        return phone;
+    }
+
+    public void setPhone(String phone)
+    {
+        this.phone = phone;
+    }
+
+    @Email(message = "閭鏍煎紡涓嶆纭�")
+    @Size(min = 0, max = 50, message = "閭闀垮害涓嶈兘瓒呰繃50涓瓧绗�")
+    public String getEmail()
+    {
+        return email;
+    }
+
+    public void setEmail(String email)
+    {
+        this.email = email;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getParentName()
+    {
+        return parentName;
+    }
+
+    public void setParentName(String parentName)
+    {
+        this.parentName = parentName;
+    }
+
+    public List<SysDept> getChildren()
+    {
+        return children;
+    }
+
+    public void setChildren(List<SysDept> children)
+    {
+        this.children = children;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("deptId", getDeptId())
+            .append("parentId", getParentId())
+            .append("ancestors", getAncestors())
+            .append("deptName", getDeptName())
+            .append("orderNum", getOrderNum())
+            .append("leader", getLeader())
+            .append("phone", getPhone())
+            .append("email", getEmail())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictData.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictData.java
new file mode 100644
index 0000000..d5efb55
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictData.java
@@ -0,0 +1,179 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 瀛楀吀鏁版嵁琛� sys_dict_data
+ * 
+ * @author ruoyi
+ */
+public class SysDictData extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 瀛楀吀缂栫爜 */
+    @Excel(name = "瀛楀吀缂栫爜", cellType = Excel.ColumnType.NUMERIC)
+    private Long dictCode;
+
+    /** 瀛楀吀鎺掑簭 */
+    @Excel(name = "瀛楀吀鎺掑簭", cellType = Excel.ColumnType.NUMERIC)
+    private Long dictSort;
+
+    /** 瀛楀吀鏍囩 */
+    @Excel(name = "瀛楀吀鏍囩")
+    private String dictLabel;
+
+    /** 瀛楀吀閿�� */
+    @Excel(name = "瀛楀吀閿��")
+    private String dictValue;
+
+    /** 瀛楀吀绫诲瀷 */
+    @Excel(name = "瀛楀吀绫诲瀷")
+    private String dictType;
+
+    /** 鏍峰紡灞炴�э紙鍏朵粬鏍峰紡鎵╁睍锛� */
+    private String cssClass;
+
+    /** 琛ㄦ牸瀛楀吀鏍峰紡 */
+    private String listClass;
+
+    /** 鏄惁榛樿锛圷鏄� N鍚︼級 */
+    @Excel(name = "鏄惁榛樿", readConverterExp = "Y=鏄�,N=鍚�")
+    private String isDefault;
+
+    /** 鐘舵�侊紙0姝e父 1鍋滅敤锛� */
+    @Excel(name = "鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
+    private String status;
+
+    public Long getDictCode()
+    {
+        return dictCode;
+    }
+
+    public void setDictCode(Long dictCode)
+    {
+        this.dictCode = dictCode;
+    }
+
+    public Long getDictSort()
+    {
+        return dictSort;
+    }
+
+    public void setDictSort(Long dictSort)
+    {
+        this.dictSort = dictSort;
+    }
+
+    @NotBlank(message = "瀛楀吀鏍囩涓嶈兘涓虹┖")
+    @Size(min = 0, max = 100, message = "瀛楀吀鏍囩闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getDictLabel()
+    {
+        return dictLabel;
+    }
+
+    public void setDictLabel(String dictLabel)
+    {
+        this.dictLabel = dictLabel;
+    }
+
+    @NotBlank(message = "瀛楀吀閿�间笉鑳戒负绌�")
+    @Size(min = 0, max = 100, message = "瀛楀吀閿�奸暱搴︿笉鑳借秴杩�100涓瓧绗�")
+    public String getDictValue()
+    {
+        return dictValue;
+    }
+
+    public void setDictValue(String dictValue)
+    {
+        this.dictValue = dictValue;
+    }
+
+    @NotBlank(message = "瀛楀吀绫诲瀷涓嶈兘涓虹┖")
+    @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getDictType()
+    {
+        return dictType;
+    }
+
+    public void setDictType(String dictType)
+    {
+        this.dictType = dictType;
+    }
+
+    @Size(min = 0, max = 100, message = "鏍峰紡灞炴�ч暱搴︿笉鑳借秴杩�100涓瓧绗�")
+    public String getCssClass()
+    {
+        return cssClass;
+    }
+
+    public void setCssClass(String cssClass)
+    {
+        this.cssClass = cssClass;
+    }
+
+    public String getListClass()
+    {
+        return listClass;
+    }
+
+    public void setListClass(String listClass)
+    {
+        this.listClass = listClass;
+    }
+
+    public boolean getDefault()
+    {
+        return UserConstants.YES.equals(this.isDefault);
+    }
+
+    public String getIsDefault()
+    {
+        return isDefault;
+    }
+
+    public void setIsDefault(String isDefault)
+    {
+        this.isDefault = isDefault;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("dictCode", getDictCode())
+            .append("dictSort", getDictSort())
+            .append("dictLabel", getDictLabel())
+            .append("dictValue", getDictValue())
+            .append("dictType", getDictType())
+            .append("cssClass", getCssClass())
+            .append("listClass", getListClass())
+            .append("isDefault", getIsDefault())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictType.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictType.java
new file mode 100644
index 0000000..4ab7392
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysDictType.java
@@ -0,0 +1,97 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 瀛楀吀绫诲瀷琛� sys_dict_type
+ * 
+ * @author ruoyi
+ */
+public class SysDictType extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 瀛楀吀涓婚敭 */
+    @Excel(name = "瀛楀吀涓婚敭", cellType = Excel.ColumnType.NUMERIC)
+    private Long dictId;
+
+    /** 瀛楀吀鍚嶇О */
+    @Excel(name = "瀛楀吀鍚嶇О")
+    private String dictName;
+
+    /** 瀛楀吀绫诲瀷 */
+    @Excel(name = "瀛楀吀绫诲瀷")
+    private String dictType;
+
+    /** 鐘舵�侊紙0姝e父 1鍋滅敤锛� */
+    @Excel(name = "鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
+    private String status;
+
+    public Long getDictId()
+    {
+        return dictId;
+    }
+
+    public void setDictId(Long dictId)
+    {
+        this.dictId = dictId;
+    }
+
+    @NotBlank(message = "瀛楀吀鍚嶇О涓嶈兘涓虹┖")
+    @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷鍚嶇О闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getDictName()
+    {
+        return dictName;
+    }
+
+    public void setDictName(String dictName)
+    {
+        this.dictName = dictName;
+    }
+
+    @NotBlank(message = "瀛楀吀绫诲瀷涓嶈兘涓虹┖")
+    @Size(min = 0, max = 100, message = "瀛楀吀绫诲瀷绫诲瀷闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getDictType()
+    {
+        return dictType;
+    }
+
+    public void setDictType(String dictType)
+    {
+        this.dictType = dictType;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("dictId", getDictId())
+            .append("dictName", getDictName())
+            .append("dictType", getDictType())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysMenu.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysMenu.java
new file mode 100644
index 0000000..b27063d
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysMenu.java
@@ -0,0 +1,231 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鑿滃崟鏉冮檺琛� sys_menu
+ * 
+ * @author ruoyi
+ */
+public class SysMenu extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鑿滃崟ID */
+    private Long menuId;
+
+    /** 鑿滃崟鍚嶇О */
+    private String menuName;
+
+    /** 鐖惰彍鍗曞悕绉� */
+    private String parentName;
+
+    /** 鐖惰彍鍗旾D */
+    private Long parentId;
+
+    /** 鏄剧ず椤哄簭 */
+    private Integer orderNum;
+
+    /** 璺敱鍦板潃 */
+    private String path;
+
+    /** 缁勪欢璺緞 */
+    private String component;
+
+    /** 鏄惁涓哄閾撅紙0鏄� 1鍚︼級 */
+    private String isFrame;
+
+    /** 绫诲瀷锛圡鐩綍 C鑿滃崟 F鎸夐挳锛� */
+    private String menuType;
+
+    /** 鑿滃崟鐘舵��:0鏄剧ず,1闅愯棌 */
+    private String visible;
+
+    /** 鏉冮檺瀛楃涓� */
+    private String perms;
+
+    /** 鑿滃崟鍥炬爣 */
+    private String icon;
+
+    /** 椤甸潰鍙傛暟 */
+    private String parameter;
+
+
+    /** 瀛愯彍鍗� */
+    private List<SysMenu> children = new ArrayList<SysMenu>();
+
+    public Long getMenuId()
+    {
+        return menuId;
+    }
+
+    public void setMenuId(Long menuId)
+    {
+        this.menuId = menuId;
+    }
+
+    @NotBlank(message = "鑿滃崟鍚嶇О涓嶈兘涓虹┖")
+    @Size(min = 0, max = 50, message = "鑿滃崟鍚嶇О闀垮害涓嶈兘瓒呰繃50涓瓧绗�")
+    public String getMenuName()
+    {
+        return menuName;
+    }
+
+    public void setMenuName(String menuName)
+    {
+        this.menuName = menuName;
+    }
+
+    public String getParentName()
+    {
+        return parentName;
+    }
+
+    public void setParentName(String parentName)
+    {
+        this.parentName = parentName;
+    }
+
+    public Long getParentId()
+    {
+        return parentId;
+    }
+
+    public void setParentId(Long parentId)
+    {
+        this.parentId = parentId;
+    }
+
+    @NotNull(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖")
+    public Integer getOrderNum()
+    {
+        return orderNum;
+    }
+
+    public void setOrderNum(Integer orderNum)
+    {
+        this.orderNum = orderNum;
+    }
+
+    @Size(min = 0, max = 200, message = "璺敱鍦板潃涓嶈兘瓒呰繃200涓瓧绗�")
+    public String getPath()
+    {
+        return path;
+    }
+
+    public void setPath(String path)
+    {
+        this.path = path;
+    }
+
+    @Size(min = 0, max = 200, message = "缁勪欢璺緞涓嶈兘瓒呰繃255涓瓧绗�")
+    public String getComponent()
+    {
+        return component;
+    }
+
+    public void setComponent(String component)
+    {
+        this.component = component;
+    }
+
+    public String getIsFrame()
+    {
+        return isFrame;
+    }
+
+    public void setIsFrame(String isFrame)
+    {
+        this.isFrame = isFrame;
+    }
+
+    @NotBlank(message = "鑿滃崟绫诲瀷涓嶈兘涓虹┖")
+    public String getMenuType()
+    {
+        return menuType;
+    }
+
+    public void setMenuType(String menuType)
+    {
+        this.menuType = menuType;
+    }
+
+    public String getVisible()
+    {
+        return visible;
+    }
+
+    public void setVisible(String visible)
+    {
+        this.visible = visible;
+    }
+
+    @Size(min = 0, max = 100, message = "鏉冮檺鏍囪瘑闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getPerms()
+    {
+        return perms;
+    }
+
+    public void setPerms(String perms)
+    {
+        this.perms = perms;
+    }
+
+    public String getIcon()
+    {
+        return icon;
+    }
+
+    public void setIcon(String icon)
+    {
+        this.icon = icon;
+    }
+
+    public List<SysMenu> getChildren()
+    {
+        return children;
+    }
+
+    public void setChildren(List<SysMenu> children)
+    {
+        this.children = children;
+    }
+
+    public String getParameter(){
+        return parameter;
+    }
+
+    public void setParameter(String parameter){
+        this.parameter = parameter;
+    }
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("menuId", getMenuId())
+            .append("menuName", getMenuName())
+            .append("parentId", getParentId())
+            .append("orderNum", getOrderNum())
+            .append("path", getPath())
+            .append("component", getComponent())
+            .append("isFrame", getIsFrame())
+            .append("menuType", getMenuType())
+            .append("visible", getVisible())
+            .append("perms", getPerms())
+            .append("icon", getIcon())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysNotice.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysNotice.java
new file mode 100644
index 0000000..1bf0a4c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysNotice.java
@@ -0,0 +1,102 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 閫氱煡鍏憡琛� sys_notice
+ * 
+ * @author ruoyi
+ */
+public class SysNotice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鍏憡ID */
+    private Long noticeId;
+
+    /** 鍏憡鏍囬 */
+    private String noticeTitle;
+
+    /** 鍏憡绫诲瀷锛�1閫氱煡 2鍏憡锛� */
+    private String noticeType;
+
+    /** 鍏憡鍐呭 */
+    private String noticeContent;
+
+    /** 鍏憡鐘舵�侊紙0姝e父 1鍏抽棴锛� */
+    private String status;
+
+    public Long getNoticeId()
+    {
+        return noticeId;
+    }
+
+    public void setNoticeId(Long noticeId)
+    {
+        this.noticeId = noticeId;
+    }
+
+    public void setNoticeTitle(String noticeTitle)
+    {
+        this.noticeTitle = noticeTitle;
+    }
+
+    @NotBlank(message = "鍏憡鏍囬涓嶈兘涓虹┖")
+    @Size(min = 0, max = 50, message = "鍏憡鏍囬涓嶈兘瓒呰繃50涓瓧绗�")
+    public String getNoticeTitle()
+    {
+        return noticeTitle;
+    }
+
+    public void setNoticeType(String noticeType)
+    {
+        this.noticeType = noticeType;
+    }
+
+    public String getNoticeType()
+    {
+        return noticeType;
+    }
+
+    public void setNoticeContent(String noticeContent)
+    {
+        this.noticeContent = noticeContent;
+    }
+
+    public String getNoticeContent()
+    {
+        return noticeContent;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("noticeId", getNoticeId())
+            .append("noticeTitle", getNoticeTitle())
+            .append("noticeType", getNoticeType())
+            .append("noticeContent", getNoticeContent())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysPost.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysPost.java
new file mode 100644
index 0000000..b3367ba
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysPost.java
@@ -0,0 +1,127 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 宀椾綅琛� sys_post
+ * 
+ * @author ruoyi
+ */
+public class SysPost extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 宀椾綅搴忓彿 */
+    @Excel(name = "宀椾綅搴忓彿", cellType = Excel.ColumnType.NUMERIC)
+    private Long postId;
+
+    /** 宀椾綅缂栫爜 */
+    @Excel(name = "宀椾綅缂栫爜")
+    private String postCode;
+
+    /** 宀椾綅鍚嶇О */
+    @Excel(name = "宀椾綅鍚嶇О")
+    private String postName;
+
+    /** 宀椾綅鎺掑簭 */
+    @Excel(name = "宀椾綅鎺掑簭")
+    private Integer postSort;
+
+    /** 鐘舵�侊紙0姝e父 1鍋滅敤锛� */
+    @Excel(name = "鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
+    private String status;
+
+    /** 鐢ㄦ埛鏄惁瀛樺湪姝ゅ矖浣嶆爣璇� 榛樿涓嶅瓨鍦� */
+    private boolean flag = false;
+
+    public Long getPostId()
+    {
+        return postId;
+    }
+
+    public void setPostId(Long postId)
+    {
+        this.postId = postId;
+    }
+
+    @NotBlank(message = "宀椾綅缂栫爜涓嶈兘涓虹┖")
+    @Size(min = 0, max = 64, message = "宀椾綅缂栫爜闀垮害涓嶈兘瓒呰繃64涓瓧绗�")
+    public String getPostCode()
+    {
+        return postCode;
+    }
+
+    public void setPostCode(String postCode)
+    {
+        this.postCode = postCode;
+    }
+
+    @NotBlank(message = "宀椾綅鍚嶇О涓嶈兘涓虹┖")
+    @Size(min = 0, max = 50, message = "宀椾綅鍚嶇О闀垮害涓嶈兘瓒呰繃50涓瓧绗�")
+    public String getPostName()
+    {
+        return postName;
+    }
+
+    public void setPostName(String postName)
+    {
+        this.postName = postName;
+    }
+
+    @NotNull(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖")
+    public Integer getPostSort()
+    {
+        return postSort;
+    }
+
+    public void setPostSort(Integer postSort)
+    {
+        this.postSort = postSort;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public boolean isFlag()
+    {
+        return flag;
+    }
+
+    public void setFlag(boolean flag)
+    {
+        this.flag = flag;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("postId", getPostId())
+            .append("postCode", getPostCode())
+            .append("postName", getPostName())
+            .append("postSort", getPostSort())
+            .append("status", getStatus())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRole.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRole.java
new file mode 100644
index 0000000..89f00fe
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRole.java
@@ -0,0 +1,201 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 瑙掕壊琛� sys_role
+ * 
+ * @author ruoyi
+ */
+public class SysRole extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 瑙掕壊ID */
+    @Excel(name = "瑙掕壊搴忓彿", cellType = Excel.ColumnType.NUMERIC)
+    private Long roleId;
+
+    /** 瑙掕壊鍚嶇О */
+    @Excel(name = "瑙掕壊鍚嶇О")
+    private String roleName;
+
+    /** 瑙掕壊鏉冮檺 */
+    @Excel(name = "瑙掕壊鏉冮檺")
+    private String roleKey;
+
+    /** 瑙掕壊鎺掑簭 */
+    @Excel(name = "瑙掕壊鎺掑簭")
+    private Integer roleSort;
+
+    /** 鏁版嵁鑼冨洿锛�1锛氭墍鏈夋暟鎹潈闄愶紱2锛氳嚜瀹氫箟鏁版嵁鏉冮檺锛�3锛氭湰閮ㄩ棬鏁版嵁鏉冮檺锛�4锛氭湰閮ㄩ棬鍙婁互涓嬫暟鎹潈闄愶級 */
+    @Excel(name = "鏁版嵁鑼冨洿", readConverterExp = "1=鎵�鏈夋暟鎹潈闄�,2=鑷畾涔夋暟鎹潈闄�,3=鏈儴闂ㄦ暟鎹潈闄�,4=鏈儴闂ㄥ強浠ヤ笅鏁版嵁鏉冮檺")
+    private String dataScope;
+
+    /** 瑙掕壊鐘舵�侊紙0姝e父 1鍋滅敤锛� */
+    @Excel(name = "瑙掕壊鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
+    private String status;
+
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    private String delFlag;
+
+    /** 鐢ㄦ埛鏄惁瀛樺湪姝よ鑹叉爣璇� 榛樿涓嶅瓨鍦� */
+    private boolean flag = false;
+
+    /** 鑿滃崟缁� */
+    private Long[] menuIds;
+
+    /** 閮ㄩ棬缁勶紙鏁版嵁鏉冮檺锛� */
+    private Long[] deptIds;
+
+    public SysRole()
+    {
+
+    }
+
+    public SysRole(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public boolean isAdmin()
+    {
+        return isAdmin(this.roleId);
+    }
+
+    public static boolean isAdmin(Long roleId)
+    {
+        return roleId != null && 1L == roleId;
+    }
+
+    @NotBlank(message = "瑙掕壊鍚嶇О涓嶈兘涓虹┖")
+    @Size(min = 0, max = 30, message = "瑙掕壊鍚嶇О闀垮害涓嶈兘瓒呰繃30涓瓧绗�")
+    public String getRoleName()
+    {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName)
+    {
+        this.roleName = roleName;
+    }
+
+    @NotBlank(message = "鏉冮檺瀛楃涓嶈兘涓虹┖")
+    @Size(min = 0, max = 100, message = "鏉冮檺瀛楃闀垮害涓嶈兘瓒呰繃100涓瓧绗�")
+    public String getRoleKey()
+    {
+        return roleKey;
+    }
+
+    public void setRoleKey(String roleKey)
+    {
+        this.roleKey = roleKey;
+    }
+
+    @NotNull(message = "鏄剧ず椤哄簭涓嶈兘涓虹┖")
+    public Integer getRoleSort()
+    {
+        return roleSort;
+    }
+
+    public void setRoleSort(Integer roleSort)
+    {
+        this.roleSort = roleSort;
+    }
+
+    public String getDataScope()
+    {
+        return dataScope;
+    }
+
+    public void setDataScope(String dataScope)
+    {
+        this.dataScope = dataScope;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public boolean isFlag()
+    {
+        return flag;
+    }
+
+    public void setFlag(boolean flag)
+    {
+        this.flag = flag;
+    }
+
+    public Long[] getMenuIds()
+    {
+        return menuIds;
+    }
+
+    public void setMenuIds(Long[] menuIds)
+    {
+        this.menuIds = menuIds;
+    }
+
+    public Long[] getDeptIds()
+    {
+        return deptIds;
+    }
+
+    public void setDeptIds(Long[] deptIds)
+    {
+        this.deptIds = deptIds;
+    }
+    
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("roleId", getRoleId())
+            .append("roleName", getRoleName())
+            .append("roleKey", getRoleKey())
+            .append("roleSort", getRoleSort())
+            .append("dataScope", getDataScope())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleDept.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleDept.java
new file mode 100644
index 0000000..69cfc47
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleDept.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 瑙掕壊鍜岄儴闂ㄥ叧鑱� sys_role_dept
+ * 
+ * @author ruoyi
+ */
+public class SysRoleDept
+{
+    /** 瑙掕壊ID */
+    private Long roleId;
+    
+    /** 閮ㄩ棬ID */
+    private Long deptId;
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("roleId", getRoleId())
+            .append("deptId", getDeptId())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleMenu.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleMenu.java
new file mode 100644
index 0000000..2d10e73
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysRoleMenu.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 瑙掕壊鍜岃彍鍗曞叧鑱� sys_role_menu
+ * 
+ * @author ruoyi
+ */
+public class SysRoleMenu
+{
+    /** 瑙掕壊ID */
+    private Long roleId;
+    
+    /** 鑿滃崟ID */
+    private Long menuId;
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    public Long getMenuId()
+    {
+        return menuId;
+    }
+
+    public void setMenuId(Long menuId)
+    {
+        this.menuId = menuId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("roleId", getRoleId())
+            .append("menuId", getMenuId())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUser.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUser.java
new file mode 100644
index 0000000..cfd911f
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUser.java
@@ -0,0 +1,328 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import java.util.Date;
+import java.util.List;
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excels;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.ColumnType;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel.Type;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excels;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鐢ㄦ埛瀵硅薄 sys_user
+ * 
+ * @author ruoyi
+ */
+public class SysUser extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鐢ㄦ埛ID */
+    @Excel(name = "鐢ㄦ埛搴忓彿", cellType = Excel.ColumnType.NUMERIC, prompt = "鐢ㄦ埛缂栧彿")
+    private Long userId;
+
+    /** 閮ㄩ棬ID */
+    @Excel(name = "閮ㄩ棬缂栧彿", type = Excel.Type.IMPORT)
+    private Long deptId;
+
+    /** 鐢ㄦ埛璐﹀彿 */
+    @Excel(name = "鐧诲綍鍚嶇О")
+    private String userName;
+
+    /** 鐢ㄦ埛鏄电О */
+    @Excel(name = "鐢ㄦ埛鍚嶇О")
+    private String nickName;
+
+    /** 鐢ㄦ埛閭 */
+    @Excel(name = "鐢ㄦ埛閭")
+    private String email;
+
+    /** 鎵嬫満鍙风爜 */
+    @Excel(name = "鎵嬫満鍙风爜")
+    private String phonenumber;
+
+    /** 鐢ㄦ埛鎬у埆 */
+    @Excel(name = "鐢ㄦ埛鎬у埆", readConverterExp = "0=鐢�,1=濂�,2=鏈煡")
+    private String sex;
+
+    /** 鐢ㄦ埛澶村儚 */
+    private String avatar;
+
+    /** 瀵嗙爜 */
+    private String password;
+
+    /** 鐩愬姞瀵� */
+    private String salt;
+
+    /** 甯愬彿鐘舵�侊紙0姝e父 1鍋滅敤锛� */
+    @Excel(name = "甯愬彿鐘舵��", readConverterExp = "0=姝e父,1=鍋滅敤")
+    private String status;
+
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    private String delFlag;
+
+    /** 鏈�鍚庣櫥闄咺P */
+    @Excel(name = "鏈�鍚庣櫥闄咺P", type = Excel.Type.EXPORT)
+    private String loginIp;
+
+    /** 鏈�鍚庣櫥闄嗘椂闂� */
+    @Excel(name = "鏈�鍚庣櫥闄嗘椂闂�", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT)
+    private Date loginDate;
+
+    /** 閮ㄩ棬瀵硅薄 */
+    @Excels({
+        @Excel(name = "閮ㄩ棬鍚嶇О", targetAttr = "deptName", type = Excel.Type.EXPORT),
+        @Excel(name = "閮ㄩ棬璐熻矗浜�", targetAttr = "leader", type = Excel.Type.EXPORT)
+    })
+    private SysDept dept;
+
+    /** 瑙掕壊瀵硅薄 */
+    private List<SysRole> roles;
+
+    /** 瑙掕壊缁� */
+    private Long[] roleIds;
+
+    /** 宀椾綅缁� */
+    private Long[] postIds;
+
+    public SysUser()
+    {
+
+    }
+
+    public SysUser(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public boolean isAdmin()
+    {
+        return isAdmin(this.userId);
+    }
+
+    public static boolean isAdmin(Long userId)
+    {
+        return userId != null && 1L == userId;
+    }
+
+    public Long getDeptId()
+    {
+        return deptId;
+    }
+
+    public void setDeptId(Long deptId)
+    {
+        this.deptId = deptId;
+    }
+
+    @Size(min = 0, max = 30, message = "鐢ㄦ埛鏄电О闀垮害涓嶈兘瓒呰繃30涓瓧绗�")
+    public String getNickName()
+    {
+        return nickName;
+    }
+
+    public void setNickName(String nickName)
+    {
+        this.nickName = nickName;
+    }
+
+    @NotBlank(message = "鐢ㄦ埛璐﹀彿涓嶈兘涓虹┖")
+    @Size(min = 0, max = 30, message = "鐢ㄦ埛璐﹀彿闀垮害涓嶈兘瓒呰繃30涓瓧绗�")
+    public String getUserName()
+    {
+        return userName;
+    }
+
+    public void setUserName(String userName)
+    {
+        this.userName = userName;
+    }
+
+    @Email(message = "閭鏍煎紡涓嶆纭�")
+    @Size(min = 0, max = 50, message = "閭闀垮害涓嶈兘瓒呰繃50涓瓧绗�")
+    public String getEmail()
+    {
+        return email;
+    }
+
+    public void setEmail(String email)
+    {
+        this.email = email;
+    }
+
+    @Size(min = 0, max = 11, message = "鎵嬫満鍙风爜闀垮害涓嶈兘瓒呰繃11涓瓧绗�")
+    public String getPhonenumber()
+    {
+        return phonenumber;
+    }
+
+    public void setPhonenumber(String phonenumber)
+    {
+        this.phonenumber = phonenumber;
+    }
+
+    public String getSex()
+    {
+        return sex;
+    }
+
+    public void setSex(String sex)
+    {
+        this.sex = sex;
+    }
+
+    public String getAvatar()
+    {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar)
+    {
+        this.avatar = avatar;
+    }
+
+    public String getPassword()
+    {
+        return password;
+    }
+
+    public void setPassword(String password)
+    {
+        this.password = password;
+    }
+
+    public String getSalt()
+    {
+        return salt;
+    }
+
+    public void setSalt(String salt)
+    {
+        this.salt = salt;
+    }
+
+    public String getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(String status)
+    {
+        this.status = status;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getLoginIp()
+    {
+        return loginIp;
+    }
+
+    public void setLoginIp(String loginIp)
+    {
+        this.loginIp = loginIp;
+    }
+
+    public Date getLoginDate()
+    {
+        return loginDate;
+    }
+
+    public void setLoginDate(Date loginDate)
+    {
+        this.loginDate = loginDate;
+    }
+
+    public SysDept getDept()
+    {
+        return dept;
+    }
+
+    public void setDept(SysDept dept)
+    {
+        this.dept = dept;
+    }
+
+    public List<SysRole> getRoles()
+    {
+        return roles;
+    }
+
+    public void setRoles(List<SysRole> roles)
+    {
+        this.roles = roles;
+    }
+
+    public Long[] getRoleIds()
+    {
+        return roleIds;
+    }
+
+    public void setRoleIds(Long[] roleIds)
+    {
+        this.roleIds = roleIds;
+    }
+
+    public Long[] getPostIds()
+    {
+        return postIds;
+    }
+
+    public void setPostIds(Long[] postIds)
+    {
+        this.postIds = postIds;
+    }
+    
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("deptId", getDeptId())
+            .append("userName", getUserName())
+            .append("nickName", getNickName())
+            .append("email", getEmail())
+            .append("phonenumber", getPhonenumber())
+            .append("sex", getSex())
+            .append("avatar", getAvatar())
+            .append("password", getPassword())
+            .append("salt", getSalt())
+            .append("status", getStatus())
+            .append("delFlag", getDelFlag())
+            .append("loginIp", getLoginIp())
+            .append("loginDate", getLoginDate())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .append("dept", getDept())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserPost.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserPost.java
new file mode 100644
index 0000000..8ab6292
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserPost.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 鐢ㄦ埛鍜屽矖浣嶅叧鑱� sys_user_post
+ * 
+ * @author ruoyi
+ */
+public class SysUserPost
+{
+    /** 鐢ㄦ埛ID */
+    private Long userId;
+    
+    /** 宀椾綅ID */
+    private Long postId;
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getPostId()
+    {
+        return postId;
+    }
+
+    public void setPostId(Long postId)
+    {
+        this.postId = postId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("postId", getPostId())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserRole.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserRole.java
new file mode 100644
index 0000000..33bbf77
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/SysUserRole.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.project.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 鐢ㄦ埛鍜岃鑹插叧鑱� sys_user_role
+ * 
+ * @author ruoyi
+ */
+public class SysUserRole
+{
+    /** 鐢ㄦ埛ID */
+    private Long userId;
+    
+    /** 瑙掕壊ID */
+    private Long roleId;
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("roleId", getRoleId())
+            .toString();
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/MetaVo.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/MetaVo.java
new file mode 100644
index 0000000..a05e0cd
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/MetaVo.java
@@ -0,0 +1,49 @@
+package com.dingzhuo.energy.project.system.domain.vo;
+
+/**
+ * 璺敱鏄剧ず淇℃伅
+ * 
+ * @author ruoyi
+ */
+public class MetaVo
+{
+    /**
+     * 璁剧疆璇ヨ矾鐢卞湪渚ц竟鏍忓拰闈㈠寘灞戜腑灞曠ず鐨勫悕瀛�
+     */
+    private String title;
+
+    /**
+     * 璁剧疆璇ヨ矾鐢辩殑鍥炬爣锛屽搴旇矾寰剆rc/icons/svg
+     */
+    private String icon;
+
+    public MetaVo()
+    {
+    }
+
+    public MetaVo(String title, String icon)
+    {
+        this.title = title;
+        this.icon = icon;
+    }
+
+    public String getTitle()
+    {
+        return title;
+    }
+
+    public void setTitle(String title)
+    {
+        this.title = title;
+    }
+
+    public String getIcon()
+    {
+        return icon;
+    }
+
+    public void setIcon(String icon)
+    {
+        this.icon = icon;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/RouterVo.java b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/RouterVo.java
new file mode 100644
index 0000000..b5496c6
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/domain/vo/RouterVo.java
@@ -0,0 +1,145 @@
+package com.dingzhuo.energy.project.system.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.util.List;
+
+/**
+ * 璺敱閰嶇疆淇℃伅
+ * 
+ * @author ruoyi
+ */
+@JsonInclude(JsonInclude.Include.NON_EMPTY)
+public class RouterVo
+{
+    /**
+     * 璺敱鍚嶅瓧
+     */
+    private String name;
+
+    /**
+     * 璺敱鍦板潃
+     */
+    private String path;
+
+    /**
+     * 鏄惁闅愯棌璺敱锛屽綋璁剧疆 true 鐨勬椂鍊欒璺敱涓嶄細鍐嶄晶杈规爮鍑虹幇
+     */
+    private String hidden;
+
+    /**
+     * 閲嶅畾鍚戝湴鍧�锛屽綋璁剧疆 noRedirect 鐨勬椂鍊欒璺敱鍦ㄩ潰鍖呭睉瀵艰埅涓笉鍙鐐瑰嚮
+     */
+    private String redirect;
+
+    /**
+     * 缁勪欢鍦板潃
+     */
+    private String component;
+
+    /**
+     * 褰撲綘涓�涓矾鐢变笅闈㈢殑 children 澹版槑鐨勮矾鐢卞ぇ浜�1涓椂锛岃嚜鍔ㄤ細鍙樻垚宓屽鐨勬ā寮�--濡傜粍浠堕〉闈�
+     */
+    private Boolean alwaysShow;
+
+    /**
+     * 鍏朵粬鍏冪礌
+     */
+    private MetaVo meta;
+
+    public String getPageQueryParameter() {
+        return pageQueryParameter;
+    }
+
+    public void setPageQueryParameter(String pageQueryParameter) {
+        this.pageQueryParameter = pageQueryParameter;
+    }
+
+    /**
+     * 鑿滃崟璺敱鍙傛暟query褰㈠紡
+     */
+    private String pageQueryParameter;
+    /**
+     * 瀛愯矾鐢�
+     */
+    private List<RouterVo> children;
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getPath()
+    {
+        return path;
+    }
+
+    public void setPath(String path)
+    {
+        this.path = path;
+    }
+
+    public String getHidden()
+    {
+        return hidden;
+    }
+
+    public void setHidden(String hidden)
+    {
+        this.hidden = hidden;
+    }
+
+    public String getRedirect()
+    {
+        return redirect;
+    }
+
+    public void setRedirect(String redirect)
+    {
+        this.redirect = redirect;
+    }
+
+    public String getComponent()
+    {
+        return component;
+    }
+
+    public void setComponent(String component)
+    {
+        this.component = component;
+    }
+
+    public Boolean getAlwaysShow()
+    {
+        return alwaysShow;
+    }
+
+    public void setAlwaysShow(Boolean alwaysShow)
+    {
+        this.alwaysShow = alwaysShow;
+    }
+
+    public MetaVo getMeta()
+    {
+        return meta;
+    }
+
+    public void setMeta(MetaVo meta)
+    {
+        this.meta = meta;
+    }
+
+    public List<RouterVo> getChildren()
+    {
+        return children;
+    }
+
+    public void setChildren(List<RouterVo> children)
+    {
+        this.children = children;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysConfigMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysConfigMapper.java
new file mode 100644
index 0000000..d3cdc11
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysConfigMapper.java
@@ -0,0 +1,68 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysConfig;
+
+/**
+ * 鍙傛暟閰嶇疆 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysConfigMapper
+{
+    /**
+     * 鏌ヨ鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 鍙傛暟閰嶇疆淇℃伅
+     */
+    SysConfig selectConfig(SysConfig config);
+
+    /**
+     * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 鍙傛暟閰嶇疆闆嗗悎
+     */
+    List<SysConfig> selectConfigList(SysConfig config);
+
+    /**
+     * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param configKey 鍙傛暟閿悕
+     * @return 鍙傛暟閰嶇疆淇℃伅
+     */
+    SysConfig checkConfigKeyUnique(String configKey);
+
+    /**
+     * 鏂板鍙傛暟閰嶇疆
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    int insertConfig(SysConfig config);
+
+    /**
+     * 淇敼鍙傛暟閰嶇疆
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    int updateConfig(SysConfig config);
+
+    /**
+     * 鍒犻櫎鍙傛暟閰嶇疆
+     * 
+     * @param configId 鍙傛暟ID
+     * @return 缁撴灉
+     */
+    int deleteConfigById(Long configId);
+
+    /**
+     * 鎵归噺鍒犻櫎鍙傛暟淇℃伅
+     * 
+     * @param configIds 闇�瑕佸垹闄ょ殑鍙傛暟ID
+     * @return 缁撴灉
+     */
+    int deleteConfigByIds(Long[] configIds);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDeptMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDeptMapper.java
new file mode 100644
index 0000000..cd9f5b8
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDeptMapper.java
@@ -0,0 +1,109 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+
+/**
+ * 閮ㄩ棬绠$悊 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysDeptMapper
+{
+    /**
+     * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 閮ㄩ棬淇℃伅闆嗗悎
+     */
+    List<SysDept> selectDeptList(SysDept dept);
+
+    /**
+     * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 閫変腑閮ㄩ棬鍒楄〃
+     */
+    List<Integer> selectDeptListByRoleId(Long roleId);
+
+    /**
+     * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 閮ㄩ棬淇℃伅
+     */
+    SysDept selectDeptById(Long deptId);
+
+    /**
+     * 鏍规嵁ID鏌ヨ鎵�鏈夊瓙閮ㄩ棬
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 閮ㄩ棬鍒楄〃
+     */
+    List<SysDept> selectChildrenDeptById(Long deptId);
+
+    /**
+     * 鏄惁瀛樺湪瀛愯妭鐐�
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    int hasChildByDeptId(Long deptId);
+
+    /**
+     * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    int checkDeptExistUser(Long deptId);
+
+    /**
+     * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴
+     * 
+     * @param deptName 閮ㄩ棬鍚嶇О
+     * @param parentId 鐖堕儴闂↖D
+     * @return 缁撴灉
+     */
+    SysDept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId);
+
+    /**
+     * 鏂板閮ㄩ棬淇℃伅
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    int insertDept(SysDept dept);
+
+    /**
+     * 淇敼閮ㄩ棬淇℃伅
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    int updateDept(SysDept dept);
+
+    /**
+     * 淇敼鎵�鍦ㄩ儴闂ㄧ殑鐖剁骇閮ㄩ棬鐘舵��
+     * 
+     * @param dept 閮ㄩ棬
+     */
+    void updateDeptStatus(SysDept dept);
+
+    /**
+     * 淇敼瀛愬厓绱犲叧绯�
+     * 
+     * @param depts 瀛愬厓绱�
+     * @return 缁撴灉
+     */
+    int updateDeptChildren(@Param("depts") List<SysDept> depts);
+
+    /**
+     * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    int deleteDeptById(Long deptId);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictDataMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictDataMapper.java
new file mode 100644
index 0000000..fe4142d
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictDataMapper.java
@@ -0,0 +1,95 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+
+/**
+ * 瀛楀吀琛� 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysDictDataMapper
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    List<SysDictData> selectDictDataList(SysDictData dictData);
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    List<SysDictData> selectDictDataByType(String dictType);
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭�
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @param dictValue 瀛楀吀閿��
+     * @return 瀛楀吀鏍囩
+     */
+    String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue);
+
+    /**
+     * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅
+     * 
+     * @param dictCode 瀛楀吀鏁版嵁ID
+     * @return 瀛楀吀鏁版嵁
+     */
+    SysDictData selectDictDataById(Long dictCode);
+
+    /**
+     * 鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀鏁版嵁
+     */
+    int countDictDataByType(String dictType);
+
+    /**
+     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictCode 瀛楀吀鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDictDataById(Long dictCode);
+
+    /**
+     * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictCodes 闇�瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDictDataByIds(Long[] dictCodes);
+
+    /**
+     * 鏂板瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 缁撴灉
+     */
+    int insertDictData(SysDictData dictData);
+
+    /**
+     * 淇敼瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 缁撴灉
+     */
+    int updateDictData(SysDictData dictData);
+
+    /**
+     * 鍚屾淇敼瀛楀吀绫诲瀷
+     * 
+     * @param oldDictType 鏃у瓧鍏哥被鍨�
+     * @param newDictType 鏂版棫瀛楀吀绫诲瀷
+     * @return 缁撴灉
+     */
+    int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictTypeMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictTypeMapper.java
new file mode 100644
index 0000000..7610745
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysDictTypeMapper.java
@@ -0,0 +1,85 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import com.dingzhuo.energy.project.system.domain.SysDictType;
+
+/**
+ * 瀛楀吀琛� 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+@Mapper
+public interface SysDictTypeMapper
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅
+     */
+    List<SysDictType> selectDictTypeList(SysDictType dictType);
+
+    /**
+     * 鏍规嵁鎵�鏈夊瓧鍏哥被鍨�
+     * 
+     * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅
+     */
+    List<SysDictType> selectDictTypeAll();
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅
+     * 
+     * @param dictId 瀛楀吀绫诲瀷ID
+     * @return 瀛楀吀绫诲瀷
+     */
+    SysDictType selectDictTypeById(Long dictId);
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀绫诲瀷
+     */
+    SysDictType selectDictTypeByType(String dictType);
+
+    /**
+     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀淇℃伅
+     * 
+     * @param dictId 瀛楀吀ID
+     * @return 缁撴灉
+     */
+    int deleteDictTypeById(Long dictId);
+
+    /**
+     * 鎵归噺鍒犻櫎瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictIds 闇�瑕佸垹闄ょ殑瀛楀吀ID
+     * @return 缁撴灉
+     */
+    int deleteDictTypeByIds(Long[] dictIds);
+
+    /**
+     * 鏂板瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 缁撴灉
+     */
+    int insertDictType(SysDictType dictType);
+
+    /**
+     * 淇敼瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 缁撴灉
+     */
+    int updateDictType(SysDictType dictType);
+
+    /**
+     * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓�
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 缁撴灉
+     */
+    SysDictType checkDictTypeUnique(String dictType);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysMenuMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysMenuMapper.java
new file mode 100644
index 0000000..fb2c154
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysMenuMapper.java
@@ -0,0 +1,108 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import com.dingzhuo.energy.project.system.domain.SysMenu;
+
+/**
+ * 鑿滃崟琛� 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysMenuMapper
+{
+    /**
+     * 鏌ヨ绯荤粺鑿滃崟鍒楄〃
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 鑿滃崟鍒楄〃
+     */
+    List<SysMenu> selectMenuList(SysMenu menu);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鎵�鏈夋潈闄�
+     * 
+     * @return 鏉冮檺鍒楄〃
+     */
+    List<String> selectMenuPerms();
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鏉冮檺鍒楄〃
+     */
+    List<String> selectMenuPermsByUserId(Long userId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟
+     * 
+     * @return 鑿滃崟鍒楄〃
+     */
+    List<SysMenu> selectMenuTreeAll();
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟
+     * 
+     * @param username 鐢ㄦ埛ID
+     * @return 鑿滃崟鍒楄〃
+     */
+    List<SysMenu> selectMenuTreeByUserId(Long userId);
+
+    /**
+     * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 閫変腑鑿滃崟鍒楄〃
+     */
+    List<Integer> selectMenuListByRoleId(Long roleId);
+
+    /**
+     * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 鑿滃崟淇℃伅
+     */
+    SysMenu selectMenuById(Long menuId);
+
+    /**
+     * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐�
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉
+     */
+    int hasChildByMenuId(Long menuId);
+
+    /**
+     * 鏂板鑿滃崟淇℃伅
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    int insertMenu(SysMenu menu);
+
+    /**
+     * 淇敼鑿滃崟淇℃伅
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    int updateMenu(SysMenu menu);
+
+    /**
+     * 鍒犻櫎鑿滃崟绠$悊淇℃伅
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉
+     */
+    int deleteMenuById(Long menuId);
+
+    /**
+     * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴
+     * 
+     * @param menuName 鑿滃崟鍚嶇О
+     * @param parentId 鐖惰彍鍗旾D
+     * @return 缁撴灉
+     */
+    SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysNoticeMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysNoticeMapper.java
new file mode 100644
index 0000000..e865037
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysNoticeMapper.java
@@ -0,0 +1,60 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysNotice;
+
+/**
+ * 閫氱煡鍏憡琛� 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysNoticeMapper
+{
+    /**
+     * 鏌ヨ鍏憡淇℃伅
+     * 
+     * @param noticeId 鍏憡ID
+     * @return 鍏憡淇℃伅
+     */
+    SysNotice selectNoticeById(Long noticeId);
+
+    /**
+     * 鏌ヨ鍏憡鍒楄〃
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 鍏憡闆嗗悎
+     */
+    List<SysNotice> selectNoticeList(SysNotice notice);
+
+    /**
+     * 鏂板鍏憡
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 缁撴灉
+     */
+    int insertNotice(SysNotice notice);
+
+    /**
+     * 淇敼鍏憡
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 缁撴灉
+     */
+    int updateNotice(SysNotice notice);
+
+    /**
+     * 鎵归噺鍒犻櫎鍏憡
+     * 
+     * @param noticeId 鍏憡ID
+     * @return 缁撴灉
+     */
+    int deleteNoticeById(Long noticeId);
+
+    /**
+     * 鎵归噺鍒犻櫎鍏憡淇℃伅
+     * 
+     * @param noticeIds 闇�瑕佸垹闄ょ殑鍏憡ID
+     * @return 缁撴灉
+     */
+    int deleteNoticeByIds(Long noticeIds);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysPostMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysPostMapper.java
new file mode 100644
index 0000000..1851223
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysPostMapper.java
@@ -0,0 +1,99 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysPost;
+
+/**
+ * 宀椾綅淇℃伅 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysPostMapper
+{
+    /**
+     * 鏌ヨ宀椾綅鏁版嵁闆嗗悎
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 宀椾綅鏁版嵁闆嗗悎
+     */
+    List<SysPost> selectPostList(SysPost post);
+
+    /**
+     * 鏌ヨ鎵�鏈夊矖浣�
+     * 
+     * @return 宀椾綅鍒楄〃
+     */
+    List<SysPost> selectPostAll();
+
+    /**
+     * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅
+     * 
+     * @param postId 宀椾綅ID
+     * @return 瑙掕壊瀵硅薄淇℃伅
+     */
+    SysPost selectPostById(Long postId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 閫変腑宀椾綅ID鍒楄〃
+     */
+    List<Integer> selectPostListByUserId(Long userId);
+
+    /**
+     * 鏌ヨ鐢ㄦ埛鎵�灞炲矖浣嶇粍
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 缁撴灉
+     */
+    List<SysPost> selectPostsByUserName(String userName);
+
+    /**
+     * 鍒犻櫎宀椾綅淇℃伅
+     * 
+     * @param postId 宀椾綅ID
+     * @return 缁撴灉
+     */
+    int deletePostById(Long postId);
+
+    /**
+     * 鎵归噺鍒犻櫎宀椾綅淇℃伅
+     * 
+     * @param postIds 闇�瑕佸垹闄ょ殑宀椾綅ID
+     * @return 缁撴灉
+     */
+    int deletePostByIds(Long[] postIds);
+
+    /**
+     * 淇敼宀椾綅淇℃伅
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    int updatePost(SysPost post);
+
+    /**
+     * 鏂板宀椾綅淇℃伅
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    int insertPost(SysPost post);
+
+    /**
+     * 鏍¢獙宀椾綅鍚嶇О
+     * 
+     * @param postName 宀椾綅鍚嶇О
+     * @return 缁撴灉
+     */
+    SysPost checkPostNameUnique(String postName);
+
+    /**
+     * 鏍¢獙宀椾綅缂栫爜
+     * 
+     * @param postCode 宀椾綅缂栫爜
+     * @return 缁撴灉
+     */
+    SysPost checkPostCodeUnique(String postCode);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleDeptMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleDeptMapper.java
new file mode 100644
index 0000000..6633fa4
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleDeptMapper.java
@@ -0,0 +1,44 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysRoleDept;
+
+/**
+ * 瑙掕壊涓庨儴闂ㄥ叧鑱旇〃 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysRoleDeptMapper
+{
+    /**
+     * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊鍜岄儴闂ㄥ叧鑱�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int deleteRoleDeptByRoleId(Long roleId);
+
+    /**
+     * 鎵归噺鍒犻櫎瑙掕壊閮ㄩ棬鍏宠仈淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteRoleDept(Long[] ids);
+
+    /**
+     * 鏌ヨ閮ㄩ棬浣跨敤鏁伴噺
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    int selectCountRoleDeptByDeptId(Long deptId);
+
+    /**
+     * 鎵归噺鏂板瑙掕壊閮ㄩ棬淇℃伅
+     * 
+     * @param roleDeptList 瑙掕壊閮ㄩ棬鍒楄〃
+     * @return 缁撴灉
+     */
+    int batchRoleDept(List<SysRoleDept> roleDeptList);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMapper.java
new file mode 100644
index 0000000..6f9910e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMapper.java
@@ -0,0 +1,107 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysRole;
+
+/**
+ * 瑙掕壊琛� 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysRoleMapper
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅
+     */
+    List<SysRole> selectRoleList(SysRole role);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 瑙掕壊鍒楄〃
+     */
+    List<SysRole> selectRolePermissionByUserId(Long userId);
+
+    /**
+     * 鏌ヨ鎵�鏈夎鑹�
+     * 
+     * @return 瑙掕壊鍒楄〃
+     */
+    List<SysRole> selectRoleAll();
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 閫変腑瑙掕壊ID鍒楄〃
+     */
+    List<Integer> selectRoleListByUserId(Long userId);
+
+    /**
+     * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 瑙掕壊瀵硅薄淇℃伅
+     */
+    SysRole selectRoleById(Long roleId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 瑙掕壊鍒楄〃
+     */
+    List<SysRole> selectRolesByUserName(String userName);
+
+    /**
+     * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴
+     * 
+     * @param roleName 瑙掕壊鍚嶇О
+     * @return 瑙掕壊淇℃伅
+     */
+    SysRole checkRoleNameUnique(String roleName);
+
+    /**
+     * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴
+     * 
+     * @param roleKey 瑙掕壊鏉冮檺
+     * @return 瑙掕壊淇℃伅
+     */
+    SysRole checkRoleKeyUnique(String roleKey);
+
+    /**
+     * 淇敼瑙掕壊淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    int updateRole(SysRole role);
+
+    /**
+     * 鏂板瑙掕壊淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    int insertRole(SysRole role);
+
+    /**
+     * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int deleteRoleById(Long roleId);
+
+    /**
+     * 鎵归噺鍒犻櫎瑙掕壊淇℃伅
+     * 
+     * @param roleIds 闇�瑕佸垹闄ょ殑瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int deleteRoleByIds(Long[] roleIds);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMenuMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMenuMapper.java
new file mode 100644
index 0000000..83200f8
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysRoleMenuMapper.java
@@ -0,0 +1,36 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysRoleMenu;
+
+/**
+ * 瑙掕壊涓庤彍鍗曞叧鑱旇〃 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysRoleMenuMapper
+{
+    /**
+     * 鏌ヨ鑿滃崟浣跨敤鏁伴噺
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉
+     */
+    int checkMenuExistRole(Long menuId);
+
+    /**
+     * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊鍜岃彍鍗曞叧鑱�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int deleteRoleMenuByRoleId(Long roleId);
+
+    /**
+     * 鎵归噺鏂板瑙掕壊鑿滃崟淇℃伅
+     * 
+     * @param roleMenuList 瑙掕壊鑿滃崟鍒楄〃
+     * @return 缁撴灉
+     */
+    int batchRoleMenu(List<SysRoleMenu> roleMenuList);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserMapper.java
new file mode 100644
index 0000000..7b4584a
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserMapper.java
@@ -0,0 +1,113 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.dingzhuo.energy.project.system.domain.SysUser;
+
+/**
+ * 鐢ㄦ埛琛� 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysUserMapper
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃
+     * 
+     * @param sysUser 鐢ㄦ埛淇℃伅
+     * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅
+     */
+    List<SysUser> selectUserList(SysUser sysUser);
+
+    /**
+     * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴�
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛瀵硅薄淇℃伅
+     */
+    SysUser selectUserByUserName(String userName);
+
+    /**
+     * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鐢ㄦ埛瀵硅薄淇℃伅
+     */
+    SysUser selectUserById(Long userId);
+
+    /**
+     * 鏂板鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    int insertUser(SysUser user);
+
+    /**
+     * 淇敼鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    int updateUser(SysUser user);
+
+    /**
+     * 淇敼鐢ㄦ埛澶村儚
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @param avatar 澶村儚鍦板潃
+     * @return 缁撴灉
+     */
+    int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar);
+
+    /**
+     * 閲嶇疆鐢ㄦ埛瀵嗙爜
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @param password 瀵嗙爜
+     * @return 缁撴灉
+     */
+    int resetUserPwd(@Param("userName") String userName, @Param("password") String password);
+
+    /**
+     * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    int deleteUserById(Long userId);
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅
+     * 
+     * @param userIds 闇�瑕佸垹闄ょ殑鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    int deleteUserByIds(Long[] userIds);
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴
+     * 
+     * @param userName 鐢ㄦ埛鍚嶇О
+     * @return 缁撴灉
+     */
+    int checkUserNameUnique(String userName);
+
+    /**
+     * 鏍¢獙鎵嬫満鍙风爜鏄惁鍞竴
+     *
+     * @param phonenumber 鎵嬫満鍙风爜
+     * @return 缁撴灉
+     */
+    SysUser checkPhoneUnique(String phonenumber);
+
+    /**
+     * 鏍¢獙email鏄惁鍞竴
+     *
+     * @param email 鐢ㄦ埛閭
+     * @return 缁撴灉
+     */
+    SysUser checkEmailUnique(String email);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserPostMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserPostMapper.java
new file mode 100644
index 0000000..a3de5de
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserPostMapper.java
@@ -0,0 +1,44 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysUserPost;
+
+/**
+ * 鐢ㄦ埛涓庡矖浣嶅叧鑱旇〃 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysUserPostMapper
+{
+    /**
+     * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛鍜屽矖浣嶅叧鑱�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    int deleteUserPostByUserId(Long userId);
+
+    /**
+     * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺
+     * 
+     * @param postId 宀椾綅ID
+     * @return 缁撴灉
+     */
+    int countUserPostById(Long postId);
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄦ埛鍜屽矖浣嶅叧鑱�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteUserPost(Long[] ids);
+
+    /**
+     * 鎵归噺鏂板鐢ㄦ埛宀椾綅淇℃伅
+     * 
+     * @param userPostList 鐢ㄦ埛瑙掕壊鍒楄〃
+     * @return 缁撴灉
+     */
+    int batchUserPost(List<SysUserPost> userPostList);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserRoleMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserRoleMapper.java
new file mode 100644
index 0000000..1b1eac8
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/mapper/SysUserRoleMapper.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.project.system.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import com.dingzhuo.energy.project.system.domain.SysUserRole;
+
+/**
+ * 鐢ㄦ埛涓庤鑹插叧鑱旇〃 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface SysUserRoleMapper
+{
+    /**
+     * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛鍜岃鑹插叧鑱�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    int deleteUserRoleByUserId(Long userId);
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄦ埛鍜岃鑹插叧鑱�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteUserRole(Long[] ids);
+
+    /**
+     * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int countUserRoleByRoleId(Long roleId);
+
+    /**
+     * 鎵归噺鏂板鐢ㄦ埛瑙掕壊淇℃伅
+     * 
+     * @param userRoleList 鐢ㄦ埛瑙掕壊鍒楄〃
+     * @return 缁撴灉
+     */
+    int batchUserRole(List<SysUserRole> userRoleList);
+
+    /**
+     * 鍒犻櫎鐢ㄦ埛鍜岃鑹插叧鑱斾俊鎭�
+     * 
+     * @param userRole 鐢ㄦ埛鍜岃鑹插叧鑱斾俊鎭�
+     * @return 缁撴灉
+     */
+    int deleteUserRoleInfo(SysUserRole userRole);
+
+    /**
+     * 鎵归噺鍙栨秷鎺堟潈鐢ㄦ埛瑙掕壊
+     * 
+     * @param roleId 瑙掕壊ID
+     * @param userIds 闇�瑕佸垹闄ょ殑鐢ㄦ埛鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysConfigService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysConfigService.java
new file mode 100644
index 0000000..7d6f805
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysConfigService.java
@@ -0,0 +1,76 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysConfig;
+
+/**
+ * 鍙傛暟閰嶇疆 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysConfigService
+{
+    /**
+     * 鏌ヨ鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param configId 鍙傛暟閰嶇疆ID
+     * @return 鍙傛暟閰嶇疆淇℃伅
+     */
+    SysConfig selectConfigById(Long configId);
+
+    /**
+     * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param configKey 鍙傛暟閿悕
+     * @return 鍙傛暟閿��
+     */
+    String selectConfigByKey(String configKey);
+
+    /**
+     * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 鍙傛暟閰嶇疆闆嗗悎
+     */
+    List<SysConfig> selectConfigList(SysConfig config);
+
+    /**
+     * 鏂板鍙傛暟閰嶇疆
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    int insertConfig(SysConfig config);
+
+    /**
+     * 淇敼鍙傛暟閰嶇疆
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    int updateConfig(SysConfig config);
+
+    /**
+     * 鍒犻櫎鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param configId 鍙傛暟ID
+     * @return 缁撴灉
+     */
+    int deleteConfigById(Long configId);
+
+    /**
+     * 鎵归噺鍒犻櫎鍙傛暟淇℃伅
+     * 
+     * @param configIds 闇�瑕佸垹闄ょ殑鍙傛暟ID
+     * @return 缁撴灉
+     */
+    int deleteConfigByIds(Long[] configIds);
+
+    /**
+     * 鏍¢獙鍙傛暟閿悕鏄惁鍞竴
+     * 
+     * @param config 鍙傛暟淇℃伅
+     * @return 缁撴灉
+     */
+    String checkConfigKeyUnique(SysConfig config);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDeptService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDeptService.java
new file mode 100644
index 0000000..626f651
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDeptService.java
@@ -0,0 +1,103 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+
+/**
+ * 閮ㄩ棬绠$悊 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysDeptService
+{
+    /**
+     * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 閮ㄩ棬淇℃伅闆嗗悎
+     */
+    List<SysDept> selectDeptList(SysDept dept);
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佹爲缁撴瀯
+     * 
+     * @param depts 閮ㄩ棬鍒楄〃
+     * @return 鏍戠粨鏋勫垪琛�
+     */
+    List<SysDept> buildDeptTree(List<SysDept> depts);
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佷笅鎷夋爲缁撴瀯
+     * 
+     * @param depts 閮ㄩ棬鍒楄〃
+     * @return 涓嬫媺鏍戠粨鏋勫垪琛�
+     */
+    List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts);
+
+    /**
+     * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 閫変腑閮ㄩ棬鍒楄〃
+     */
+    List<Integer> selectDeptListByRoleId(Long roleId);
+
+    /**
+     * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 閮ㄩ棬淇℃伅
+     */
+    SysDept selectDeptById(Long deptId);
+
+    /**
+     * 鏄惁瀛樺湪閮ㄩ棬瀛愯妭鐐�
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    boolean hasChildByDeptId(Long deptId);
+
+    /**
+     * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦�
+     */
+    boolean checkDeptExistUser(Long deptId);
+
+    /**
+     * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    String checkDeptNameUnique(SysDept dept);
+
+    /**
+     * 鏂板淇濆瓨閮ㄩ棬淇℃伅
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    int insertDept(SysDept dept);
+
+    /**
+     * 淇敼淇濆瓨閮ㄩ棬淇℃伅
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    int updateDept(SysDept dept);
+
+    /**
+     * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    int deleteDeptById(Long deptId);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictDataService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictDataService.java
new file mode 100644
index 0000000..ca28aff
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictDataService.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+
+/**
+ * 瀛楀吀 涓氬姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysDictDataService
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    List<SysDictData> selectDictDataList(SysDictData dictData);
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    List<SysDictData> selectDictDataByType(String dictType);
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭�
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @param dictValue 瀛楀吀閿��
+     * @return 瀛楀吀鏍囩
+     */
+    String selectDictLabel(String dictType, String dictValue);
+
+    /**
+     * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅
+     * 
+     * @param dictCode 瀛楀吀鏁版嵁ID
+     * @return 瀛楀吀鏁版嵁
+     */
+    SysDictData selectDictDataById(Long dictCode);
+
+    /**
+     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictCode 瀛楀吀鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDictDataById(Long dictCode);
+
+    /**
+     * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictCodes 闇�瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDictDataByIds(Long[] dictCodes);
+
+    /**
+     * 鏂板淇濆瓨瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 缁撴灉
+     */
+    int insertDictData(SysDictData dictData);
+
+    /**
+     * 淇敼淇濆瓨瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 缁撴灉
+     */
+    int updateDictData(SysDictData dictData);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictTypeService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictTypeService.java
new file mode 100644
index 0000000..cc3c0cf
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysDictTypeService.java
@@ -0,0 +1,83 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysDictType;
+
+/**
+ * 瀛楀吀 涓氬姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysDictTypeService
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅
+     */
+    List<SysDictType> selectDictTypeList(SysDictType dictType);
+
+    /**
+     * 鏍规嵁鎵�鏈夊瓧鍏哥被鍨�
+     * 
+     * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅
+     */
+    List<SysDictType> selectDictTypeAll();
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅
+     * 
+     * @param dictId 瀛楀吀绫诲瀷ID
+     * @return 瀛楀吀绫诲瀷
+     */
+    SysDictType selectDictTypeById(Long dictId);
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀绫诲瀷
+     */
+    SysDictType selectDictTypeByType(String dictType);
+
+    /**
+     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀淇℃伅
+     * 
+     * @param dictId 瀛楀吀ID
+     * @return 缁撴灉
+     */
+    int deleteDictTypeById(Long dictId);
+
+    /**
+     * 鎵归噺鍒犻櫎瀛楀吀淇℃伅
+     * 
+     * @param dictIds 闇�瑕佸垹闄ょ殑瀛楀吀ID
+     * @return 缁撴灉
+     */
+    int deleteDictTypeByIds(Long[] dictIds);
+
+    /**
+     * 鏂板淇濆瓨瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 缁撴灉
+     */
+    int insertDictType(SysDictType dictType);
+
+    /**
+     * 淇敼淇濆瓨瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 缁撴灉
+     */
+    int updateDictType(SysDictType dictType);
+
+    /**
+     * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓�
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 缁撴灉
+     */
+    String checkDictTypeUnique(SysDictType dictType);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysMenuService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysMenuService.java
new file mode 100644
index 0000000..8aa7aa5
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysMenuService.java
@@ -0,0 +1,129 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import java.util.Set;
+
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import com.dingzhuo.energy.project.system.domain.SysMenu;
+import com.dingzhuo.energy.project.system.domain.vo.RouterVo;
+
+/**
+ * 鑿滃崟 涓氬姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysMenuService
+{
+    /**
+     * 鏌ヨ绯荤粺鑿滃崟鍒楄〃
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 鑿滃崟鍒楄〃
+     */
+    List<SysMenu> selectMenuList(SysMenu menu);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鏉冮檺鍒楄〃
+     */
+    Set<String> selectMenuPermsByUserId(Long userId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鑿滃崟鏍戜俊鎭�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鑿滃崟鍒楄〃
+     */
+    List<SysMenu> selectMenuTreeByUserId(Long userId);
+
+    /**
+     * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 閫変腑鑿滃崟鍒楄〃
+     */
+    List<Integer> selectMenuListByRoleId(Long roleId);
+
+    /**
+     * 鏋勫缓鍓嶇璺敱鎵�闇�瑕佺殑鑿滃崟
+     * 
+     * @param menus 鑿滃崟鍒楄〃
+     * @return 璺敱鍒楄〃
+     */
+    List<RouterVo> buildMenus(List<SysMenu> menus);
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佹爲缁撴瀯
+     * 
+     * @param menus 鑿滃崟鍒楄〃
+     * @return 鏍戠粨鏋勫垪琛�
+     */
+    List<SysMenu> buildMenuTree(List<SysMenu> menus);
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佷笅鎷夋爲缁撴瀯
+     * 
+     * @param menus 鑿滃崟鍒楄〃
+     * @return 涓嬫媺鏍戠粨鏋勫垪琛�
+     */
+    List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);
+
+    /**
+     * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 鑿滃崟淇℃伅
+     */
+    SysMenu selectMenuById(Long menuId);
+
+    /**
+     * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐�
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦�
+     */
+    boolean hasChildByMenuId(Long menuId);
+
+    /**
+     * 鏌ヨ鑿滃崟鏄惁瀛樺湪瑙掕壊
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦�
+     */
+    boolean checkMenuExistRole(Long menuId);
+
+    /**
+     * 鏂板淇濆瓨鑿滃崟淇℃伅
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    int insertMenu(SysMenu menu);
+
+    /**
+     * 淇敼淇濆瓨鑿滃崟淇℃伅
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    int updateMenu(SysMenu menu);
+
+    /**
+     * 鍒犻櫎鑿滃崟绠$悊淇℃伅
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉
+     */
+    int deleteMenuById(Long menuId);
+
+    /**
+     * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    String checkMenuNameUnique(SysMenu menu);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysNoticeService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysNoticeService.java
new file mode 100644
index 0000000..7458ea7
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysNoticeService.java
@@ -0,0 +1,60 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysNotice;
+
+/**
+ * 鍏憡 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysNoticeService
+{
+    /**
+     * 鏌ヨ鍏憡淇℃伅
+     * 
+     * @param noticeId 鍏憡ID
+     * @return 鍏憡淇℃伅
+     */
+    SysNotice selectNoticeById(Long noticeId);
+
+    /**
+     * 鏌ヨ鍏憡鍒楄〃
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 鍏憡闆嗗悎
+     */
+    List<SysNotice> selectNoticeList(SysNotice notice);
+
+    /**
+     * 鏂板鍏憡
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 缁撴灉
+     */
+    int insertNotice(SysNotice notice);
+
+    /**
+     * 淇敼鍏憡
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 缁撴灉
+     */
+    int updateNotice(SysNotice notice);
+
+    /**
+     * 鍒犻櫎鍏憡淇℃伅
+     * 
+     * @param noticeId 鍏憡ID
+     * @return 缁撴灉
+     */
+    int deleteNoticeById(Long noticeId);
+    
+    /**
+     * 鎵归噺鍒犻櫎鍏憡淇℃伅
+     * 
+     * @param noticeIds 闇�瑕佸垹闄ょ殑鍏憡ID
+     * @return 缁撴灉
+     */
+    int deleteNoticeByIds(Long noticeIds);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysPostService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysPostService.java
new file mode 100644
index 0000000..cad7150
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysPostService.java
@@ -0,0 +1,100 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysPost;
+
+/**
+ * 宀椾綅淇℃伅 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysPostService
+{
+    /**
+     * 鏌ヨ宀椾綅淇℃伅闆嗗悎
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 宀椾綅鍒楄〃
+     */
+    List<SysPost> selectPostList(SysPost post);
+
+    /**
+     * 鏌ヨ鎵�鏈夊矖浣�
+     * 
+     * @return 宀椾綅鍒楄〃
+     */
+    List<SysPost> selectPostAll();
+
+    /**
+     * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅
+     * 
+     * @param postId 宀椾綅ID
+     * @return 瑙掕壊瀵硅薄淇℃伅
+     */
+    SysPost selectPostById(Long postId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 閫変腑宀椾綅ID鍒楄〃
+     */
+    List<Integer> selectPostListByUserId(Long userId);
+
+    /**
+     * 鏍¢獙宀椾綅鍚嶇О
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    String checkPostNameUnique(SysPost post);
+
+    /**
+     * 鏍¢獙宀椾綅缂栫爜
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    String checkPostCodeUnique(SysPost post);
+
+    /**
+     * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺
+     * 
+     * @param postId 宀椾綅ID
+     * @return 缁撴灉
+     */
+    int countUserPostById(Long postId);
+
+    /**
+     * 鍒犻櫎宀椾綅淇℃伅
+     * 
+     * @param postId 宀椾綅ID
+     * @return 缁撴灉
+     */
+    int deletePostById(Long postId);
+
+    /**
+     * 鎵归噺鍒犻櫎宀椾綅淇℃伅
+     * 
+     * @param postIds 闇�瑕佸垹闄ょ殑宀椾綅ID
+     * @return 缁撴灉
+     * @throws Exception 寮傚父
+     */
+    int deletePostByIds(Long[] postIds);
+
+    /**
+     * 鏂板淇濆瓨宀椾綅淇℃伅
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    int insertPost(SysPost post);
+
+    /**
+     * 淇敼淇濆瓨宀椾綅淇℃伅
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    int updatePost(SysPost post);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysRoleService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysRoleService.java
new file mode 100644
index 0000000..aecbfbc
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysRoleService.java
@@ -0,0 +1,131 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import java.util.Set;
+import com.dingzhuo.energy.project.system.domain.SysRole;
+
+/**
+ * 瑙掕壊涓氬姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysRoleService
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅
+     */
+    List<SysRole> selectRoleList(SysRole role);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ瑙掕壊
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鏉冮檺鍒楄〃
+     */
+    Set<String> selectRolePermissionByUserId(Long userId);
+
+    /**
+     * 鏌ヨ鎵�鏈夎鑹�
+     * 
+     * @return 瑙掕壊鍒楄〃
+     */
+    List<SysRole> selectRoleAll();
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 閫変腑瑙掕壊ID鍒楄〃
+     */
+    List<Integer> selectRoleListByUserId(Long userId);
+
+    /**
+     * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 瑙掕壊瀵硅薄淇℃伅
+     */
+    SysRole selectRoleById(Long roleId);
+
+    /**
+     * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    String checkRoleNameUnique(SysRole role);
+
+    /**
+     * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    String checkRoleKeyUnique(SysRole role);
+
+    /**
+     * 鏍¢獙瑙掕壊鏄惁鍏佽鎿嶄綔
+     * 
+     * @param role 瑙掕壊淇℃伅
+     */
+    void checkRoleAllowed(SysRole role);
+
+    /**
+     * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int countUserRoleByRoleId(Long roleId);
+
+    /**
+     * 鏂板淇濆瓨瑙掕壊淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    int insertRole(SysRole role);
+
+    /**
+     * 淇敼淇濆瓨瑙掕壊淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    int updateRole(SysRole role);
+
+    /**
+     * 淇敼瑙掕壊鐘舵��
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    int updateRoleStatus(SysRole role);
+
+    /**
+     * 淇敼鏁版嵁鏉冮檺淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    int authDataScope(SysRole role);
+
+    /**
+     * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int deleteRoleById(Long roleId);
+
+    /**
+     * 鎵归噺鍒犻櫎瑙掕壊淇℃伅
+     * 
+     * @param roleIds 闇�瑕佸垹闄ょ殑瑙掕壊ID
+     * @return 缁撴灉
+     */
+    int deleteRoleByIds(Long[] roleIds);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserOnlineService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserOnlineService.java
new file mode 100644
index 0000000..cccf41d
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserOnlineService.java
@@ -0,0 +1,50 @@
+package com.dingzhuo.energy.project.system.service;
+
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.monitor.domain.SysUserOnline;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.monitor.domain.SysUserOnline;
+
+/**
+ * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysUserOnlineService
+{
+    /**
+     * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅
+     * 
+     * @param ipaddr 鐧诲綍鍦板潃
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     */
+    SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user);
+
+    /**
+     * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅
+     * 
+     * @param userName 鐢ㄦ埛鍚嶇О
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     */
+    SysUserOnline selectOnlineByUserName(String userName, LoginUser user);
+
+    /**
+     * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅
+     * 
+     * @param ipaddr 鐧诲綍鍦板潃
+     * @param userName 鐢ㄦ埛鍚嶇О
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     */
+    SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user);
+
+    /**
+     * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛
+     */
+    SysUserOnline loginUserToUserOnline(LoginUser user);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserService.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserService.java
new file mode 100644
index 0000000..a2c1538
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/ISysUserService.java
@@ -0,0 +1,167 @@
+package com.dingzhuo.energy.project.system.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+
+/**
+ * 鐢ㄦ埛 涓氬姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface ISysUserService
+{
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅
+     */
+    List<SysUser> selectUserList(SysUser user);
+
+    /**
+     * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴�
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛瀵硅薄淇℃伅
+     */
+    SysUser selectUserByUserName(String userName);
+
+    /**
+     * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鐢ㄦ埛瀵硅薄淇℃伅
+     */
+    SysUser selectUserById(Long userId);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鐢ㄦ埛鎵�灞炶鑹茬粍
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 缁撴灉
+     */
+    String selectUserRoleGroup(String userName);
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鐢ㄦ埛鎵�灞炲矖浣嶇粍
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 缁撴灉
+     */
+    String selectUserPostGroup(String userName);
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴
+     * 
+     * @param userName 鐢ㄦ埛鍚嶇О
+     * @return 缁撴灉
+     */
+    String checkUserNameUnique(String userName);
+
+    /**
+     * 鏍¢獙鎵嬫満鍙风爜鏄惁鍞竴
+     *
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    String checkPhoneUnique(SysUser user);
+
+    /**
+     * 鏍¢獙email鏄惁鍞竴
+     *
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    String checkEmailUnique(SysUser user);
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鏄惁鍏佽鎿嶄綔
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     */
+    void checkUserAllowed(SysUser user);
+
+    /**
+     * 鏂板鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    int insertUser(SysUser user);
+
+    /**
+     * 淇敼鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    int updateUser(SysUser user);
+
+    /**
+     * 淇敼鐢ㄦ埛鐘舵��
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    int updateUserStatus(SysUser user);
+
+    /**
+     * 淇敼鐢ㄦ埛鍩烘湰淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    int updateUserProfile(SysUser user);
+
+    /**
+     * 淇敼鐢ㄦ埛澶村儚
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @param avatar 澶村儚鍦板潃
+     * @return 缁撴灉
+     */
+    boolean updateUserAvatar(String userName, String avatar);
+
+    /**
+     * 閲嶇疆鐢ㄦ埛瀵嗙爜
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    int resetPwd(SysUser user);
+
+    /**
+     * 閲嶇疆鐢ㄦ埛瀵嗙爜
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @param password 瀵嗙爜
+     * @return 缁撴灉
+     */
+    int resetUserPwd(String userName, String password);
+
+    /**
+     * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    int deleteUserById(Long userId);
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅
+     * 
+     * @param userIds 闇�瑕佸垹闄ょ殑鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    int deleteUserByIds(Long[] userIds);
+
+    /**
+     * 瀵煎叆鐢ㄦ埛鏁版嵁
+     * 
+     * @param userList 鐢ㄦ埛鏁版嵁鍒楄〃
+     * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁
+     * @param operName 鎿嶄綔鐢ㄦ埛
+     * @return 缁撴灉
+     */
+    String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysConfigServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysConfigServiceImpl.java
new file mode 100644
index 0000000..ac7ba86
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysConfigServiceImpl.java
@@ -0,0 +1,129 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.project.system.domain.SysConfig;
+import com.dingzhuo.energy.project.system.mapper.SysConfigMapper;
+import com.dingzhuo.energy.project.system.service.ISysConfigService;
+
+/**
+ * 鍙傛暟閰嶇疆 鏈嶅姟灞傚疄鐜�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysConfigServiceImpl implements ISysConfigService
+{
+    @Autowired
+    private SysConfigMapper configMapper;
+
+    /**
+     * 鏌ヨ鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param configId 鍙傛暟閰嶇疆ID
+     * @return 鍙傛暟閰嶇疆淇℃伅
+     */
+    @Override
+    public SysConfig selectConfigById(Long configId)
+    {
+        SysConfig config = new SysConfig();
+        config.setConfigId(configId);
+        return configMapper.selectConfig(config);
+    }
+
+    /**
+     * 鏍规嵁閿悕鏌ヨ鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param configKey 鍙傛暟key
+     * @return 鍙傛暟閿��
+     */
+    @Override
+    public String selectConfigByKey(String configKey)
+    {
+        SysConfig config = new SysConfig();
+        config.setConfigKey(configKey);
+        SysConfig retConfig = configMapper.selectConfig(config);
+        return StringUtils.isNotNull(retConfig) ? retConfig.getConfigValue() : "";
+    }
+
+    /**
+     * 鏌ヨ鍙傛暟閰嶇疆鍒楄〃
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 鍙傛暟閰嶇疆闆嗗悎
+     */
+    @Override
+    public List<SysConfig> selectConfigList(SysConfig config)
+    {
+        return configMapper.selectConfigList(config);
+    }
+
+    /**
+     * 鏂板鍙傛暟閰嶇疆
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertConfig(SysConfig config)
+    {
+        return configMapper.insertConfig(config);
+    }
+
+    /**
+     * 淇敼鍙傛暟閰嶇疆
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateConfig(SysConfig config)
+    {
+        return configMapper.updateConfig(config);
+    }
+
+    /**
+     * 鍒犻櫎鍙傛暟閰嶇疆淇℃伅
+     * 
+     * @param configId 鍙傛暟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteConfigById(Long configId)
+    {
+        return configMapper.deleteConfigById(configId);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鍙傛暟淇℃伅
+     * 
+     * @param configIds 闇�瑕佸垹闄ょ殑鍙傛暟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteConfigByIds(Long[] configIds)
+    {
+        return configMapper.deleteConfigByIds(configIds);
+    }
+
+    /**
+     * 鏍¢獙鍙傛暟閿悕鏄惁鍞竴
+     * 
+     * @param config 鍙傛暟閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkConfigKeyUnique(SysConfig config)
+    {
+        Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId();
+        SysConfig info = configMapper.checkConfigKeyUnique(config.getConfigKey());
+        if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDeptServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDeptServiceImpl.java
new file mode 100644
index 0000000..62b14a3
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDeptServiceImpl.java
@@ -0,0 +1,297 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import com.dingzhuo.energy.project.system.domain.SysDept;
+import com.dingzhuo.energy.project.system.mapper.SysDeptMapper;
+import com.dingzhuo.energy.project.system.service.ISysDeptService;
+
+/**
+ * 閮ㄩ棬绠$悊 鏈嶅姟瀹炵幇
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysDeptServiceImpl implements ISysDeptService
+{
+    @Autowired
+    private SysDeptMapper deptMapper;
+
+    /**
+     * 鏌ヨ閮ㄩ棬绠$悊鏁版嵁
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 閮ㄩ棬淇℃伅闆嗗悎
+     */
+    @Override
+    @DataScope(deptAlias = "d")
+    public List<SysDept> selectDeptList(SysDept dept)
+    {
+        return deptMapper.selectDeptList(dept);
+    }
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佹爲缁撴瀯
+     * 
+     * @param depts 閮ㄩ棬鍒楄〃
+     * @return 鏍戠粨鏋勫垪琛�
+     */
+    @Override
+    public List<SysDept> buildDeptTree(List<SysDept> depts)
+    {
+        List<SysDept> returnList = new ArrayList<SysDept>();
+        List<Long> tempList = new ArrayList<Long>();
+        for (SysDept dept : depts)
+        {
+            tempList.add(dept.getDeptId());
+        }
+        for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext();)
+        {
+            SysDept dept = iterator.next();
+            // 濡傛灉鏄《绾ц妭鐐�, 閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣
+            if (!tempList.contains(dept.getParentId()))
+            {
+                recursionFn(depts, dept);
+                returnList.add(dept);
+            }
+        }
+        if (returnList.isEmpty())
+        {
+            returnList = depts;
+        }
+        return returnList;
+    }
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佷笅鎷夋爲缁撴瀯
+     * 
+     * @param depts 閮ㄩ棬鍒楄〃
+     * @return 涓嬫媺鏍戠粨鏋勫垪琛�
+     */
+    @Override
+    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
+    {
+        List<SysDept> deptTrees = buildDeptTree(depts);
+        return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    /**
+     * 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戜俊鎭�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 閫変腑閮ㄩ棬鍒楄〃
+     */
+    @Override
+    public List<Integer> selectDeptListByRoleId(Long roleId)
+    {
+        return deptMapper.selectDeptListByRoleId(roleId);
+    }
+
+    /**
+     * 鏍规嵁閮ㄩ棬ID鏌ヨ淇℃伅
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 閮ㄩ棬淇℃伅
+     */
+    @Override
+    public SysDept selectDeptById(Long deptId)
+    {
+        return deptMapper.selectDeptById(deptId);
+    }
+
+    /**
+     * 鏄惁瀛樺湪瀛愯妭鐐�
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    @Override
+    public boolean hasChildByDeptId(Long deptId)
+    {
+        int result = deptMapper.hasChildByDeptId(deptId);
+        return result > 0;
+    }
+
+    /**
+     * 鏌ヨ閮ㄩ棬鏄惁瀛樺湪鐢ㄦ埛
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉 true 瀛樺湪 false 涓嶅瓨鍦�
+     */
+    @Override
+    public boolean checkDeptExistUser(Long deptId)
+    {
+        int result = deptMapper.checkDeptExistUser(deptId);
+        return result > 0;
+    }
+
+    /**
+     * 鏍¢獙閮ㄩ棬鍚嶇О鏄惁鍞竴
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkDeptNameUnique(SysDept dept)
+    {
+        Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
+        SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId());
+        if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鏂板淇濆瓨閮ㄩ棬淇℃伅
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDept(SysDept dept)
+    {
+        SysDept info = deptMapper.selectDeptById(dept.getParentId());
+        // 濡傛灉鐖惰妭鐐逛笉涓烘甯哥姸鎬�,鍒欎笉鍏佽鏂板瀛愯妭鐐�
+        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
+        {
+            throw new CustomException("閮ㄩ棬鍋滅敤锛屼笉鍏佽鏂板");
+        }
+        dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
+        return deptMapper.insertDept(dept);
+    }
+
+    /**
+     * 淇敼淇濆瓨閮ㄩ棬淇℃伅
+     * 
+     * @param dept 閮ㄩ棬淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateDept(SysDept dept)
+    {
+        SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
+        SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
+        if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept))
+        {
+            String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
+            String oldAncestors = oldDept.getAncestors();
+            dept.setAncestors(newAncestors);
+            updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors);
+        }
+        int result = deptMapper.updateDept(dept);
+        if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()))
+        {
+            // 濡傛灉璇ラ儴闂ㄦ槸鍚敤鐘舵�侊紝鍒欏惎鐢ㄨ閮ㄩ棬鐨勬墍鏈変笂绾ч儴闂�
+            updateParentDeptStatus(dept);
+        }
+        return result;
+    }
+
+    /**
+     * 淇敼璇ラ儴闂ㄧ殑鐖剁骇閮ㄩ棬鐘舵��
+     * 
+     * @param dept 褰撳墠閮ㄩ棬
+     */
+    private void updateParentDeptStatus(SysDept dept)
+    {
+        String updateBy = dept.getUpdateBy();
+        dept = deptMapper.selectDeptById(dept.getDeptId());
+        dept.setUpdateBy(updateBy);
+        deptMapper.updateDeptStatus(dept);
+    }
+
+    /**
+     * 淇敼瀛愬厓绱犲叧绯�
+     * 
+     * @param deptId 琚慨鏀圭殑閮ㄩ棬ID
+     * @param newAncestors 鏂扮殑鐖禝D闆嗗悎
+     * @param oldAncestors 鏃х殑鐖禝D闆嗗悎
+     */
+    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors)
+    {
+        List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
+        for (SysDept child : children)
+        {
+            child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors));
+        }
+        if (children.size() > 0)
+        {
+            deptMapper.updateDeptChildren(children);
+        }
+    }
+
+    /**
+     * 鍒犻櫎閮ㄩ棬绠$悊淇℃伅
+     * 
+     * @param deptId 閮ㄩ棬ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeptById(Long deptId)
+    {
+        return deptMapper.deleteDeptById(deptId);
+    }
+
+    /**
+     * 閫掑綊鍒楄〃
+     */
+    private void recursionFn(List<SysDept> list, SysDept t)
+    {
+        // 寰楀埌瀛愯妭鐐瑰垪琛�
+        List<SysDept> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (SysDept tChild : childList)
+        {
+            if (hasChild(list, tChild))
+            {
+                // 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣
+                Iterator<SysDept> it = childList.iterator();
+                while (it.hasNext())
+                {
+                    SysDept n = it.next();
+                    recursionFn(list, n);
+                }
+            }
+        }
+    }
+
+    /**
+     * 寰楀埌瀛愯妭鐐瑰垪琛�
+     */
+    private List<SysDept> getChildList(List<SysDept> list, SysDept t)
+    {
+        List<SysDept> tlist = new ArrayList<SysDept>();
+        Iterator<SysDept> it = list.iterator();
+        while (it.hasNext())
+        {
+            SysDept n = it.next();
+            if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
+            {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣
+     */
+    private boolean hasChild(List<SysDept> list, SysDept t)
+    {
+        return getChildList(list, t).size() > 0;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictDataServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictDataServiceImpl.java
new file mode 100644
index 0000000..e3cbeac
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictDataServiceImpl.java
@@ -0,0 +1,116 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.mapper.SysDictDataMapper;
+import com.dingzhuo.energy.project.system.service.ISysDictDataService;
+
+/**
+ * 瀛楀吀 涓氬姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysDictDataServiceImpl implements ISysDictDataService
+{
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    @Override
+    public List<SysDictData> selectDictDataList(SysDictData dictData)
+    {
+        return dictDataMapper.selectDictDataList(dictData);
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀鏁版嵁闆嗗悎淇℃伅
+     */
+    @Override
+    public List<SysDictData> selectDictDataByType(String dictType)
+    {
+        return dictDataMapper.selectDictDataByType(dictType);
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鍜屽瓧鍏搁敭鍊兼煡璇㈠瓧鍏告暟鎹俊鎭�
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @param dictValue 瀛楀吀閿��
+     * @return 瀛楀吀鏍囩
+     */
+    @Override
+    public String selectDictLabel(String dictType, String dictValue)
+    {
+        return dictDataMapper.selectDictLabel(dictType, dictValue);
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀鏁版嵁ID鏌ヨ淇℃伅
+     * 
+     * @param dictCode 瀛楀吀鏁版嵁ID
+     * @return 瀛楀吀鏁版嵁
+     */
+    @Override
+    public SysDictData selectDictDataById(Long dictCode)
+    {
+        return dictDataMapper.selectDictDataById(dictCode);
+    }
+
+    /**
+     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictCode 瀛楀吀鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDictDataById(Long dictCode)
+    {
+        return dictDataMapper.deleteDictDataById(dictCode);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictCodes 闇�瑕佸垹闄ょ殑瀛楀吀鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteDictDataByIds(Long[] dictCodes)
+    {
+        return dictDataMapper.deleteDictDataByIds(dictCodes);
+    }
+
+    /**
+     * 鏂板淇濆瓨瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDictData(SysDictData dictData)
+    {
+        return dictDataMapper.insertDictData(dictData);
+    }
+
+    /**
+     * 淇敼淇濆瓨瀛楀吀鏁版嵁淇℃伅
+     * 
+     * @param dictData 瀛楀吀鏁版嵁淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateDictData(SysDictData dictData)
+    {
+        return dictDataMapper.updateDictData(dictData);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictTypeServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictTypeServiceImpl.java
new file mode 100644
index 0000000..ddd3944
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysDictTypeServiceImpl.java
@@ -0,0 +1,141 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.project.system.domain.SysDictType;
+import com.dingzhuo.energy.project.system.mapper.SysDictDataMapper;
+import com.dingzhuo.energy.project.system.mapper.SysDictTypeMapper;
+import com.dingzhuo.energy.project.system.service.ISysDictTypeService;
+
+/**
+ * 瀛楀吀 涓氬姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysDictTypeServiceImpl implements ISysDictTypeService
+{
+    @Autowired
+    private SysDictTypeMapper dictTypeMapper;
+
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瀛楀吀绫诲瀷
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅
+     */
+    @Override
+    public List<SysDictType> selectDictTypeList(SysDictType dictType)
+    {
+        return dictTypeMapper.selectDictTypeList(dictType);
+    }
+
+    /**
+     * 鏍规嵁鎵�鏈夊瓧鍏哥被鍨�
+     * 
+     * @return 瀛楀吀绫诲瀷闆嗗悎淇℃伅
+     */
+    @Override
+    public List<SysDictType> selectDictTypeAll()
+    {
+        return dictTypeMapper.selectDictTypeAll();
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷ID鏌ヨ淇℃伅
+     * 
+     * @param dictId 瀛楀吀绫诲瀷ID
+     * @return 瀛楀吀绫诲瀷
+     */
+    @Override
+    public SysDictType selectDictTypeById(Long dictId)
+    {
+        return dictTypeMapper.selectDictTypeById(dictId);
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷
+     * @return 瀛楀吀绫诲瀷
+     */
+    public SysDictType selectDictTypeByType(String dictType)
+    {
+        return dictTypeMapper.selectDictTypeByType(dictType);
+    }
+
+    /**
+     * 閫氳繃瀛楀吀ID鍒犻櫎瀛楀吀淇℃伅
+     * 
+     * @param dictId 瀛楀吀ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDictTypeById(Long dictId)
+    {
+        return dictTypeMapper.deleteDictTypeById(dictId);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictIds 闇�瑕佸垹闄ょ殑瀛楀吀ID
+     * @return 缁撴灉
+     */
+    public int deleteDictTypeByIds(Long[] dictIds)
+    {
+        return dictTypeMapper.deleteDictTypeByIds(dictIds);
+    }
+
+    /**
+     * 鏂板淇濆瓨瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDictType(SysDictType dictType)
+    {
+        return dictTypeMapper.insertDictType(dictType);
+    }
+
+    /**
+     * 淇敼淇濆瓨瀛楀吀绫诲瀷淇℃伅
+     * 
+     * @param dictType 瀛楀吀绫诲瀷淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public int updateDictType(SysDictType dictType)
+    {
+        SysDictType oldDict = dictTypeMapper.selectDictTypeById(dictType.getDictId());
+        dictDataMapper.updateDictDataType(oldDict.getDictType(), dictType.getDictType());
+        return dictTypeMapper.updateDictType(dictType);
+    }
+
+    /**
+     * 鏍¢獙瀛楀吀绫诲瀷绉版槸鍚﹀敮涓�
+     * 
+     * @param dict 瀛楀吀绫诲瀷
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkDictTypeUnique(SysDictType dict)
+    {
+        Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId();
+        SysDictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType());
+        if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysMenuServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysMenuServiceImpl.java
new file mode 100644
index 0000000..6dad65d
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysMenuServiceImpl.java
@@ -0,0 +1,361 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.web.domain.TreeSelect;
+import com.dingzhuo.energy.project.system.domain.SysMenu;
+import com.dingzhuo.energy.project.system.domain.vo.MetaVo;
+import com.dingzhuo.energy.project.system.domain.vo.RouterVo;
+import com.dingzhuo.energy.project.system.mapper.SysMenuMapper;
+import com.dingzhuo.energy.project.system.mapper.SysRoleMenuMapper;
+import com.dingzhuo.energy.project.system.service.ISysMenuService;
+
+/**
+ * 鑿滃崟 涓氬姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysMenuServiceImpl implements ISysMenuService
+{
+    public static final String PREMISSION_STRING = "perms[\"{0}\"]";
+
+    @Autowired
+    private SysMenuMapper menuMapper;
+
+    @Autowired
+    private SysRoleMenuMapper roleMenuMapper;
+
+    /**
+     * 鏌ヨ绯荤粺鑿滃崟鍒楄〃
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 鑿滃崟鍒楄〃
+     */
+    @Override
+    public List<SysMenu> selectMenuList(SysMenu menu)
+    {
+        List<SysMenu> menuList = menuMapper.selectMenuList(menu);
+        return menuList;
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鏉冮檺鍒楄〃
+     */
+    @Override
+    public Set<String> selectMenuPermsByUserId(Long userId)
+    {
+        List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
+        Set<String> permsSet = new HashSet<>();
+        for (String perm : perms)
+        {
+            if (StringUtils.isNotEmpty(perm))
+            {
+                permsSet.addAll(Arrays.asList(perm.trim().split(",")));
+            }
+        }
+        return permsSet;
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛鍚嶇О鏌ヨ鑿滃崟
+     * 
+     * @param username 鐢ㄦ埛鍚嶇О
+     * @return 鑿滃崟鍒楄〃
+     */
+    @Override
+    public List<SysMenu> selectMenuTreeByUserId(Long userId)
+    {
+        List<SysMenu> menus = null;
+        if (SecurityUtils.isAdmin(userId))
+        {
+            menus = menuMapper.selectMenuTreeAll();
+        }
+        else
+        {
+            menus = menuMapper.selectMenuTreeByUserId(userId);
+        }
+        return getChildPerms(menus, 0);
+    }
+
+    /**
+     * 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戜俊鎭�
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 閫変腑鑿滃崟鍒楄〃
+     */
+    public List<Integer> selectMenuListByRoleId(Long roleId)
+    {
+        return menuMapper.selectMenuListByRoleId(roleId);
+    }
+
+    /**
+     * 鏋勫缓鍓嶇璺敱鎵�闇�瑕佺殑鑿滃崟
+     * 
+     * @param menus 鑿滃崟鍒楄〃
+     * @return 璺敱鍒楄〃
+     */
+    @Override
+    public List<RouterVo> buildMenus(List<SysMenu> menus)
+    {
+        List<RouterVo> routers = new LinkedList<RouterVo>();
+        for (SysMenu menu : menus)
+        {
+            RouterVo router = new RouterVo();
+            router.setName(StringUtils.capitalize(menu.getPath()));
+            router.setPath(getRouterPath(menu));
+            router.setComponent(StringUtils.isEmpty(menu.getComponent()) ? "Layout" : menu.getComponent());
+            router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon()));
+            router.setPageQueryParameter(menu.getParameter());
+            List<SysMenu> cMenus = menu.getChildren();
+            if (!cMenus.isEmpty() && cMenus.size() > 0 && "M".equals(menu.getMenuType()))
+            {
+                router.setAlwaysShow(true);
+                router.setRedirect("noRedirect");
+                router.setChildren(buildMenus(cMenus));
+            }
+            routers.add(router);
+        }
+        return routers;
+    }
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佹爲缁撴瀯
+     * 
+     * @param menus 鑿滃崟鍒楄〃
+     * @return 鏍戠粨鏋勫垪琛�
+     */
+    @Override
+    public List<SysMenu> buildMenuTree(List<SysMenu> menus)
+    {
+        List<SysMenu> returnList = new ArrayList<SysMenu>();
+        for (Iterator<SysMenu> iterator = menus.iterator(); iterator.hasNext();)
+        {
+            SysMenu t = iterator.next();
+            // 鏍规嵁浼犲叆鐨勬煇涓埗鑺傜偣ID,閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣
+            if (t.getParentId() == 0)
+            {
+                recursionFn(menus, t);
+                returnList.add(t);
+            }
+        }
+        if (returnList.isEmpty())
+        {
+            returnList = menus;
+        }
+        return returnList;
+    }
+
+    /**
+     * 鏋勫缓鍓嶇鎵�闇�瑕佷笅鎷夋爲缁撴瀯
+     * 
+     * @param menus 鑿滃崟鍒楄〃
+     * @return 涓嬫媺鏍戠粨鏋勫垪琛�
+     */
+    @Override
+    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus)
+    {
+        List<SysMenu> menuTrees = buildMenuTree(menus);
+        return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
+    }
+
+    /**
+     * 鏍规嵁鑿滃崟ID鏌ヨ淇℃伅
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 鑿滃崟淇℃伅
+     */
+    @Override
+    public SysMenu selectMenuById(Long menuId)
+    {
+        return menuMapper.selectMenuById(menuId);
+    }
+
+    /**
+     * 鏄惁瀛樺湪鑿滃崟瀛愯妭鐐�
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public boolean hasChildByMenuId(Long menuId)
+    {
+        int result = menuMapper.hasChildByMenuId(menuId);
+        return result > 0;
+    }
+
+    /**
+     * 鏌ヨ鑿滃崟浣跨敤鏁伴噺
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public boolean checkMenuExistRole(Long menuId)
+    {
+        int result = roleMenuMapper.checkMenuExistRole(menuId);
+        return result > 0;
+    }
+
+    /**
+     * 鏂板淇濆瓨鑿滃崟淇℃伅
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertMenu(SysMenu menu)
+    {
+        return menuMapper.insertMenu(menu);
+    }
+
+    /**
+     * 淇敼淇濆瓨鑿滃崟淇℃伅
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateMenu(SysMenu menu)
+    {
+        return menuMapper.updateMenu(menu);
+    }
+
+    /**
+     * 鍒犻櫎鑿滃崟绠$悊淇℃伅
+     * 
+     * @param menuId 鑿滃崟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteMenuById(Long menuId)
+    {
+        return menuMapper.deleteMenuById(menuId);
+    }
+
+    /**
+     * 鏍¢獙鑿滃崟鍚嶇О鏄惁鍞竴
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkMenuNameUnique(SysMenu menu)
+    {
+        Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
+        SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
+        if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鑾峰彇璺敱鍦板潃
+     * 
+     * @param menu 鑿滃崟淇℃伅
+     * @return 璺敱鍦板潃
+     */
+    public String getRouterPath(SysMenu menu)
+    {
+        String routerPath = menu.getPath();
+        // 闈炲閾惧苟涓旀槸涓�绾х洰褰�
+        if (0 == menu.getParentId() && "1".equals(menu.getIsFrame()))
+        {
+            routerPath = "/" + menu.getPath();
+        }
+        return routerPath;
+    }
+
+    /**
+     * 鏍规嵁鐖惰妭鐐圭殑ID鑾峰彇鎵�鏈夊瓙鑺傜偣
+     * 
+     * @param list 鍒嗙被琛�
+     * @param parentId 浼犲叆鐨勭埗鑺傜偣ID
+     * @return String
+     */
+    public List<SysMenu> getChildPerms(List<SysMenu> list, int parentId)
+    {
+        List<SysMenu> returnList = new ArrayList<SysMenu>();
+        for (Iterator<SysMenu> iterator = list.iterator(); iterator.hasNext();)
+        {
+            SysMenu t = iterator.next();
+            // 涓�銆佹牴鎹紶鍏ョ殑鏌愪釜鐖惰妭鐐笽D,閬嶅巻璇ョ埗鑺傜偣鐨勬墍鏈夊瓙鑺傜偣
+            if (t.getParentId() == parentId)
+            {
+                recursionFn(list, t);
+                returnList.add(t);
+            }
+        }
+        return returnList;
+    }
+
+    /**
+     * 閫掑綊鍒楄〃
+     * 
+     * @param list
+     * @param t
+     */
+    private void recursionFn(List<SysMenu> list, SysMenu t)
+    {
+        // 寰楀埌瀛愯妭鐐瑰垪琛�
+        List<SysMenu> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (SysMenu tChild : childList)
+        {
+            if (hasChild(list, tChild))
+            {
+                // 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣
+                Iterator<SysMenu> it = childList.iterator();
+                while (it.hasNext())
+                {
+                    SysMenu n = it.next();
+                    recursionFn(list, n);
+                }
+            }
+        }
+    }
+
+    /**
+     * 寰楀埌瀛愯妭鐐瑰垪琛�
+     */
+    private List<SysMenu> getChildList(List<SysMenu> list, SysMenu t)
+    {
+        List<SysMenu> tlist = new ArrayList<SysMenu>();
+        Iterator<SysMenu> it = list.iterator();
+        while (it.hasNext())
+        {
+            SysMenu n = it.next();
+            if (n.getParentId().longValue() == t.getMenuId().longValue())
+            {
+                tlist.add(n);
+            }
+        }
+        return tlist;
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁鏈夊瓙鑺傜偣
+     */
+    private boolean hasChild(List<SysMenu> list, SysMenu t)
+    {
+        return getChildList(list, t).size() > 0;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysNoticeServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysNoticeServiceImpl.java
new file mode 100644
index 0000000..39f1a7e
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysNoticeServiceImpl.java
@@ -0,0 +1,91 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.system.domain.SysNotice;
+import com.dingzhuo.energy.project.system.mapper.SysNoticeMapper;
+import com.dingzhuo.energy.project.system.service.ISysNoticeService;
+
+/**
+ * 鍏憡 鏈嶅姟灞傚疄鐜�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysNoticeServiceImpl implements ISysNoticeService
+{
+    @Autowired
+    private SysNoticeMapper noticeMapper;
+
+    /**
+     * 鏌ヨ鍏憡淇℃伅
+     * 
+     * @param noticeId 鍏憡ID
+     * @return 鍏憡淇℃伅
+     */
+    @Override
+    public SysNotice selectNoticeById(Long noticeId)
+    {
+        return noticeMapper.selectNoticeById(noticeId);
+    }
+
+    /**
+     * 鏌ヨ鍏憡鍒楄〃
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 鍏憡闆嗗悎
+     */
+    @Override
+    public List<SysNotice> selectNoticeList(SysNotice notice)
+    {
+        return noticeMapper.selectNoticeList(notice);
+    }
+
+    /**
+     * 鏂板鍏憡
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertNotice(SysNotice notice)
+    {
+        return noticeMapper.insertNotice(notice);
+    }
+
+    /**
+     * 淇敼鍏憡
+     * 
+     * @param notice 鍏憡淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateNotice(SysNotice notice)
+    {
+        return noticeMapper.updateNotice(notice);
+    }
+
+    /**
+     * 鍒犻櫎鍏憡瀵硅薄
+     * 
+     * @param noticeId 鍏憡ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteNoticeById(Long noticeId)
+    {
+        return noticeMapper.deleteNoticeById(noticeId);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鍏憡淇℃伅
+     * 
+     * @param noticeIds 闇�瑕佸垹闄ょ殑鍏憡ID
+     * @return 缁撴灉
+     */
+    public int deleteNoticeByIds(Long noticeIds)
+    {
+        return noticeMapper.deleteNoticeByIds(noticeIds);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysPostServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysPostServiceImpl.java
new file mode 100644
index 0000000..f6b3bfb
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysPostServiceImpl.java
@@ -0,0 +1,177 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.project.system.domain.SysPost;
+import com.dingzhuo.energy.project.system.mapper.SysPostMapper;
+import com.dingzhuo.energy.project.system.mapper.SysUserPostMapper;
+import com.dingzhuo.energy.project.system.service.ISysPostService;
+
+/**
+ * 宀椾綅淇℃伅 鏈嶅姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysPostServiceImpl implements ISysPostService
+{
+    @Autowired
+    private SysPostMapper postMapper;
+
+    @Autowired
+    private SysUserPostMapper userPostMapper;
+
+    /**
+     * 鏌ヨ宀椾綅淇℃伅闆嗗悎
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 宀椾綅淇℃伅闆嗗悎
+     */
+    @Override
+    public List<SysPost> selectPostList(SysPost post)
+    {
+        return postMapper.selectPostList(post);
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夊矖浣�
+     * 
+     * @return 宀椾綅鍒楄〃
+     */
+    @Override
+    public List<SysPost> selectPostAll()
+    {
+        return postMapper.selectPostAll();
+    }
+
+    /**
+     * 閫氳繃宀椾綅ID鏌ヨ宀椾綅淇℃伅
+     * 
+     * @param postId 宀椾綅ID
+     * @return 瑙掕壊瀵硅薄淇℃伅
+     */
+    @Override
+    public SysPost selectPostById(Long postId)
+    {
+        return postMapper.selectPostById(postId);
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鑾峰彇宀椾綅閫夋嫨妗嗗垪琛�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 閫変腑宀椾綅ID鍒楄〃
+     */
+    public List<Integer> selectPostListByUserId(Long userId)
+    {
+        return postMapper.selectPostListByUserId(userId);
+    }
+
+    /**
+     * 鏍¢獙宀椾綅鍚嶇О鏄惁鍞竴
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkPostNameUnique(SysPost post)
+    {
+        Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId();
+        SysPost info = postMapper.checkPostNameUnique(post.getPostName());
+        if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鏍¢獙宀椾綅缂栫爜鏄惁鍞竴
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkPostCodeUnique(SysPost post)
+    {
+        Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId();
+        SysPost info = postMapper.checkPostCodeUnique(post.getPostCode());
+        if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 閫氳繃宀椾綅ID鏌ヨ宀椾綅浣跨敤鏁伴噺
+     * 
+     * @param postId 宀椾綅ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int countUserPostById(Long postId)
+    {
+        return userPostMapper.countUserPostById(postId);
+    }
+
+    /**
+     * 鍒犻櫎宀椾綅淇℃伅
+     * 
+     * @param postId 宀椾綅ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deletePostById(Long postId)
+    {
+        return postMapper.deletePostById(postId);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎宀椾綅淇℃伅
+     * 
+     * @param postIds 闇�瑕佸垹闄ょ殑宀椾綅ID
+     * @return 缁撴灉
+     * @throws Exception 寮傚父
+     */
+    public int deletePostByIds(Long[] postIds)
+    {
+        for (Long postId : postIds)
+        {
+            SysPost post = selectPostById(postId);
+            if (countUserPostById(postId) > 0)
+            {
+                throw new CustomException(String.format("%1$s宸插垎閰�,涓嶈兘鍒犻櫎", post.getPostName()));
+            }
+        }
+        return postMapper.deletePostByIds(postIds);
+    }
+
+    /**
+     * 鏂板淇濆瓨宀椾綅淇℃伅
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertPost(SysPost post)
+    {
+        return postMapper.insertPost(post);
+    }
+
+    /**
+     * 淇敼淇濆瓨宀椾綅淇℃伅
+     * 
+     * @param post 宀椾綅淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updatePost(SysPost post)
+    {
+        return postMapper.updatePost(post);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysRoleServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysRoleServiceImpl.java
new file mode 100644
index 0000000..0ce6f61
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysRoleServiceImpl.java
@@ -0,0 +1,313 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import com.dingzhuo.energy.project.system.domain.SysRole;
+import com.dingzhuo.energy.project.system.domain.SysRoleDept;
+import com.dingzhuo.energy.project.system.domain.SysRoleMenu;
+import com.dingzhuo.energy.project.system.mapper.SysRoleDeptMapper;
+import com.dingzhuo.energy.project.system.mapper.SysRoleMapper;
+import com.dingzhuo.energy.project.system.mapper.SysRoleMenuMapper;
+import com.dingzhuo.energy.project.system.mapper.SysUserRoleMapper;
+import com.dingzhuo.energy.project.system.service.ISysRoleService;
+
+/**
+ * 瑙掕壊 涓氬姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysRoleServiceImpl implements ISysRoleService
+{
+    @Autowired
+    private SysRoleMapper roleMapper;
+
+    @Autowired
+    private SysRoleMenuMapper roleMenuMapper;
+
+    @Autowired
+    private SysUserRoleMapper userRoleMapper;
+
+    @Autowired
+    private SysRoleDeptMapper roleDeptMapper;
+
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ瑙掕壊鏁版嵁
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 瑙掕壊鏁版嵁闆嗗悎淇℃伅
+     */
+    @Override
+    @DataScope(deptAlias = "d")
+    public List<SysRole> selectRoleList(SysRole role)
+    {
+        return roleMapper.selectRoleList(role);
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鏌ヨ鏉冮檺
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鏉冮檺鍒楄〃
+     */
+    @Override
+    public Set<String> selectRolePermissionByUserId(Long userId)
+    {
+        List<SysRole> perms = roleMapper.selectRolePermissionByUserId(userId);
+        Set<String> permsSet = new HashSet<>();
+        for (SysRole perm : perms)
+        {
+            if (StringUtils.isNotNull(perm))
+            {
+                permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
+            }
+        }
+        return permsSet;
+    }
+
+    /**
+     * 鏌ヨ鎵�鏈夎鑹�
+     * 
+     * @return 瑙掕壊鍒楄〃
+     */
+    public List<SysRole> selectRoleAll()
+    {
+        return roleMapper.selectRoleAll();
+    }
+
+    /**
+     * 鏍规嵁鐢ㄦ埛ID鑾峰彇瑙掕壊閫夋嫨妗嗗垪琛�
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 閫変腑瑙掕壊ID鍒楄〃
+     */
+    public List<Integer> selectRoleListByUserId(Long userId)
+    {
+        return roleMapper.selectRoleListByUserId(userId);
+    }
+
+    /**
+     * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 瑙掕壊瀵硅薄淇℃伅
+     */
+    public SysRole selectRoleById(Long roleId)
+    {
+        return roleMapper.selectRoleById(roleId);
+    }
+
+    /**
+     * 鏍¢獙瑙掕壊鍚嶇О鏄惁鍞竴
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkRoleNameUnique(SysRole role)
+    {
+        Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
+        SysRole info = roleMapper.checkRoleNameUnique(role.getRoleName());
+        if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鏍¢獙瑙掕壊鏉冮檺鏄惁鍞竴
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkRoleKeyUnique(SysRole role)
+    {
+        Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
+        SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey());
+        if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鏍¢獙瑙掕壊鏄惁鍏佽鎿嶄綔
+     * 
+     * @param role 瑙掕壊淇℃伅
+     */
+    public void checkRoleAllowed(SysRole role)
+    {
+        if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin())
+        {
+            throw new CustomException("涓嶅厑璁告搷浣滆秴绾х鐞嗗憳瑙掕壊");
+        }
+    }
+
+    /**
+     * 閫氳繃瑙掕壊ID鏌ヨ瑙掕壊浣跨敤鏁伴噺
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int countUserRoleByRoleId(Long roleId)
+    {
+        return userRoleMapper.countUserRoleByRoleId(roleId);
+    }
+
+    /**
+     * 鏂板淇濆瓨瑙掕壊淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public int insertRole(SysRole role)
+    {
+        // 鏂板瑙掕壊淇℃伅
+        roleMapper.insertRole(role);
+        return insertRoleMenu(role);
+    }
+
+    /**
+     * 淇敼淇濆瓨瑙掕壊淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public int updateRole(SysRole role)
+    {
+        // 淇敼瑙掕壊淇℃伅
+        roleMapper.updateRole(role);
+        // 鍒犻櫎瑙掕壊涓庤彍鍗曞叧鑱�
+        roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId());
+        return insertRoleMenu(role);
+    }
+
+    /**
+     * 淇敼瑙掕壊鐘舵��
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateRoleStatus(SysRole role)
+    {
+        return roleMapper.updateRole(role);
+    }
+
+    /**
+     * 淇敼鏁版嵁鏉冮檺淇℃伅
+     * 
+     * @param role 瑙掕壊淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public int authDataScope(SysRole role)
+    {
+        // 淇敼瑙掕壊淇℃伅
+        roleMapper.updateRole(role);
+        // 鍒犻櫎瑙掕壊涓庨儴闂ㄥ叧鑱�
+        roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId());
+        // 鏂板瑙掕壊鍜岄儴闂ㄤ俊鎭紙鏁版嵁鏉冮檺锛�
+        return insertRoleDept(role);
+    }
+
+    /**
+     * 鏂板瑙掕壊鑿滃崟淇℃伅
+     * 
+     * @param role 瑙掕壊瀵硅薄
+     */
+    public int insertRoleMenu(SysRole role)
+    {
+        int rows = 1;
+        // 鏂板鐢ㄦ埛涓庤鑹茬鐞�
+        List<SysRoleMenu> list = new ArrayList<SysRoleMenu>();
+        for (Long menuId : role.getMenuIds())
+        {
+            SysRoleMenu rm = new SysRoleMenu();
+            rm.setRoleId(role.getRoleId());
+            rm.setMenuId(menuId);
+            list.add(rm);
+        }
+        if (list.size() > 0)
+        {
+            rows = roleMenuMapper.batchRoleMenu(list);
+        }
+        return rows;
+    }
+
+    /**
+     * 鏂板瑙掕壊閮ㄩ棬淇℃伅(鏁版嵁鏉冮檺)
+     *
+     * @param role 瑙掕壊瀵硅薄
+     */
+    public int insertRoleDept(SysRole role)
+    {
+        int rows = 1;
+        // 鏂板瑙掕壊涓庨儴闂紙鏁版嵁鏉冮檺锛夌鐞�
+        List<SysRoleDept> list = new ArrayList<SysRoleDept>();
+        for (Long deptId : role.getDeptIds())
+        {
+            SysRoleDept rd = new SysRoleDept();
+            rd.setRoleId(role.getRoleId());
+            rd.setDeptId(deptId);
+            list.add(rd);
+        }
+        if (list.size() > 0)
+        {
+            rows = roleDeptMapper.batchRoleDept(list);
+        }
+        return rows;
+    }
+
+    /**
+     * 閫氳繃瑙掕壊ID鍒犻櫎瑙掕壊
+     * 
+     * @param roleId 瑙掕壊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteRoleById(Long roleId)
+    {
+        return roleMapper.deleteRoleById(roleId);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎瑙掕壊淇℃伅
+     * 
+     * @param roleIds 闇�瑕佸垹闄ょ殑瑙掕壊ID
+     * @return 缁撴灉
+     */
+    public int deleteRoleByIds(Long[] roleIds)
+    {
+        for (Long roleId : roleIds)
+        {
+            checkRoleAllowed(new SysRole(roleId));
+            SysRole role = selectRoleById(roleId);
+            if (countUserRoleByRoleId(roleId) > 0)
+            {
+                throw new CustomException(String.format("%1$s宸插垎閰�,涓嶈兘鍒犻櫎", role.getRoleName()));
+            }
+        }
+        return roleMapper.deleteRoleByIds(roleIds);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserOnlineServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserOnlineServiceImpl.java
new file mode 100644
index 0000000..5881231
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserOnlineServiceImpl.java
@@ -0,0 +1,97 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.monitor.domain.SysUserOnline;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.project.monitor.domain.SysUserOnline;
+import com.dingzhuo.energy.project.system.service.ISysUserOnlineService;
+
+/**
+ * 鍦ㄧ嚎鐢ㄦ埛 鏈嶅姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysUserOnlineServiceImpl implements ISysUserOnlineService
+{
+    /**
+     * 閫氳繃鐧诲綍鍦板潃鏌ヨ淇℃伅
+     * 
+     * @param ipaddr 鐧诲綍鍦板潃
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     */
+    @Override
+    public SysUserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user)
+    {
+        if (StringUtils.equals(ipaddr, user.getIpaddr()))
+        {
+            return loginUserToUserOnline(user);
+        }
+        return null;
+    }
+
+    /**
+     * 閫氳繃鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅
+     * 
+     * @param userName 鐢ㄦ埛鍚嶇О
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     */
+    @Override
+    public SysUserOnline selectOnlineByUserName(String userName, LoginUser user)
+    {
+        if (StringUtils.equals(userName, user.getUsername()))
+        {
+            return loginUserToUserOnline(user);
+        }
+        return null;
+    }
+
+    /**
+     * 閫氳繃鐧诲綍鍦板潃/鐢ㄦ埛鍚嶇О鏌ヨ淇℃伅
+     * 
+     * @param ipaddr 鐧诲綍鍦板潃
+     * @param userName 鐢ㄦ埛鍚嶇О
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     */
+    @Override
+    public SysUserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user)
+    {
+        if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
+        {
+            return loginUserToUserOnline(user);
+        }
+        return null;
+    }
+
+    /**
+     * 璁剧疆鍦ㄧ嚎鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鍦ㄧ嚎鐢ㄦ埛
+     */
+    public SysUserOnline loginUserToUserOnline(LoginUser user)
+    {
+        if (StringUtils.isNull(user) && StringUtils.isNull(user.getUser()))
+        {
+            return null;
+        }
+        SysUserOnline sysUserOnline = new SysUserOnline();
+        sysUserOnline.setTokenId(user.getToken());
+        sysUserOnline.setUserName(user.getUsername());
+        sysUserOnline.setIpaddr(user.getIpaddr());
+        sysUserOnline.setLoginLocation(user.getLoginLocation());
+        sysUserOnline.setBrowser(user.getBrowser());
+        sysUserOnline.setOs(user.getOs());
+        sysUserOnline.setLoginTime(user.getLoginTime());
+        if (StringUtils.isNotNull(user.getUser().getDept()))
+        {
+            sysUserOnline.setDeptName(user.getUser().getDept().getDeptName());
+        }
+        return sysUserOnline;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserServiceImpl.java
new file mode 100644
index 0000000..0a6acbb
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/system/service/impl/SysUserServiceImpl.java
@@ -0,0 +1,457 @@
+package com.dingzhuo.energy.project.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.dingzhuo.energy.common.constant.UserConstants;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.DataScope;
+import com.dingzhuo.energy.project.system.domain.SysPost;
+import com.dingzhuo.energy.project.system.domain.SysRole;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import com.dingzhuo.energy.project.system.domain.SysUserPost;
+import com.dingzhuo.energy.project.system.domain.SysUserRole;
+import com.dingzhuo.energy.project.system.mapper.SysPostMapper;
+import com.dingzhuo.energy.project.system.mapper.SysRoleMapper;
+import com.dingzhuo.energy.project.system.mapper.SysUserMapper;
+import com.dingzhuo.energy.project.system.mapper.SysUserPostMapper;
+import com.dingzhuo.energy.project.system.mapper.SysUserRoleMapper;
+import com.dingzhuo.energy.project.system.service.ISysConfigService;
+import com.dingzhuo.energy.project.system.service.ISysUserService;
+
+/**
+ * 鐢ㄦ埛 涓氬姟灞傚鐞�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class SysUserServiceImpl implements ISysUserService
+{
+    private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class);
+
+    @Autowired
+    private SysUserMapper userMapper;
+
+    @Autowired
+    private SysRoleMapper roleMapper;
+
+    @Autowired
+    private SysPostMapper postMapper;
+
+    @Autowired
+    private SysUserRoleMapper userRoleMapper;
+
+    @Autowired
+    private SysUserPostMapper userPostMapper;
+
+    @Autowired
+    private ISysConfigService configService;
+
+    /**
+     * 鏍规嵁鏉′欢鍒嗛〉鏌ヨ鐢ㄦ埛鍒楄〃
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 鐢ㄦ埛淇℃伅闆嗗悎淇℃伅
+     */
+    @Override
+    @DataScope(deptAlias = "d", userAlias = "u")
+    public List<SysUser> selectUserList(SysUser user)
+    {
+        return userMapper.selectUserList(user);
+    }
+
+    /**
+     * 閫氳繃鐢ㄦ埛鍚嶆煡璇㈢敤鎴�
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 鐢ㄦ埛瀵硅薄淇℃伅
+     */
+    @Override
+    public SysUser selectUserByUserName(String userName)
+    {
+        return userMapper.selectUserByUserName(userName);
+    }
+
+    /**
+     * 閫氳繃鐢ㄦ埛ID鏌ヨ鐢ㄦ埛
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 鐢ㄦ埛瀵硅薄淇℃伅
+     */
+    @Override
+    public SysUser selectUserById(Long userId)
+    {
+        return userMapper.selectUserById(userId);
+    }
+
+    /**
+     * 鏌ヨ鐢ㄦ埛鎵�灞炶鑹茬粍
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 缁撴灉
+     */
+    @Override
+    public String selectUserRoleGroup(String userName)
+    {
+        List<SysRole> list = roleMapper.selectRolesByUserName(userName);
+        StringBuffer idsStr = new StringBuffer();
+        for (SysRole role : list)
+        {
+            idsStr.append(role.getRoleName()).append(",");
+        }
+        if (StringUtils.isNotEmpty(idsStr.toString()))
+        {
+            return idsStr.substring(0, idsStr.length() - 1);
+        }
+        return idsStr.toString();
+    }
+
+    /**
+     * 鏌ヨ鐢ㄦ埛鎵�灞炲矖浣嶇粍
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @return 缁撴灉
+     */
+    @Override
+    public String selectUserPostGroup(String userName)
+    {
+        List<SysPost> list = postMapper.selectPostsByUserName(userName);
+        StringBuffer idsStr = new StringBuffer();
+        for (SysPost post : list)
+        {
+            idsStr.append(post.getPostName()).append(",");
+        }
+        if (StringUtils.isNotEmpty(idsStr.toString()))
+        {
+            return idsStr.substring(0, idsStr.length() - 1);
+        }
+        return idsStr.toString();
+    }
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴
+     * 
+     * @param userName 鐢ㄦ埛鍚嶇О
+     * @return 缁撴灉
+     */
+    @Override
+    public String checkUserNameUnique(String userName)
+    {
+        int count = userMapper.checkUserNameUnique(userName);
+        if (count > 0)
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鍚嶇О鏄惁鍞竴
+     *
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return
+     */
+    @Override
+    public String checkPhoneUnique(SysUser user)
+    {
+        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
+        SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber());
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鏍¢獙email鏄惁鍞竴
+     *
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return
+     */
+    @Override
+    public String checkEmailUnique(SysUser user)
+    {
+        Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId();
+        SysUser info = userMapper.checkEmailUnique(user.getEmail());
+        if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue())
+        {
+            return UserConstants.NOT_UNIQUE;
+        }
+        return UserConstants.UNIQUE;
+    }
+
+    /**
+     * 鏍¢獙鐢ㄦ埛鏄惁鍏佽鎿嶄綔
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     */
+    public void checkUserAllowed(SysUser user)
+    {
+        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin())
+        {
+            throw new CustomException("涓嶅厑璁告搷浣滆秴绾х鐞嗗憳鐢ㄦ埛");
+        }
+    }
+
+    /**
+     * 鏂板淇濆瓨鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public int insertUser(SysUser user)
+    {
+        // 鏂板鐢ㄦ埛淇℃伅
+        int rows = userMapper.insertUser(user);
+        // 鏂板鐢ㄦ埛宀椾綅鍏宠仈
+        insertUserPost(user);
+        // 鏂板鐢ㄦ埛涓庤鑹茬鐞�
+        insertUserRole(user);
+        return rows;
+    }
+
+    /**
+     * 淇敼淇濆瓨鐢ㄦ埛淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public int updateUser(SysUser user)
+    {
+        Long userId = user.getUserId();
+        // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱�
+        userRoleMapper.deleteUserRoleByUserId(userId);
+        // 鏂板鐢ㄦ埛涓庤鑹茬鐞�
+        insertUserRole(user);
+        // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶅叧鑱�
+        userPostMapper.deleteUserPostByUserId(userId);
+        // 鏂板鐢ㄦ埛涓庡矖浣嶇鐞�
+        insertUserPost(user);
+        return userMapper.updateUser(user);
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛鐘舵��
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateUserStatus(SysUser user)
+    {
+        return userMapper.updateUser(user);
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛鍩烘湰淇℃伅
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateUserProfile(SysUser user)
+    {
+        return userMapper.updateUser(user);
+    }
+
+    /**
+     * 淇敼鐢ㄦ埛澶村儚
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @param avatar 澶村儚鍦板潃
+     * @return 缁撴灉
+     */
+    public boolean updateUserAvatar(String userName, String avatar)
+    {
+        return userMapper.updateUserAvatar(userName, avatar) > 0;
+    }
+
+    /**
+     * 閲嶇疆鐢ㄦ埛瀵嗙爜
+     * 
+     * @param user 鐢ㄦ埛淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int resetPwd(SysUser user)
+    {
+        return userMapper.updateUser(user);
+    }
+
+    /**
+     * 閲嶇疆鐢ㄦ埛瀵嗙爜
+     * 
+     * @param userName 鐢ㄦ埛鍚�
+     * @param password 瀵嗙爜
+     * @return 缁撴灉
+     */
+    @Override
+    public int resetUserPwd(String userName, String password)
+    {
+        return userMapper.resetUserPwd(userName, password);
+    }
+
+    /**
+     * 鏂板鐢ㄦ埛瑙掕壊淇℃伅
+     * 
+     * @param user 鐢ㄦ埛瀵硅薄
+     */
+    public void insertUserRole(SysUser user)
+    {
+        Long[] roles = user.getRoleIds();
+        if (StringUtils.isNotNull(roles))
+        {
+            // 鏂板鐢ㄦ埛涓庤鑹茬鐞�
+            List<SysUserRole> list = new ArrayList<SysUserRole>();
+            for (Long roleId : roles)
+            {
+                SysUserRole ur = new SysUserRole();
+                ur.setUserId(user.getUserId());
+                ur.setRoleId(roleId);
+                list.add(ur);
+            }
+            if (list.size() > 0)
+            {
+                userRoleMapper.batchUserRole(list);
+            }
+        }
+    }
+
+    /**
+     * 鏂板鐢ㄦ埛宀椾綅淇℃伅
+     * 
+     * @param user 鐢ㄦ埛瀵硅薄
+     */
+    public void insertUserPost(SysUser user)
+    {
+        Long[] posts = user.getPostIds();
+        if (StringUtils.isNotNull(posts))
+        {
+            // 鏂板鐢ㄦ埛涓庡矖浣嶇鐞�
+            List<SysUserPost> list = new ArrayList<SysUserPost>();
+            for (Long postId : posts)
+            {
+                SysUserPost up = new SysUserPost();
+                up.setUserId(user.getUserId());
+                up.setPostId(postId);
+                list.add(up);
+            }
+            if (list.size() > 0)
+            {
+                userPostMapper.batchUserPost(list);
+            }
+        }
+    }
+
+    /**
+     * 閫氳繃鐢ㄦ埛ID鍒犻櫎鐢ㄦ埛
+     * 
+     * @param userId 鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteUserById(Long userId)
+    {
+        // 鍒犻櫎鐢ㄦ埛涓庤鑹插叧鑱�
+        userRoleMapper.deleteUserRoleByUserId(userId);
+        // 鍒犻櫎鐢ㄦ埛涓庡矖浣嶈〃
+        userPostMapper.deleteUserPostByUserId(userId);
+        return userMapper.deleteUserById(userId);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐢ㄦ埛淇℃伅
+     * 
+     * @param userIds 闇�瑕佸垹闄ょ殑鐢ㄦ埛ID
+     * @return 缁撴灉
+     */
+    public int deleteUserByIds(Long[] userIds)
+    {
+        for (Long userId : userIds)
+        {
+            checkUserAllowed(new SysUser(userId));
+        }
+        return userMapper.deleteUserByIds(userIds);
+    }
+
+    /**
+     * 瀵煎叆鐢ㄦ埛鏁版嵁
+     * 
+     * @param userList 鐢ㄦ埛鏁版嵁鍒楄〃
+     * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁
+     * @param operName 鎿嶄綔鐢ㄦ埛
+     * @return 缁撴灉
+     */
+    @Override
+    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)
+    {
+        if (StringUtils.isNull(userList) || userList.size() == 0)
+        {
+            throw new CustomException("瀵煎叆鐢ㄦ埛鏁版嵁涓嶈兘涓虹┖锛�");
+        }
+        int successNum = 0;
+        int failureNum = 0;
+        StringBuilder successMsg = new StringBuilder();
+        StringBuilder failureMsg = new StringBuilder();
+        String password = configService.selectConfigByKey("sys.user.initPassword");
+        for (SysUser user : userList)
+        {
+            try
+            {
+                // 楠岃瘉鏄惁瀛樺湪杩欎釜鐢ㄦ埛
+                SysUser u = userMapper.selectUserByUserName(user.getUserName());
+                if (StringUtils.isNull(u))
+                {
+                    user.setPassword(SecurityUtils.encryptPassword(password));
+                    user.setCreateBy(operName);
+                    this.insertUser(user);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "銆佽处鍙� " + user.getUserName() + " 瀵煎叆鎴愬姛");
+                }
+                else if (isUpdateSupport)
+                {
+                    user.setUpdateBy(operName);
+                    this.updateUser(user);
+                    successNum++;
+                    successMsg.append("<br/>" + successNum + "銆佽处鍙� " + user.getUserName() + " 鏇存柊鎴愬姛");
+                }
+                else
+                {
+                    failureNum++;
+                    failureMsg.append("<br/>" + failureNum + "銆佽处鍙� " + user.getUserName() + " 宸插瓨鍦�");
+                }
+            }
+            catch (Exception e)
+            {
+                failureNum++;
+                String msg = "<br/>" + failureNum + "銆佽处鍙� " + user.getUserName() + " 瀵煎叆澶辫触锛�";
+                failureMsg.append(msg + e.getMessage());
+                log.error(msg, e);
+            }
+        }
+        if (failureNum > 0)
+        {
+            failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細");
+            throw new CustomException(failureMsg.toString());
+        }
+        else
+        {
+            successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏� " + successNum + " 鏉★紝鏁版嵁濡備笅锛�");
+        }
+        return successMsg.toString();
+    }
+
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/controller/GenController.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/controller/GenController.java
new file mode 100644
index 0000000..776cc57
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/controller/GenController.java
@@ -0,0 +1,192 @@
+package com.dingzhuo.energy.project.tool.gen.controller;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletResponse;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.tool.gen.service.IGenTableColumnService;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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.dingzhuo.energy.common.utils.text.Convert;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn;
+import com.dingzhuo.energy.project.tool.gen.service.IGenTableColumnService;
+import com.dingzhuo.energy.project.tool.gen.service.IGenTableService;
+
+/**
+ * 浠g爜鐢熸垚 鎿嶄綔澶勭悊
+ * 
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/tool/gen")
+public class GenController extends BaseController
+{
+
+    @Autowired
+    private IGenTableService genTableService;
+
+    @Autowired
+    private IGenTableColumnService genTableColumnService;
+
+    /**
+     * 鏌ヨ浠g爜鐢熸垚鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
+    @GetMapping("/list")
+    public TableDataInfo genList(GenTable genTable)
+    {
+        startPage();
+        List<GenTable> list = genTableService.selectGenTableList(genTable);
+        return getDataTable(list);
+    }
+
+    /**
+     * 淇敼浠g爜鐢熸垚涓氬姟
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:query')")
+    @GetMapping(value = "/{talbleId}")
+    public AjaxResult getInfo(@PathVariable Long talbleId)
+    {
+        GenTable table = genTableService.selectGenTableById(talbleId);
+        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(talbleId);
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("info", table);
+        map.put("rows", list);
+        return AjaxResult.success(map);
+    }
+
+    /**
+     * 鏌ヨ鏁版嵁搴撳垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
+    @GetMapping("/db/list")
+    public TableDataInfo dataList(GenTable genTable)
+    {
+        startPage();
+        List<GenTable> list = genTableService.selectDbTableList(genTable);
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏌ヨ鏁版嵁琛ㄥ瓧娈靛垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
+    @GetMapping(value = "/column/{talbleId}")
+    public TableDataInfo columnList(Long tableId)
+    {
+        TableDataInfo dataInfo = new TableDataInfo();
+        List<GenTableColumn> list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
+        dataInfo.setRows(list);
+        dataInfo.setTotal(list.size());
+        return dataInfo;
+    }
+
+    /**
+     * 瀵煎叆琛ㄧ粨鏋勶紙淇濆瓨锛�
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:list')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.IMPORT)
+    @PostMapping("/importTable")
+    public AjaxResult importTableSave(String tables)
+    {
+        String[] tableNames = Convert.toStrArray(tables);
+        // 鏌ヨ琛ㄤ俊鎭�
+        List<GenTable> tableList = genTableService.selectDbTableListByNames(tableNames);
+        genTableService.importGenTable(tableList);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 淇敼淇濆瓨浠g爜鐢熸垚涓氬姟
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:edit')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult editSave(@Validated @RequestBody GenTable genTable)
+    {
+        System.out.println(genTable.getParams().size());
+        genTableService.validateEdit(genTable);
+        genTableService.updateGenTable(genTable);
+        return AjaxResult.success();
+    }
+
+    @PreAuthorize("@ss.hasPermi('tool:gen:remove')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{tableIds}")
+    public AjaxResult remove(@PathVariable Long[] tableIds)
+    {
+        genTableService.deleteGenTableByIds(tableIds);
+        return AjaxResult.success();
+    }
+
+    /**
+     * 棰勮浠g爜
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:preview')")
+    @GetMapping("/preview/{tableId}")
+    public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException
+    {
+        Map<String, String> dataMap = genTableService.previewCode(tableId);
+        return AjaxResult.success(dataMap);
+    }
+
+    /**
+     * 鐢熸垚浠g爜
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
+    @GetMapping("/genCode/{tableName}")
+    public void genCode(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException
+    {
+        byte[] data = genTableService.generatorCode(tableName);
+        genCode(response, data);
+    }
+
+    /**
+     * 鎵归噺鐢熸垚浠g爜
+     */
+    @PreAuthorize("@ss.hasPermi('tool:gen:code')")
+    @Log(title = "浠g爜鐢熸垚", businessType = BusinessType.GENCODE)
+    @GetMapping("/batchGenCode")
+    public void batchGenCode(HttpServletResponse response, String tables) throws IOException
+    {
+        String[] tableNames = Convert.toStrArray(tables);
+        byte[] data = genTableService.generatorCode(tableNames);
+        genCode(response, data);
+    }
+
+    /**
+     * 鐢熸垚zip鏂囦欢
+     */
+    private void genCode(HttpServletResponse response, byte[] data) throws IOException
+    {
+        response.reset();
+        response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\"");
+        response.addHeader("Content-Length", "" + data.length);
+        response.setContentType("application/octet-stream; charset=UTF-8");
+        IOUtils.write(data, response.getOutputStream());
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTable.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTable.java
new file mode 100644
index 0000000..179d342
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTable.java
@@ -0,0 +1,271 @@
+package com.dingzhuo.energy.project.tool.gen.domain;
+
+import java.util.List;
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.common.constant.GenConstants;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 涓氬姟琛� gen_table
+ * 
+ * @author ruoyi
+ */
+public class GenTable extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 缂栧彿 */
+    private Long tableId;
+
+    /** 琛ㄥ悕绉� */
+    @NotBlank(message = "琛ㄥ悕绉颁笉鑳戒负绌�")
+    private String tableName;
+
+    /** 琛ㄦ弿杩� */
+    @NotBlank(message = "琛ㄦ弿杩颁笉鑳戒负绌�")
+    private String tableComment;
+
+    /** 瀹炰綋绫诲悕绉�(棣栧瓧姣嶅ぇ鍐�) */
+    @NotBlank(message = "瀹炰綋绫诲悕绉颁笉鑳戒负绌�")
+    private String className;
+
+    /** 浣跨敤鐨勬ā鏉匡紙crud鍗曡〃鎿嶄綔 tree鏍戣〃鎿嶄綔锛� */
+    private String tplCategory;
+
+    /** 鐢熸垚鍖呰矾寰� */
+    @NotBlank(message = "鐢熸垚鍖呰矾寰勪笉鑳戒负绌�")
+    private String packageName;
+
+    /** 鐢熸垚妯″潡鍚� */
+    @NotBlank(message = "鐢熸垚妯″潡鍚嶄笉鑳戒负绌�")
+    private String moduleName;
+
+    /** 鐢熸垚涓氬姟鍚� */
+    @NotBlank(message = "鐢熸垚涓氬姟鍚嶄笉鑳戒负绌�")
+    private String businessName;
+
+    /** 鐢熸垚鍔熻兘鍚� */
+    @NotBlank(message = "鐢熸垚鍔熻兘鍚嶄笉鑳戒负绌�")
+    private String functionName;
+
+    /** 鐢熸垚浣滆�� */
+    @NotBlank(message = "浣滆�呬笉鑳戒负绌�")
+    private String functionAuthor;
+
+    /** 涓婚敭淇℃伅 */
+    private GenTableColumn pkColumn;
+
+    /** 琛ㄥ垪淇℃伅 */
+    @Valid
+    private List<GenTableColumn> columns;
+
+    /** 鍏跺畠鐢熸垚閫夐」 */
+    private String options;
+
+    /** 鏍戠紪鐮佸瓧娈� */
+    private String treeCode;
+
+    /** 鏍戠埗缂栫爜瀛楁 */
+    private String treeParentCode;
+
+    /** 鏍戝悕绉板瓧娈� */
+    private String treeName;
+
+    public Long getTableId()
+    {
+        return tableId;
+    }
+
+    public void setTableId(Long tableId)
+    {
+        this.tableId = tableId;
+    }
+
+    public String getTableName()
+    {
+        return tableName;
+    }
+
+    public void setTableName(String tableName)
+    {
+        this.tableName = tableName;
+    }
+
+    public String getTableComment()
+    {
+        return tableComment;
+    }
+
+    public void setTableComment(String tableComment)
+    {
+        this.tableComment = tableComment;
+    }
+
+    public String getClassName()
+    {
+        return className;
+    }
+
+    public void setClassName(String className)
+    {
+        this.className = className;
+    }
+
+    public String getTplCategory()
+    {
+        return tplCategory;
+    }
+
+    public void setTplCategory(String tplCategory)
+    {
+        this.tplCategory = tplCategory;
+    }
+
+    public String getPackageName()
+    {
+        return packageName;
+    }
+
+    public void setPackageName(String packageName)
+    {
+        this.packageName = packageName;
+    }
+
+    public String getModuleName()
+    {
+        return moduleName;
+    }
+
+    public void setModuleName(String moduleName)
+    {
+        this.moduleName = moduleName;
+    }
+
+    public String getBusinessName()
+    {
+        return businessName;
+    }
+
+    public void setBusinessName(String businessName)
+    {
+        this.businessName = businessName;
+    }
+
+    public String getFunctionName()
+    {
+        return functionName;
+    }
+
+    public void setFunctionName(String functionName)
+    {
+        this.functionName = functionName;
+    }
+
+    public String getFunctionAuthor()
+    {
+        return functionAuthor;
+    }
+
+    public void setFunctionAuthor(String functionAuthor)
+    {
+        this.functionAuthor = functionAuthor;
+    }
+
+    public GenTableColumn getPkColumn()
+    {
+        return pkColumn;
+    }
+
+    public void setPkColumn(GenTableColumn pkColumn)
+    {
+        this.pkColumn = pkColumn;
+    }
+
+    public List<GenTableColumn> getColumns()
+    {
+        return columns;
+    }
+
+    public void setColumns(List<GenTableColumn> columns)
+    {
+        this.columns = columns;
+    }
+
+    public String getOptions()
+    {
+        return options;
+    }
+
+    public void setOptions(String options)
+    {
+        this.options = options;
+    }
+
+    public String getTreeCode()
+    {
+        return treeCode;
+    }
+
+    public void setTreeCode(String treeCode)
+    {
+        this.treeCode = treeCode;
+    }
+
+    public String getTreeParentCode()
+    {
+        return treeParentCode;
+    }
+
+    public void setTreeParentCode(String treeParentCode)
+    {
+        this.treeParentCode = treeParentCode;
+    }
+
+    public String getTreeName()
+    {
+        return treeName;
+    }
+
+    public void setTreeName(String treeName)
+    {
+        this.treeName = treeName;
+    }
+
+    public boolean isTree()
+    {
+        return isTree(this.tplCategory);
+    }
+
+    public static boolean isTree(String tplCategory)
+    {
+        return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory);
+    }
+
+    public boolean isCrud()
+    {
+        return isCrud(this.tplCategory);
+    }
+
+    public static boolean isCrud(String tplCategory)
+    {
+        return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory);
+    }
+
+    public boolean isSuperColumn(String javaField)
+    {
+        return isSuperColumn(this.tplCategory, javaField);
+    }
+
+    public static boolean isSuperColumn(String tplCategory, String javaField)
+    {
+        if (isTree(tplCategory))
+        {
+            StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.TREE_ENTITY);
+        }
+        return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY);
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTableColumn.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTableColumn.java
new file mode 100644
index 0000000..bd4d8d8
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/domain/GenTableColumn.java
@@ -0,0 +1,370 @@
+package com.dingzhuo.energy.project.tool.gen.domain;
+
+import javax.validation.constraints.NotBlank;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 浠g爜鐢熸垚涓氬姟瀛楁琛� gen_table_column
+ * 
+ * @author ruoyi
+ */
+public class GenTableColumn extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 缂栧彿 */
+    private Long columnId;
+
+    /** 褰掑睘琛ㄧ紪鍙� */
+    private Long tableId;
+
+    /** 鍒楀悕绉� */
+    private String columnName;
+
+    /** 鍒楁弿杩� */
+    private String columnComment;
+
+    /** 鍒楃被鍨� */
+    private String columnType;
+
+    /** JAVA绫诲瀷 */
+    private String javaType;
+
+    /** JAVA瀛楁鍚� */
+    @NotBlank(message = "Java灞炴�т笉鑳戒负绌�")
+    private String javaField;
+
+    /** 鏄惁涓婚敭锛�1鏄級 */
+    private String isPk;
+
+    /** 鏄惁鑷锛�1鏄級 */
+    private String isIncrement;
+
+    /** 鏄惁蹇呭~锛�1鏄級 */
+    private String isRequired;
+
+    /** 鏄惁涓烘彃鍏ュ瓧娈碉紙1鏄級 */
+    private String isInsert;
+
+    /** 鏄惁缂栬緫瀛楁锛�1鏄級 */
+    private String isEdit;
+
+    /** 鏄惁鍒楄〃瀛楁锛�1鏄級 */
+    private String isList;
+
+    /** 鏄惁鏌ヨ瀛楁锛�1鏄級 */
+    private String isQuery;
+
+    /** 鏌ヨ鏂瑰紡锛圗Q绛変簬銆丯E涓嶇瓑浜庛�丟T澶т簬銆丩T灏忎簬銆丩IKE妯$硦銆丅ETWEEN鑼冨洿锛� */
+    private String queryType;
+
+    /** 鏄剧ず绫诲瀷锛坕nput鏂囨湰妗嗐�乼extarea鏂囨湰鍩熴�乻elect涓嬫媺妗嗐�乧heckbox澶嶉�夋銆乺adio鍗曢�夋銆乨atetime鏃ユ湡鎺т欢锛� */
+    private String htmlType;
+
+    /** 瀛楀吀绫诲瀷 */
+    private String dictType;
+
+    /** 鎺掑簭 */
+    private Integer sort;
+
+    public void setColumnId(Long columnId)
+    {
+        this.columnId = columnId;
+    }
+
+    public Long getColumnId()
+    {
+        return columnId;
+    }
+
+    public void setTableId(Long tableId)
+    {
+        this.tableId = tableId;
+    }
+
+    public Long getTableId()
+    {
+        return tableId;
+    }
+
+    public void setColumnName(String columnName)
+    {
+        this.columnName = columnName;
+    }
+
+    public String getColumnName()
+    {
+        return columnName;
+    }
+
+    public void setColumnComment(String columnComment)
+    {
+        this.columnComment = columnComment;
+    }
+
+    public String getColumnComment()
+    {
+        return columnComment;
+    }
+
+    public void setColumnType(String columnType)
+    {
+        this.columnType = columnType;
+    }
+
+    public String getColumnType()
+    {
+        return columnType;
+    }
+
+    public void setJavaType(String javaType)
+    {
+        this.javaType = javaType;
+    }
+
+    public String getJavaType()
+    {
+        return javaType;
+    }
+
+    public void setJavaField(String javaField)
+    {
+        this.javaField = javaField;
+    }
+
+    public String getJavaField()
+    {
+        return javaField;
+    }
+
+    public void setIsPk(String isPk)
+    {
+        this.isPk = isPk;
+    }
+
+    public String getIsPk()
+    {
+        return isPk;
+    }
+
+    public boolean isPk()
+    {
+        return isPk(this.isPk);
+    }
+
+    public boolean isPk(String isPk)
+    {
+        return isPk != null && StringUtils.equals("1", isPk);
+    }
+
+    public String getIsIncrement()
+    {
+        return isIncrement;
+    }
+
+    public void setIsIncrement(String isIncrement)
+    {
+        this.isIncrement = isIncrement;
+    }
+
+    public boolean isIncrement()
+    {
+        return isIncrement(this.isIncrement);
+    }
+
+    public boolean isIncrement(String isIncrement)
+    {
+        return isIncrement != null && StringUtils.equals("1", isIncrement);
+    }
+
+    public void setIsRequired(String isRequired)
+    {
+        this.isRequired = isRequired;
+    }
+
+    public String getIsRequired()
+    {
+        return isRequired;
+    }
+
+    public boolean isRequired()
+    {
+        return isRequired(this.isRequired);
+    }
+
+    public boolean isRequired(String isRequired)
+    {
+        return isRequired != null && StringUtils.equals("1", isRequired);
+    }
+
+    public void setIsInsert(String isInsert)
+    {
+        this.isInsert = isInsert;
+    }
+
+    public String getIsInsert()
+    {
+        return isInsert;
+    }
+
+    public boolean isInsert()
+    {
+        return isInsert(this.isInsert);
+    }
+
+    public boolean isInsert(String isInsert)
+    {
+        return isInsert != null && StringUtils.equals("1", isInsert);
+    }
+
+    public void setIsEdit(String isEdit)
+    {
+        this.isEdit = isEdit;
+    }
+
+    public String getIsEdit()
+    {
+        return isEdit;
+    }
+
+    public boolean isEdit()
+    {
+        return isInsert(this.isEdit);
+    }
+
+    public boolean isEdit(String isEdit)
+    {
+        return isEdit != null && StringUtils.equals("1", isEdit);
+    }
+
+    public void setIsList(String isList)
+    {
+        this.isList = isList;
+    }
+
+    public String getIsList()
+    {
+        return isList;
+    }
+
+    public boolean isList()
+    {
+        return isList(this.isList);
+    }
+
+    public boolean isList(String isList)
+    {
+        return isList != null && StringUtils.equals("1", isList);
+    }
+
+    public void setIsQuery(String isQuery)
+    {
+        this.isQuery = isQuery;
+    }
+
+    public String getIsQuery()
+    {
+        return isQuery;
+    }
+
+    public boolean isQuery()
+    {
+        return isQuery(this.isQuery);
+    }
+
+    public boolean isQuery(String isQuery)
+    {
+        return isQuery != null && StringUtils.equals("1", isQuery);
+    }
+
+    public void setQueryType(String queryType)
+    {
+        this.queryType = queryType;
+    }
+
+    public String getQueryType()
+    {
+        return queryType;
+    }
+
+    public String getHtmlType()
+    {
+        return htmlType;
+    }
+
+    public void setHtmlType(String htmlType)
+    {
+        this.htmlType = htmlType;
+    }
+
+    public void setDictType(String dictType)
+    {
+        this.dictType = dictType;
+    }
+
+    public String getDictType()
+    {
+        return dictType;
+    }
+
+    public void setSort(Integer sort)
+    {
+        this.sort = sort;
+    }
+
+    public Integer getSort()
+    {
+        return sort;
+    }
+
+    public boolean isSuperColumn()
+    {
+        return isSuperColumn(this.javaField);
+    }
+
+    public static boolean isSuperColumn(String javaField)
+    {
+        return StringUtils.equalsAnyIgnoreCase(javaField,
+                // BaseEntity
+                "createBy", "createTime", "updateBy", "updateTime", "remark",
+                // TreeEntity
+                "parentName", "parentId", "orderNum", "ancestors");
+    }
+
+    public boolean isUsableColumn()
+    {
+        return isUsableColumn(javaField);
+    }
+
+    public static boolean isUsableColumn(String javaField)
+    {
+        // isSuperColumn()涓殑鍚嶅崟鐢ㄤ簬閬垮厤鐢熸垚澶氫綑Domain灞炴�э紝鑻ユ煇浜涘睘鎬у湪鐢熸垚椤甸潰鏃堕渶瑕佺敤鍒颁笉鑳藉拷鐣ワ紝鍒欐斁鍦ㄦ澶勭櫧鍚嶅崟
+        return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum");
+    }
+
+    public String readConverterExp()
+    {
+        String remarks = StringUtils.substringBetween(this.columnComment, "锛�", "锛�");
+        StringBuffer sb = new StringBuffer();
+        if (StringUtils.isNotEmpty(remarks))
+        {
+            for (String value : remarks.split(" "))
+            {
+                if (StringUtils.isNotEmpty(value))
+                {
+                    Object startStr = value.subSequence(0, 1);
+                    String endStr = value.substring(1);
+                    sb.append(startStr).append("=").append(endStr).append(",");
+                }
+            }
+            return sb.deleteCharAt(sb.length() - 1).toString();
+        }
+        else
+        {
+            return this.columnComment;
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableColumnMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableColumnMapper.java
new file mode 100644
index 0000000..92c86b9
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableColumnMapper.java
@@ -0,0 +1,52 @@
+package com.dingzhuo.energy.project.tool.gen.mapper;
+
+import java.util.List;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn;
+
+/**
+ * 涓氬姟瀛楁 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface GenTableColumnMapper
+{
+    /**
+     * 鏍规嵁琛ㄥ悕绉版煡璇㈠垪淇℃伅
+     * 
+     * @param tableName 琛ㄥ悕绉�
+     * @return 鍒椾俊鎭�
+     */
+    List<GenTableColumn> selectDbTableColumnsByName(String tableName);
+    
+    /**
+     * 鏌ヨ涓氬姟瀛楁鍒楄〃
+     * 
+     * @param tableId 涓氬姟瀛楁缂栧彿
+     * @return 涓氬姟瀛楁闆嗗悎
+     */
+    List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
+
+    /**
+     * 鏂板涓氬姟瀛楁
+     * 
+     * @param genTableColumn 涓氬姟瀛楁淇℃伅
+     * @return 缁撴灉
+     */
+    int insertGenTableColumn(GenTableColumn genTableColumn);
+
+    /**
+     * 淇敼涓氬姟瀛楁
+     * 
+     * @param genTableColumn 涓氬姟瀛楁淇℃伅
+     * @return 缁撴灉
+     */
+    int updateGenTableColumn(GenTableColumn genTableColumn);
+
+    /**
+     * 鎵归噺鍒犻櫎涓氬姟瀛楁
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteGenTableColumnByIds(Long[] ids);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableMapper.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableMapper.java
new file mode 100644
index 0000000..7c9a600
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/mapper/GenTableMapper.java
@@ -0,0 +1,78 @@
+package com.dingzhuo.energy.project.tool.gen.mapper;
+
+import java.util.List;
+
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+
+/**
+ * 涓氬姟 鏁版嵁灞�
+ * 
+ * @author ruoyi
+ */
+public interface GenTableMapper
+{
+    /**
+     * 鏌ヨ涓氬姟鍒楄〃
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 涓氬姟闆嗗悎
+     */
+    List<GenTable> selectGenTableList(GenTable genTable);
+
+    /**
+     * 鏌ヨ鎹簱鍒楄〃
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 鏁版嵁搴撹〃闆嗗悎
+     */
+    List<GenTable> selectDbTableList(GenTable genTable);
+
+    /**
+     * 鏌ヨ鎹簱鍒楄〃
+     * 
+     * @param tableNames 琛ㄥ悕绉扮粍
+     * @return 鏁版嵁搴撹〃闆嗗悎
+     */
+    List<GenTable> selectDbTableListByNames(String[] tableNames);
+
+    /**
+     * 鏌ヨ琛↖D涓氬姟淇℃伅
+     * 
+     * @param tableId 涓氬姟ID
+     * @return 涓氬姟淇℃伅
+     */
+    GenTable selectGenTableById(Long tableId);
+
+    /**
+     * 鏌ヨ琛ㄥ悕绉颁笟鍔′俊鎭�
+     * 
+     * @param tableName 琛ㄥ悕绉�
+     * @return 涓氬姟淇℃伅
+     */
+    GenTable selectGenTableByName(String tableName);
+
+    /**
+     * 鏂板涓氬姟
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 缁撴灉
+     */
+    int insertGenTable(GenTable genTable);
+
+    /**
+     * 淇敼涓氬姟
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 缁撴灉
+     */
+    int updateGenTable(GenTable genTable);
+
+    /**
+     * 鎵归噺鍒犻櫎涓氬姟
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteGenTableByIds(Long[] ids);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableColumnServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableColumnServiceImpl.java
new file mode 100644
index 0000000..6a85dd7
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableColumnServiceImpl.java
@@ -0,0 +1,68 @@
+package com.dingzhuo.energy.project.tool.gen.service;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.common.utils.text.Convert;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn;
+import com.dingzhuo.energy.project.tool.gen.mapper.GenTableColumnMapper;
+
+/**
+ * 涓氬姟瀛楁 鏈嶅姟灞傚疄鐜�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class GenTableColumnServiceImpl implements IGenTableColumnService 
+{
+	@Autowired
+	private GenTableColumnMapper genTableColumnMapper;
+
+	/**
+     * 鏌ヨ涓氬姟瀛楁鍒楄〃
+     * 
+     * @param genTableColumn 涓氬姟瀛楁缂栧彿
+     * @return 涓氬姟瀛楁闆嗗悎
+     */
+	@Override
+	public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId)
+	{
+	    return genTableColumnMapper.selectGenTableColumnListByTableId(tableId);
+	}
+	
+    /**
+     * 鏂板涓氬姟瀛楁
+     * 
+     * @param genTableColumn 涓氬姟瀛楁淇℃伅
+     * @return 缁撴灉
+     */
+	@Override
+	public int insertGenTableColumn(GenTableColumn genTableColumn)
+	{
+	    return genTableColumnMapper.insertGenTableColumn(genTableColumn);
+	}
+	
+	/**
+     * 淇敼涓氬姟瀛楁
+     * 
+     * @param genTableColumn 涓氬姟瀛楁淇℃伅
+     * @return 缁撴灉
+     */
+	@Override
+	public int updateGenTableColumn(GenTableColumn genTableColumn)
+	{
+	    return genTableColumnMapper.updateGenTableColumn(genTableColumn);
+	}
+
+	/**
+     * 鍒犻櫎涓氬姟瀛楁瀵硅薄
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+	@Override
+	public int deleteGenTableColumnByIds(String ids)
+	{
+		return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids));
+	}
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableServiceImpl.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableServiceImpl.java
new file mode 100644
index 0000000..722c873
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/GenTableServiceImpl.java
@@ -0,0 +1,341 @@
+package com.dingzhuo.energy.project.tool.gen.service;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import org.apache.commons.io.IOUtils;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.constant.Constants;
+import com.dingzhuo.energy.common.constant.GenConstants;
+import com.dingzhuo.energy.common.exception.CustomException;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn;
+import com.dingzhuo.energy.project.tool.gen.mapper.GenTableColumnMapper;
+import com.dingzhuo.energy.project.tool.gen.mapper.GenTableMapper;
+import com.dingzhuo.energy.project.tool.gen.util.GenUtils;
+import com.dingzhuo.energy.project.tool.gen.util.VelocityInitializer;
+import com.dingzhuo.energy.project.tool.gen.util.VelocityUtils;
+
+/**
+ * 涓氬姟 鏈嶅姟灞傚疄鐜�
+ * 
+ * @author ruoyi
+ */
+@Service
+public class GenTableServiceImpl implements IGenTableService
+{
+    private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class);
+
+    @Autowired
+    private GenTableMapper genTableMapper;
+
+    @Autowired
+    private GenTableColumnMapper genTableColumnMapper;
+
+    /**
+     * 鏌ヨ涓氬姟淇℃伅
+     * 
+     * @param id 涓氬姟ID
+     * @return 涓氬姟淇℃伅
+     */
+    @Override
+    public GenTable selectGenTableById(Long id)
+    {
+        GenTable genTable = genTableMapper.selectGenTableById(id);
+        setTableFromOptions(genTable);
+        return genTable;
+    }
+
+    /**
+     * 鏌ヨ涓氬姟鍒楄〃
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 涓氬姟闆嗗悎
+     */
+    @Override
+    public List<GenTable> selectGenTableList(GenTable genTable)
+    {
+        return genTableMapper.selectGenTableList(genTable);
+    }
+
+    /**
+     * 鏌ヨ鎹簱鍒楄〃
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 鏁版嵁搴撹〃闆嗗悎
+     */
+    public List<GenTable> selectDbTableList(GenTable genTable)
+    {
+        return genTableMapper.selectDbTableList(genTable);
+    }
+
+    /**
+     * 鏌ヨ鎹簱鍒楄〃
+     * 
+     * @param tableNames 琛ㄥ悕绉扮粍
+     * @return 鏁版嵁搴撹〃闆嗗悎
+     */
+    public List<GenTable> selectDbTableListByNames(String[] tableNames)
+    {
+        return genTableMapper.selectDbTableListByNames(tableNames);
+    }
+
+    /**
+     * 淇敼涓氬姟
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public void updateGenTable(GenTable genTable)
+    {
+        String options = JSON.toJSONString(genTable.getParams());
+        genTable.setOptions(options);
+        int row = genTableMapper.updateGenTable(genTable);
+        if (row > 0)
+        {
+            for (GenTableColumn cenTableColumn : genTable.getColumns())
+            {
+                genTableColumnMapper.updateGenTableColumn(cenTableColumn);
+            }
+        }
+    }
+
+    /**
+     * 鍒犻櫎涓氬姟瀵硅薄
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    @Override
+    @Transactional
+    public void deleteGenTableByIds(Long[] tableIds)
+    {
+        genTableMapper.deleteGenTableByIds(tableIds);
+        genTableColumnMapper.deleteGenTableColumnByIds(tableIds);
+    }
+
+    /**
+     * 瀵煎叆琛ㄧ粨鏋�
+     * 
+     * @param tableList 瀵煎叆琛ㄥ垪琛�
+     */
+    @Override
+    @Transactional
+    public void importGenTable(List<GenTable> tableList)
+    {
+        String operName = SecurityUtils.getUsername();
+        for (GenTable table : tableList)
+        {
+            try
+            {
+                String tableName = table.getTableName();
+                GenUtils.initTable(table, operName);
+                int row = genTableMapper.insertGenTable(table);
+                if (row > 0)
+                {
+                    // 淇濆瓨鍒椾俊鎭�
+                    List<GenTableColumn> genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName);
+                    for (GenTableColumn column : genTableColumns)
+                    {
+                        GenUtils.initColumnField(column, table);
+                        genTableColumnMapper.insertGenTableColumn(column);
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                log.error("琛ㄥ悕 " + table.getTableName() + " 瀵煎叆澶辫触锛�", e);
+            }
+        }
+    }
+
+    /**
+     * 棰勮浠g爜
+     * 
+     * @param tableId 琛ㄧ紪鍙�
+     * @return 棰勮鏁版嵁鍒楄〃
+     */
+    public Map<String, String> previewCode(Long tableId)
+    {
+        Map<String, String> dataMap = new LinkedHashMap<>();
+        // 鏌ヨ琛ㄤ俊鎭�
+        GenTable table = genTableMapper.selectGenTableById(tableId);
+        // 鏌ヨ鍒椾俊鎭�
+        List<GenTableColumn> columns = table.getColumns();
+        setPkColumn(table, columns);
+        VelocityInitializer.initVelocity();
+
+        VelocityContext context = VelocityUtils.prepareContext(table);
+
+        // 鑾峰彇妯℃澘鍒楄〃
+        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
+        for (String template : templates)
+        {
+            // 娓叉煋妯℃澘
+            StringWriter sw = new StringWriter();
+            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
+            tpl.merge(context, sw);
+            dataMap.put(template, sw.toString());
+        }
+        return dataMap;
+    }
+
+    /**
+     * 鐢熸垚浠g爜
+     * 
+     * @param tableName 琛ㄥ悕绉�
+     * @return 鏁版嵁
+     */
+    @Override
+    public byte[] generatorCode(String tableName)
+    {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        ZipOutputStream zip = new ZipOutputStream(outputStream);
+        generatorCode(tableName, zip);
+        IOUtils.closeQuietly(zip);
+        return outputStream.toByteArray();
+    }
+
+    /**
+     * 鎵归噺鐢熸垚浠g爜
+     * 
+     * @param tableNames 琛ㄦ暟缁�
+     * @return 鏁版嵁
+     */
+    @Override
+    public byte[] generatorCode(String[] tableNames)
+    {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        ZipOutputStream zip = new ZipOutputStream(outputStream);
+        for (String tableName : tableNames)
+        {
+            generatorCode(tableName, zip);
+        }
+        IOUtils.closeQuietly(zip);
+        return outputStream.toByteArray();
+    }
+
+    /**
+     * 鏌ヨ琛ㄤ俊鎭苟鐢熸垚浠g爜
+     */
+    private void generatorCode(String tableName, ZipOutputStream zip)
+    {
+        // 鏌ヨ琛ㄤ俊鎭�
+        GenTable table = genTableMapper.selectGenTableByName(tableName);
+        // 鏌ヨ鍒椾俊鎭�
+        List<GenTableColumn> columns = table.getColumns();
+        setPkColumn(table, columns);
+
+        VelocityInitializer.initVelocity();
+
+        VelocityContext context = VelocityUtils.prepareContext(table);
+
+        // 鑾峰彇妯℃澘鍒楄〃
+        List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
+        for (String template : templates)
+        {
+            // 娓叉煋妯℃澘
+            StringWriter sw = new StringWriter();
+            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
+            tpl.merge(context, sw);
+            try
+            {
+                // 娣诲姞鍒皕ip
+                zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table)));
+                IOUtils.write(sw.toString(), zip, Constants.UTF8);
+                IOUtils.closeQuietly(sw);
+				zip.flush();
+                zip.closeEntry();
+            }
+            catch (IOException e)
+            {
+                log.error("娓叉煋妯℃澘澶辫触锛岃〃鍚嶏細" + table.getTableName(), e);
+            }
+        }
+    }
+
+    /**
+     * 淇敼淇濆瓨鍙傛暟鏍¢獙
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     */
+    public void validateEdit(GenTable genTable)
+    {
+        if (GenConstants.TPL_TREE.equals(genTable.getTplCategory()))
+        {
+            String options = JSON.toJSONString(genTable.getParams());
+            JSONObject paramsObj = JSONObject.parseObject(options);
+            if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE)))
+            {
+                throw new CustomException("鏍戠紪鐮佸瓧娈典笉鑳戒负绌�");
+            }
+            else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE)))
+            {
+                throw new CustomException("鏍戠埗缂栫爜瀛楁涓嶈兘涓虹┖");
+            }
+            else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME)))
+            {
+                throw new CustomException("鏍戝悕绉板瓧娈典笉鑳戒负绌�");
+            }
+        }
+    }
+
+    /**
+     * 璁剧疆涓婚敭鍒椾俊鎭�
+     * 
+     * @param genTable 涓氬姟琛ㄤ俊鎭�
+     * @param columns 涓氬姟瀛楁鍒楄〃
+     */
+    public void setPkColumn(GenTable table, List<GenTableColumn> columns)
+    {
+        for (GenTableColumn column : columns)
+        {
+            if (column.isPk())
+            {
+                table.setPkColumn(column);
+                break;
+            }
+        }
+        if (StringUtils.isNull(table.getPkColumn()))
+        {
+            table.setPkColumn(columns.get(0));
+        }
+    }
+
+    /**
+     * 璁剧疆浠g爜鐢熸垚鍏朵粬閫夐」鍊�
+     * 
+     * @param genTable 璁剧疆鍚庣殑鐢熸垚瀵硅薄
+     */
+    public void setTableFromOptions(GenTable genTable)
+    {
+        JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions());
+        if (StringUtils.isNotNull(paramsObj))
+        {
+            String treeCode = paramsObj.getString(GenConstants.TREE_CODE);
+            String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE);
+            String treeName = paramsObj.getString(GenConstants.TREE_NAME);
+            genTable.setTreeCode(treeCode);
+            genTable.setTreeParentCode(treeParentCode);
+            genTable.setTreeName(treeName);
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableColumnService.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableColumnService.java
new file mode 100644
index 0000000..4c2d9d5
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableColumnService.java
@@ -0,0 +1,44 @@
+package com.dingzhuo.energy.project.tool.gen.service;
+
+import java.util.List;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn;
+
+/**
+ * 涓氬姟瀛楁 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface IGenTableColumnService
+{
+    /**
+     * 鏌ヨ涓氬姟瀛楁鍒楄〃
+     * 
+     * @param genTableColumn 涓氬姟瀛楁缂栧彿
+     * @return 涓氬姟瀛楁闆嗗悎
+     */
+    List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
+
+    /**
+     * 鏂板涓氬姟瀛楁
+     * 
+     * @param genTableColumn 涓氬姟瀛楁淇℃伅
+     * @return 缁撴灉
+     */
+    int insertGenTableColumn(GenTableColumn genTableColumn);
+
+    /**
+     * 淇敼涓氬姟瀛楁
+     * 
+     * @param genTableColumn 涓氬姟瀛楁淇℃伅
+     * @return 缁撴灉
+     */
+    int updateGenTableColumn(GenTableColumn genTableColumn);
+
+    /**
+     * 鍒犻櫎涓氬姟瀛楁淇℃伅
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteGenTableColumnByIds(String ids);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableService.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableService.java
new file mode 100644
index 0000000..0c8a963
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/service/IGenTableService.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.project.tool.gen.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+
+/**
+ * 涓氬姟 鏈嶅姟灞�
+ * 
+ * @author ruoyi
+ */
+public interface IGenTableService
+{
+    /**
+     * 鏌ヨ涓氬姟鍒楄〃
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 涓氬姟闆嗗悎
+     */
+    List<GenTable> selectGenTableList(GenTable genTable);
+
+    /**
+     * 鏌ヨ鎹簱鍒楄〃
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 鏁版嵁搴撹〃闆嗗悎
+     */
+    List<GenTable> selectDbTableList(GenTable genTable);
+
+    /**
+     * 鏌ヨ鎹簱鍒楄〃
+     * 
+     * @param tableNames 琛ㄥ悕绉扮粍
+     * @return 鏁版嵁搴撹〃闆嗗悎
+     */
+    List<GenTable> selectDbTableListByNames(String[] tableNames);
+
+    /**
+     * 鏌ヨ涓氬姟淇℃伅
+     * 
+     * @param id 涓氬姟ID
+     * @return 涓氬姟淇℃伅
+     */
+    GenTable selectGenTableById(Long id);
+
+    /**
+     * 淇敼涓氬姟
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     * @return 缁撴灉
+     */
+    void updateGenTable(GenTable genTable);
+
+    /**
+     * 鍒犻櫎涓氬姟淇℃伅
+     * 
+     * @param tableIds 闇�瑕佸垹闄ょ殑琛ㄦ暟鎹甀D
+     * @return 缁撴灉
+     */
+    void deleteGenTableByIds(Long[] tableIds);
+
+    /**
+     * 瀵煎叆琛ㄧ粨鏋�
+     * 
+     * @param tableList 瀵煎叆琛ㄥ垪琛�
+     */
+    void importGenTable(List<GenTable> tableList);
+
+    /**
+     * 棰勮浠g爜
+     * 
+     * @param tableId 琛ㄧ紪鍙�
+     * @return 棰勮鏁版嵁鍒楄〃
+     */
+    Map<String, String> previewCode(Long tableId);
+
+    /**
+     * 鐢熸垚浠g爜
+     * 
+     * @param tableName 琛ㄥ悕绉�
+     * @return 鏁版嵁
+     */
+    byte[] generatorCode(String tableName);
+
+    /**
+     * 鎵归噺鐢熸垚浠g爜
+     * 
+     * @param tableNames 琛ㄦ暟缁�
+     * @return 鏁版嵁
+     */
+    byte[] generatorCode(String[] tableNames);
+
+    /**
+     * 淇敼淇濆瓨鍙傛暟鏍¢獙
+     * 
+     * @param genTable 涓氬姟淇℃伅
+     */
+    void validateEdit(GenTable genTable);
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/GenUtils.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/GenUtils.java
new file mode 100644
index 0000000..750a46c
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/GenUtils.java
@@ -0,0 +1,241 @@
+package com.dingzhuo.energy.project.tool.gen.util;
+
+import java.util.Arrays;
+
+import com.dingzhuo.energy.framework.config.GenConfig;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import org.apache.commons.lang3.RegExUtils;
+import com.dingzhuo.energy.common.constant.GenConstants;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.config.GenConfig;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn;
+
+/**
+ * 浠g爜鐢熸垚鍣� 宸ュ叿绫�
+ * 
+ * @author ruoyi
+ */
+public class GenUtils
+{
+    /**
+     * 鍒濆鍖栬〃淇℃伅
+     */
+    public static void initTable(GenTable genTable, String operName)
+    {
+        genTable.setClassName(convertClassName(genTable.getTableName()));
+        genTable.setPackageName(GenConfig.getPackageName());
+        genTable.setModuleName(getModuleName(GenConfig.getPackageName()));
+        genTable.setBusinessName(getBusinessName(genTable.getTableName()));
+        genTable.setFunctionName(replaceText(genTable.getTableComment()));
+        genTable.setFunctionAuthor(GenConfig.getAuthor());
+        genTable.setCreateBy(operName);
+    }
+
+    /**
+     * 鍒濆鍖栧垪灞炴�у瓧娈�
+     */
+    public static void initColumnField(GenTableColumn column, GenTable table)
+    {
+        String dataType = getDbType(column.getColumnType());
+        String columnName = column.getColumnName();
+        column.setTableId(table.getTableId());
+        column.setCreateBy(table.getCreateBy());
+        // 璁剧疆java瀛楁鍚�
+        column.setJavaField(StringUtils.toCamelCase(columnName));
+
+        if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType))
+        {
+            column.setJavaType(GenConstants.TYPE_STRING);
+            // 瀛楃涓查暱搴﹁秴杩�500璁剧疆涓烘枃鏈煙
+            Integer columnLength = getColumnLength(column.getColumnType());
+            String htmlType = columnLength >= 500 ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT;
+            column.setHtmlType(htmlType);
+        }
+        else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType))
+        {
+            column.setJavaType(GenConstants.TYPE_DATE);
+            column.setHtmlType(GenConstants.HTML_DATETIME);
+        }
+        else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType))
+        {
+            column.setHtmlType(GenConstants.HTML_INPUT);
+
+            // 濡傛灉鏄诞鐐瑰瀷
+            String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ",");
+            if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0)
+            {
+                column.setJavaType(GenConstants.TYPE_DOUBLE);
+            }
+            // 濡傛灉鏄暣褰�
+            else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10)
+            {
+                column.setJavaType(GenConstants.TYPE_INTEGER);
+            }
+            // 闀挎暣褰�
+            else
+            {
+                column.setJavaType(GenConstants.TYPE_LONG);
+            }
+        }
+
+        // 鎻掑叆瀛楁锛堥粯璁ゆ墍鏈夊瓧娈甸兘闇�瑕佹彃鍏ワ級
+        column.setIsInsert(GenConstants.REQUIRE);
+
+        // 缂栬緫瀛楁
+        if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk())
+        {
+            column.setIsEdit(GenConstants.REQUIRE);
+        }
+        // 鍒楄〃瀛楁
+        if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk())
+        {
+            column.setIsList(GenConstants.REQUIRE);
+        }
+        // 鏌ヨ瀛楁
+        if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk())
+        {
+            column.setIsQuery(GenConstants.REQUIRE);
+        }
+
+        // 鏌ヨ瀛楁绫诲瀷
+        if (StringUtils.endsWithIgnoreCase(columnName, "name"))
+        {
+            column.setQueryType(GenConstants.QUERY_LIKE);
+        }
+        // 鐘舵�佸瓧娈佃缃崟閫夋
+        if (StringUtils.endsWithIgnoreCase(columnName, "status"))
+        {
+            column.setHtmlType(GenConstants.HTML_RADIO);
+        }
+        // 绫诲瀷&鎬у埆瀛楁璁剧疆涓嬫媺妗�
+        else if (StringUtils.endsWithIgnoreCase(columnName, "type")
+                || StringUtils.endsWithIgnoreCase(columnName, "sex"))
+        {
+            column.setHtmlType(GenConstants.HTML_SELECT);
+        }
+    }
+
+    /**
+     * 鏍¢獙鏁扮粍鏄惁鍖呭惈鎸囧畾鍊�
+     * 
+     * @param arr 鏁扮粍
+     * @param targetValue 鍊�
+     * @return 鏄惁鍖呭惈
+     */
+    public static boolean arraysContains(String[] arr, String targetValue)
+    {
+        return Arrays.asList(arr).contains(targetValue);
+    }
+
+    /**
+     * 鑾峰彇妯″潡鍚�
+     * 
+     * @param packageName 鍖呭悕
+     * @return 妯″潡鍚�
+     */
+    public static String getModuleName(String packageName)
+    {
+        int lastIndex = packageName.lastIndexOf(".");
+        int nameLength = packageName.length();
+        String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength);
+        return moduleName;
+    }
+
+    /**
+     * 鑾峰彇涓氬姟鍚�
+     * 
+     * @param tableName 琛ㄥ悕
+     * @return 涓氬姟鍚�
+     */
+    public static String getBusinessName(String tableName)
+    {
+        int lastIndex = tableName.lastIndexOf("_");
+        int nameLength = tableName.length();
+        String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength);
+        return businessName;
+    }
+
+    /**
+     * 琛ㄥ悕杞崲鎴怞ava绫诲悕
+     * 
+     * @param tableName 琛ㄥ悕绉�
+     * @return 绫诲悕
+     */
+    public static String convertClassName(String tableName)
+    {
+        boolean autoRemovePre = GenConfig.getAutoRemovePre();
+        String tablePrefix = GenConfig.getTablePrefix();
+        if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix))
+        {
+            String[] searchList = StringUtils.split(tablePrefix, ",");
+            String[] replacementList = emptyList(searchList.length);
+            tableName = StringUtils.replaceEach(tableName, searchList, replacementList);
+        }
+        return StringUtils.convertToCamelCase(tableName);
+    }
+
+    /**
+     * 鍏抽敭瀛楁浛鎹�
+     * 
+     * @param name 闇�瑕佽鏇挎崲鐨勫悕瀛�
+     * @return 鏇挎崲鍚庣殑鍚嶅瓧
+     */
+    public static String replaceText(String text)
+    {
+        return RegExUtils.replaceAll(text, "(?:琛▅鑻ヤ緷)", "");
+    }
+
+    /**
+     * 鑾峰彇鏁版嵁搴撶被鍨嬪瓧娈�
+     * 
+     * @param columnType 鍒楃被鍨�
+     * @return 鎴彇鍚庣殑鍒楃被鍨�
+     */
+    public static String getDbType(String columnType)
+    {
+        if (StringUtils.indexOf(columnType, "(") > 0)
+        {
+            return StringUtils.substringBefore(columnType, "(");
+        }
+        else
+        {
+            return columnType;
+        }
+    }
+
+    /**
+     * 鑾峰彇瀛楁闀垮害
+     * 
+     * @param columnType 鍒楃被鍨�
+     * @return 鎴彇鍚庣殑鍒楃被鍨�
+     */
+    public static Integer getColumnLength(String columnType)
+    {
+        if (StringUtils.indexOf(columnType, "(") > 0)
+        {
+            String length = StringUtils.substringBetween(columnType, "(", ")");
+            return Integer.valueOf(length);
+        }
+        else
+        {
+            return 0;
+        }
+    }
+
+    /**
+     * 鑾峰彇绌烘暟缁勫垪琛�
+     * 
+     * @param length 闀垮害
+     * @return 鏁扮粍淇℃伅
+     */
+    public static String[] emptyList(int length)
+    {
+        String[] values = new String[length];
+        for (int i = 0; i < length; i++)
+        {
+            values[i] = StringUtils.EMPTY;
+        }
+        return values;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityInitializer.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityInitializer.java
new file mode 100644
index 0000000..ac0ada6
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityInitializer.java
@@ -0,0 +1,35 @@
+package com.dingzhuo.energy.project.tool.gen.util;
+
+import java.util.Properties;
+import org.apache.velocity.app.Velocity;
+import com.dingzhuo.energy.common.constant.Constants;
+
+/**
+ * VelocityEngine宸ュ巶
+ * 
+ * @author RuoYi
+ */
+public class VelocityInitializer
+{
+    /**
+     * 鍒濆鍖杤m鏂规硶
+     */
+    public static void initVelocity()
+    {
+        Properties p = new Properties();
+        try
+        {
+            // 鍔犺浇classpath鐩綍涓嬬殑vm鏂囦欢
+            p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
+            // 瀹氫箟瀛楃闆�
+            p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8);
+            p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8);
+            // 鍒濆鍖朧elocity寮曟搸锛屾寚瀹氶厤缃甈roperties
+            Velocity.init(p);
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityUtils.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityUtils.java
new file mode 100644
index 0000000..dc18206
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/gen/util/VelocityUtils.java
@@ -0,0 +1,283 @@
+package com.dingzhuo.energy.project.tool.gen.util;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import org.apache.velocity.VelocityContext;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.constant.GenConstants;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTable;
+import com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn;
+
+public class VelocityUtils
+{
+    /** 椤圭洰绌洪棿璺緞 */
+    private static final String PROJECT_PATH = "main/java";
+
+    /** mybatis绌洪棿璺緞 */
+    private static final String MYBATIS_PATH = "main/resources/mybatis";
+
+    /**
+     * 璁剧疆妯℃澘鍙橀噺淇℃伅
+     * 
+     * @return 妯℃澘鍒楄〃
+     */
+    public static VelocityContext prepareContext(GenTable genTable)
+    {
+        String moduleName = genTable.getModuleName();
+        String businessName = genTable.getBusinessName();
+        String packageName = genTable.getPackageName();
+        String tplCategory = genTable.getTplCategory();
+        String functionName = genTable.getFunctionName();
+
+        VelocityContext velocityContext = new VelocityContext();
+        velocityContext.put("tplCategory", genTable.getTplCategory());
+        velocityContext.put("tableName", genTable.getTableName());
+        velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "銆愯濉啓鍔熻兘鍚嶇О銆�");
+        velocityContext.put("ClassName", genTable.getClassName());
+        velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName()));
+        velocityContext.put("moduleName", genTable.getModuleName());
+        velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName()));
+        velocityContext.put("businessName", genTable.getBusinessName());
+        velocityContext.put("basePackage", getPackagePrefix(packageName));
+        velocityContext.put("packageName", packageName);
+        velocityContext.put("author", genTable.getFunctionAuthor());
+        velocityContext.put("datetime", DateUtils.getDate());
+        velocityContext.put("pkColumn", genTable.getPkColumn());
+        velocityContext.put("importList", getImportList(genTable.getColumns()));
+        velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName));
+        velocityContext.put("columns", genTable.getColumns());
+        velocityContext.put("table", genTable);
+        if (GenConstants.TPL_TREE.equals(tplCategory))
+        {
+            setTreeVelocityContext(velocityContext, genTable);
+        }
+        return velocityContext;
+    }
+
+    public static void setTreeVelocityContext(VelocityContext context, GenTable genTable)
+    {
+        String options = genTable.getOptions();
+        JSONObject paramsObj = JSONObject.parseObject(options);
+        String treeCode = getTreecode(paramsObj);
+        String treeParentCode = getTreeParentCode(paramsObj);
+        String treeName = getTreeName(paramsObj);
+
+        context.put("treeCode", treeCode);
+        context.put("treeParentCode", treeParentCode);
+        context.put("treeName", treeName);
+        context.put("expandColumn", getExpandColumn(genTable));
+        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
+        {
+            context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE));
+        }
+        if (paramsObj.containsKey(GenConstants.TREE_NAME))
+        {
+            context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME));
+        }
+    }
+
+    /**
+     * 鑾峰彇妯℃澘淇℃伅
+     * 
+     * @return 妯℃澘鍒楄〃
+     */
+    public static List<String> getTemplateList(String tplCategory)
+    {
+        List<String> templates = new ArrayList<String>();
+        templates.add("vm/java/domain.java.vm");
+        templates.add("vm/java/mapper.java.vm");
+        templates.add("vm/java/service.java.vm");
+        templates.add("vm/java/serviceImpl.java.vm");
+        templates.add("vm/java/controller.java.vm");
+        templates.add("vm/xml/mapper.xml.vm");
+        templates.add("vm/sql/sql.vm");
+        templates.add("vm/js/api.js.vm");
+        templates.add("vm/vue/index.vue.vm");
+        return templates;
+    }
+
+    /**
+     * 鑾峰彇鏂囦欢鍚�
+     */
+    public static String getFileName(String template, GenTable genTable)
+    {
+        // 鏂囦欢鍚嶇О
+        String fileName = "";
+        // 鍖呰矾寰�
+        String packageName = genTable.getPackageName();
+        // 妯″潡鍚�
+        String moduleName = genTable.getModuleName();
+        // 澶у啓绫诲悕
+        String className = genTable.getClassName();
+        // 涓氬姟鍚嶇О
+        String businessName = genTable.getBusinessName();
+
+        String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
+        String mybatisPath = MYBATIS_PATH + "/" + moduleName;
+        String vuePath = "vue";
+
+        if (template.contains("domain.java.vm"))
+        {
+            fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
+        }
+        else if (template.contains("mapper.java.vm"))
+        {
+            fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
+        }
+        else if (template.contains("service.java.vm"))
+        {
+            fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
+        }
+        else if (template.contains("serviceImpl.java.vm"))
+        {
+            fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
+        }
+        else if (template.contains("controller.java.vm"))
+        {
+            fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
+        }
+        else if (template.contains("mapper.xml.vm"))
+        {
+            fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
+        }
+        else if (template.contains("sql.vm"))
+        {
+            fileName = businessName + "Menu.sql";
+        }
+        else if (template.contains("js.vm"))
+        {
+            fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
+        }
+        else if (template.contains("vue.vm"))
+        {
+            fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
+        }
+        return fileName;
+    }
+
+    /**
+     * 鑾峰彇鍖呭墠缂�
+     * 
+     * @param packageName 鍖呭悕绉�
+     * @return 鍖呭墠缂�鍚嶇О
+     */
+    public static String getPackagePrefix(String packageName)
+    {
+        int lastIndex = packageName.lastIndexOf(".");
+        String basePackage = StringUtils.substring(packageName, 0, lastIndex);
+        return basePackage;
+    }
+
+    /**
+     * 鏍规嵁鍒楃被鍨嬭幏鍙栧鍏ュ寘
+     * 
+     * @param column 鍒楅泦鍚�
+     * @return 杩斿洖闇�瑕佸鍏ョ殑鍖呭垪琛�
+     */
+    public static HashSet<String> getImportList(List<GenTableColumn> columns)
+    {
+        HashSet<String> importList = new HashSet<String>();
+        for (GenTableColumn column : columns)
+        {
+            if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType()))
+            {
+                importList.add("java.util.Date");
+            }
+            else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType()))
+            {
+                importList.add("java.math.BigDecimal");
+            }
+        }
+        return importList;
+    }
+
+    /**
+     * 鑾峰彇鏉冮檺鍓嶇紑
+     * 
+     * @param moduleName 妯″潡鍚嶇О
+     * @param businessName 涓氬姟鍚嶇О
+     * @return 杩斿洖鏉冮檺鍓嶇紑
+     */
+    public static String getPermissionPrefix(String moduleName, String businessName)
+    {
+        return StringUtils.format("{}:{}", moduleName, businessName);
+
+    }
+
+    /**
+     * 鑾峰彇鏍戠紪鐮�
+     * 
+     * @param options 鐢熸垚鍏朵粬閫夐」
+     * @return 鏍戠紪鐮�
+     */
+    public static String getTreecode(JSONObject paramsObj)
+    {
+        if (paramsObj.containsKey(GenConstants.TREE_CODE))
+        {
+            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE));
+        }
+        return "";
+    }
+
+    /**
+     * 鑾峰彇鏍戠埗缂栫爜
+     * 
+     * @param options 鐢熸垚鍏朵粬閫夐」
+     * @return 鏍戠埗缂栫爜
+     */
+    public static String getTreeParentCode(JSONObject paramsObj)
+    {
+        if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
+        {
+            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE));
+        }
+        return "";
+    }
+
+    /**
+     * 鑾峰彇鏍戝悕绉�
+     * 
+     * @param options 鐢熸垚鍏朵粬閫夐」
+     * @return 鏍戝悕绉�
+     */
+    public static String getTreeName(JSONObject paramsObj)
+    {
+        if (paramsObj.containsKey(GenConstants.TREE_NAME))
+        {
+            return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME));
+        }
+        return "";
+    }
+
+    /**
+     * 鑾峰彇闇�瑕佸湪鍝竴鍒椾笂闈㈡樉绀哄睍寮�鎸夐挳
+     * 
+     * @param genTable 涓氬姟琛ㄥ璞�
+     * @return 灞曞紑鎸夐挳鍒楀簭鍙�
+     */
+    public static int getExpandColumn(GenTable genTable)
+    {
+        String options = genTable.getOptions();
+        JSONObject paramsObj = JSONObject.parseObject(options);
+        String treeName = paramsObj.getString(GenConstants.TREE_NAME);
+        int num = 0;
+        for (GenTableColumn column : genTable.getColumns())
+        {
+            if (column.isList())
+            {
+                num++;
+                String columnName = column.getColumnName();
+                if (columnName.equals(treeName))
+                {
+                    break;
+                }
+            }
+        }
+        return num;
+    }
+}
diff --git a/basic/src/main/java/com/dingzhuo/energy/project/tool/swagger/TestController.java b/basic/src/main/java/com/dingzhuo/energy/project/tool/swagger/TestController.java
new file mode 100644
index 0000000..3350a58
--- /dev/null
+++ b/basic/src/main/java/com/dingzhuo/energy/project/tool/swagger/TestController.java
@@ -0,0 +1,178 @@
+package com.dingzhuo.energy.project.tool.swagger;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+
+/**
+ * swagger 鐢ㄦ埛娴嬭瘯鏂规硶
+ *
+ * @author ruoyi
+ */
+@Api(value = "鐢ㄦ埛淇℃伅绠$悊",tags = {"鐢ㄦ埛淇℃伅绠$悊"})
+@RestController
+@RequestMapping("/test/user")
+public class TestController extends BaseController
+{
+    private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
+    {
+        users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
+        users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
+    }
+
+    @ApiOperation("鑾峰彇鐢ㄦ埛鍒楄〃")
+    @GetMapping("/list")
+    public AjaxResult userList()
+    {
+        List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
+        return AjaxResult.success(userList);
+    }
+
+    @ApiOperation("鑾峰彇鐢ㄦ埛璇︾粏")
+    @ApiImplicitParam(name = "userId", value = "鐢ㄦ埛ID", required = true, dataType = "int", paramType = "path")
+    @GetMapping("/{userId}")
+    public AjaxResult getUser(@PathVariable Integer userId)
+    {
+        if (!users.isEmpty() && users.containsKey(userId))
+        {
+            return AjaxResult.success(users.get(userId));
+        }
+        else
+        {
+            return AjaxResult.error("鐢ㄦ埛涓嶅瓨鍦�");
+        }
+    }
+
+    @ApiOperation("鏂板鐢ㄦ埛")
+    @ApiImplicitParam(name = "userEntity", value = "鏂板鐢ㄦ埛淇℃伅", dataType = "UserEntity")
+    @PostMapping("/save")
+    public AjaxResult save(UserEntity user)
+    {
+        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
+        {
+            return AjaxResult.error("鐢ㄦ埛ID涓嶈兘涓虹┖");
+        }
+        return AjaxResult.success(users.put(user.getUserId(), user));
+    }
+
+    @ApiOperation("鏇存柊鐢ㄦ埛")
+    @ApiImplicitParam(name = "userEntity", value = "鏂板鐢ㄦ埛淇℃伅", dataType = "UserEntity")
+    @PutMapping("/update")
+    public AjaxResult update(UserEntity user)
+    {
+        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
+        {
+            return AjaxResult.error("鐢ㄦ埛ID涓嶈兘涓虹┖");
+        }
+        if (users.isEmpty() || !users.containsKey(user.getUserId()))
+        {
+            return AjaxResult.error("鐢ㄦ埛涓嶅瓨鍦�");
+        }
+        users.remove(user.getUserId());
+        return AjaxResult.success(users.put(user.getUserId(), user));
+    }
+
+    @ApiOperation("鍒犻櫎鐢ㄦ埛淇℃伅")
+    @ApiImplicitParam(name = "userId", value = "鐢ㄦ埛ID", required = true, dataType = "int", paramType = "path")
+    @DeleteMapping("/{userId}")
+    public AjaxResult delete(@PathVariable Integer userId)
+    {
+        if (!users.isEmpty() && users.containsKey(userId))
+        {
+            users.remove(userId);
+            return AjaxResult.success();
+        }
+        else
+        {
+            return AjaxResult.error("鐢ㄦ埛涓嶅瓨鍦�");
+        }
+    }
+}
+
+@ApiModel("鐢ㄦ埛瀹炰綋")
+class UserEntity
+{
+    @ApiModelProperty("鐢ㄦ埛ID")
+    private Integer userId;
+
+    @ApiModelProperty("鐢ㄦ埛鍚嶇О")
+    private String username;
+
+    @ApiModelProperty("鐢ㄦ埛瀵嗙爜")
+    private String password;
+
+    @ApiModelProperty("鐢ㄦ埛鎵嬫満")
+    private String mobile;
+
+    public UserEntity()
+    {
+
+    }
+
+    public UserEntity(Integer userId, String username, String password, String mobile)
+    {
+        this.userId = userId;
+        this.username = username;
+        this.password = password;
+        this.mobile = mobile;
+    }
+
+    public Integer getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Integer userId)
+    {
+        this.userId = userId;
+    }
+
+    public String getUsername()
+    {
+        return username;
+    }
+
+    public void setUsername(String username)
+    {
+        this.username = username;
+    }
+
+    public String getPassword()
+    {
+        return password;
+    }
+
+    public void setPassword(String password)
+    {
+        this.password = password;
+    }
+
+    public String getMobile()
+    {
+        return mobile;
+    }
+
+    public void setMobile(String mobile)
+    {
+        this.mobile = mobile;
+    }
+}
diff --git a/basic/src/main/resources/mybatis/monitor/SysLogininforMapper.xml b/basic/src/main/resources/mybatis/monitor/SysLogininforMapper.xml
new file mode 100644
index 0000000..7614bd7
--- /dev/null
+++ b/basic/src/main/resources/mybatis/monitor/SysLogininforMapper.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.monitor.mapper.SysLogininforMapper">
+
+	<resultMap type="SysLogininfor" id="SysLogininforResult">
+		<id     property="infoId"        column="info_id"           />
+		<result property="userName"      column="user_name"         />
+		<result property="status"        column="status"            />
+		<result property="ipaddr"        column="ipaddr"            />
+		<result property="loginLocation" column="login_location"    />
+		<result property="browser"       column="browser"           />
+		<result property="os"            column="os"                />
+		<result property="msg"           column="msg"               />
+		<result property="loginTime"     column="login_time"        />
+	</resultMap>
+
+	<insert id="insertLogininfor" parameterType="SysLogininfor">
+		insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time)
+		values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, now())
+	</insert>
+	
+	<select id="selectLogininforList" parameterType="SysLogininfor" resultMap="SysLogininforResult">
+		select info_id, user_name, ipaddr, login_location, browser, os, status, msg, login_time from sys_logininfor
+		<where>
+			<if test="ipaddr != null and ipaddr != ''">
+				AND ipaddr like concat('%', #{ipaddr}, '%')
+			</if>
+			<if test="status != null and status != ''">
+				AND status = #{status}
+			</if>
+			<if test="userName != null and userName != ''">
+				AND user_name like concat('%', #{userName}, '%')
+			</if>
+			<if test="beginTime != null and beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+				and login_time &gt;= to_date(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+			</if>
+			<if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+				and login_time &lt;= to_date(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+			</if>
+		</where>
+	</select>
+	
+	<delete id="deleteLogininforByIds" parameterType="Long">
+ 		delete from sys_logininfor where info_id in
+ 		<foreach collection="array" item="infoId" open="(" separator="," close=")">
+ 			#{infoId}
+        </foreach> 
+ 	</delete>
+    
+    <update id="cleanLogininfor">
+        truncate table sys_logininfor
+    </update>
+    
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/monitor/SysOperLogMapper.xml b/basic/src/main/resources/mybatis/monitor/SysOperLogMapper.xml
new file mode 100644
index 0000000..eca509f
--- /dev/null
+++ b/basic/src/main/resources/mybatis/monitor/SysOperLogMapper.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.monitor.mapper.SysOperLogMapper">
+
+	<resultMap type="SysOperLog" id="SysOperLogResult">
+		<id     property="operId"         column="oper_id"        />
+		<result property="title"          column="title"          />
+		<result property="businessType"   column="business_type"  />
+		<result property="method"         column="method"         />
+		<result property="requestMethod"  column="request_method" />
+		<result property="operatorType"   column="operator_type"  />
+		<result property="operName"       column="oper_name"      />
+		<result property="deptName"       column="dept_name"      />
+		<result property="operUrl"        column="oper_url"       />
+		<result property="operIp"         column="oper_ip"        />
+		<result property="operLocation"   column="oper_location"  />
+		<result property="operParam"      column="oper_param"     />
+		<result property="jsonResult"     column="json_result"    />
+		<result property="status"         column="status"         />
+		<result property="errorMsg"       column="error_msg"      />
+		<result property="operTime"       column="oper_time"      />
+	</resultMap>
+
+	<sql id="selectOperLogVo">
+        select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time
+        from sys_oper_log
+    </sql>
+    
+	<insert id="insertOperlog" parameterType="SysOperLog">
+		insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time)
+        values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, now())
+	</insert>
+	
+	<select id="selectOperLogList" parameterType="SysOperLog" resultMap="SysOperLogResult">
+		<include refid="selectOperLogVo"/>
+		<where>
+			<if test="title != null and title != ''">
+				AND title like concat('%', #{title}, '%')
+			</if>
+			<if test="businessType != null">
+				AND business_type = #{businessType}
+			</if>
+			<if test="businessTypes != null and businessTypes.length > 0">
+			    AND business_type in
+			    <foreach collection="businessTypes" item="businessType" open="(" separator="," close=")">
+		 			#{businessType}
+		        </foreach> 
+			</if>
+			<if test="status != null">
+				AND status = #{status}
+			</if>
+			<if test="operName != null and operName != ''">
+				AND oper_name like concat('%', #{operName}, '%')
+			</if>
+			<if test="beginTime != null and beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+				and oper_time &gt;= to_date(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+			</if>
+			<if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+				and oper_time &lt;= to_date(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+			</if>
+		</where>
+	</select>
+	
+	<delete id="deleteOperLogByIds" parameterType="Long">
+ 		delete from sys_oper_log where oper_id in
+ 		<foreach collection="array" item="operId" open="(" separator="," close=")">
+ 			#{operId}
+        </foreach> 
+ 	</delete>
+ 	
+ 	<select id="selectOperLogById" parameterType="Long" resultMap="SysOperLogResult">
+		<include refid="selectOperLogVo"/>
+		where oper_id = #{operId}
+	</select>
+	
+	<update id="cleanOperLog">
+        truncate table sys_oper_log
+    </update>
+
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysConfigMapper.xml b/basic/src/main/resources/mybatis/system/SysConfigMapper.xml
new file mode 100644
index 0000000..71ead9a
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysConfigMapper.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysConfigMapper">
+    
+    <resultMap type="SysConfig" id="SysConfigResult">
+    	<id     property="configId"      column="config_id"      />
+        <result property="configName"    column="config_name"    />
+        <result property="configKey"     column="config_key"     />
+        <result property="configValue"   column="config_value"   />
+        <result property="configType"    column="config_type"    />
+        <result property="createBy"      column="create_by"      />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"      column="update_by"      />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+    
+    <sql id="selectConfigVo">
+        select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark 
+		from sys_config
+    </sql>
+    
+    <!-- 鏌ヨ鏉′欢 -->
+	<sql id="sqlwhereSearch">
+		<where>
+			<if test="configId !=null">
+				and config_id = #{configId}
+			</if>
+			<if test="configKey !=null and configKey != ''">
+				and config_key = #{configKey}
+			</if>
+		</where>
+	</sql>
+    
+    <select id="selectConfig" parameterType="SysConfig" resultMap="SysConfigResult">
+        <include refid="selectConfigVo"/>
+        <include refid="sqlwhereSearch"/>
+    </select>
+    
+    <select id="selectConfigList" parameterType="SysConfig" resultMap="SysConfigResult">
+        <include refid="selectConfigVo"/>
+        <where>
+			<if test="configName != null and configName != ''">
+				AND config_name like concat('%', #{configName}, '%')
+			</if>
+			<if test="configType != null and configType != ''">
+				AND config_type = #{configType}
+			</if>
+			<if test="configKey != null and configKey != ''">
+				AND config_key like concat('%', #{configKey}, '%')
+			</if>
+			<if test="beginTime != null and beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+				and create_time &gt;= to_date(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+			</if>
+			<if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+				and create_time &lt;= to_date(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+			</if>
+		</where>
+    </select>
+    
+    <select id="checkConfigKeyUnique" parameterType="String" resultMap="SysConfigResult">
+        <include refid="selectConfigVo"/>
+        where config_key = #{configKey}
+    </select>
+    
+    <insert id="insertConfig" parameterType="SysConfig">
+        insert into sys_config (
+			<if test="configName != null and configName != '' ">config_name,</if>
+			<if test="configKey != null and configKey != '' ">config_key,</if>
+			<if test="configValue != null and configValue != '' ">config_value,</if>
+			<if test="configType != null and configType != '' ">config_type,</if>
+			<if test="createBy != null and createBy != ''">create_by,</if>
+			<if test="remark != null and remark != ''">remark,</if>
+ 			create_time
+        )values(
+			<if test="configName != null and configName != ''">#{configName},</if>
+			<if test="configKey != null and configKey != ''">#{configKey},</if>
+			<if test="configValue != null and configValue != ''">#{configValue},</if>
+			<if test="configType != null and configType != ''">#{configType},</if>
+			<if test="createBy != null and createBy != ''">#{createBy},</if>
+			<if test="remark != null and remark != ''">#{remark},</if>
+        now()
+		)
+    </insert>
+	 
+    <update id="updateConfig" parameterType="SysConfig">
+        update sys_config 
+        <set>
+            <if test="configName != null and configName != ''">config_name = #{configName},</if>
+            <if test="configKey != null and configKey != ''">config_key = #{configKey},</if>
+            <if test="configValue != null and configValue != ''">config_value = #{configValue},</if>
+            <if test="configType != null and configType != ''">config_type = #{configType},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+ 			update_time = now()
+        </set>
+        where config_id = #{configId}
+    </update>
+	
+    <delete id="deleteConfigById" parameterType="Long">
+        delete from sys_config where config_id = #{configId}
+    </delete>
+    
+    <delete id="deleteConfigByIds" parameterType="Long">
+        delete from sys_config where config_id in 
+        <foreach item="configId" collection="array" open="(" separator="," close=")">
+        	#{configId}
+        </foreach>
+    </delete>
+    
+</mapper>
diff --git a/basic/src/main/resources/mybatis/system/SysDeptMapper.xml b/basic/src/main/resources/mybatis/system/SysDeptMapper.xml
new file mode 100644
index 0000000..9b5b8e2
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysDeptMapper.xml
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysDeptMapper">
+
+    <resultMap type="SysDept" id="SysDeptResult">
+        <id property="deptId" column="dept_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="ancestors" column="ancestors"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="leader" column="leader"/>
+        <result property="phone" column="phone"/>
+        <result property="email" column="email"/>
+        <result property="status" column="status"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="parentName" column="parent_name"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectDeptVo">
+        select d.dept_id,
+               d.parent_id,
+               d.ancestors,
+               d.dept_name,
+               d.order_num,
+               d.leader,
+               d.phone,
+               d.email,
+               d.status,
+               d.del_flag,
+               d.create_by,
+               d.create_time
+        from sys_dept d
+    </sql>
+
+    <select id="selectDeptList" parameterType="SysDept" resultMap="SysDeptResult">
+        <include refid="selectDeptVo"/>
+        where d.del_flag = '0'
+        <if test="parentId != null and parentId != 0">
+            AND parent_id = #{parentId}
+        </if>
+        <if test="deptName != null and deptName != ''">
+            AND dept_name like concat('%', #{deptName}, '%')
+        </if>
+        <if test="status != null and status != ''">
+            AND status = #{status}
+        </if>
+        <!-- 鏁版嵁鑼冨洿杩囨护 -->
+        ${dataScope}
+        order by d.parent_id, d.order_num
+    </select>
+
+    <select id="selectDeptListByRoleId" parameterType="Long" resultType="Integer">
+        select d.dept_id, d.parent_id
+        from sys_dept d
+                 left join sys_role_dept rd on d.dept_id = rd.dept_id
+        where rd.role_id = #{roleId}
+          and d.dept_id not in (select d.parent_id
+                                from sys_dept d
+                                         inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
+        order by d.parent_id, d.order_num
+    </select>
+
+    <select id="selectDeptById" parameterType="Long" resultMap="SysDeptResult">
+        <include refid="selectDeptVo"/>
+        where dept_id = #{deptId}
+    </select>
+
+    <select id="checkDeptExistUser" parameterType="Long" resultType="int">
+        select count(1)
+        from sys_user
+        where dept_id = #{deptId}
+          and del_flag = '0'
+    </select>
+
+    <select id="hasChildByDeptId" parameterType="Long" resultType="int">
+        select count(1)
+        from sys_dept
+        where del_flag = '0'
+          and parent_id = #{deptId}
+    </select>
+
+    <select id="selectChildrenDeptById" parameterType="Long" resultMap="SysDeptResult">
+        select *
+        from sys_dept
+        where ancestors = (select ancestors from sys_dept where dept_id = #{deptId}) || #{deptId}
+    </select>
+
+    <select id="checkDeptNameUnique" resultMap="SysDeptResult">
+        <include refid="selectDeptVo"/>
+        where dept_name=#{deptName} and parent_id = #{parentId}
+    </select>
+
+    <insert id="insertDept" parameterType="SysDept">
+        insert into sys_dept(
+        <if test="deptId != null and deptId != 0">dept_id,</if>
+        <if test="parentId != null and parentId != 0">parent_id,</if>
+        <if test="deptName != null and deptName != ''">dept_name,</if>
+        <if test="ancestors != null and ancestors != ''">ancestors,</if>
+        <if test="orderNum != null and orderNum != ''">order_num,</if>
+        <if test="leader != null and leader != ''">leader,</if>
+        <if test="phone != null and phone != ''">phone,</if>
+        <if test="email != null and email != ''">email,</if>
+        <if test="status != null">status,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        create_time
+        )values(
+        <if test="deptId != null and deptId != 0">#{deptId},</if>
+        <if test="parentId != null and parentId != 0">#{parentId},</if>
+        <if test="deptName != null and deptName != ''">#{deptName},</if>
+        <if test="ancestors != null and ancestors != ''">#{ancestors},</if>
+        <if test="orderNum != null and orderNum != ''">#{orderNum},</if>
+        <if test="leader != null and leader != ''">#{leader},</if>
+        <if test="phone != null and phone != ''">#{phone},</if>
+        <if test="email != null and email != ''">#{email},</if>
+        <if test="status != null">#{status},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        now()
+        )
+    </insert>
+
+    <update id="updateDept" parameterType="SysDept">
+        update sys_dept
+        <set>
+            <if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
+            <if test="deptName != null and deptName != ''">dept_name = #{deptName},</if>
+            <if test="ancestors != null and ancestors != ''">ancestors = #{ancestors},</if>
+            <if test="orderNum != null and orderNum != ''">order_num = #{orderNum},</if>
+            <if test="leader != null">leader = #{leader},</if>
+            <if test="phone != null">phone = #{phone},</if>
+            <if test="email != null">email = #{email},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = now()
+        </set>
+        where dept_id = #{deptId}
+    </update>
+
+    <update id="updateDeptChildren" parameterType="java.util.List">
+        update sys_dept set ancestors =
+        <foreach collection="depts" item="item" index="index"
+                 separator=" " open="case dept_id" close="end">
+            when #{item.deptId} then #{item.ancestors}
+        </foreach>
+        where dept_id in
+        <foreach collection="depts" item="item" index="index"
+                 separator="," open="(" close=")">
+            #{item.deptId}
+        </foreach>
+    </update>
+
+    <update id="updateDeptStatus" parameterType="SysDept">
+        update sys_dept
+        <set>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            update_time = now()
+        </set>
+        where dept_id in (${ancestors})
+    </update>
+
+    <delete id="deleteDeptById" parameterType="Long">
+        update sys_dept
+        set del_flag = '2'
+        where dept_id = #{deptId}
+    </delete>
+
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysDictDataMapper.xml b/basic/src/main/resources/mybatis/system/SysDictDataMapper.xml
new file mode 100644
index 0000000..188dfc0
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysDictDataMapper.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysDictDataMapper">
+	
+	<resultMap type="SysDictData" id="SysDictDataResult">
+		<id     property="dictCode"   column="dict_code"   />
+		<result property="dictSort"   column="dict_sort"   />
+		<result property="dictLabel"  column="dict_label"  />
+		<result property="dictValue"  column="dict_value"  />
+		<result property="dictType"   column="dict_type"   />
+		<result property="cssClass"   column="css_class"   />
+		<result property="listClass"  column="list_class"  />
+		<result property="isDefault"  column="is_default"  />
+		<result property="status"     column="status"      />
+		<result property="createBy"   column="create_by"   />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy"   column="update_by"   />
+		<result property="updateTime" column="update_time" />
+	</resultMap>
+	
+	<sql id="selectDictDataVo">
+        select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark 
+		from sys_dict_data
+    </sql>
+
+	<select id="selectDictDataList" parameterType="SysDictData" resultMap="SysDictDataResult">
+	    <include refid="selectDictDataVo"/>
+		<where>
+		    <if test="dictType != null and dictType != ''">
+				AND dict_type = #{dictType}
+			</if>
+			<if test="dictLabel != null and dictLabel != ''">
+				AND dict_label like concat('%', #{dictLabel}, '%')
+			</if>
+			<if test="status != null and status != ''">
+				AND status = #{status}
+			</if>
+			order by dict_sort
+		</where>
+	</select>
+	
+	<select id="selectDictDataByType" parameterType="SysDictData" resultMap="SysDictDataResult">
+		<include refid="selectDictDataVo"/>
+		where status = '0' and dict_type = #{dictType} order by dict_sort asc
+	</select>
+
+	<select id="selectDictLabel" resultType="String">
+		select dict_label from sys_dict_data
+		where dict_type = #{dictType} and dict_value = #{dictValue}
+	</select>
+	
+	<select id="selectDictDataById" parameterType="Long" resultMap="SysDictDataResult">
+		<include refid="selectDictDataVo"/>
+		where dict_code = #{dictCode}
+	</select>
+	
+	<select id="countDictDataByType" resultType="Integer">
+	    select count(1) from sys_dict_data where dict_type=#{dictType}  
+	</select>
+	
+	<delete id="deleteDictDataById" parameterType="Long">
+ 		delete from sys_dict_data where dict_code = #{dictCode}
+ 	</delete>
+ 	
+ 	<delete id="deleteDictDataByIds" parameterType="Long">
+ 		delete from sys_dict_data where dict_code in
+ 		<foreach collection="array" item="dictCode" open="(" separator="," close=")">
+ 			#{dictCode}
+        </foreach> 
+ 	</delete>
+	
+	<update id="updateDictData" parameterType="SysDictData">
+ 		update sys_dict_data
+ 		<set>
+ 			<if test="dictSort != null and dictSort != ''">dict_sort = #{dictSort},</if>
+ 			<if test="dictLabel != null and dictLabel != ''">dict_label = #{dictLabel},</if>
+ 			<if test="dictValue != null and dictValue != ''">dict_value = #{dictValue},</if>
+ 			<if test="dictType != null and dictType != ''">dict_type = #{dictType},</if>
+ 			<if test="cssClass != null">css_class = #{cssClass},</if>
+ 			<if test="listClass != null">list_class = #{listClass},</if>
+ 			<if test="isDefault != null and isDefault != ''">is_default = #{isDefault},</if>
+ 			<if test="status != null">status = #{status},</if>
+ 			<if test="remark != null">remark = #{remark},</if>
+ 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+ 			update_time = now()
+ 		</set>
+ 		where dict_code = #{dictCode}
+	</update>
+	
+	<update id="updateDictDataType" parameterType="String">
+ 		update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType}
+	</update>
+ 	
+ 	<insert id="insertDictData" parameterType="SysDictData">
+ 		insert into sys_dict_data(
+ 			<if test="dictSort != null and dictSort != ''">dict_sort,</if>
+ 			<if test="dictLabel != null and dictLabel != ''">dict_label,</if>
+ 			<if test="dictValue != null and dictValue != ''">dict_value,</if>
+ 			<if test="dictType != null and dictType != ''">dict_type,</if>
+ 			<if test="cssClass != null and cssClass != ''">css_class,</if>
+ 			<if test="listClass != null and listClass != ''">list_class,</if>
+ 			<if test="isDefault != null and isDefault != ''">is_default,</if>
+ 			<if test="status != null">status,</if>
+ 			<if test="remark != null and remark != ''">remark,</if>
+ 			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			create_time
+ 		)values(
+ 		    <if test="dictSort != null and dictSort != ''">#{dictSort},</if>
+ 		    <if test="dictLabel != null and dictLabel != ''">#{dictLabel},</if>
+ 			<if test="dictValue != null and dictValue != ''">#{dictValue},</if>
+ 			<if test="dictType != null and dictType != ''">#{dictType},</if>
+ 			<if test="cssClass != null and cssClass != ''">#{cssClass},</if>
+ 			<if test="listClass != null and listClass != ''">#{listClass},</if>
+ 			<if test="isDefault != null and isDefault != ''">#{isDefault},</if>
+ 			<if test="status != null">#{status},</if>
+ 			<if test="remark != null and remark != ''">#{remark},</if>
+ 			<if test="createBy != null and createBy != ''">#{createBy},</if>
+ 			now()
+ 		)
+	</insert>
+	
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysDictTypeMapper.xml b/basic/src/main/resources/mybatis/system/SysDictTypeMapper.xml
new file mode 100644
index 0000000..97fd786
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysDictTypeMapper.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysDictTypeMapper">
+
+	<resultMap type="SysDictType" id="SysDictTypeResult">
+		<id     property="dictId"     column="dict_id"     />
+		<result property="dictName"   column="dict_name"   />
+		<result property="dictType"   column="dict_type"   />
+		<result property="status"     column="status"      />
+		<result property="createBy"   column="create_by"   />
+		<result property="createTime" column="create_time" />
+		<result property="updateBy"   column="update_by"   />
+		<result property="updateTime" column="update_time" />
+	</resultMap>
+	
+	<sql id="selectDictTypeVo">
+        select dict_id, dict_name, dict_type, status, create_by, create_time, remark 
+		from sys_dict_type
+    </sql>
+
+	<select id="selectDictTypeList" parameterType="SysDictType" resultMap="SysDictTypeResult">
+	    <include refid="selectDictTypeVo"/>
+		<where>
+		    <if test="dictName != null and dictName != ''">
+				AND dict_name like concat('%', #{dictName}, '%')
+			</if>
+			<if test="status != null and status != ''">
+				AND status = #{status}
+			</if>
+			<if test="dictType != null and dictType != ''">
+				AND dict_type like concat('%', #{dictType}, '%')
+			</if>
+			<if test="beginTime != null and beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+				and to_char(create_time,'yyyymmdd') &gt;= to_char(to_date(#{beginTime}, 'yyyy-mm-dd'),'yyyymmdd')
+			</if>
+			<if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+				and to_char(create_time,'yyyymmdd') &lt;= to_char(to_date(#{endTime}, 'yyyy-mm-dd'),'yyyymmdd')
+			</if>
+	    </where>
+	</select>
+	
+	<select id="selectDictTypeAll" resultMap="SysDictTypeResult">
+		<include refid="selectDictTypeVo"/>
+	</select>
+	
+	<select id="selectDictTypeById" parameterType="Long" resultMap="SysDictTypeResult">
+		<include refid="selectDictTypeVo"/>
+		where dict_id = #{dictId}
+	</select>
+	
+	<select id="selectDictTypeByType" parameterType="String" resultMap="SysDictTypeResult">
+		<include refid="selectDictTypeVo"/>
+		where dict_type = #{dictType}
+	</select>
+	
+	<select id="checkDictTypeUnique" parameterType="String" resultMap="SysDictTypeResult">
+		<include refid="selectDictTypeVo"/>
+		where dict_type = #{dictType}
+	</select>
+	
+	<delete id="deleteDictTypeById" parameterType="Long">
+ 		delete from sys_dict_type where dict_id = #{dictId}
+ 	</delete>
+ 	
+ 	<delete id="deleteDictTypeByIds" parameterType="Long">
+ 		delete from sys_dict_type where dict_id in
+ 		<foreach collection="array" item="dictId" open="(" separator="," close=")">
+ 			#{dictId}
+        </foreach> 
+ 	</delete>
+
+ 	<update id="updateDictType" parameterType="SysDictType">
+ 		update sys_dict_type
+ 		<set>
+ 			<if test="dictName != null and dictName != ''">dict_name = #{dictName},</if>
+ 			<if test="dictType != null and dictType != ''">dict_type = #{dictType},</if>
+ 			<if test="status != null">status = #{status},</if>
+ 			<if test="remark != null">remark = #{remark},</if>
+ 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+ 			update_time = now()
+ 		</set>
+ 		where dict_id = #{dictId}
+	</update>
+ 	
+ 	<insert id="insertDictType" parameterType="SysDictType">
+ 		insert into sys_dict_type(
+ 			<if test="dictName != null and dictName != ''">dict_name,</if>
+ 			<if test="dictType != null and dictType != ''">dict_type,</if>
+ 			<if test="status != null">status,</if>
+ 			<if test="remark != null and remark != ''">remark,</if>
+ 			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			create_time
+ 		)values(
+ 			<if test="dictName != null and dictName != ''">#{dictName},</if>
+ 			<if test="dictType != null and dictType != ''">#{dictType},</if>
+ 			<if test="status != null">#{status},</if>
+ 			<if test="remark != null and remark != ''">#{remark},</if>
+ 			<if test="createBy != null and createBy != ''">#{createBy},</if>
+			now()
+ 		)
+	</insert>
+	
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysMenuMapper.xml b/basic/src/main/resources/mybatis/system/SysMenuMapper.xml
new file mode 100644
index 0000000..6488063
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysMenuMapper.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+		PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+		"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysMenuMapper">
+
+	<resultMap type="SysMenu" id="SysMenuResult">
+		<id     property="menuId"         column="menu_id"        />
+		<result property="menuName"       column="menu_name"      />
+		<result property="parentName"     column="parent_name"    />
+		<result property="parentId"       column="parent_id"      />
+		<result property="orderNum"       column="order_num"      />
+		<result property="path"           column="path"           />
+		<result property="component"      column="component"      />
+		<result property="isFrame"        column="is_frame"       />
+		<result property="menuType"       column="menu_type"      />
+		<result property="visible"        column="visible"        />
+		<result property="perms"          column="perms"          />
+		<result property="icon"           column="icon"           />
+		<result property="createBy"       column="create_by"      />
+		<result property="createTime"     column="create_time"    />
+		<result property="updateTime"     column="update_time"    />
+		<result property="updateBy"       column="update_by"      />
+		<result property="remark"         column="remark"         />
+		<result property="parameter"         column="page_parameter"         />
+	</resultMap>
+
+	<sql id="selectMenuVo">
+        select menu_id, menu_name, parent_id, order_num, path, component, is_frame, menu_type, visible, COALESCE(perms,'') as perms, icon, create_time,page_parameter
+		from sys_menu
+    </sql>
+    
+    <select id="selectMenuList" parameterType="SysMenu" resultMap="SysMenuResult">
+		<include refid="selectMenuVo"/>
+		<where>
+			<if test="menuName != null and menuName != ''">
+				AND menu_name like concat('%', #{menuName}, '%')
+			</if>
+			<if test="visible != null and visible != ''">
+				AND visible = #{visible}
+			</if>
+		</where>
+		order by parent_id, order_num
+	</select>
+	
+	<select id="selectMenuTreeAll" resultMap="SysMenuResult">
+		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.visible, COALESCE(m.perms,'') as perms, m.is_frame, m.menu_type, m.icon, m.order_num, m.create_time,m.page_parameter
+		from sys_menu m where m.menu_type in ('M', 'C') and m.visible = '0'
+		order by m.parent_id, m.order_num
+	</select>
+    
+    <select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
+		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.visible, COALESCE(m.perms,'') as perms, m.is_frame, m.menu_type, m.icon, m.order_num, m.create_time,m.page_parameter
+		from sys_menu m
+			 left join sys_role_menu rm on m.menu_id = rm.menu_id
+			 left join sys_user_role ur on rm.role_id = ur.role_id
+			 left join sys_role ro on ur.role_id = ro.role_id
+			 left join sys_user u on ur.user_id = u.user_id
+		where u.user_id = #{userId} and m.menu_type in ('M', 'C') and m.visible = '0'  AND ro.status = '0'
+		order by m.parent_id, m.order_num
+	</select>
+	
+	<select id="selectMenuListByRoleId" parameterType="Long" resultType="Integer">
+		select m.menu_id, m.parent_id
+		from sys_menu m
+            left join sys_role_menu rm on m.menu_id = rm.menu_id
+        where rm.role_id = #{roleId}
+        	and m.menu_id not in (select m.parent_id from sys_menu m inner join sys_role_menu rm on m.menu_id = rm.menu_id and rm.role_id = #{roleId})
+		order by m.parent_id, m.order_num
+	</select>
+	
+	<select id="selectMenuPerms" resultType="String">
+		select distinct m.perms
+		from sys_menu m
+			 left join sys_role_menu rm on m.menu_id = rm.menu_id
+			 left join sys_user_role ur on rm.role_id = ur.role_id
+	</select>
+
+	<select id="selectMenuPermsByUserId" parameterType="Long" resultType="String">
+		select distinct m.perms
+		from sys_menu m
+			 left join sys_role_menu rm on m.menu_id = rm.menu_id
+			 left join sys_user_role ur on rm.role_id = ur.role_id
+		where ur.user_id = #{userId}
+	</select>
+	
+	<select id="selectMenuById" parameterType="Long" resultMap="SysMenuResult">
+		<include refid="selectMenuVo"/>
+		where menu_id = #{menuId}
+	</select>
+	
+	<select id="hasChildByMenuId" resultType="Integer">
+	    select count(1) from sys_menu where parent_id = #{menuId}  
+	</select>
+	
+	<select id="checkMenuNameUnique" parameterType="SysMenu" resultMap="SysMenuResult">
+		<include refid="selectMenuVo"/>
+		where menu_name=#{menuName} and parent_id = #{parentId}
+	</select>
+	
+	<update id="updateMenu" parameterType="SysMenu">
+		update sys_menu
+		<set>
+			<if test="menuName != null and menuName != ''">menu_name = #{menuName},</if>
+			<if test="parentId != null and parentId != 0">parent_id = #{parentId},</if>
+			<if test="orderNum != null and orderNum != ''">order_num = #{orderNum},</if>
+			<if test="path != null and path != ''">path = #{path},</if>
+			<if test="component != null and component != ''">component = #{component},</if>
+			<if test="isFrame != null and isFrame != ''">is_frame = #{isFrame},</if>
+			<if test="menuType != null and menuType != ''">menu_type = #{menuType},</if>
+			<if test="visible != null">visible = #{visible},</if>
+			<if test="perms !=null">perms = #{perms},</if>
+			<if test="icon !=null and icon != ''">icon = #{icon},</if>
+			<if test="remark != null and remark != ''">remark = #{remark},</if>
+			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+			<if test="parameter != null and parameter != ''">page_parameter = #{parameter},</if>
+			update_time = now()
+		</set>
+		where menu_id = #{menuId}
+	</update>
+
+	<insert id="insertMenu" parameterType="SysMenu">
+		insert into sys_menu(
+		<if test="menuId != null and menuId != 0">menu_id,</if>
+		<if test="parentId != null and parentId != 0">parent_id,</if>
+		<if test="menuName != null and menuName != ''">menu_name,</if>
+		<if test="orderNum != null and orderNum != ''">order_num,</if>
+		<if test="path != null and path != ''">path,</if>
+		<if test="component != null and component != ''">component,</if>
+		<if test="isFrame != null and isFrame != ''">is_frame,</if>
+		<if test="menuType != null and menuType != ''">menu_type,</if>
+		<if test="visible != null">visible,</if>
+		<if test="perms !=null and perms != ''">perms,</if>
+		<if test="icon != null and icon != ''">icon,</if>
+		<if test="remark != null and remark != ''">remark,</if>
+		<if test="createBy != null and createBy != ''">create_by,</if>
+		<if test="parameter != null and parameter != ''">page_parameter,</if>
+		create_time
+		)values(
+		<if test="menuId != null and menuId != 0">#{menuId},</if>
+		<if test="parentId != null and parentId != 0">#{parentId},</if>
+		<if test="menuName != null and menuName != ''">#{menuName},</if>
+		<if test="orderNum != null and orderNum != ''">#{orderNum},</if>
+		<if test="path != null and path != ''">#{path},</if>
+		<if test="component != null and component != ''">#{component},</if>
+		<if test="isFrame != null and isFrame != ''">#{isFrame},</if>
+		<if test="menuType != null and menuType != ''">#{menuType},</if>
+		<if test="visible != null">#{visible},</if>
+		<if test="perms !=null and perms != ''">#{perms},</if>
+		<if test="icon != null and icon != ''">#{icon},</if>
+		<if test="remark != null and remark != ''">#{remark},</if>
+		<if test="createBy != null and createBy != ''">#{createBy},</if>
+		<if test="parameter != null and parameter != ''">#{parameter},</if>
+		now()
+		)
+	</insert>
+	
+	<delete id="deleteMenuById" parameterType="Long">
+	    delete from sys_menu where menu_id = #{menuId}
+	</delete>
+
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysNoticeMapper.xml b/basic/src/main/resources/mybatis/system/SysNoticeMapper.xml
new file mode 100644
index 0000000..ffb93b8
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysNoticeMapper.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysNoticeMapper">
+    
+    <resultMap type="SysNotice" id="SysNoticeResult">
+        <result property="noticeId"       column="notice_id"       />
+        <result property="noticeTitle"    column="notice_title"    />
+        <result property="noticeType"     column="notice_type"     />
+        <result property="noticeContent"  column="notice_content"  />
+        <result property="status"         column="status"          />
+        <result property="createBy"       column="create_by"       />
+        <result property="createTime"     column="create_time"     />
+        <result property="updateBy"       column="update_by"       />
+        <result property="updateTime"     column="update_time"     />
+        <result property="remark"         column="remark"          />
+    </resultMap>
+    
+    <sql id="selectNoticeVo">
+        select notice_id, notice_title, notice_type, notice_content, status, create_by, create_time, update_by, update_time, remark 
+		from sys_notice
+    </sql>
+    
+    <select id="selectNoticeById" parameterType="Long" resultMap="SysNoticeResult">
+        <include refid="selectNoticeVo"/>
+        where notice_id = #{noticeId}
+    </select>
+    
+    <select id="selectNoticeList" parameterType="SysNotice" resultMap="SysNoticeResult">
+        <include refid="selectNoticeVo"/>
+        <where>
+			<if test="noticeTitle != null and noticeTitle != ''">
+				AND notice_title like concat('%', #{noticeTitle}, '%')
+			</if>
+			<if test="noticeType != null and noticeType != ''">
+				AND notice_type = #{noticeType}
+			</if>
+			<if test="createBy != null and createBy != ''">
+				AND create_by like concat('%', #{createBy}, '%')
+			</if>
+		</where>
+    </select>
+    
+    <insert id="insertNotice" parameterType="SysNotice">
+        insert into sys_notice (
+			<if test="noticeTitle != null and noticeTitle != '' ">notice_title, </if>
+			<if test="noticeType != null and noticeType != '' ">notice_type, </if>
+			<if test="noticeContent != null and noticeContent != '' ">notice_content, </if>
+			<if test="status != null and status != '' ">status, </if>
+			<if test="remark != null and remark != ''">remark,</if>
+ 			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			create_time
+ 		)values(
+			<if test="noticeTitle != null and noticeTitle != ''">#{noticeTitle}, </if>
+			<if test="noticeType != null and noticeType != ''">#{noticeType}, </if>
+			<if test="noticeContent != null and noticeContent != ''">#{noticeContent}, </if>
+			<if test="status != null and status != ''">#{status}, </if>
+			<if test="remark != null and remark != ''">#{remark},</if>
+ 			<if test="createBy != null and createBy != ''">#{createBy},</if>
+            now()
+		)
+    </insert>
+	 
+    <update id="updateNotice" parameterType="SysNotice">
+        update sys_notice 
+        <set>
+            <if test="noticeTitle != null and noticeTitle != ''">notice_title = #{noticeTitle}, </if>
+            <if test="noticeType != null and noticeType != ''">notice_type = #{noticeType}, </if>
+            <if test="noticeContent != null">notice_content = #{noticeContent}, </if>
+            <if test="status != null and status != ''">status = #{status}, </if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+ 			update_time = now()
+        </set>
+        where notice_id = #{noticeId}
+    </update>
+	
+    <delete id="deleteNoticeById" parameterType="Long">
+        delete from sys_notice where notice_id = #{noticeId}
+    </delete>
+    
+    <delete id="deleteNoticeByIds" parameterType="Long">
+        delete from sys_notice where notice_id in 
+        <foreach item="noticeId" collection="array" open="(" separator="," close=")">
+            #{noticeId}
+        </foreach>
+    </delete>
+    
+</mapper>
diff --git a/basic/src/main/resources/mybatis/system/SysPostMapper.xml b/basic/src/main/resources/mybatis/system/SysPostMapper.xml
new file mode 100644
index 0000000..694375a
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysPostMapper.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysPostMapper">
+
+	<resultMap type="SysPost" id="SysPostResult">
+		<id     property="postId"        column="post_id"       />
+		<result property="postCode"      column="post_code"     />
+		<result property="postName"      column="post_name"     />
+		<result property="postSort"      column="post_sort"     />
+		<result property="status"        column="status"        />
+		<result property="createBy"      column="create_by"     />
+		<result property="createTime"    column="create_time"   />
+		<result property="updateBy"      column="update_by"     />
+		<result property="updateTime"    column="update_time"   />
+		<result property="remark"        column="remark"        />
+	</resultMap>
+	
+	<sql id="selectPostVo">
+        select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark
+		from sys_post
+    </sql>
+	
+	<select id="selectPostList" parameterType="SysPost" resultMap="SysPostResult">
+	    <include refid="selectPostVo"/>
+		<where>
+			<if test="postCode != null and postCode != ''">
+				AND post_code like concat('%', #{postCode}, '%')
+			</if>
+			<if test="status != null and status != ''">
+				AND status = #{status}
+			</if>
+			<if test="postName != null and postName != ''">
+				AND post_name like concat('%', #{postName}, '%')
+			</if>
+		</where>
+		order by post_sort
+	</select>
+	
+	<select id="selectPostAll" resultMap="SysPostResult">
+		<include refid="selectPostVo"/>
+	</select>
+	
+	<select id="selectPostById" parameterType="Long" resultMap="SysPostResult">
+		<include refid="selectPostVo"/>
+		where post_id = #{postId}
+	</select>
+	
+	<select id="selectPostListByUserId" parameterType="Long" resultType="Integer">
+		select p.post_id
+        from sys_post p
+	        left join sys_user_post up on up.post_id = p.post_id
+	        left join sys_user u on u.user_id = up.user_id
+	    where u.user_id = #{userId}
+	</select>
+	
+	<select id="selectPostsByUserName" parameterType="String" resultMap="SysPostResult">
+		select p.post_id, p.post_name, p.post_code
+		from sys_post p
+			 left join sys_user_post up on up.post_id = p.post_id
+			 left join sys_user u on u.user_id = up.user_id
+		where u.user_name = #{userName}
+	</select>
+	
+	<select id="checkPostNameUnique" parameterType="String" resultMap="SysPostResult">
+		<include refid="selectPostVo"/>
+		 where post_name=#{postName}
+	</select>
+	
+	<select id="checkPostCodeUnique" parameterType="String" resultMap="SysPostResult">
+		<include refid="selectPostVo"/>
+		 where post_code=#{postCode}
+	</select>
+	
+	<update id="updatePost" parameterType="SysPost">
+ 		update sys_post
+ 		<set>
+ 			<if test="postCode != null and postCode != ''">post_code = #{postCode},</if>
+ 			<if test="postName != null and postName != ''">post_name = #{postName},</if>
+ 			<if test="postSort != null and postSort != ''">post_sort = #{postSort},</if>
+ 			<if test="status != null and status != ''">status = #{status},</if>
+ 			<if test="remark != null">remark = #{remark},</if>
+ 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+ 			update_time = now()
+ 		</set>
+ 		where post_id = #{postId}
+	</update>
+ 	
+ 	<insert id="insertPost" parameterType="SysPost" useGeneratedKeys="true" keyProperty="postId">
+ 		insert into sys_post(
+ 			<if test="postId != null and postId != 0">post_id,</if>
+ 			<if test="postCode != null and postCode != ''">post_code,</if>
+ 			<if test="postName != null and postName != ''">post_name,</if>
+ 			<if test="postSort != null and postSort != ''">post_sort,</if>
+ 			<if test="status != null and status != ''">status,</if>
+ 			<if test="remark != null and remark != ''">remark,</if>
+ 			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			create_time
+ 		)values(
+ 			<if test="postId != null and postId != 0">#{postId},</if>
+ 			<if test="postCode != null and postCode != ''">#{postCode},</if>
+ 			<if test="postName != null and postName != ''">#{postName},</if>
+ 			<if test="postSort != null and postSort != ''">#{postSort},</if>
+ 			<if test="status != null and status != ''">#{status},</if>
+ 			<if test="remark != null and remark != ''">#{remark},</if>
+ 			<if test="createBy != null and createBy != ''">#{createBy},</if>
+			now()
+ 		)
+	</insert>
+	
+	<delete id="deletePostById" parameterType="Long">
+		delete from sys_post where post_id = #{postId}
+	</delete>
+	
+	<delete id="deletePostByIds" parameterType="Long">
+ 		delete from sys_post where post_id in
+ 		<foreach collection="array" item="postId" open="(" separator="," close=")">
+ 			#{postId}
+        </foreach> 
+ 	</delete>
+
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysRoleDeptMapper.xml b/basic/src/main/resources/mybatis/system/SysRoleDeptMapper.xml
new file mode 100644
index 0000000..04d54a8
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysRoleDeptMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysRoleDeptMapper">
+
+	<resultMap type="SysRoleDept" id="SysRoleDeptResult">
+		<result property="roleId"     column="role_id"      />
+		<result property="deptId"     column="dept_id"      />
+	</resultMap>
+
+	<delete id="deleteRoleDeptByRoleId" parameterType="Long">
+		delete from sys_role_dept where role_id=#{roleId}
+	</delete>
+	
+	<select id="selectCountRoleDeptByDeptId" resultType="Integer">
+	    select count(1) from sys_role_dept where dept_id=#{deptId}
+	</select>
+	
+	<delete id="deleteRoleDept" parameterType="Long">
+ 		delete from sys_role_dept where role_id in
+ 		<foreach collection="array" item="roleId" open="(" separator="," close=")">
+ 			#{roleId}
+        </foreach> 
+ 	</delete>
+	
+	<insert id="batchRoleDept">
+		insert into sys_role_dept(role_id, dept_id) values
+		<foreach item="item" index="index" collection="list" separator=",">
+			(#{item.roleId},#{item.deptId})
+		</foreach>
+	</insert>
+	
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysRoleMapper.xml b/basic/src/main/resources/mybatis/system/SysRoleMapper.xml
new file mode 100644
index 0000000..5b9bb33
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysRoleMapper.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysRoleMapper">
+
+	<resultMap type="SysRole" id="SysRoleResult">
+		<id     property="roleId"       column="role_id"        />
+		<result property="roleName"     column="role_name"      />
+		<result property="roleKey"      column="role_key"       />
+		<result property="roleSort"     column="role_sort"      />
+		<result property="dataScope"    column="data_scope"     />
+		<result property="status"       column="status"         />
+		<result property="delFlag"      column="del_flag"       />
+		<result property="createBy"     column="create_by"      />
+		<result property="createTime"   column="create_time"    />
+		<result property="updateBy"     column="update_by"      />
+		<result property="updateTime"   column="update_time"    />
+		<result property="remark"       column="remark"         />
+	</resultMap>
+	
+	<sql id="selectRoleVo">
+	    select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope,
+            r.status, r.del_flag, r.create_time, r.remark 
+        from sys_role r
+	        left join sys_user_role ur on ur.role_id = r.role_id
+	        left join sys_user u on u.user_id = ur.user_id
+	        left join sys_dept d on u.dept_id = d.dept_id
+    </sql>
+    
+    <select id="selectRoleList" parameterType="SysRole" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		where r.del_flag = '0'
+		<if test="roleName != null and roleName != ''">
+			AND r.role_name like concat('%', #{roleName}, '%')
+		</if>
+		<if test="status != null and status != ''">
+			AND r.status = #{status}
+		</if>
+		<if test="roleKey != null and roleKey != ''">
+			AND r.role_key like concat('%', #{roleKey}, '%')
+		</if>
+		<if test="beginTime != null and beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+			and to_char(r.create_time,'yyyymmdd') &gt;= to_char(to_date(#{beginTime}, 'yyyy-mm-dd'),'yyyymmdd')
+		</if>
+		<if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+			and to_char(r.create_time,'yyyymmdd') &lt;= to_char(to_date(#{endTime}, 'yyyy-mm-dd'),'yyyymmdd')
+		</if>
+		<!-- 鏁版嵁鑼冨洿杩囨护 -->
+		${dataScope}
+		order by r.role_sort
+	</select>
+    
+	<select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		WHERE r.del_flag = '0' and ur.user_id = #{userId}
+	</select>
+	
+	<select id="selectRoleAll" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		order by r.role_sort
+	</select>
+	
+	<select id="selectRoleListByUserId" parameterType="Long" resultType="Integer">
+		select r.role_id
+        from sys_role r
+	        left join sys_user_role ur on ur.role_id = r.role_id
+	        left join sys_user u on u.user_id = ur.user_id
+	    where u.user_id = #{userId}
+	</select>
+	
+	<select id="selectRoleById" parameterType="Long" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		where r.role_id = #{roleId}
+	</select>
+	
+	<select id="selectRolesByUserName" parameterType="String" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		WHERE r.del_flag = '0' and u.user_name = #{userName}
+	</select>
+	
+	<select id="checkRoleNameUnique" parameterType="String" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		 where r.role_name=#{roleName}
+	</select>
+	
+	<select id="checkRoleKeyUnique" parameterType="String" resultMap="SysRoleResult">
+		<include refid="selectRoleVo"/>
+		 where r.role_key=#{roleKey}
+	</select>
+	
+ 	<insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId">
+ 		insert into sys_role(
+ 			<if test="roleId != null and roleId != 0">role_id,</if>
+ 			<if test="roleName != null and roleName != ''">role_name,</if>
+ 			<if test="roleKey != null and roleKey != ''">role_key,</if>
+ 			<if test="roleSort != null and roleSort != ''">role_sort,</if>
+ 			<if test="dataScope != null and dataScope != ''">data_scope,</if>
+ 			<if test="status != null and status != ''">status,</if>
+ 			<if test="remark != null and remark != ''">remark,</if>
+ 			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			create_time
+ 		)values(
+ 			<if test="roleId != null and roleId != 0">#{roleId},</if>
+ 			<if test="roleName != null and roleName != ''">#{roleName},</if>
+ 			<if test="roleKey != null and roleKey != ''">#{roleKey},</if>
+ 			<if test="roleSort != null and roleSort != ''">#{roleSort},</if>
+ 			<if test="dataScope != null and dataScope != ''">#{dataScope},</if>
+ 			<if test="status != null and status != ''">#{status},</if>
+ 			<if test="remark != null and remark != ''">#{remark},</if>
+ 			<if test="createBy != null and createBy != ''">#{createBy},</if>
+			now()
+ 		)
+	</insert>
+	
+	<update id="updateRole" parameterType="SysRole">
+ 		update sys_role
+ 		<set>
+ 			<if test="roleName != null and roleName != ''">role_name = #{roleName},</if>
+ 			<if test="roleKey != null and roleKey != ''">role_key = #{roleKey},</if>
+ 			<if test="roleSort != null and roleSort != ''">role_sort = #{roleSort},</if>
+ 			<if test="dataScope != null and dataScope != ''">data_scope = #{dataScope},</if>
+ 			<if test="status != null and status != ''">status = #{status},</if>
+ 			<if test="remark != null">remark = #{remark},</if>
+ 			<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+ 			update_time = now()
+ 		</set>
+ 		where role_id = #{roleId}
+	</update>
+	
+	<update id="updateRoleStatus" parameterType="SysRole">
+ 		update sys_user set status = #{status} where user_id = #{userId}
+	</update>
+	
+	<delete id="deleteRoleById" parameterType="Long">
+ 		delete from sys_role where role_id = #{roleId}
+ 	</delete>
+ 	
+ 	<delete id="deleteRoleByIds" parameterType="Long">
+ 	    update sys_role set del_flag = '2' where role_id in
+ 		<foreach collection="array" item="roleId" open="(" separator="," close=")">
+ 			#{roleId}
+        </foreach> 
+ 	</delete>
+ 	
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysRoleMenuMapper.xml b/basic/src/main/resources/mybatis/system/SysRoleMenuMapper.xml
new file mode 100644
index 0000000..7f8af09
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysRoleMenuMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysRoleMenuMapper">
+
+	<resultMap type="SysRoleMenu" id="SysRoleMenuResult">
+		<result property="roleId"     column="role_id"      />
+		<result property="menuId"     column="menu_id"      />
+	</resultMap>
+	
+	<select id="checkMenuExistRole" resultType="Integer">
+	    select count(1) from sys_role_menu where menu_id = #{menuId}  
+	</select>
+
+	<delete id="deleteRoleMenuByRoleId" parameterType="Long">
+		delete from sys_role_menu where role_id=#{roleId}
+	</delete>
+	
+	<insert id="batchRoleMenu">
+		insert into sys_role_menu(role_id, menu_id) values
+		<foreach item="item" index="index" collection="list" separator=",">
+			(#{item.roleId},#{item.menuId})
+		</foreach>
+	</insert>
+	
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysUserMapper.xml b/basic/src/main/resources/mybatis/system/SysUserMapper.xml
new file mode 100644
index 0000000..7e4e59a
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysUserMapper.xml
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysUserMapper">
+
+    <resultMap type="SysUser" id="SysUserResult">
+        <id property="userId" column="user_id"/>
+        <result property="deptId" column="dept_id"/>
+        <result property="userName" column="user_name"/>
+        <result property="nickName" column="nick_name"/>
+        <result property="email" column="email"/>
+        <result property="phonenumber" column="phonenumber"/>
+        <result property="sex" column="sex"/>
+        <result property="avatar" column="avatar"/>
+        <result property="password" column="password"/>
+        <result property="status" column="status"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="loginIp" column="login_ip"/>
+        <result property="loginDate" column="login_date"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="remark" column="remark"/>
+        <association property="dept" column="dept_id" javaType="SysDept" resultMap="deptResult"/>
+        <collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
+    </resultMap>
+
+    <resultMap id="deptResult" type="SysDept">
+        <id property="deptId" column="dept_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="deptName" column="dept_name"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="leader" column="leader"/>
+        <result property="status" column="dept_status"/>
+    </resultMap>
+
+    <resultMap id="RoleResult" type="SysRole">
+        <id property="roleId" column="role_id"/>
+        <result property="roleName" column="role_name"/>
+        <result property="roleKey" column="role_key"/>
+        <result property="roleSort" column="role_sort"/>
+        <result property="dataScope" column="data_scope"/>
+        <result property="status" column="role_status"/>
+    </resultMap>
+
+    <sql id="selectUserVo">
+        select u.user_id,
+               u.dept_id,
+               u.user_name,
+               u.nick_name,
+               u.email,
+               u.avatar,
+               u.phonenumber,
+               u.password,
+               u.sex,
+               u.status,
+               u.del_flag,
+               u.login_ip,
+               u.login_date,
+               u.create_by,
+               u.create_time,
+               u.remark,
+               d.dept_id,
+               d.parent_id,
+               d.dept_name,
+               d.order_num,
+               d.leader,
+               d.status as dept_status,
+               r.role_id,
+               r.role_name,
+               r.role_key,
+               r.role_sort,
+               r.data_scope,
+               r.status as role_status
+        from sys_user u
+                 left join sys_dept d on u.dept_id = d.dept_id
+                 left join sys_user_role ur on u.user_id = ur.user_id
+                 left join sys_role r on r.role_id = ur.role_id
+    </sql>
+
+    <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
+        select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.password, u.sex,
+        u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from
+        sys_user u
+        left join sys_dept d on u.dept_id = d.dept_id
+        where u.del_flag = '0'
+        <if test="userName != null and userName != ''">
+            AND u.user_name like concat('%', #{userName}, '%')
+        </if>
+        <if test="status != null and status != ''">
+            AND u.status = #{status}
+        </if>
+        <if test="phonenumber != null and phonenumber != ''">
+            AND u.phonenumber like concat('%', #{phonenumber}, '%')
+        </if>
+        <if test="beginTime != null and beginTime != ''"><!-- 寮�濮嬫椂闂存绱� -->
+            AND to_char(u.create_time,'yyyymmdd') &gt;= to_char(to_date(#{beginTime}, 'yyyy-mm-dd'),'yyyymmdd')
+        </if>
+        <if test="endTime != null and endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
+            AND to_char(u.create_time,'yyyymmdd') &lt;= to_char(to_date(#{endTime}, 'yyyy-mm-dd'),'yyyymmdd')
+        </if>
+        <if test="deptId != null and deptId != 0">
+            AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE ancestors = (select
+            ancestors from sys_dept where dept_id = #{deptId}) || #{deptId} ))
+        </if>
+        <!-- 鏁版嵁鑼冨洿杩囨护 -->
+        ${dataScope}
+    </select>
+
+    <select id="selectUserByUserName" parameterType="String" resultMap="SysUserResult">
+        <include refid="selectUserVo"/>
+        where u.user_name = #{userName}
+    </select>
+
+    <select id="selectUserById" parameterType="Long" resultMap="SysUserResult">
+        <include refid="selectUserVo"/>
+        where u.user_id = #{userId}
+    </select>
+
+    <select id="checkUserNameUnique" parameterType="String" resultType="int">
+        select count(1)
+        from sys_user
+        where user_name = #{userName}
+    </select>
+
+    <select id="checkPhoneUnique" parameterType="String" resultMap="SysUserResult">
+        select user_id, phonenumber
+        from sys_user
+        where phonenumber = #{phonenumber}
+    </select>
+
+    <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
+        select user_id, email
+        from sys_user
+        where email = #{email}
+    </select>
+
+    <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
+        insert into sys_user(
+        <if test="userId != null and userId != 0">user_id,</if>
+        <if test="deptId != null and deptId != 0">dept_id,</if>
+        <if test="userName != null and userName != ''">user_name,</if>
+        <if test="nickName != null and nickName != ''">nick_name,</if>
+        <if test="email != null and email != ''">email,</if>
+        <if test="avatar != null and avatar != ''">avatar,</if>
+        <if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
+        <if test="sex != null and sex != ''">sex,</if>
+        <if test="password != null and password != ''">password,</if>
+        <if test="status != null and status != ''">status,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        <if test="remark != null and remark != ''">remark,</if>
+        create_time
+        )values(
+        <if test="userId != null and userId != ''">#{userId},</if>
+        <if test="deptId != null and deptId != ''">#{deptId},</if>
+        <if test="userName != null and userName != ''">#{userName},</if>
+        <if test="nickName != null and nickName != ''">#{nickName},</if>
+        <if test="email != null and email != ''">#{email},</if>
+        <if test="avatar != null and avatar != ''">#{avatar},</if>
+        <if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
+        <if test="sex != null and sex != ''">#{sex},</if>
+        <if test="password != null and password != ''">#{password},</if>
+        <if test="status != null and status != ''">#{status},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        <if test="remark != null and remark != ''">#{remark},</if>
+        now()
+        )
+    </insert>
+
+    <update id="updateUser" parameterType="SysUser">
+        update sys_user
+        <set>
+            <if test="deptId != null and deptId != 0">dept_id = #{deptId},</if>
+            <if test="userName != null and userName != ''">user_name = #{userName},</if>
+            <if test="nickName != null and nickName != ''">nick_name = #{nickName},</if>
+            <if test="email != null and email != ''">email = #{email},</if>
+            <if test="phonenumber != null and phonenumber != ''">phonenumber = #{phonenumber},</if>
+            <if test="sex != null and sex != ''">sex = #{sex},</if>
+            <if test="avatar != null and avatar != ''">avatar = #{avatar},</if>
+            <if test="password != null and password != ''">password = #{password},</if>
+            <if test="status != null and status != ''">status = #{status},</if>
+            <if test="loginIp != null and loginIp != ''">login_ip = #{loginIp},</if>
+            <if test="loginDate != null">login_date = #{loginDate},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            update_time = now()
+        </set>
+        where user_id = #{userId}
+    </update>
+
+    <update id="updateUserStatus" parameterType="SysUser">
+        update sys_user
+        set status = #{status}
+        where user_id = #{userId}
+    </update>
+
+    <update id="updateUserAvatar" parameterType="SysUser">
+        update sys_user
+        set avatar = #{avatar}
+        where user_name = #{userName}
+    </update>
+
+    <update id="resetUserPwd" parameterType="SysUser">
+        update sys_user
+        set password = #{password}
+        where user_name = #{userName}
+    </update>
+
+    <delete id="deleteUserById" parameterType="Long">
+        delete
+        from sys_user
+        where user_id = #{userId}
+    </delete>
+
+    <delete id="deleteUserByIds" parameterType="Long">
+        delete
+        from sys_user
+        where user_id in
+        <foreach collection="array" item="userId" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </delete>
+
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysUserPostMapper.xml b/basic/src/main/resources/mybatis/system/SysUserPostMapper.xml
new file mode 100644
index 0000000..0701d87
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysUserPostMapper.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysUserPostMapper">
+
+	<resultMap type="SysUserPost" id="SysUserPostResult">
+		<result property="userId"     column="user_id"      />
+		<result property="postId"     column="post_id"      />
+	</resultMap>
+
+	<delete id="deleteUserPostByUserId" parameterType="Long">
+		delete from sys_user_post where user_id=#{userId}
+	</delete>
+	
+	<select id="countUserPostById" resultType="Integer">
+	    select count(1) from sys_user_post where post_id=#{postId}  
+	</select>
+	
+	<delete id="deleteUserPost" parameterType="Long">
+ 		delete from sys_user_post where user_id in
+ 		<foreach collection="array" item="userId" open="(" separator="," close=")">
+ 			#{userId}
+        </foreach> 
+ 	</delete>
+	
+	<insert id="batchUserPost">
+		insert into sys_user_post(user_id, post_id) values
+		<foreach item="item" index="index" collection="list" separator=",">
+			(#{item.userId},#{item.postId})
+		</foreach>
+	</insert>
+	
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/system/SysUserRoleMapper.xml b/basic/src/main/resources/mybatis/system/SysUserRoleMapper.xml
new file mode 100644
index 0000000..ffe8206
--- /dev/null
+++ b/basic/src/main/resources/mybatis/system/SysUserRoleMapper.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.system.mapper.SysUserRoleMapper">
+
+	<resultMap type="SysUserRole" id="SysUserRoleResult">
+		<result property="userId"     column="user_id"      />
+		<result property="roleId"     column="role_id"      />
+	</resultMap>
+
+	<delete id="deleteUserRoleByUserId" parameterType="Long">
+		delete from sys_user_role where user_id=#{userId}
+	</delete>
+	
+	<select id="countUserRoleByRoleId" resultType="Integer">
+	    select count(1) from sys_user_role where role_id=#{roleId}  
+	</select>
+	
+	<delete id="deleteUserRole" parameterType="Long">
+ 		delete from sys_user_role where user_id in
+ 		<foreach collection="array" item="userId" open="(" separator="," close=")">
+ 			#{userId}
+        </foreach> 
+ 	</delete>
+	
+	<insert id="batchUserRole">
+		insert into sys_user_role(user_id, role_id) values
+		<foreach item="item" index="index" collection="list" separator=",">
+			(#{item.userId},#{item.roleId})
+		</foreach>
+	</insert>
+	
+	<delete id="deleteUserRoleInfo" parameterType="SysUserRole">
+		delete from sys_user_role where user_id=#{userId} and role_id=#{roleId}
+	</delete>
+	
+	<delete id="deleteUserRoleInfos">
+	    delete from sys_user_role where role_id=#{roleId} and user_id in
+ 	    <foreach collection="userIds" item="userId" open="(" separator="," close=")">
+ 	        #{userId}
+            </foreach> 
+	</delete>
+</mapper> 
diff --git a/basic/src/main/resources/mybatis/tool/GenTableColumnMapper.xml b/basic/src/main/resources/mybatis/tool/GenTableColumnMapper.xml
new file mode 100644
index 0000000..7ccdb94
--- /dev/null
+++ b/basic/src/main/resources/mybatis/tool/GenTableColumnMapper.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.tool.gen.mapper.GenTableColumnMapper">
+
+    <resultMap type="GenTableColumn" id="GenTableColumnResult">
+        <id property="columnId" column="column_id"/>
+        <result property="tableId" column="table_id"/>
+        <result property="columnName" column="column_name"/>
+        <result property="columnComment" column="column_comment"/>
+        <result property="columnType" column="column_type"/>
+        <result property="javaType" column="java_type"/>
+        <result property="javaField" column="java_field"/>
+        <result property="isPk" column="is_pk"/>
+        <result property="isIncrement" column="is_increment"/>
+        <result property="isRequired" column="is_required"/>
+        <result property="isInsert" column="is_insert"/>
+        <result property="isEdit" column="is_edit"/>
+        <result property="isList" column="is_list"/>
+        <result property="isQuery" column="is_query"/>
+        <result property="queryType" column="query_type"/>
+        <result property="htmlType" column="html_type"/>
+        <result property="dictType" column="dict_type"/>
+        <result property="sort" column="sort"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectGenTableColumnVo">
+        select column_id,
+               table_id,
+               column_name,
+               column_comment,
+               column_type,
+               java_type,
+               java_field,
+               is_pk,
+               is_increment,
+               is_required,
+               is_insert,
+               is_edit,
+               is_list,
+               is_query,
+               query_type,
+               html_type,
+               dict_type,
+               sort,
+               create_by,
+               create_time,
+               update_by,
+               update_time
+        from gen_table_column
+    </sql>
+
+    <select id="selectGenTableColumnListByTableId" parameterType="Long" resultMap="GenTableColumnResult">
+        <include refid="selectGenTableColumnVo"/>
+        where table_id = #{tableId}
+        order by sort
+    </select>
+
+    <select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult">
+        SELECT A.attname                                 AS COLUMN_NAME,
+               col_description(A.attrelid, A.attnum)     AS column_comment,
+               T.typname                                 AS column_type,
+               CASE col.is_nullable WHEN 'NO' THEN 1 END AS is_required,
+               CASE col.is_identity WHEN 'NO' THEN 0 END AS is_pk,
+               col.ordinal_position                      AS sort,
+               '0'                                       AS is_increment
+        FROM pg_class C
+                 LEFT JOIN pg_attribute A ON A.attrelid = C.oid
+                 LEFT JOIN pg_type T ON A.atttypid = T.oid
+                 LEFT JOIN information_schema.COLUMNS col ON col.COLUMN_NAME = A.attname
+        WHERE C.relname = #{tableName}
+          AND col.TABLE_NAME = #{tableName}
+          AND A.attnum > 0
+        order by col.ordinal_position asc
+    </select>
+
+    <insert id="insertGenTableColumn" parameterType="GenTableColumn" useGeneratedKeys="true" keyProperty="columnId">
+        insert into gen_table_column (
+        <if test="tableId != null and tableId != ''">table_id,</if>
+        <if test="columnName != null and columnName != ''">column_name,</if>
+        <if test="columnComment != null and columnComment != ''">column_comment,</if>
+        <if test="columnType != null and columnType != ''">column_type,</if>
+        <if test="javaType != null and javaType != ''">java_type,</if>
+        <if test="javaField != null  and javaField != ''">java_field,</if>
+        <if test="isPk != null and isPk != ''">is_pk,</if>
+        <if test="isIncrement != null and isIncrement != ''">is_increment,</if>
+        <if test="isRequired != null and isRequired != ''">is_required,</if>
+        <if test="isInsert != null and isInsert != ''">is_insert,</if>
+        <if test="isEdit != null and isEdit != ''">is_edit,</if>
+        <if test="isList != null and isList != ''">is_list,</if>
+        <if test="isQuery != null and isQuery != ''">is_query,</if>
+        <if test="queryType != null and queryType != ''">query_type,</if>
+        <if test="htmlType != null and htmlType != ''">html_type,</if>
+        <if test="dictType != null and dictType != ''">dict_type,</if>
+        <if test="sort != null">sort,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        create_time
+        )values(
+        <if test="tableId != null and tableId != ''">#{tableId},</if>
+        <if test="columnName != null and columnName != ''">#{columnName},</if>
+        <if test="columnComment != null and columnComment != ''">#{columnComment},</if>
+        <if test="columnType != null and columnType != ''">#{columnType},</if>
+        <if test="javaType != null and javaType != ''">#{javaType},</if>
+        <if test="javaField != null and javaField != ''">#{javaField},</if>
+        <if test="isPk != null and isPk != ''">#{isPk},</if>
+        <if test="isIncrement != null and isIncrement != ''">#{isIncrement},</if>
+        <if test="isRequired != null and isRequired != ''">#{isRequired},</if>
+        <if test="isInsert != null and isInsert != ''">#{isInsert},</if>
+        <if test="isEdit != null and isEdit != ''">#{isEdit},</if>
+        <if test="isList != null and isList != ''">#{isList},</if>
+        <if test="isQuery != null and isQuery != ''">#{isQuery},</if>
+        <if test="queryType != null and queryType != ''">#{queryType},</if>
+        <if test="htmlType != null and htmlType != ''">#{htmlType},</if>
+        <if test="dictType != null and dictType != ''">#{dictType},</if>
+        <if test="sort != null">#{sort},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        now()
+        )
+    </insert>
+
+    <update id="updateGenTableColumn" parameterType="GenTableColumn">
+        update gen_table_column
+        <set>
+            column_comment = #{columnComment},
+            java_type = #{javaType},
+            java_field = #{javaField},
+            is_insert = #{isInsert},
+            is_edit = #{isEdit},
+            is_list = #{isList},
+            is_query = #{isQuery},
+            is_required = #{isRequired},
+            query_type = #{queryType},
+            html_type = #{htmlType},
+            dict_type = #{dictType},
+            sort = #{sort},
+            update_by = #{updateBy},
+            update_time = now()
+        </set>
+        where column_id = #{columnId}
+    </update>
+
+    <delete id="deleteGenTableColumnByIds" parameterType="Long">
+        delete from gen_table_column where table_id in
+        <foreach collection="array" item="tableId" open="(" separator="," close=")">
+            #{tableId}
+        </foreach>
+    </delete>
+
+</mapper>
diff --git a/basic/src/main/resources/mybatis/tool/GenTableMapper.xml b/basic/src/main/resources/mybatis/tool/GenTableMapper.xml
new file mode 100644
index 0000000..100302c
--- /dev/null
+++ b/basic/src/main/resources/mybatis/tool/GenTableMapper.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.tool.gen.mapper.GenTableMapper">
+
+    <resultMap type="com.dingzhuo.energy.project.tool.gen.domain.GenTable" id="GenTableResult">
+        <id property="tableId" column="table_id"/>
+        <result property="tableName" column="table_name"/>
+        <result property="tableComment" column="table_comment"/>
+        <result property="className" column="class_name"/>
+        <result property="tplCategory" column="tpl_category"/>
+        <result property="packageName" column="package_name"/>
+        <result property="moduleName" column="module_name"/>
+        <result property="businessName" column="business_name"/>
+        <result property="functionName" column="function_name"/>
+        <result property="functionAuthor" column="function_author"/>
+        <result property="options" column="options"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="remark" column="remark"/>
+        <collection property="columns" javaType="java.util.List" resultMap="GenTableColumnResult"/>
+    </resultMap>
+
+    <resultMap type="com.dingzhuo.energy.project.tool.gen.domain.GenTableColumn" id="GenTableColumnResult">
+        <id property="columnId" column="column_id"/>
+        <result property="tableId" column="table_id"/>
+        <result property="columnName" column="column_name"/>
+        <result property="columnComment" column="column_comment"/>
+        <result property="columnType" column="column_type"/>
+        <result property="javaType" column="java_type"/>
+        <result property="javaField" column="java_field"/>
+        <result property="isPk" column="is_pk"/>
+        <result property="isIncrement" column="is_increment"/>
+        <result property="isRequired" column="is_required"/>
+        <result property="isInsert" column="is_insert"/>
+        <result property="isEdit" column="is_edit"/>
+        <result property="isList" column="is_list"/>
+        <result property="isQuery" column="is_query"/>
+        <result property="queryType" column="query_type"/>
+        <result property="htmlType" column="html_type"/>
+        <result property="dictType" column="dict_type"/>
+        <result property="sort" column="sort"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <sql id="selectGenTableVo">
+        select table_id, table_name, table_comment, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, options, create_by, create_time, update_by, update_time, remark from gen_table
+    </sql>
+
+    <select id="selectGenTableList" parameterType="com.dingzhuo.energy.project.tool.gen.domain.GenTable"
+            resultMap="GenTableResult">
+        <include refid="selectGenTableVo"/>
+        <where>
+            <if test="tableName != null and tableName != ''">
+                AND lower(table_name) like lower(concat('%', #{tableName}, '%'))
+            </if>
+            <if test="tableComment != null and tableComment != ''">
+                AND lower(table_comment) like lower(concat('%', #{tableComment}, '%'))
+            </if>
+            <!-- 			<if test="beginTime != null and beginTime != ''">寮�濮嬫椂闂存绱� -->
+            <!-- 				AND date_format(create_time,'%y%m%d') &gt;= date_format(#{beginTime},'%y%m%d') -->
+            <!-- 			</if> -->
+            <!-- 			<if test="endTime != null and endTime != ''">缁撴潫鏃堕棿妫�绱� -->
+            <!-- 				AND date_format(create_time,'%y%m%d') &lt;= date_format(#{endTime},'%y%m%d') -->
+            <!-- 			</if> -->
+        </where>
+        order by table_id
+    </select>
+
+    <select id="selectDbTableList" parameterType="com.dingzhuo.energy.project.tool.gen.domain.GenTable"
+            resultMap="GenTableResult">
+        SELECT tablename AS table_name FROM pg_tables WHERE schemaname='public'
+        AND tablename NOT LIKE 'qrtz_%' AND tablename NOT LIKE 'gen_%'
+        AND tablename NOT IN (select table_name from gen_table)
+        <if test="tableName != null and tableName != ''">
+            AND lower(tablename) like lower(concat('%', #{tableName}, '%'))
+        </if>
+    </select>
+
+    <select id="selectDbTableListByNames" resultMap="GenTableResult">
+        SELECT C.relname AS table_name,CAST (obj_description (relfilenode,'pg_class') AS VARCHAR) AS table_comment,null
+        AS create_time,null AS update_time FROM pg_class C WHERE
+        C.relname IN (SELECT tablename FROM pg_tables WHERE schemaname='public' AND POSITION ('_2' IN tablename)=0)
+        and C.relname NOT LIKE 'qrtz_%' and C.relname NOT LIKE 'gen_%'
+        and C.relname in
+        <foreach collection="array" item="name" open="(" separator="," close=")">
+            #{name}
+        </foreach>
+        ORDER BY C.relname
+    </select>
+
+    <select id="selectGenTableById" parameterType="Long" resultMap="GenTableResult">
+	    SELECT t.table_id, t.table_name, t.table_comment, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark,
+			   c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
+		FROM gen_table t
+			 LEFT JOIN gen_table_column c ON t.table_id = c.table_id
+		where t.table_id = #{tableId}
+	</select>
+
+    <select id="selectGenTableByName" parameterType="String" resultMap="GenTableResult">
+	    SELECT t.table_id, t.table_name, t.table_comment, t.class_name, t.tpl_category, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark,
+			   c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort
+		FROM gen_table t
+			 LEFT JOIN gen_table_column c ON t.table_id = c.table_id
+		where t.table_name = #{tableName}
+	</select>
+
+    <insert id="insertGenTable" parameterType="com.dingzhuo.energy.project.tool.gen.domain.GenTable"
+            useGeneratedKeys="true" keyProperty="tableId">
+        insert into gen_table (
+        <if test="tableName != null">table_name,</if>
+        <if test="tableComment != null and tableComment != ''">table_comment,</if>
+        <if test="className != null and className != ''">class_name,</if>
+        <if test="tplCategory != null and tplCategory != ''">tpl_category,</if>
+        <if test="packageName != null and packageName != ''">package_name,</if>
+        <if test="moduleName != null and moduleName != ''">module_name,</if>
+        <if test="businessName != null and businessName != ''">business_name,</if>
+        <if test="functionName != null and functionName != ''">function_name,</if>
+        <if test="functionAuthor != null and functionAuthor != ''">function_author,</if>
+        <if test="remark != null and remark != ''">remark,</if>
+        <if test="createBy != null and createBy != ''">create_by,</if>
+        create_time
+        )values(
+        <if test="tableName != null">#{tableName},</if>
+        <if test="tableComment != null and tableComment != ''">#{tableComment},</if>
+        <if test="className != null and className != ''">#{className},</if>
+        <if test="tplCategory != null and tplCategory != ''">#{tplCategory},</if>
+        <if test="packageName != null and packageName != ''">#{packageName},</if>
+        <if test="moduleName != null and moduleName != ''">#{moduleName},</if>
+        <if test="businessName != null and businessName != ''">#{businessName},</if>
+        <if test="functionName != null and functionName != ''">#{functionName},</if>
+        <if test="functionAuthor != null and functionAuthor != ''">#{functionAuthor},</if>
+        <if test="remark != null and remark != ''">#{remark},</if>
+        <if test="createBy != null and createBy != ''">#{createBy},</if>
+        now()
+        )
+    </insert>
+
+    <update id="updateGenTable" parameterType="com.dingzhuo.energy.project.tool.gen.domain.GenTable">
+        update gen_table
+        <set>
+            <if test="tableName != null">table_name = #{tableName},</if>
+            <if test="tableComment != null and tableComment != ''">table_comment = #{tableComment},</if>
+            <if test="className != null and className != ''">class_name = #{className},</if>
+            <if test="functionAuthor != null and functionAuthor != ''">function_author = #{functionAuthor},</if>
+            <if test="tplCategory != null and tplCategory != ''">tpl_category = #{tplCategory},</if>
+            <if test="packageName != null and packageName != ''">package_name = #{packageName},</if>
+            <if test="moduleName != null and moduleName != ''">module_name = #{moduleName},</if>
+            <if test="businessName != null and businessName != ''">business_name = #{businessName},</if>
+            <if test="functionName != null and functionName != ''">function_name = #{functionName},</if>
+            <if test="options != null and options != ''">options = #{options},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            update_time = now()
+        </set>
+        where table_id = #{tableId}
+    </update>
+
+    <delete id="deleteGenTableByIds" parameterType="Long">
+        delete from gen_table where table_id in
+        <foreach collection="array" item="tableId" open="(" separator="," close=")">
+            #{tableId}
+        </foreach>
+    </delete>
+
+</mapper> 
diff --git a/compute-engine/.gitignore b/compute-engine/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/compute-engine/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git a/compute-engine/.mvn/wrapper/MavenWrapperDownloader.java b/compute-engine/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..753a5e2
--- /dev/null
+++ b/compute-engine/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * 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
+ *
+ *      https://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.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+  private static final String WRAPPER_VERSION = "0.5.6";
+  /**
+   * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+   */
+  private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+      + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+  /**
+   * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+   * use instead of the default one.
+   */
+  private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+      ".mvn/wrapper/maven-wrapper.properties";
+
+  /**
+   * Path where the maven-wrapper.jar will be saved to.
+   */
+  private static final String MAVEN_WRAPPER_JAR_PATH =
+      ".mvn/wrapper/maven-wrapper.jar";
+
+  /**
+   * Name of the property which should be used to override the default download url for the wrapper.
+   */
+  private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+  public static void main(String args[]) {
+    System.out.println("- Downloader started");
+    File baseDirectory = new File(args[0]);
+    System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+    // If the maven-wrapper.properties exists, read it and check if it contains a custom
+    // wrapperUrl parameter.
+    File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+    String url = DEFAULT_DOWNLOAD_URL;
+    if (mavenWrapperPropertyFile.exists()) {
+      FileInputStream mavenWrapperPropertyFileInputStream = null;
+      try {
+        mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+        Properties mavenWrapperProperties = new Properties();
+        mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+        url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+      } catch (IOException e) {
+        System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+      } finally {
+        try {
+          if (mavenWrapperPropertyFileInputStream != null) {
+            mavenWrapperPropertyFileInputStream.close();
+          }
+        } catch (IOException e) {
+          // Ignore ...
+        }
+      }
+    }
+    System.out.println("- Downloading from: " + url);
+
+    File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+    if (!outputFile.getParentFile().exists()) {
+      if (!outputFile.getParentFile().mkdirs()) {
+        System.out.println(
+            "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+      }
+    }
+    System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+    try {
+      downloadFileFromURL(url, outputFile);
+      System.out.println("Done");
+      System.exit(0);
+    } catch (Throwable e) {
+      System.out.println("- Error downloading");
+      e.printStackTrace();
+      System.exit(1);
+    }
+  }
+
+  private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+    if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+      String username = System.getenv("MVNW_USERNAME");
+      char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+      Authenticator.setDefault(new Authenticator() {
+        @Override
+        protected PasswordAuthentication getPasswordAuthentication() {
+          return new PasswordAuthentication(username, password);
+        }
+      });
+    }
+    URL website = new URL(urlString);
+    ReadableByteChannel rbc;
+    rbc = Channels.newChannel(website.openStream());
+    FileOutputStream fos = new FileOutputStream(destination);
+    fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+    fos.close();
+    rbc.close();
+  }
+
+}
diff --git a/compute-engine/.mvn/wrapper/maven-wrapper.jar b/compute-engine/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..2cc7d4a
--- /dev/null
+++ b/compute-engine/.mvn/wrapper/maven-wrapper.jar
Binary files differ
diff --git a/compute-engine/.mvn/wrapper/maven-wrapper.properties b/compute-engine/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..642d572
--- /dev/null
+++ b/compute-engine/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/compute-engine/mvnw b/compute-engine/mvnw
new file mode 100644
index 0000000..a16b543
--- /dev/null
+++ b/compute-engine/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/compute-engine/mvnw.cmd b/compute-engine/mvnw.cmd
new file mode 100644
index 0000000..c8d4337
--- /dev/null
+++ b/compute-engine/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/compute-engine/pom.xml b/compute-engine/pom.xml
new file mode 100644
index 0000000..507ffb3
--- /dev/null
+++ b/compute-engine/pom.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>compute-engine</artifactId>
+
+  <properties>
+    <java.version>1.8</java.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.typesafe.akka</groupId>
+      <artifactId>akka-actor_2.13</artifactId>
+      <version>2.6.4</version>
+    </dependency>
+    <dependency>
+      <groupId>com.typesafe.akka</groupId>
+      <artifactId>akka-cluster_2.13</artifactId>
+      <version>2.6.4</version>
+    </dependency>
+    <dependency>
+      <groupId>com.typesafe.akka</groupId>
+      <artifactId>akka-cluster-sharding-typed_2.13</artifactId>
+      <version>2.6.4</version>
+    </dependency>
+    <dependency>
+      <groupId>com.typesafe.akka</groupId>
+      <artifactId>akka-slf4j_2.13</artifactId>
+      <version>2.6.4</version>
+    </dependency>
+    <dependency>
+      <groupId>args4j</groupId>
+      <artifactId>args4j</artifactId>
+      <version>2.33</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>parent</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>data-model</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>data-service</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>data-monitoring</artifactId>
+      <version>1.0.0</version>
+      <scope>compile</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <!--      绗笁鏂瑰寘鎵撹繘jar鏂囦欢涓�-->
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <version>2.0.5.RELEASE</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <includeSystemScope>true</includeSystemScope>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <addClasspath>true</addClasspath>
+              <classpathPrefix>lib/</classpathPrefix>
+              <mainClass>com.dingzhuo.compute.engine.ComputeEngineApplication</mainClass>
+              <useUniqueVersions>false</useUniqueVersions>
+            </manifest>
+            <manifestEntries>
+              <Class-Path>lib/fel-0.10.jar</Class-Path>
+            </manifestEntries>
+          </archive>
+          <excludes>
+            <exclude>application-prod.yml</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy-lib</id>
+            <phase>package</phase>
+            <goals>
+              <goal>copy-dependencies</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${project.build.directory}/lib</outputDirectory>
+              <excludeTransitive>false</excludeTransitive>
+              <stripVersion>false</stripVersion>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.7</version>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+        <executions>
+          <execution>
+            <id>copy-resources</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${basedir}/target/config</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>src/main/resources</directory>
+                  <filtering>true</filtering>
+                  <includes>
+                    <include>application-prod.yml</include>
+                  </includes>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/ApplicationConfiguration.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/ApplicationConfiguration.java
new file mode 100644
index 0000000..3dd99a8
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/ApplicationConfiguration.java
@@ -0,0 +1,40 @@
+package com.dingzhuo.compute.engine;
+
+import akka.actor.ActorSystem;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.SpringAkkaExtension;
+import com.typesafe.config.Config;
+import com.typesafe.config.ConfigFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author fanxinfu
+ */
+@Configuration
+public class ApplicationConfiguration {
+
+  private final ApplicationContext applicationContext;
+  private final SpringAkkaExtension springAkkaExtension;
+
+  public ApplicationConfiguration(
+      ApplicationContext applicationContext, SpringAkkaExtension springAkkaExtension) {
+    this.applicationContext = applicationContext;
+    this.springAkkaExtension = springAkkaExtension;
+  }
+
+  @Bean
+  public ActorSystem actorSystem() {
+    ActorSystem system = ActorSystem.create(ActorUtil.ACTOR_SYSTEM, akkaConfiguration());
+    springAkkaExtension.initialize(applicationContext);
+    system.dispatchers().lookup("computeDispatcher");
+    return system;
+  }
+
+  @Bean
+  public Config akkaConfiguration() {
+    return ConfigFactory.load("akka");
+  }
+
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineApplication.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineApplication.java
new file mode 100644
index 0000000..24afa23
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineApplication.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.compute.engine;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * @author fanxinfu
+ */
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class},
+    scanBasePackages = "com.dingzhuo.*")
+public class ComputeEngineApplication {
+
+  public static void main(String[] args) {
+    SpringApplication.run(ComputeEngineApplication.class, args);
+  }
+
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineRunner.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineRunner.java
new file mode 100644
index 0000000..a51198b
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/ComputeEngineRunner.java
@@ -0,0 +1,94 @@
+package com.dingzhuo.compute.engine;
+
+import akka.actor.ActorSystem;
+import akka.cluster.sharding.ClusterSharding;
+import akka.cluster.sharding.ClusterShardingSettings;
+import com.dingzhuo.compute.engine.actor.alarm.AlarmTimerActor;
+import com.dingzhuo.compute.engine.actor.alarm.LoadAlarmActor;
+import com.dingzhuo.compute.engine.actor.alarm.PeriodAlarmActor;
+import com.dingzhuo.compute.engine.actor.alarm.RealtimeAlarmActor;
+import com.dingzhuo.compute.engine.actor.device.DeviceStatusActor;
+import com.dingzhuo.compute.engine.actor.device.DeviceStatusTimerActor;
+import com.dingzhuo.compute.engine.actor.device.LoadDeviceStatusActor;
+import com.dingzhuo.compute.engine.actor.indexcalc.CalculationIndexActor;
+import com.dingzhuo.compute.engine.actor.indexcalc.LoadIndexActor;
+import com.dingzhuo.compute.engine.actor.indexcalc.SavePeriodActor;
+import com.dingzhuo.compute.engine.actor.indexcalc.TimerActor;
+import com.dingzhuo.compute.engine.actor.monitor.RecastDataActor;
+import com.dingzhuo.compute.engine.config.CalcMessageExtractor;
+import com.dingzhuo.compute.engine.config.EngineArgOption;
+import com.dingzhuo.compute.engine.utils.SpringAkkaExtension;
+import org.kohsuke.args4j.CmdLineException;
+import org.kohsuke.args4j.CmdLineParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanxinfu
+ */
+@Component
+public class ComputeEngineRunner implements CommandLineRunner {
+
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());
+  private final ActorSystem actorSystem;
+  private final SpringAkkaExtension akkaExt;
+
+  public ComputeEngineRunner(
+      ActorSystem actorSystem, SpringAkkaExtension springAkkaExtension) {
+    this.actorSystem = actorSystem;
+    this.akkaExt = springAkkaExtension;
+  }
+
+  @Override
+  public void run(String... args) {
+    EngineArgOption argOption = new EngineArgOption();
+    CmdLineParser cmdLineParser = new CmdLineParser(argOption);
+    if (args.length == 0) {
+      showHelp(cmdLineParser);
+      return;
+    }
+
+    try {
+      cmdLineParser.parseArgument(args);
+    } catch (CmdLineException e) {
+      logger.error(e.getLocalizedMessage());
+    }
+
+    if (argOption.isCalc()) {
+      actorSystem
+          .actorOf(akkaExt.props(CalculationIndexActor.ACTOR_NAME),
+              CalculationIndexActor.ACTOR_NAME);
+      actorSystem.actorOf(akkaExt.props(TimerActor.ACTOR_NAME), TimerActor.ACTOR_NAME);
+      actorSystem.actorOf(akkaExt.props(LoadIndexActor.ACTOR_NAME), LoadIndexActor.ACTOR_NAME);
+      actorSystem.actorOf(akkaExt.props(SavePeriodActor.ACTOR_NAME), SavePeriodActor.ACTOR_NAME);
+    }
+
+    if (argOption.isAlarm()) {
+      actorSystem.actorOf(akkaExt.props(LoadAlarmActor.ACTOR_NAME), LoadAlarmActor.ACTOR_NAME);
+      actorSystem
+          .actorOf(akkaExt.props(RealtimeAlarmActor.ACTOR_NAME), RealtimeAlarmActor.ACTOR_NAME);
+      actorSystem.actorOf(akkaExt.props(PeriodAlarmActor.ACTOR_NAME), PeriodAlarmActor.ACTOR_NAME);
+      actorSystem.actorOf(akkaExt.props(AlarmTimerActor.ACTOR_NAME), AlarmTimerActor.ACTOR_NAME);
+    }
+
+    if (argOption.isDevice()) {
+      actorSystem.actorOf(akkaExt.props(LoadDeviceStatusActor.ACTOR_NAME),
+          LoadDeviceStatusActor.ACTOR_NAME);
+      actorSystem.actorOf(akkaExt.props(DeviceStatusTimerActor.ACTOR_NAME),
+          DeviceStatusTimerActor.ACTOR_NAME);
+      actorSystem
+          .actorOf(akkaExt.props(DeviceStatusActor.ACTOR_NAME), DeviceStatusActor.ACTOR_NAME);
+    }
+
+    if (argOption.isRecast()) {
+      actorSystem.actorOf(akkaExt.props(RecastDataActor.ACTOR_NAME), RecastDataActor.ACTOR_NAME);
+    }
+  }
+
+  private void showHelp(CmdLineParser cmdLineParser) {
+    System.out.println("鍙傛暟璇存槑锛�");
+    cmdLineParser.printUsage(System.out);
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/AlarmTimerActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/AlarmTimerActor.java
new file mode 100644
index 0000000..6de4b61
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/AlarmTimerActor.java
@@ -0,0 +1,122 @@
+package com.dingzhuo.compute.engine.actor.alarm;
+
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.actor.Cancellable;
+import akka.actor.UntypedAbstractActor;
+import com.dingzhuo.compute.engine.message.alarm.AlarmJudgeMessage;
+import com.dingzhuo.compute.engine.message.alarm.AlarmRegisterMessage;
+import com.dingzhuo.compute.engine.message.alarm.AlarmType;
+import com.dingzhuo.compute.engine.message.timer.RegisterType;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+import scala.concurrent.duration.FiniteDuration;
+
+@Component("alarmTimerActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class AlarmTimerActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "alarmTimerActor";
+  private final ActorSystem actorSystem;
+  private Cancellable timer;
+  private Map<AlarmType, List<String>> actorIds = new HashMap<>();
+  private List<String> realtimeTags = new ArrayList<>();
+  private ActorSelection realtimeAlarmActor;
+  private ActorSelection periodAlarmActor;
+  private final RealtimeDatabaseService realtimeDatabaseService;
+  private CacheService cacheService;
+
+  public AlarmTimerActor(ActorSystem actorSystem, RealtimeDatabaseService realtimeDatabaseService,
+      CacheService cacheService) {
+    this.actorSystem = actorSystem;
+    this.realtimeDatabaseService = realtimeDatabaseService;
+    this.cacheService = cacheService;
+  }
+
+  @Override
+  public void preStart() {
+    realtimeAlarmActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(RealtimeAlarmActor.ACTOR_NAME));
+    periodAlarmActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(PeriodAlarmActor.ACTOR_NAME));
+    FiniteDuration interval = Duration.create(30, TimeUnit.SECONDS);
+    FiniteDuration delay = Duration.Zero();
+    timer = actorSystem.scheduler()
+        .scheduleAtFixedRate(delay, interval, self(), Message.TIMER, actorSystem.dispatcher(),
+            self());
+  }
+
+  @Override
+  public void postStop() throws Exception {
+    super.postStop();
+    if (timer != null) {
+      timer.cancel();
+    }
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message == Message.TIMER) {
+      timer();
+    } else if (message instanceof AlarmRegisterMessage) {
+      registerAlarm((AlarmRegisterMessage) message);
+    }
+  }
+
+  private void registerAlarm(AlarmRegisterMessage registerMessage) {
+    AlarmType alarmType = registerMessage.getAlarmType();
+    if (!actorIds.containsKey(alarmType)) {
+      actorIds.put(alarmType, new ArrayList<>());
+    }
+
+    if (registerMessage.getRegisterType() == RegisterType.REGISTER) {
+      actorIds.get(alarmType).add(registerMessage.getActorId());
+      if (alarmType == AlarmType.LIVE) {
+        realtimeTags.add(registerMessage.getAlarmItem().getIndexCode());
+      }
+    } else if (registerMessage.getRegisterType() == RegisterType.UNREGISTER) {
+      actorIds.get(alarmType).remove(registerMessage.getActorId());
+      if (alarmType == AlarmType.LIVE) {
+        realtimeTags.remove(registerMessage.getAlarmItem().getIndexCode());
+      }
+    }
+  }
+
+  private void timer() {
+    if (!actorIds.isEmpty()) {
+      List<String> realtimeAlarmIds = actorIds.get(AlarmType.LIVE);
+      List<String> periodAlarmIds = actorIds.get(AlarmType.PERIOD);
+      if (!realtimeTags.isEmpty()) {
+        List<TagValue> tagValues = realtimeDatabaseService.retrieve(realtimeTags);
+        cacheService.cacheTagValues(tagValues);
+      }
+
+      if (realtimeAlarmIds != null && !realtimeAlarmIds.isEmpty()) {
+        realtimeAlarmIds
+            .forEach(id -> realtimeAlarmActor.tell(new AlarmJudgeMessage(id), getSender()));
+      }
+
+      if (periodAlarmIds != null && !periodAlarmIds.isEmpty()) {
+        periodAlarmIds.forEach(id -> periodAlarmActor.tell(new AlarmJudgeMessage(id), getSender()));
+      }
+    }
+  }
+
+  private enum Message {
+    /**
+     * 鏃堕棿瑙﹀彂
+     */
+    TIMER
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/BaseAlarmActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/BaseAlarmActor.java
new file mode 100644
index 0000000..9e086f4
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/BaseAlarmActor.java
@@ -0,0 +1,158 @@
+package com.dingzhuo.compute.engine.actor.alarm;
+
+import static org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase;
+
+import akka.actor.ActorSelection;
+import akka.actor.UntypedAbstractActor;
+import com.dingzhuo.compute.engine.message.alarm.AlarmJudgeMessage;
+import com.dingzhuo.compute.engine.message.alarm.AlarmRegisterMessage;
+import com.dingzhuo.compute.engine.message.alarm.AlarmType;
+import com.dingzhuo.compute.engine.message.alarm.LoadAlarmMessage;
+import com.dingzhuo.compute.engine.message.alarm.UnloadAlarmMessage;
+import com.dingzhuo.compute.engine.message.timer.RegisterType;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.HistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IHistoryAlarmService;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IRealtimeAlarmService;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import org.jetbrains.annotations.NotNull;
+import org.joda.time.DateTime;
+import org.joda.time.Seconds;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @author fanxinfu
+ */
+public abstract class BaseAlarmActor extends UntypedAbstractActor {
+
+  @Autowired
+  protected CacheService cacheService;
+  @Autowired
+  protected IRealtimeAlarmService realtimeAlarmService;
+  @Autowired
+  private IHistoryAlarmService historyAlarmService;
+
+  private ActorSelection timerActor;
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+    timerActor = getContext().actorSelection(ActorUtil.getActorAddress(AlarmTimerActor.ACTOR_NAME));
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof LoadAlarmMessage) {
+      loadAlarm((LoadAlarmMessage) message);
+    } else if (message instanceof UnloadAlarmMessage) {
+      unloadAlarm((UnloadAlarmMessage) message);
+    } else if (message instanceof AlarmJudgeMessage) {
+      judge((AlarmJudgeMessage) message);
+    }
+  }
+
+  private void unloadAlarm(UnloadAlarmMessage message) {
+    cacheService.removeAlarmCache(message.getActorId());
+    AlarmItem alarmItem = message.getAlarmItem();
+    AlarmType alarmType = getAlarmType(alarmItem);
+    timerActor
+        .tell(new AlarmRegisterMessage(message.getActorId(), alarmType, RegisterType.UNREGISTER,
+                alarmItem),
+            self());
+  }
+
+  private void loadAlarm(LoadAlarmMessage message) {
+    AlarmItem alarmItem = message.getAlarmItem();
+    AlarmType alarmType = getAlarmType(alarmItem);
+    cacheService.cacheAlarmItem(alarmItem);
+    timerActor.tell(new AlarmRegisterMessage(message.getActorId(), alarmType, RegisterType.REGISTER,
+        alarmItem), self());
+  }
+
+  @NotNull
+  private AlarmType getAlarmType(AlarmItem alarmItem) {
+    AlarmType alarmType;
+    if (equalsAnyIgnoreCase(alarmItem.getTimeSlot(), TimeType.LIVE.name())) {
+      alarmType = AlarmType.LIVE;
+    } else {
+      alarmType = AlarmType.PERIOD;
+    }
+    return alarmType;
+  }
+
+  protected void insertPeriodHistoryAlarm(AlarmItem item, DateTime now, String timeCode,
+      RealTimeAlarm realTimeAlarm) {
+    HistoryAlarm historyAlarm = new HistoryAlarm();
+    if (realTimeAlarm == null) {
+      realTimeAlarm = realtimeAlarmService.getAlarmByItemIdAndTimeCode(item.getId(), timeCode);
+    }
+
+    historyAlarm.setId(UUID.fastUUID().toString());
+    historyAlarm.setBeginTime(realTimeAlarm.getBeginTime());
+    historyAlarm.setIndexId(realTimeAlarm.getIndexId());
+    historyAlarm.setLimitingValue(realTimeAlarm.getLimitingValue());
+    historyAlarm.setItemId(item.getId());
+    historyAlarm.setAlarmValue(realTimeAlarm.getAlarmValue());
+    historyAlarm.setAlarmValueQuality(realTimeAlarm.getAlarmValueQuality());
+    historyAlarm.setEndTime(now.toDate());
+    historyAlarm.setTimeCode(realTimeAlarm.getTimeCode());
+    int durationSecond = Seconds.secondsBetween(new DateTime(historyAlarm.getBeginTime()),
+        new DateTime(historyAlarm.getEndTime())).getSeconds();
+    historyAlarm.setDuration(durationSecond);
+    historyAlarmService.updateHistoryAlarm(historyAlarm.getItemId(), historyAlarm);
+  }
+
+  protected void insertHistoryAlarm(AlarmItem item, DateTime now) {
+    HistoryAlarm historyAlarm = new HistoryAlarm();
+    RealTimeAlarm realTimeAlarm = realtimeAlarmService.getRealTimeAlarmByAlarmCode(
+        item.getAlarmCode());
+    if (realTimeAlarm == null) {
+      return;
+    }
+
+    historyAlarm.setId(UUID.fastUUID().toString());
+    historyAlarm.setBeginTime(realTimeAlarm.getBeginTime());
+    historyAlarm.setIndexId(realTimeAlarm.getIndexId());
+    historyAlarm.setLimitingValue(realTimeAlarm.getLimitingValue());
+
+    historyAlarm.setItemId(item.getId());
+    historyAlarm.setAlarmCode(item.getAlarmCode());
+    historyAlarm.setAlarmValue(realTimeAlarm.getAlarmValue());
+    historyAlarm.setAlarmValueQuality(realTimeAlarm.getAlarmValueQuality());
+    historyAlarm.setEndTime(now.toDate());
+    historyAlarm.setTimeCode(realTimeAlarm.getTimeCode());
+    int durationSecond = Seconds.secondsBetween(new DateTime(historyAlarm.getBeginTime()),
+        new DateTime(historyAlarm.getEndTime())).getSeconds();
+    historyAlarm.setDuration(durationSecond);
+    historyAlarmService.updateHistoryAlarm(historyAlarm.getAlarmCode(), historyAlarm);
+  }
+
+  protected void insertRealtimeAlarm(AlarmItem item, DateTime now, Double value, Quality quality,
+      String timeCode) {
+    RealTimeAlarm realTimeAlarm = realtimeAlarmService.getRealTimeAlarmByAlarmCode(
+        item.getAlarmCode());
+    if (realTimeAlarm != null) {
+      return;
+    }
+
+    realTimeAlarm = new RealTimeAlarm();
+    realTimeAlarm.setId(UUID.fastUUID().toString());
+    realTimeAlarm.setBeginTime(now.toDate());
+    realTimeAlarm.setIndexId(item.getDwid());
+    realTimeAlarm.setLimitingValue(Double.parseDouble(item.getLimitVal()));
+
+    realTimeAlarm.setItemId(item.getId());
+    realTimeAlarm.setAlarmCode(item.getAlarmCode());
+    realTimeAlarm.setAlarmValue(value);
+    realTimeAlarm.setAlarmValueQuality(quality);
+    realTimeAlarm.setTimeCode(timeCode);
+    realtimeAlarmService.insert(realTimeAlarm);
+  }
+
+  abstract void judge(AlarmJudgeMessage message);
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/LoadAlarmActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/LoadAlarmActor.java
new file mode 100644
index 0000000..766cb7f
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/LoadAlarmActor.java
@@ -0,0 +1,161 @@
+package com.dingzhuo.compute.engine.actor.alarm;
+
+import static org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase;
+
+import akka.actor.ActorSelection;
+import akka.actor.UntypedAbstractActor;
+import akka.event.Logging;
+import akka.event.LoggingAdapter;
+import com.dingzhuo.compute.engine.message.alarm.AlarmStatus;
+import com.dingzhuo.compute.engine.message.alarm.LoadAlarmMessage;
+import com.dingzhuo.compute.engine.message.alarm.UnloadAlarmMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.LimitType;
+import com.dingzhuo.energy.data.model.service.ILimitTypeService;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IAlarmItemService;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IRealtimeAlarmService;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+
+/**
+ * @author fanxinfu
+ */
+@Component("loadAlarmActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class LoadAlarmActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "loadAlarmActor";
+  LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
+  private final IAlarmItemService alarmItemService;
+  private final ILimitTypeService limitTypeService;
+  private ActorSelection realtimeAlarm;
+  private ActorSelection periodAlarm;
+  private CacheService cacheService;
+  private IRealtimeAlarmService realtimeAlarmService;
+  Map<String, AlarmItem> loadedAlarmItem = new HashMap<>();
+
+  public LoadAlarmActor(
+      IAlarmItemService alarmItemService,
+      ILimitTypeService limitTypeService,
+      IRealtimeAlarmService realtimeAlarmService,
+      CacheService cacheService) {
+    this.alarmItemService = alarmItemService;
+    this.limitTypeService = limitTypeService;
+    this.cacheService = cacheService;
+    this.realtimeAlarmService = realtimeAlarmService;
+  }
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+    realtimeAlarm = getContext()
+        .actorSelection(ActorUtil.getActorAddress(RealtimeAlarmActor.ACTOR_NAME));
+    periodAlarm = getContext()
+        .actorSelection(ActorUtil.getActorAddress(PeriodAlarmActor.ACTOR_NAME));
+    this.context().system().scheduler()
+        .scheduleAtFixedRate(Duration.Zero(), Duration.create(1, TimeUnit.MINUTES), this.self(),
+            Message.REFRESH, this.context().system().dispatcher(), null);
+    cacheLimitType();
+    initAlarm();
+  }
+
+  private void cacheLimitType() {
+    List<LimitType> limitTypes = limitTypeService.selectLimitTypeList(new LimitType());
+    limitTypes.forEach(type -> cacheService.cacheLimitType(type.getLimitCode(), type));
+  }
+
+  private void initAlarm() {
+    List<RealTimeAlarm> alarms = realtimeAlarmService.getRealTimeAlarm();
+    if (!alarms.isEmpty()) {
+      alarms.forEach(alarm -> {
+        AlarmStatus status = new AlarmStatus();
+        status.setAlarm(true);
+        status.setBeginTime(alarm.getBeginTime());
+        cacheService.cacheAlarmStatus(alarm.getItemId(), status);
+      });
+    }
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof Message) {
+      if (message == Message.REFRESH) {
+        refreshAlarmItem();
+      } else {
+        this.unhandled(message);
+      }
+    }
+  }
+
+  private void refreshAlarmItem() {
+    List<AlarmItem> alarmItemList = alarmItemService.getAllAlarmItem();
+    Map<String, AlarmItem> newAlarmItem = alarmItemList.stream()
+        .collect(Collectors.toMap(ActorUtil::buildAlarmActorId, item -> item));
+
+    Set<String> needInstall = new HashSet<>();
+    Set<String> needUninstall = new HashSet<>();
+
+    loadedAlarmItem.forEach((id, alarmItem) -> {
+      if (!newAlarmItem.containsKey(id)) {
+        needUninstall.add(id);
+      } else {
+        Date nowUpdate = newAlarmItem.get(id).getUpdateTime();
+        Date lastUpdate = alarmItem.getUpdateTime();
+        if (lastUpdate != null && nowUpdate != null && lastUpdate.after(nowUpdate)) {
+          needUninstall.add(id);
+          needInstall.add(id);
+        }
+      }
+    });
+
+    newAlarmItem.forEach((id, alarmItem) -> {
+      if (!loadedAlarmItem.containsKey(id)) {
+        needInstall.add(id);
+      }
+    });
+
+    needUninstall.forEach(id -> {
+      AlarmItem alarmItem = loadedAlarmItem.get(id);
+      loadedAlarmItem.remove(id);
+      if (equalsAnyIgnoreCase(alarmItem.getTimeSlot(), TimeType.LIVE.name())) {
+        realtimeAlarm.tell(new UnloadAlarmMessage(alarmItem), getSelf());
+      } else {
+        periodAlarm.tell(new UnloadAlarmMessage(alarmItem), getSelf());
+      }
+    });
+
+    needInstall.forEach(id -> {
+      AlarmItem alarmItem = newAlarmItem.get(id);
+      if (equalsAnyIgnoreCase(alarmItem.getTimeSlot(), TimeType.LIVE.name())) {
+        alarmItem.setCalcText("limitRealtimeAlarm('" + id + "')");
+        realtimeAlarm.tell(new LoadAlarmMessage(alarmItem), getSelf());
+      } else {
+        alarmItem.setCalcText("limitPeriodAlarm('" + id + "')");
+        periodAlarm.tell(new LoadAlarmMessage(alarmItem), getSelf());
+      }
+
+      loadedAlarmItem.put(id, alarmItem);
+    });
+  }
+
+  public enum Message {
+    /**
+     * 妫�娴嬫姤璀﹂厤缃�
+     */
+    REFRESH
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/PeriodAlarmActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/PeriodAlarmActor.java
new file mode 100644
index 0000000..073b1e8
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/PeriodAlarmActor.java
@@ -0,0 +1,68 @@
+package com.dingzhuo.compute.engine.actor.alarm;
+
+import com.dingzhuo.compute.engine.function.FunctionEngine;
+import com.dingzhuo.compute.engine.message.alarm.AlarmJudgeMessage;
+import com.dingzhuo.compute.engine.message.alarm.AlarmStatus;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm;
+import com.greenpineyu.fel.context.FelContext;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanxinfu
+ */
+@Component("periodAlarmActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class PeriodAlarmActor extends BaseAlarmActor {
+
+  public static final String ACTOR_NAME = "periodAlarmActor";
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  @Override
+  void judge(AlarmJudgeMessage message) {
+    try {
+      String actorId = message.getActorId();
+      AlarmItem item = cacheService.getAlarmItem(actorId);
+      TimeType timeType = TimeType.valueOf(item.getTimeSlot());
+      String timeCode = TimeManager.getTimeCode(DateTime.now().toDate(), timeType);
+      String lastTimeCode = TimeManager.getTimeCode(TimeManager.getTime(timeCode, -1), timeType);
+      RealTimeAlarm alarm = realtimeAlarmService
+          .getAlarmByItemIdAndTimeCode(item.getId(), lastTimeCode);
+      if (alarm != null) {
+        insertPeriodHistoryAlarm(item, new DateTime(TimeManager.getEndTime(lastTimeCode)),
+            lastTimeCode, alarm);
+      }
+
+      AlarmStatus lastStatus = cacheService.getAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType());
+      DateTime now = DateTime.now();
+      if (lastStatus == null) {
+        lastStatus = new AlarmStatus();
+        lastStatus.setAlarm(false);
+        lastStatus.setBeginTime(now.toDate());
+      }
+
+      FelContext context = FunctionEngine.getInstance().getContext();
+      context.set("timeCode", timeCode);
+      Object value = FunctionEngine.getInstance().eval(item.getCalcText(), context);
+      boolean isAlarm = (Boolean) value;
+      if (isAlarm != lastStatus.isAlarm()) {
+        lastStatus.setAlarm(isAlarm);
+        cacheService.cacheAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType(), lastStatus);
+        if (isAlarm) {
+          insertRealtimeAlarm(item, now, null, null, timeCode);
+        } else {
+          insertPeriodHistoryAlarm(item, now, timeCode, null);
+        }
+      }
+    } catch (Exception ex) {
+      logger.error(ex.getMessage());
+    }
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/RealtimeAlarmActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/RealtimeAlarmActor.java
new file mode 100644
index 0000000..c05c511
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/RealtimeAlarmActor.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.compute.engine.actor.alarm;
+
+import com.dingzhuo.compute.engine.function.FunctionEngine;
+import com.dingzhuo.compute.engine.message.alarm.AlarmJudgeMessage;
+import com.dingzhuo.compute.engine.message.alarm.AlarmStatus;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanxinfu
+ */
+@Component("realtimeAlarmActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class RealtimeAlarmActor extends BaseAlarmActor {
+
+  public static final String ACTOR_NAME = "realtimeAlarmActor";
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  @Override
+  void judge(AlarmJudgeMessage message) {
+    try {
+      String actorId = message.getActorId();
+      AlarmItem item = cacheService.getAlarmItem(actorId);
+      AlarmStatus lastStatus = cacheService
+          .getAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType());
+      DateTime now = DateTime.now();
+      if (lastStatus == null) {
+        lastStatus = new AlarmStatus();
+        lastStatus.setAlarm(false);
+        lastStatus.setBeginTime(now.toDate());
+      }
+
+      Object value = FunctionEngine.getInstance().eval(item.getCalcText());
+      boolean isAlarm = (Boolean) value;
+      if (isAlarm != lastStatus.isAlarm()) {
+        try {
+          if (isAlarm) {
+            TagValue tagValue = cacheService.getTagValue(item.getIndexCode());
+            insertRealtimeAlarm(item, now, tagValue.getValue(), tagValue.getQuality(), "L");
+          } else {
+            insertHistoryAlarm(item, now);
+          }
+
+          lastStatus.setAlarm(isAlarm);
+          cacheService
+              .cacheAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType(),
+                  lastStatus);
+        } catch (Exception ex) {
+          logger.error(ex.getMessage(), ex);
+        }
+      }
+    } catch (Exception ex) {
+      logger.error(ex.getMessage(), ex);
+    }
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/SaveAlarmActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/SaveAlarmActor.java
new file mode 100644
index 0000000..d41208c
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/alarm/SaveAlarmActor.java
@@ -0,0 +1,57 @@
+package com.dingzhuo.compute.engine.actor.alarm;
+
+import akka.actor.ActorSystem;
+import akka.actor.Cancellable;
+import akka.actor.UntypedAbstractActor;
+import java.util.concurrent.TimeUnit;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+import scala.concurrent.duration.FiniteDuration;
+
+/**
+ * @author fanxinfu
+ */
+@Component("saveAlarmActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class SaveAlarmActor extends UntypedAbstractActor {
+
+  private Cancellable timer;
+  private final ActorSystem actorSystem;
+
+  public SaveAlarmActor(ActorSystem actorSystem) {
+    this.actorSystem = actorSystem;
+  }
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+    FiniteDuration interval = Duration.create(1, TimeUnit.SECONDS);
+    FiniteDuration delay = Duration.Zero();
+    timer = actorSystem.scheduler()
+        .scheduleAtFixedRate(delay, interval, self(), Message.TIMER, actorSystem.dispatcher(),
+            self());
+  }
+
+  @Override
+  public void postStop() throws Exception {
+    super.postStop();
+    if (timer != null) {
+      timer.cancel();
+    }
+  }
+
+  @Override
+  public void onReceive(Object message) throws Throwable {
+
+  }
+
+  private enum Message {
+    /**
+     * 鏃堕棿瑙﹀彂
+     */
+    TIMER
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusActor.java
new file mode 100644
index 0000000..6d69e01
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusActor.java
@@ -0,0 +1,90 @@
+package com.dingzhuo.compute.engine.actor.device;
+
+import akka.actor.UntypedAbstractActor;
+import com.dingzhuo.compute.engine.function.FunctionEngine;
+import com.dingzhuo.compute.engine.message.device.DeviceStatus;
+import com.dingzhuo.compute.engine.message.device.DeviceStatusJudgeMessage;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusHistory;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusLive;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusHistoryService;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusLiveService;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Component("deviceStatusActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class DeviceStatusActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "deviceStatusActor";
+  private final CacheService cacheService;
+  private final IDeviceStatusLiveService liveService;
+  private final IDeviceStatusHistoryService historyService;
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+  public DeviceStatusActor(CacheService cacheService,
+      IDeviceStatusLiveService liveService,
+      IDeviceStatusHistoryService historyService) {
+    this.cacheService = cacheService;
+    this.liveService = liveService;
+    this.historyService = historyService;
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof DeviceStatusJudgeMessage) {
+      judge((DeviceStatusJudgeMessage) message);
+    }
+  }
+
+  private void judge(DeviceStatusJudgeMessage message) {
+    try {
+      String actorId = message.getActorId();
+      DeviceFormula formula = cacheService.getDeviceFormula(actorId);
+      if (formula == null) {
+        return;
+      }
+
+      DeviceStatus lastStatus = cacheService.getDeviceStatus(actorId);
+      DateTime now = DateTime.now();
+      if (lastStatus == null) {
+        lastStatus = new DeviceStatus();
+        lastStatus.setAlarm(false);
+        lastStatus.setBeginTime(now.toDate());
+      }
+
+      Object value = FunctionEngine.getInstance().eval(formula.getCalcText());
+      boolean isAlarm = (Boolean) value;
+      if (isAlarm != lastStatus.isAlarm()) {
+        lastStatus.setAlarm(isAlarm);
+        cacheService.cacheDeviceStatus(actorId, lastStatus);
+        if (isAlarm) {
+          DeviceStatusLive live = new DeviceStatusLive();
+          live.setId(UUID.fastUUID().toString());
+          live.setDeviceId(formula.getDeviceId());
+          live.setStatusId(formula.getStateId());
+          live.setBeginTime(now.toString("yyyy-MM-dd HH:mm:ss"));
+          liveService.insertDeviceStatusLive(live);
+        } else {
+          DeviceStatusHistory history = new DeviceStatusHistory();
+          DeviceStatusLive live = liveService
+              .getDeviceStatus(formula.getDeviceId(), formula.getStateId());
+          history.setId(UUID.fastUUID().toString());
+          history.setDeviceId(formula.getDeviceId());
+          history.setStatusId(formula.getStateId());
+          history.setBeginTime(live.getBeginTime());
+          history.setEndTime(now.toString("yyyy-MM-dd HH:mm:ss"));
+          historyService.saveHistoryStatus(history);
+        }
+      }
+    } catch (Exception ex) {
+      logger.error(ex.getMessage());
+    }
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusTimerActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusTimerActor.java
new file mode 100644
index 0000000..795de1c
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/DeviceStatusTimerActor.java
@@ -0,0 +1,78 @@
+package com.dingzhuo.compute.engine.actor.device;
+
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.actor.UntypedAbstractActor;
+import com.dingzhuo.compute.engine.actor.alarm.PeriodAlarmActor;
+import com.dingzhuo.compute.engine.message.device.DeviceStatusJudgeMessage;
+import com.dingzhuo.compute.engine.message.device.LoadDeviceStatusMessage;
+import com.dingzhuo.compute.engine.message.device.UnloadDeviceStatusMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+import scala.concurrent.duration.FiniteDuration;
+
+@Component("deviceStatusTimerActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class DeviceStatusTimerActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "deviceStatusTimerActor";
+  private List<String> actorIds = new ArrayList<>();
+  private final ActorSystem actorSystem;
+  private final CacheService cacheService;
+  private ActorSelection deviceStatusActor;
+
+  public DeviceStatusTimerActor(ActorSystem actorSystem, CacheService cacheService) {
+    this.actorSystem = actorSystem;
+    this.cacheService = cacheService;
+  }
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+
+    deviceStatusActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(DeviceStatusActor.ACTOR_NAME));
+    FiniteDuration interval = Duration.create(30, TimeUnit.SECONDS);
+    FiniteDuration delay = Duration.Zero();
+    actorSystem.scheduler()
+        .scheduleAtFixedRate(delay, interval, self(), Message.TIMER, actorSystem.dispatcher(),
+            self());
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof LoadDeviceStatusMessage) {
+      LoadDeviceStatusMessage loadMessage = (LoadDeviceStatusMessage) message;
+      actorIds.add(loadMessage.getActorId());
+      cacheService.cacheDeviceStatusSetting(loadMessage.getDeviceFormula());
+    } else if (message instanceof UnloadDeviceStatusMessage) {
+      UnloadDeviceStatusMessage unloadMessage = (UnloadDeviceStatusMessage) message;
+      actorIds.remove(unloadMessage.getActorId());
+      cacheService.removeDeviceStatusSetting(unloadMessage.getActorId());
+    } else if (message == Message.TIMER) {
+      doTimer();
+    }
+  }
+
+  private void doTimer() {
+    if (!actorIds.isEmpty()) {
+      actorIds.forEach(id -> deviceStatusActor.tell(new DeviceStatusJudgeMessage(id), getSelf()));
+    }
+  }
+
+  enum Message {
+    /**
+     * 鍒扮偣瑙﹀彂
+     */
+    TIMER
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/LoadDeviceStatusActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/LoadDeviceStatusActor.java
new file mode 100644
index 0000000..0c28928
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/device/LoadDeviceStatusActor.java
@@ -0,0 +1,110 @@
+package com.dingzhuo.compute.engine.actor.device;
+
+import akka.actor.ActorSelection;
+import akka.actor.UntypedAbstractActor;
+import com.dingzhuo.compute.engine.message.device.LoadDeviceStatusMessage;
+import com.dingzhuo.compute.engine.message.device.UnloadDeviceStatusMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceFormulaService;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+
+@Component("loadDeviceStatusActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class LoadDeviceStatusActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "loadDeviceStatusActor";
+  private final IDeviceFormulaService deviceFormulaService;
+  Map<String, DeviceFormula> loadedDeviceFormula = new HashMap<>();
+  private ActorSelection deviceStatusTimerActor;
+
+  public LoadDeviceStatusActor(
+      IDeviceFormulaService deviceFormulaService) {
+    this.deviceFormulaService = deviceFormulaService;
+  }
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+
+    deviceStatusTimerActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(DeviceStatusTimerActor.ACTOR_NAME));
+    this.context().system().scheduler()
+        .scheduleAtFixedRate(Duration.Zero(), Duration.create(5, TimeUnit.MINUTES), this.self(),
+            Message.REFRESH, this.context().system().dispatcher(), null);
+    initDeviceStatus();
+    refreshDeviceStatusSetting();
+  }
+
+  private void initDeviceStatus() {
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof Message) {
+      if (message == Message.REFRESH) {
+        refreshDeviceStatusSetting();
+      } else {
+        this.unhandled(message);
+      }
+    }
+  }
+
+  private void refreshDeviceStatusSetting() {
+    List<DeviceFormula> formulas = deviceFormulaService.getAllDeviceFormula();
+    Map<String, DeviceFormula> newFormulas = formulas.stream()
+        .collect(Collectors.toMap(DeviceFormula::getId, item -> item));
+
+    Set<String> needInstall = new HashSet<>();
+    Set<String> needUninstall = new HashSet<>();
+
+    loadedDeviceFormula.forEach((id, alarmItem) -> {
+      if (!newFormulas.containsKey(id)) {
+        needUninstall.add(id);
+      } else {
+        Date nowUpdate = newFormulas.get(id).getUpdateTime();
+        Date lastUpdate = alarmItem.getUpdateTime();
+        if (lastUpdate != null && nowUpdate != null && lastUpdate.after(nowUpdate)) {
+          needUninstall.add(id);
+          needInstall.add(id);
+        }
+      }
+    });
+
+    newFormulas.forEach((id, formula) -> {
+      if (!loadedDeviceFormula.containsKey(id)) {
+        needInstall.add(id);
+      }
+    });
+
+    needUninstall.forEach(id -> {
+      DeviceFormula deviceFormula = loadedDeviceFormula.get(id);
+      loadedDeviceFormula.remove(id);
+      deviceStatusTimerActor.tell(new UnloadDeviceStatusMessage(deviceFormula), getSelf());
+    });
+
+    needInstall.forEach(id -> {
+      DeviceFormula deviceFormula = newFormulas.get(id);
+      deviceStatusTimerActor.tell(new LoadDeviceStatusMessage(deviceFormula), getSelf());
+      loadedDeviceFormula.put(id, deviceFormula);
+    });
+  }
+
+  public enum Message {
+    /**
+     * 妫�娴嬮厤缃�
+     */
+    REFRESH
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/CalculationIndexActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/CalculationIndexActor.java
new file mode 100644
index 0000000..2bd93c6
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/CalculationIndexActor.java
@@ -0,0 +1,128 @@
+package com.dingzhuo.compute.engine.actor.indexcalc;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.actor.UntypedAbstractActor;
+import akka.cluster.sharding.ClusterSharding;
+import com.dingzhuo.compute.engine.function.FunctionEngine;
+import com.dingzhuo.compute.engine.message.calculation.CalculateMessage;
+import com.dingzhuo.compute.engine.message.calculation.LinkMessage;
+import com.dingzhuo.compute.engine.message.calculation.LoadCalcIndexMessage;
+import com.dingzhuo.compute.engine.message.calculation.UnlinkMessage;
+import com.dingzhuo.compute.engine.message.calculation.UnloadCalcIndexMessage;
+import com.dingzhuo.compute.engine.message.save.SaveMessage;
+import com.dingzhuo.compute.engine.message.timer.RegisterTimeMessage;
+import com.dingzhuo.compute.engine.message.timer.RegisterType;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.greenpineyu.fel.context.FelContext;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanxinfu
+ */
+@Component("indexCalcActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class CalculationIndexActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "indexCalcActor";
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());
+  private final CacheService cacheService;
+  private ActorSelection calculateActor;
+  private ActorSelection timerActor;
+  private ActorSelection saveActor;
+
+  public CalculationIndexActor(CacheService cacheService) {
+    this.cacheService = cacheService;
+  }
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+    calculateActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(CalculationIndexActor.ACTOR_NAME));
+    timerActor = getContext().actorSelection(ActorUtil.getActorAddress(TimerActor.ACTOR_NAME));
+    saveActor = getContext().actorSelection(ActorUtil.getActorAddress(SavePeriodActor.ACTOR_NAME));
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof LoadCalcIndexMessage) {
+      IndexStorage storage = ((LoadCalcIndexMessage) message).getIndexStorage();
+      loadIndex(storage);
+    } else if (message instanceof UnloadCalcIndexMessage) {
+      String actorId = ((UnloadCalcIndexMessage) message).getActorId();
+      unloadIndex(actorId);
+    } else if (message instanceof LinkMessage) {
+      LinkMessage linkMessage = (LinkMessage) message;
+      cacheService.cachePostIndex(linkMessage.getActorId(), linkMessage.getPostActorId());
+    } else if (message instanceof UnlinkMessage) {
+      UnlinkMessage unlinkMessage = (UnlinkMessage) message;
+      cacheService.removePostIndexCache(unlinkMessage.getActorId(), unlinkMessage.getPostActorId());
+    } else if (message instanceof CalculateMessage) {
+      calculate((CalculateMessage) message);
+    }
+  }
+
+  private void calculate(CalculateMessage message) {
+    try {
+      IndexStorage indexStorage = cacheService.getIndexStorageCache(message.getActorId());
+      if (StringUtils.isBlank(indexStorage.getCalcText())) {
+        return;
+      }
+
+      List<String> postActorIds = cacheService.getPostActorIds(message.getActorId());
+      FelContext calcContext = FunctionEngine.getInstance().getContext();
+      calcContext.set("timeType", message.getTimeType().name());
+      calcContext.set("timeCode", message.getTimeCode());
+      Object value = FunctionEngine.getInstance().eval(indexStorage.getCalcText(), calcContext);
+      SaveMessage saveMessage = new SaveMessage();
+      saveMessage.setIndexId(indexStorage.getIndexId());
+      saveMessage.setTimeType(message.getTimeType());
+      saveMessage.setTimeCode(message.getTimeCode());
+      if (value != null) {
+        saveMessage.setValue(Double.parseDouble(String.valueOf(value)));
+      } else {
+        saveMessage.setValue(0d);
+      }
+      saveMessage.getPostActorIds().addAll(postActorIds);
+
+      saveActor.tell(saveMessage, getSelf());
+    } catch (Exception ex) {
+      logger.error(ex.getMessage(), ex);
+    }
+  }
+
+  private void unloadIndex(String actorId) {
+    IndexStorage indexStorage = cacheService.getIndexStorageCache(actorId);
+    RegisterTimeMessage message =
+        new RegisterTimeMessage(actorId, indexStorage.getTimeType(), RegisterType.UNREGISTER);
+    timerActor.tell(message, getSelf());
+    indexStorage.getParamIndex().forEach(param -> {
+      String preActorId = ActorUtil.buildActorId(param, indexStorage.getTimeType());
+      calculateActor.tell(new UnlinkMessage(preActorId, actorId), getSelf());
+    });
+    cacheService.removeIndexCache(actorId);
+  }
+
+  private void loadIndex(IndexStorage storage) {
+    cacheService.cacheIndexStorage(storage);
+    String actorId = ActorUtil.buildActorId(storage);
+    storage.getParamIndex().forEach(param -> {
+      String preActorId = ActorUtil.buildActorId(param, storage.getTimeType());
+      calculateActor.tell(new LinkMessage(preActorId, actorId), getSelf());
+    });
+
+    RegisterTimeMessage message =
+        new RegisterTimeMessage(actorId, storage.getTimeType(), RegisterType.REGISTER);
+    timerActor.tell(message, getSelf());
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/LoadIndexActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/LoadIndexActor.java
new file mode 100644
index 0000000..8f7421f
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/LoadIndexActor.java
@@ -0,0 +1,135 @@
+package com.dingzhuo.compute.engine.actor.indexcalc;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.actor.UntypedAbstractActor;
+import akka.cluster.sharding.ClusterSharding;
+import akka.event.Logging;
+import akka.event.LoggingAdapter;
+import com.dingzhuo.compute.engine.function.FunctionEngine;
+import com.dingzhuo.compute.engine.message.calculation.LoadCalcIndexMessage;
+import com.dingzhuo.compute.engine.message.calculation.UnloadCalcIndexMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.dingzhuo.energy.data.model.service.IIndexStorageService;
+import com.greenpineyu.fel.parser.FelNode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+
+/**
+ * @author fanxinfu
+ */
+@Component("loadIndexActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class LoadIndexActor extends UntypedAbstractActor {
+
+  LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
+  private final IIndexStorageService indexStorageService;
+  public static final String ACTOR_NAME = "loadIndexActor";
+  private Map<String, IndexStorage> loadedCalcIndex = new HashMap<>();
+  private ActorSelection calculateActor;
+
+  public LoadIndexActor(IIndexStorageService indexStorageService) {
+    this.indexStorageService = indexStorageService;
+  }
+
+  @Override
+  public void preStart() {
+    calculateActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(CalculationIndexActor.ACTOR_NAME));
+    this.context().system().scheduler()
+        .scheduleAtFixedRate(Duration.Zero(), Duration.create(5, TimeUnit.MINUTES), this.self(),
+            Message.REFRESH, this.context().system().dispatcher(), null);
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof Message) {
+      if (message == Message.REFRESH) {
+        refreshIndex();
+      } else {
+        this.unhandled(message);
+      }
+    }
+  }
+
+  private void refreshIndex() {
+    List<IndexStorage> indexStorages = indexStorageService.getAllCalcIndexStorage();
+    List<IndexStorage> filterIndexStorageList = new ArrayList<>();
+    indexStorages.forEach(indexStorage -> {
+      try {
+        if (StringUtils.isNotBlank(indexStorage.getCalcText())) {
+          FelNode node = FunctionEngine.getInstance().parse(indexStorage.getCalcText());
+          if (node != null && !node.getChildren().isEmpty()) {
+            filterIndexStorageList.add(indexStorage);
+          } else {
+            log.error("ErrorIndex:" + indexStorage.getId() + ";" + indexStorage.getCalcText());
+          }
+        }
+      } catch (Exception ex) {
+        log.error("ErrorIndex:" + indexStorage.getId() + ";" + indexStorage.getCalcText());
+      }
+    });
+
+    if (filterIndexStorageList.isEmpty()) {
+      return;
+    }
+
+    Map<String, IndexStorage> newCalcIndex = filterIndexStorageList.stream()
+        .collect(Collectors.toMap(IndexStorage::getId, indexStorage -> indexStorage));
+    Set<String> needInstall = new HashSet<>();
+    Set<String> needUninstall = new HashSet<>();
+
+    loadedCalcIndex.forEach((id, indexStorage) -> {
+      if (!newCalcIndex.containsKey(id)) {
+        needUninstall.add(id);
+      } else {
+        Date nowUpdate = newCalcIndex.get(id).getUpdateTime();
+        Date lastUpdate = indexStorage.getUpdateTime();
+        if (lastUpdate != null && nowUpdate != null && lastUpdate.after(nowUpdate)) {
+          needUninstall.add(id);
+          needInstall.add(id);
+        }
+      }
+    });
+
+    newCalcIndex.forEach((id, indexStorage) -> {
+      if (!loadedCalcIndex.containsKey(id)) {
+        needInstall.add(id);
+      }
+    });
+
+    needUninstall.forEach(id -> {
+      IndexStorage indexStorage = loadedCalcIndex.get(id);
+      loadedCalcIndex.remove(id);
+      calculateActor
+          .tell(new UnloadCalcIndexMessage(ActorUtil.buildActorId(indexStorage)), getSelf());
+    });
+
+    needInstall.forEach(id -> {
+      IndexStorage indexStorage = newCalcIndex.get(id);
+      loadedCalcIndex.put(id, indexStorage);
+      calculateActor.tell(new LoadCalcIndexMessage(indexStorage), getSelf());
+    });
+  }
+
+  public enum Message {
+    /**
+     * 妫�娴嬫寚鏍�
+     */
+    REFRESH
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/SavePeriodActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/SavePeriodActor.java
new file mode 100644
index 0000000..2b4db9d
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/SavePeriodActor.java
@@ -0,0 +1,145 @@
+package com.dingzhuo.compute.engine.actor.indexcalc;
+
+import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;
+
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.actor.Cancellable;
+import akka.actor.UntypedAbstractActor;
+import akka.event.Logging;
+import akka.event.LoggingAdapter;
+import com.dingzhuo.compute.engine.message.ExecuteType;
+import com.dingzhuo.compute.engine.message.calculation.CalculateMessage;
+import com.dingzhuo.compute.engine.message.save.SaveMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.ServiceProvicer;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+import scala.concurrent.duration.FiniteDuration;
+
+@Component("savePeriodActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class SavePeriodActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "savePeriodActor";
+  LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
+  private final ActorSystem actorSystem;
+  private Cancellable timer;
+  private ActorSelection calculateActor;
+  private ConcurrentHashMap<String, SaveMessage> cacheData = new ConcurrentHashMap<>();
+
+  public SavePeriodActor(ActorSystem actorSystem) {
+    this.actorSystem = actorSystem;
+  }
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+    calculateActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(CalculationIndexActor.ACTOR_NAME));
+    FiniteDuration interval = Duration.create(10, TimeUnit.SECONDS);
+    FiniteDuration delay = Duration.Zero();
+    timer = actorSystem.scheduler()
+        .scheduleAtFixedRate(delay, interval, self(), Message.TIMER, actorSystem.dispatcher(),
+            self());
+  }
+
+  @Override
+  public void postStop() throws Exception {
+    super.postStop();
+    if (timer != null) {
+      timer.cancel();
+    }
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof Message) {
+      if (message == Message.TIMER) {
+        doSave();
+      }
+    } else if (message instanceof SaveMessage) {
+      SaveMessage saveMessage = (SaveMessage) message;
+      String key = String.format("%s:%s", saveMessage.getIndexId(), saveMessage.getTimeCode());
+      cacheData.put(key, saveMessage);
+    }
+  }
+
+  private void doSave() {
+    if (!cacheData.isEmpty()) {
+      List<SaveMessage> saveData = new ArrayList<>();
+      List<String> needRemoveKeys = new ArrayList<>();
+      List<CalculateMessage> postIndexMessage = new ArrayList<>();
+      cacheData.forEach((key, value) -> {
+        needRemoveKeys.add(key);
+        saveData.add(value);
+        value.getPostActorIds().forEach(actorId -> {
+          if (!equalsIgnoreCase(actorId,
+              ActorUtil.buildActorId(value.getIndexId(), value.getTimeType()))) {
+            CalculateMessage message =
+                new CalculateMessage(actorId, value.getTimeCode(),
+                    value.getTimeType(),
+                    ExecuteType.TIMER);
+            postIndexMessage.add(message);
+          }
+        });
+      });
+
+      for (String key : needRemoveKeys) {
+        cacheData.remove(key);
+      }
+
+      savePeriodData(saveData);
+      postIndexMessage.forEach(message -> calculateActor.tell(message, getSelf()));
+    }
+  }
+
+  private void savePeriodData(List<SaveMessage> saveData) {
+    List<DataItem> dataItems = new ArrayList<>();
+    saveData.forEach(data -> {
+      String timeCode = data.getTimeCode();
+      DataItem dataItem = new DataItem();
+      dataItem.setIndexId(data.getIndexId());
+      dataItem.setTimeCode(timeCode);
+      dataItem.setTimeType(data.getTimeType());
+      dataItem.setBeginTime(TimeManager.getBeginTime(timeCode));
+      dataItem.setEndTime(TimeManager.getEndTime(timeCode));
+      dataItem.setDataTime(TimeManager.getTime(timeCode));
+      dataItem.setValue(data.getValue());
+      dataItems.add(dataItem);
+    });
+
+    try {
+      ServiceProvicer.getPeriodDataService().save(dataItems);
+    } catch (Exception ex) {
+      log.error("鎵归噺淇濆瓨澶辫触锛�" + ex.getMessage());
+      dataItems.forEach(item -> {
+        try {
+          if (item != null) {
+            ServiceProvicer.getPeriodDataService().save(item);
+          }
+        } catch (Exception singleEx) {
+          log.error("鍗曚釜淇濆瓨澶辫触锛�" + singleEx.getMessage());
+        }
+      });
+    }
+
+    log.error(DateTime.now().toString("yyyy-MM-dd HH:mm:ss.SSS"));
+  }
+
+  private enum Message {
+    /**
+     * 鏃堕棿瑙﹀彂
+     */
+    TIMER
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/TimerActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/TimerActor.java
new file mode 100644
index 0000000..17a6628
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/indexcalc/TimerActor.java
@@ -0,0 +1,121 @@
+package com.dingzhuo.compute.engine.actor.indexcalc;
+
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.actor.Cancellable;
+import akka.actor.UntypedAbstractActor;
+import akka.event.Logging;
+import akka.event.LoggingAdapter;
+import com.dingzhuo.compute.engine.message.ExecuteType;
+import com.dingzhuo.compute.engine.message.calculation.CalculateMessage;
+import com.dingzhuo.compute.engine.message.timer.RegisterTimeMessage;
+import com.dingzhuo.compute.engine.message.timer.RegisterType;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import com.dingzhuo.compute.engine.utils.ServiceProvicer;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+import scala.concurrent.duration.FiniteDuration;
+
+/**
+ * @author fanxinfu
+ */
+@Component("timerActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class TimerActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "timerActor";
+  private final CacheService cacheService;
+  LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
+  private final ActorSystem actorSystem;
+  private Cancellable timerCancelable;
+  private ActorSelection calculationActor;
+
+  public TimerActor(ActorSystem actorSystem, CacheService cacheService) {
+    this.actorSystem = actorSystem;
+    this.cacheService = cacheService;
+  }
+
+  @Override
+  public void preStart() throws Exception {
+    super.preStart();
+    calculationActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(CalculationIndexActor.ACTOR_NAME));
+    FiniteDuration interval = Duration
+        .create(ServiceProvicer.getCalculationConfig().getInterval(), TimeUnit.SECONDS);
+    FiniteDuration delay = Duration.Zero();
+    this.timerCancelable = actorSystem.scheduler()
+        .scheduleAtFixedRate(delay, interval, self(), Message.TIMER, actorSystem.dispatcher(),
+            self());
+  }
+
+  @Override
+  public void postStop() throws Exception {
+    super.postStop();
+    if (this.timerCancelable != null) {
+      this.timerCancelable.cancel();
+    }
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof Message) {
+      if (message == Message.TIMER) {
+        doTimer();
+      }
+    } else if (message instanceof RegisterTimeMessage) {
+      register((RegisterTimeMessage) message);
+    }
+  }
+
+  private void register(RegisterTimeMessage message) {
+    if (!cacheService.getRegisters().containsKey(message.getTimeType())) {
+      cacheService.getRegisters().put(message.getTimeType(), new HashSet<>());
+    }
+
+    if (message.getRegisterType() == RegisterType.REGISTER) {
+      cacheService.getRegisters().get(message.getTimeType()).add(message.getActorId());
+    } else if (message.getRegisterType() == RegisterType.UNREGISTER) {
+      cacheService.getRegisters().get(message.getTimeType()).remove(message.getActorId());
+    }
+  }
+
+  private void doTimer() {
+    Date now = DateTime.now().toDate();
+    TimeType[] timeTypes = TimeManager.typeArray;
+    int delayTime = ServiceProvicer.getCalculationConfig().getInterval() * 3;
+    for (TimeType timeType : timeTypes) {
+      String timeCode = TimeManager.getExecuteTimeCode(now, timeType, delayTime);
+      if (StringUtils.isEmpty(timeCode)) {
+        continue;
+      }
+
+      Set<String> actorIds = cacheService.getRegisters().get(timeType);
+      if (actorIds == null || actorIds.isEmpty()) {
+        continue;
+      }
+
+      for (String actorId : actorIds) {
+        calculationActor
+            .tell(new CalculateMessage(actorId, timeCode, timeType, ExecuteType.TIMER), getSelf());
+      }
+    }
+  }
+
+  public enum Message {
+    /**
+     * 鏃堕棿瑙﹀彂
+     */
+    TIMER
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/monitor/RecastDataActor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/monitor/RecastDataActor.java
new file mode 100644
index 0000000..e06d7f4
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/actor/monitor/RecastDataActor.java
@@ -0,0 +1,172 @@
+package com.dingzhuo.compute.engine.actor.monitor;
+
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import akka.actor.Cancellable;
+import akka.actor.UntypedAbstractActor;
+import com.alibaba.fastjson.JSONArray;
+import com.dingzhuo.compute.engine.actor.indexcalc.CalculationIndexActor;
+import com.dingzhuo.compute.engine.message.ExecuteType;
+import com.dingzhuo.compute.engine.message.calculation.CalculateMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.CacheService;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import java.io.File;
+import java.nio.charset.Charset;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import org.apache.commons.io.FileUtils;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import scala.concurrent.duration.Duration;
+import scala.concurrent.duration.FiniteDuration;
+
+/**
+ * @author fanxinfu
+ */
+@Component("recastDataActor")
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
+public class RecastDataActor extends UntypedAbstractActor {
+
+  public static final String ACTOR_NAME = "recastDataActor";
+  private final CacheService cacheService;
+  private Cancellable timerCancelable;
+  private final ActorSystem actorSystem;
+  private ActorSelection calculationActor;
+  Logger logger = LoggerFactory.getLogger(RecastDataActor.class.getName());
+
+  public RecastDataActor(ActorSystem actorSystem, CacheService cacheService) {
+    this.actorSystem = actorSystem;
+    this.cacheService = cacheService;
+  }
+
+  @Override
+  public void preStart() {
+    calculationActor = getContext()
+        .actorSelection(ActorUtil.getActorAddress(CalculationIndexActor.ACTOR_NAME));
+    FiniteDuration interval = Duration.create(10, TimeUnit.SECONDS);
+    FiniteDuration delay = Duration.Zero();
+    this.timerCancelable = actorSystem.scheduler().scheduleAtFixedRate(delay,
+        interval,
+        self(),
+        Message.TIMER,
+        actorSystem.dispatcher(),
+        self());
+  }
+
+  @Override
+  public void postStop() throws Exception {
+    super.postStop();
+    if (this.timerCancelable != null) {
+      this.timerCancelable.cancel();
+    }
+  }
+
+  @Override
+  public void onReceive(Object message) {
+    if (message instanceof Message) {
+      if (message == Message.TIMER) {
+        verifyRecastData();
+      }
+    }
+  }
+
+  private void verifyRecastData() {
+    String pathname = "recast.json";
+    try {
+      File jsonFile = new File(pathname);
+      if (jsonFile.exists()) {
+        sendRecastData(jsonFile);
+      }
+    } catch (Exception e) {
+      logger.error("", e);
+    }
+
+  }
+
+  private void sendRecastData(File jsonFile) {
+    try {
+      String jsonString = FileUtils.readFileToString(jsonFile, Charset.defaultCharset());
+      List<RecastConfig> configs = JSONArray.parseArray(jsonString, RecastConfig.class);
+      configs.forEach(config -> {
+        DateTime time = config.getBeginTime();
+        TimeType timeType = config.getTimeType();
+        Set<String> actorIds = cacheService.getRegisters().get(timeType);
+        if (actorIds != null && actorIds.size() > 0) {
+          while (time.isBefore(config.getEndTime())) {
+            String timeCode = TimeManager.getTimeCode(time.toDate(), timeType);
+            for (String actorId : actorIds) {
+              CalculateMessage msg =
+                  new CalculateMessage(actorId, timeCode, timeType, ExecuteType.TIMER);
+              calculationActor.tell(msg, getSelf());
+            }
+
+            if (timeType == TimeType.HOUR) {
+              time = time.plusHours(1);
+            } else if (timeType == TimeType.DAY) {
+              time = time.plusDays(1);
+            } else if (timeType == TimeType.MONTH) {
+              time = time.plusMonths(1);
+            } else if (timeType == TimeType.YEAR) {
+              time = time.plusYears(1);
+            }
+
+            try {
+              Thread.sleep(0);
+            } catch (InterruptedException e) {
+              logger.error("", e);
+            }
+          }
+        }
+      });
+
+      jsonFile.delete();
+    } catch (Exception ex) {
+      logger.error("", ex);
+    }
+  }
+
+  private static class RecastConfig {
+
+    private DateTime beginTime;
+    private DateTime endTime;
+    private TimeType timeType;
+
+    public DateTime getBeginTime() {
+      return beginTime;
+    }
+
+    public void setBeginTime(DateTime beginTime) {
+      this.beginTime = beginTime;
+    }
+
+    public DateTime getEndTime() {
+      return endTime;
+    }
+
+    public void setEndTime(DateTime endTime) {
+      this.endTime = endTime;
+    }
+
+    public TimeType getTimeType() {
+      return timeType;
+    }
+
+    public void setTimeType(TimeType timeType) {
+      this.timeType = timeType;
+    }
+  }
+
+  public enum Message {
+    /**
+     * 鏃堕棿瑙﹀彂
+     */
+    TIMER
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalcMessageExtractor.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalcMessageExtractor.java
new file mode 100644
index 0000000..dc8a0f7
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalcMessageExtractor.java
@@ -0,0 +1,33 @@
+package com.dingzhuo.compute.engine.config;
+
+import akka.cluster.sharding.ShardRegion.MessageExtractor;
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+
+/**
+ * @author fanxinfu
+ */
+public class CalcMessageExtractor implements MessageExtractor {
+
+  @Override
+  public String entityId(Object message) {
+    if (message instanceof BaseActorMessage) {
+      return ((BaseActorMessage) message).getActorId();
+    }
+
+    return null;
+  }
+
+  @Override
+  public Object entityMessage(Object message) {
+    return message;
+  }
+
+  @Override
+  public String shardId(Object message) {
+    if (message instanceof BaseActorMessage) {
+      return String.valueOf(((BaseActorMessage) message).getActorId().hashCode() % 10);
+    }
+
+    return null;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalculationConfig.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalculationConfig.java
new file mode 100644
index 0000000..c191a2f
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/CalculationConfig.java
@@ -0,0 +1,22 @@
+package com.dingzhuo.compute.engine.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanxinfu
+ */
+@Component
+@ConfigurationProperties(prefix = "calc")
+public class CalculationConfig {
+
+  private int interval;
+
+  public int getInterval() {
+    return interval;
+  }
+
+  public void setInterval(int interval) {
+    this.interval = interval;
+  }
+}
\ No newline at end of file
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/EngineArgOption.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/EngineArgOption.java
new file mode 100644
index 0000000..d2eda07
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/EngineArgOption.java
@@ -0,0 +1,47 @@
+package com.dingzhuo.compute.engine.config;
+
+import org.kohsuke.args4j.Option;
+
+public class EngineArgOption {
+
+  @Option(name = "-c", usage = "鎸囨爣璁$畻寮曟搸")
+  private boolean calc;
+  @Option(name = "-a", usage = "鎸囨爣鎶ヨ寮曟搸")
+  private boolean alarm;
+  @Option(name = "-d", usage = "璁惧妫�娴嬪紩鎿�")
+  private boolean device;
+  @Option(name = "-r", usage = "閲嶇畻寮曟搸")
+  private boolean recast;
+
+  public boolean isCalc() {
+    return calc;
+  }
+
+  public void setCalc(boolean calc) {
+    this.calc = calc;
+  }
+
+  public boolean isAlarm() {
+    return alarm;
+  }
+
+  public void setAlarm(boolean alarm) {
+    this.alarm = alarm;
+  }
+
+  public boolean isDevice() {
+    return device;
+  }
+
+  public void setDevice(boolean device) {
+    this.device = device;
+  }
+
+  public void setRecast(boolean recast) {
+    this.recast = recast;
+  }
+
+  public boolean isRecast() {
+    return recast;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/ExecutePrioMailBox.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/ExecutePrioMailBox.java
new file mode 100644
index 0000000..0772589
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/config/ExecutePrioMailBox.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.compute.engine.config;
+
+import akka.dispatch.Envelope;
+import akka.dispatch.UnboundedStablePriorityMailbox;
+import java.util.Comparator;
+
+public class ExecutePrioMailBox extends UnboundedStablePriorityMailbox {
+
+  public ExecutePrioMailBox(Comparator<Envelope> cmp, int initialCapacity) {
+    super(cmp, initialCapacity);
+  }
+
+  public ExecutePrioMailBox(Comparator<Envelope> cmp) {
+    super(cmp);
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/CalculationController.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/CalculationController.java
new file mode 100644
index 0000000..61c9ec0
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/CalculationController.java
@@ -0,0 +1,60 @@
+package com.dingzhuo.compute.engine.controller;
+
+import akka.actor.ActorRef;
+import akka.actor.ActorSelection;
+import akka.actor.ActorSystem;
+import com.dingzhuo.compute.engine.actor.indexcalc.CalculationIndexActor;
+import com.dingzhuo.compute.engine.message.ExecuteType;
+import com.dingzhuo.compute.engine.message.calculation.CalculateMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.compute.engine.utils.SpringAkkaExtension;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.dingzhuo.energy.data.model.service.IIndexStorageService;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import java.util.List;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/computing")
+public class CalculationController {
+
+  private final ActorSystem actorSystem;
+  private final SpringAkkaExtension akkaExt;
+  private final IIndexStorageService storageService;
+  private ActorSelection calculateActor;
+
+  public CalculationController(ActorSystem actorSystem, SpringAkkaExtension akkaExt,
+      IIndexStorageService storageService) {
+    this.actorSystem = actorSystem;
+    this.akkaExt = akkaExt;
+    this.storageService = storageService;
+  }
+
+  @GetMapping("/recalc")
+  public AjaxResult reCalc(@RequestBody List<Recalc> recalcList) {
+    calculateActor = actorSystem.actorSelection(
+        ActorUtil.getActorAddress(CalculationIndexActor.ACTOR_NAME));
+    DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
+    recalcList.forEach(recalc -> {
+      IndexStorage indexStorage = storageService.getIndexStorage(recalc.getIndexId(),
+          recalc.getTimeType());
+      if (indexStorage != null) {
+        String actorId = ActorUtil.buildActorId(indexStorage);
+        String timeCode = TimeManager.getTimeCode(
+            DateTime.parse(recalc.getDataTime(), fmt).toDate(),
+            recalc.getTimeType());
+        calculateActor.tell(
+            new CalculateMessage(actorId, timeCode, recalc.getTimeType(), ExecuteType.TIMER),
+            ActorRef.noSender());
+      }
+    });
+    return AjaxResult.success();
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/Recalc.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/Recalc.java
new file mode 100644
index 0000000..4bc168c
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/controller/Recalc.java
@@ -0,0 +1,34 @@
+package com.dingzhuo.compute.engine.controller;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+
+public class Recalc {
+
+  private String indexId;
+  private String dataTime;
+  private TimeType timeType;
+
+  public String getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(String dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/function/CustomFunction.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/function/CustomFunction.java
new file mode 100644
index 0000000..c89f8f5
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/function/CustomFunction.java
@@ -0,0 +1,201 @@
+package com.dingzhuo.compute.engine.function;
+
+import com.dingzhuo.compute.engine.message.alarm.AlarmStatus;
+import com.dingzhuo.compute.engine.utils.ServiceProvicer;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.domain.LimitType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmJudgeDirection;
+import com.dingzhuo.energy.dataservice.domain.CollectionModes;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.greenpineyu.fel.context.FelContext;
+import com.greenpineyu.fel.function.CommonFunction;
+import com.greenpineyu.fel.function.Function;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import org.joda.time.Instant;
+
+/**
+ * 鑷畾涔夊嚱鏁�
+ *
+ * @author fanxinfu
+ */
+public class CustomFunction {
+
+    static Function accumulate = new CommonFunction() {
+        @Override
+        public Object call(Object[] arguments, FelContext felContext) {
+            if (arguments == null || arguments.length == 0) {
+                return 0;
+            }
+
+            String indexCode = String.valueOf(arguments[0]);
+            String timeCode = String.valueOf(felContext.get("timeCode"));
+            Date beginTime = TimeManager.getBeginTime(timeCode);
+            Date endTime = TimeManager.getEndTime(timeCode);
+            if (timeCode.startsWith("M") && endTime.after(Instant.now().toDate())) {
+                endTime = Instant.now().toDate();
+            }
+            RealtimeDatabaseService service = ServiceProvicer.getRealtimeDatabaseService();
+            TagValue beginValue = service.retrieve(indexCode, beginTime, timeCode);
+            TagValue endValue = service.retrieve(indexCode, endTime, timeCode);
+            if (beginValue == null || beginValue.getValue() == null) {
+                return 0;
+            }
+            if (endValue == null || endValue.getValue() == null) {
+                return 0;
+            }
+
+            if (beginValue.getValue() > endValue.getValue()) {
+                TagValue maxValue = service
+                        .statistics(indexCode, beginTime, endTime, CollectionModes.Maximum);
+                TagValue minValue = service
+                        .statistics(indexCode, beginTime, endTime, CollectionModes.Minimum);
+                if (maxValue == null || maxValue.getValue() == null) {
+                    return 0;
+                }
+                if (minValue == null || minValue.getValue() == null) {
+                    return 0;
+                }
+
+                BigDecimal value = BigDecimal.valueOf(maxValue.getValue())
+                        .subtract(BigDecimal.valueOf(beginValue.getValue()))
+                        .add(BigDecimal.valueOf(endValue.getValue()))
+                        .subtract(BigDecimal.valueOf(minValue.getValue()));
+                return value.doubleValue();
+            }
+
+            BigDecimal value = BigDecimal.valueOf(endValue.getValue())
+                    .subtract(BigDecimal.valueOf(beginValue.getValue()));
+            return value.doubleValue();
+        }
+
+        @Override
+        public String getName() {
+            return "accumulate";
+        }
+    };
+
+    static Function get = new CommonFunction() {
+        @Override
+        public Object call(Object[] arguments, FelContext felContext) {
+            if (arguments == null || arguments.length == 0) {
+                return 0;
+            }
+
+            String indexCode = String.valueOf(arguments[0]);
+            String timeCode = String.valueOf(felContext.get("timeCode"));
+            PeriodDataService service = ServiceProvicer.getPeriodDataService();
+            DataItem item = service.getDataByIndexCode(indexCode, timeCode);
+            return item == null ? 0 : item.getValue();
+        }
+
+        @Override
+        public String getName() {
+            return "get";
+        }
+    };
+
+    static Function limitRealtimeAlarm = new CommonFunction() {
+        @Override
+        public Object call(Object[] arguments, FelContext felContext) {
+            if (arguments == null || arguments.length == 0) {
+                return 0;
+            }
+
+            String actorId = String.valueOf(arguments[0]);
+            AlarmItem item = ServiceProvicer.getCacheService().getAlarmItem(actorId);
+            if (item == null) {
+                return false;
+            }
+
+            boolean isAlarm = false;
+            TagValue tagValue = ServiceProvicer.getCacheService().getTagValue(item.getIndexCode());
+            if (tagValue == null) {
+                tagValue = ServiceProvicer.getRealtimeDatabaseService().retrieve(item.getIndexCode());
+            }
+
+            if (tagValue == null || tagValue.getValue() == null) {
+                // 鍙栦笉鍒版暟鏃朵繚鎸佷笂娆$姸鎬�
+                AlarmStatus lastStatus = ServiceProvicer.getCacheService()
+                        .getAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType());
+                isAlarm = lastStatus != null && lastStatus.isAlarm();
+            } else {
+                LimitType limitType = ServiceProvicer.getCacheService().getLimitType(item.getLimitType());
+                AlarmJudgeDirection judge = AlarmJudgeDirection.value(limitType.getComparatorOperator());
+                Double limitValue = Double.parseDouble(item.getLimitVal());
+                if (judge == AlarmJudgeDirection.G) {
+                    isAlarm = tagValue.getValue() > limitValue;
+                } else if (judge == AlarmJudgeDirection.GE) {
+                    isAlarm = tagValue.getValue() >= limitValue;
+                } else if (judge == AlarmJudgeDirection.L) {
+                    isAlarm = tagValue.getValue() < limitValue;
+                } else if (judge == AlarmJudgeDirection.LE) {
+                    isAlarm = tagValue.getValue() <= limitValue;
+                } else if (judge == AlarmJudgeDirection.E) {
+                    isAlarm = Math.abs(tagValue.getValue() - limitValue) < 0.000000001;
+                }
+            }
+
+            ServiceProvicer.getCacheService().cacheTagValue(tagValue);
+            return isAlarm;
+        }
+
+        @Override
+        public String getName() {
+            return "limitRealtimeAlarm";
+        }
+    };
+
+    static Function limitPeriodAlarm = new CommonFunction() {
+        @Override
+        public Object call(Object[] arguments, FelContext felContext) {
+            if (arguments == null || arguments.length == 0) {
+                return 0;
+            }
+
+            String actorId = String.valueOf(arguments[0]);
+            AlarmItem item = ServiceProvicer.getCacheService().getAlarmItem(actorId);
+            boolean isAlarm = false;
+            String timeCode = felContext.get("timeCode").toString();
+            DataItem dataItem = ServiceProvicer.getPeriodDataService()
+                    .getDataByIndex(item.getDwid(), timeCode);
+
+            if (dataItem == null || dataItem.getValue() == null) {
+                // 鍙栦笉鍒版暟鏃朵繚鎸佷笂娆$姸鎬�
+                AlarmStatus lastStatus = ServiceProvicer.getCacheService()
+                        .getAlarmStatus(item.getDwid(), item.getTimeSlot(), item.getLimitType());
+                isAlarm = lastStatus != null && lastStatus.isAlarm();
+            } else {
+                LimitType limitType = ServiceProvicer.getCacheService().getLimitType(item.getLimitType());
+                AlarmJudgeDirection judge = AlarmJudgeDirection.value(limitType.getComparatorOperator());
+                Double limitValue = Double.parseDouble(item.getLimitVal());
+                if (judge == AlarmJudgeDirection.G) {
+                    isAlarm = dataItem.getValue() > limitValue;
+                } else if (judge == AlarmJudgeDirection.GE) {
+                    isAlarm = dataItem.getValue() >= limitValue;
+                } else if (judge == AlarmJudgeDirection.L) {
+                    isAlarm = dataItem.getValue() < limitValue;
+                } else if (judge == AlarmJudgeDirection.LE) {
+                    isAlarm = dataItem.getValue() <= limitValue;
+                } else if (judge == AlarmJudgeDirection.E) {
+                    isAlarm = Math.abs(dataItem.getValue() - limitValue) < 0.000000001;
+                }
+            }
+
+            return isAlarm;
+        }
+
+        @Override
+        public String getName() {
+            return "limitPeriodAlarm";
+        }
+    };
+
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/function/FunctionEngine.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/function/FunctionEngine.java
new file mode 100644
index 0000000..dbe5ee2
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/function/FunctionEngine.java
@@ -0,0 +1,27 @@
+package com.dingzhuo.compute.engine.function;
+
+
+import com.greenpineyu.fel.FelEngine;
+import com.greenpineyu.fel.FelEngineImpl;
+
+/**
+ * @author fanxinfu
+ */
+public class FunctionEngine {
+
+  private static ThreadLocal<FunctionEngine> function = ThreadLocal
+      .withInitial(FunctionEngine::new);
+  private FelEngine felEngine;
+
+  private FunctionEngine() {
+    felEngine = new FelEngineImpl();
+    felEngine.addFun(CustomFunction.accumulate);
+    felEngine.addFun(CustomFunction.get);
+    felEngine.addFun(CustomFunction.limitPeriodAlarm);
+    felEngine.addFun(CustomFunction.limitRealtimeAlarm);
+  }
+
+  public static FelEngine getInstance() {
+    return function.get().felEngine;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/BaseActorMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/BaseActorMessage.java
new file mode 100644
index 0000000..3072350
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/BaseActorMessage.java
@@ -0,0 +1,21 @@
+package com.dingzhuo.compute.engine.message;
+
+/**
+ * @author fanxinfu
+ */
+public class BaseActorMessage {
+
+  private String actorId;
+
+  public BaseActorMessage(String actorId) {
+    this.actorId = actorId;
+  }
+
+  public String getActorId() {
+    return actorId;
+  }
+
+  public void setActorId(String actorId) {
+    this.actorId = actorId;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/ExecuteType.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/ExecuteType.java
new file mode 100644
index 0000000..c59e8ce
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/ExecuteType.java
@@ -0,0 +1,12 @@
+package com.dingzhuo.compute.engine.message;
+
+public enum ExecuteType {
+  /**
+   * 鍒扮偣瑙﹀彂
+   */
+  TIMER,
+  /**
+   * 寮哄埗璁$畻
+   */
+  DEMAND
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmJudgeMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmJudgeMessage.java
new file mode 100644
index 0000000..1a743bd
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmJudgeMessage.java
@@ -0,0 +1,10 @@
+package com.dingzhuo.compute.engine.message.alarm;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+
+public class AlarmJudgeMessage extends BaseActorMessage {
+
+  public AlarmJudgeMessage(String actorId) {
+    super(actorId);
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmRegisterMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmRegisterMessage.java
new file mode 100644
index 0000000..22426c4
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmRegisterMessage.java
@@ -0,0 +1,48 @@
+package com.dingzhuo.compute.engine.message.alarm;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.compute.engine.message.timer.RegisterType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+
+/**
+ * @author fanxinfu
+ */
+public class AlarmRegisterMessage extends BaseActorMessage {
+
+  private RegisterType registerType;
+  private AlarmType alarmType;
+  private AlarmItem alarmItem;
+
+  public AlarmRegisterMessage(String actorId, AlarmType alarmType,
+      RegisterType registerType,
+      AlarmItem alarmItem) {
+    super(actorId);
+    this.alarmType = alarmType;
+    this.registerType = registerType;
+    this.alarmItem = alarmItem;
+  }
+
+  public RegisterType getRegisterType() {
+    return registerType;
+  }
+
+  public void setRegisterType(RegisterType registerType) {
+    this.registerType = registerType;
+  }
+
+  public AlarmType getAlarmType() {
+    return alarmType;
+  }
+
+  public void setAlarmType(AlarmType alarmType) {
+    this.alarmType = alarmType;
+  }
+
+  public AlarmItem getAlarmItem() {
+    return alarmItem;
+  }
+
+  public void setAlarmItem(AlarmItem alarmItem) {
+    this.alarmItem = alarmItem;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmSaveMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmSaveMessage.java
new file mode 100644
index 0000000..907846f
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmSaveMessage.java
@@ -0,0 +1,13 @@
+package com.dingzhuo.compute.engine.message.alarm;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+
+/**
+ * @author fanxinfu
+ */
+public class AlarmSaveMessage extends BaseActorMessage {
+
+  public AlarmSaveMessage(String actorId) {
+    super(actorId);
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmStatus.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmStatus.java
new file mode 100644
index 0000000..0104888
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmStatus.java
@@ -0,0 +1,25 @@
+package com.dingzhuo.compute.engine.message.alarm;
+
+import java.util.Date;
+
+public class AlarmStatus {
+
+  private boolean isAlarm;
+  private Date beginTime;
+
+  public boolean isAlarm() {
+    return isAlarm;
+  }
+
+  public void setAlarm(boolean alarm) {
+    isAlarm = alarm;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmType.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmType.java
new file mode 100644
index 0000000..3656a53
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/AlarmType.java
@@ -0,0 +1,12 @@
+package com.dingzhuo.compute.engine.message.alarm;
+
+public enum AlarmType {
+  /**
+   * 瀹炴椂鎶ヨ
+   */
+  LIVE,
+  /**
+   * 闃舵鎶ヨ
+   */
+  PERIOD
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/LoadAlarmMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/LoadAlarmMessage.java
new file mode 100644
index 0000000..7a5d39a
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/LoadAlarmMessage.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.compute.engine.message.alarm;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+
+/**
+ * @author fanxinfu
+ */
+public class LoadAlarmMessage extends BaseActorMessage {
+
+  private AlarmItem alarmItem;
+
+  public LoadAlarmMessage(AlarmItem alarmItem) {
+    super(ActorUtil.buildAlarmActorId(alarmItem));
+    this.alarmItem = alarmItem;
+  }
+
+  public AlarmItem getAlarmItem() {
+    return alarmItem;
+  }
+
+  public void setAlarmItem(AlarmItem alarmItem) {
+    this.alarmItem = alarmItem;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/UnloadAlarmMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/UnloadAlarmMessage.java
new file mode 100644
index 0000000..7d475e1
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/alarm/UnloadAlarmMessage.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.compute.engine.message.alarm;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+
+/**
+ * @author fanxinfu
+ */
+public class UnloadAlarmMessage extends BaseActorMessage {
+
+  private AlarmItem alarmItem;
+
+  public UnloadAlarmMessage(AlarmItem alarmItem) {
+    super(ActorUtil.buildAlarmActorId(alarmItem));
+    this.alarmItem = alarmItem;
+  }
+
+  public AlarmItem getAlarmItem() {
+    return alarmItem;
+  }
+
+  public void setAlarmItem(AlarmItem alarmItem) {
+    this.alarmItem = alarmItem;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/CalculateMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/CalculateMessage.java
new file mode 100644
index 0000000..758b4f1
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/CalculateMessage.java
@@ -0,0 +1,47 @@
+package com.dingzhuo.compute.engine.message.calculation;
+
+import com.dingzhuo.compute.engine.message.ExecuteType;
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+
+/**
+ * @author fanxinfu
+ */
+public class CalculateMessage extends BaseActorMessage {
+
+  private String timeCode;
+  private TimeType timeType;
+  private ExecuteType executeType;
+
+  public CalculateMessage(String actorId, String timeCode, TimeType timeType,
+      ExecuteType executeType) {
+    super(actorId);
+    this.timeCode = timeCode;
+    this.timeType = timeType;
+    this.executeType = executeType;
+  }
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public ExecuteType getExecuteType() {
+    return executeType;
+  }
+
+  public void setExecuteType(ExecuteType executeType) {
+    this.executeType = executeType;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LinkMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LinkMessage.java
new file mode 100644
index 0000000..9eb90ad
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LinkMessage.java
@@ -0,0 +1,21 @@
+package com.dingzhuo.compute.engine.message.calculation;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+
+public class LinkMessage extends BaseActorMessage {
+
+  private String postActorId;
+
+  public LinkMessage(String actorId, String postActorId) {
+    super(actorId);
+    this.postActorId = postActorId;
+  }
+
+  public String getPostActorId() {
+    return postActorId;
+  }
+
+  public void setPostActorId(String postActorId) {
+    this.postActorId = postActorId;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LoadCalcIndexMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LoadCalcIndexMessage.java
new file mode 100644
index 0000000..663237f
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/LoadCalcIndexMessage.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.compute.engine.message.calculation;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+
+/**
+ * @author fanxinfu
+ */
+public class LoadCalcIndexMessage extends BaseActorMessage {
+
+  private IndexStorage indexStorage;
+
+  public LoadCalcIndexMessage(IndexStorage indexStorage) {
+    super(ActorUtil.buildActorId(indexStorage));
+    this.indexStorage = indexStorage;
+  }
+
+  public IndexStorage getIndexStorage() {
+    return indexStorage;
+  }
+
+  public void setIndexStorage(IndexStorage indexStorage) {
+    this.indexStorage = indexStorage;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnlinkMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnlinkMessage.java
new file mode 100644
index 0000000..dcc8e82
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnlinkMessage.java
@@ -0,0 +1,21 @@
+package com.dingzhuo.compute.engine.message.calculation;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+
+public class UnlinkMessage extends BaseActorMessage {
+
+  private String postActorId;
+
+  public UnlinkMessage(String actorId, String postActorId) {
+    super(actorId);
+    this.postActorId = postActorId;
+  }
+
+  public String getPostActorId() {
+    return postActorId;
+  }
+
+  public void setPostActorId(String postActorId) {
+    this.postActorId = postActorId;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnloadCalcIndexMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnloadCalcIndexMessage.java
new file mode 100644
index 0000000..99c368a
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/calculation/UnloadCalcIndexMessage.java
@@ -0,0 +1,10 @@
+package com.dingzhuo.compute.engine.message.calculation;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+
+public class UnloadCalcIndexMessage extends BaseActorMessage {
+
+  public UnloadCalcIndexMessage(String actorId) {
+    super(actorId);
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatus.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatus.java
new file mode 100644
index 0000000..d8c0706
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatus.java
@@ -0,0 +1,25 @@
+package com.dingzhuo.compute.engine.message.device;
+
+import java.util.Date;
+
+public class DeviceStatus {
+
+  private boolean alarm;
+  private Date beginTime;
+
+  public boolean isAlarm() {
+    return alarm;
+  }
+
+  public void setAlarm(boolean alarm) {
+    this.alarm = alarm;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatusJudgeMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatusJudgeMessage.java
new file mode 100644
index 0000000..7afd615
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/DeviceStatusJudgeMessage.java
@@ -0,0 +1,10 @@
+package com.dingzhuo.compute.engine.message.device;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+
+public class DeviceStatusJudgeMessage  extends BaseActorMessage {
+
+  public DeviceStatusJudgeMessage(String actorId) {
+    super(actorId);
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/LoadDeviceStatusMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/LoadDeviceStatusMessage.java
new file mode 100644
index 0000000..8e76dc0
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/LoadDeviceStatusMessage.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.compute.engine.message.device;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+
+public class LoadDeviceStatusMessage extends BaseActorMessage {
+
+  private DeviceFormula deviceFormula;
+
+  public LoadDeviceStatusMessage(DeviceFormula deviceFormula) {
+    super(ActorUtil.buildActorId(deviceFormula));
+  }
+
+  public DeviceFormula getDeviceFormula() {
+    return deviceFormula;
+  }
+
+  public void setDeviceFormula(
+      DeviceFormula deviceFormula) {
+    this.deviceFormula = deviceFormula;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/UnloadDeviceStatusMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/UnloadDeviceStatusMessage.java
new file mode 100644
index 0000000..4c5ba47
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/device/UnloadDeviceStatusMessage.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.compute.engine.message.device;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.compute.engine.utils.ActorUtil;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+
+public class UnloadDeviceStatusMessage extends BaseActorMessage {
+
+  private DeviceFormula deviceFormula;
+
+  public UnloadDeviceStatusMessage(DeviceFormula deviceFormula) {
+    super(ActorUtil.buildActorId(deviceFormula));
+  }
+
+  public DeviceFormula getDeviceFormula() {
+    return deviceFormula;
+  }
+
+  public void setDeviceFormula(
+      DeviceFormula deviceFormula) {
+    this.deviceFormula = deviceFormula;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/save/SaveMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/save/SaveMessage.java
new file mode 100644
index 0000000..8bd463a
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/save/SaveMessage.java
@@ -0,0 +1,53 @@
+package com.dingzhuo.compute.engine.message.save;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author fanxinfu
+ */
+public class SaveMessage {
+
+  private String indexId;
+  private String timeCode;
+  private TimeType timeType;
+  private double value;
+  private List<String> postActorIds = new ArrayList<>();
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+
+  public double getValue() {
+    return value;
+  }
+
+  public void setValue(double value) {
+    this.value = value;
+  }
+
+  public List<String> getPostActorIds() {
+    return postActorIds;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterTimeMessage.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterTimeMessage.java
new file mode 100644
index 0000000..ccbae21
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterTimeMessage.java
@@ -0,0 +1,34 @@
+package com.dingzhuo.compute.engine.message.timer;
+
+import com.dingzhuo.compute.engine.message.BaseActorMessage;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+
+public class RegisterTimeMessage extends BaseActorMessage {
+
+  private TimeType timeType;
+  private RegisterType registerType;
+
+  public RegisterTimeMessage(String actorId,
+      TimeType timeType,
+      RegisterType registerType) {
+    super(actorId);
+    this.timeType = timeType;
+    this.registerType = registerType;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public RegisterType getRegisterType() {
+    return registerType;
+  }
+
+  public void setRegisterType(RegisterType registerType) {
+    this.registerType = registerType;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterType.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterType.java
new file mode 100644
index 0000000..5458468
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/message/timer/RegisterType.java
@@ -0,0 +1,12 @@
+package com.dingzhuo.compute.engine.message.timer;
+
+public enum RegisterType {
+  /**
+   * 娉ㄥ唽
+   */
+  REGISTER,
+  /**
+   * 鍗歌浇
+   */
+  UNREGISTER
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ActorUtil.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ActorUtil.java
new file mode 100644
index 0000000..adc10d3
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ActorUtil.java
@@ -0,0 +1,64 @@
+package com.dingzhuo.compute.engine.utils;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author fanxinfu
+ */
+public class ActorUtil {
+
+  public static String ACTOR_SYSTEM = "CsieComputeEngine";
+
+  public static String buildActorId(IndexStorage indexStorage) {
+    return String
+        .format("Index:%s:%s", indexStorage.getTimeType().name(), indexStorage.getIndexId());
+  }
+
+  public static String buildAlarmActorId(AlarmItem alarmItem) {
+    return String.format("Alarm:%s:%s:%s", alarmItem.getDwid(), alarmItem.getTimeSlot(),
+        alarmItem.getLimitType());
+  }
+
+  public static String buildActorId(String indexId, TimeType timeType) {
+    return String.format("Index:%s:%s", timeType, indexId);
+  }
+
+  public static String buildAlarmStatusId(String indexId, String timeType, String limitType) {
+    return String.format("Status:%s:%s:%s", indexId, timeType, limitType);
+  }
+
+  public static String getActorAddress(String actorName) {
+    return String.format("akka://%s/user/%s", ACTOR_SYSTEM, actorName);
+  }
+
+  public static <E> List<List<E>> splitList(List<E> targetList, Integer splitSize) {
+    if (targetList == null) {
+      return new ArrayList<>();
+    }
+
+    int size = targetList.size();
+    List<List<E>> resultList = new ArrayList<>();
+    if (size <= splitSize) {
+      resultList.add(targetList);
+    } else {
+      for (int i = 0; i < size; i += splitSize) {
+        //鐢ㄤ簬闄愬埗鏈�鍚庝竴閮ㄥ垎size灏忎簬splitSize鐨刲ist
+        int limit = i + splitSize;
+        if (limit > size) {
+          limit = size;
+        }
+        resultList.add(targetList.subList(i, limit));
+      }
+    }
+    return resultList;
+  }
+
+  public static String buildActorId(DeviceFormula deviceFormula) {
+    return String.format("Device:%s", deviceFormula.getId());
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/CacheService.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/CacheService.java
new file mode 100644
index 0000000..95974d1
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/CacheService.java
@@ -0,0 +1,182 @@
+package com.dingzhuo.compute.engine.utils;
+
+import com.dingzhuo.compute.engine.message.alarm.AlarmStatus;
+import com.dingzhuo.compute.engine.message.device.DeviceStatus;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.dingzhuo.energy.data.model.domain.LimitType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+@Component
+@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
+public class CacheService {
+
+  private final Logger logger = LoggerFactory.getLogger(this.getClass());
+  private ConcurrentHashMap<String, IndexStorage> indexStorageCache = new ConcurrentHashMap<>();
+  private ConcurrentHashMap<String, List<String>> postIndexIdsCache = new ConcurrentHashMap<>();
+  private ConcurrentHashMap<String, AlarmItem> alarmItemCache = new ConcurrentHashMap<>();
+  private ConcurrentHashMap<String, AlarmStatus> alarmCache = new ConcurrentHashMap<>();
+  private ConcurrentHashMap<String, LimitType> limitTypeCache = new ConcurrentHashMap<>();
+  private ConcurrentHashMap<String, TagValue> tagValueCache = new ConcurrentHashMap<>();
+  private ConcurrentHashMap<String, DeviceFormula> deviceFormulaCache = new ConcurrentHashMap<>();
+  private ConcurrentHashMap<String, DeviceStatus> deviceStatusCache = new ConcurrentHashMap<>();
+
+  private ConcurrentHashMap<TimeType, Set<String>> registers = new ConcurrentHashMap<>();
+
+  /**
+   * 缂撳瓨鎸囨爣瀛樺偍淇℃伅.
+   *
+   * @param indexStorage 鎸囨爣瀛樺偍
+   */
+  public void cacheIndexStorage(IndexStorage indexStorage) {
+    String actorId = ActorUtil.buildActorId(indexStorage);
+    indexStorageCache.put(actorId, indexStorage);
+  }
+
+  /**
+   * 鏍规嵁 actorId 鑾峰彇鎸囨爣瀛樺偍.
+   *
+   * @param actorId
+   * @return
+   */
+  public IndexStorage getIndexStorageCache(String actorId) {
+    return indexStorageCache.getOrDefault(actorId, null);
+  }
+
+  /**
+   * 缂撳瓨璁$畻鎸囨爣鐨勫悗缃寚鏍�.
+   *
+   * @param actorId
+   * @param postId
+   */
+  public void cachePostIndex(String actorId, String postId) {
+    if (!postIndexIdsCache.containsKey(actorId)) {
+      postIndexIdsCache.put(actorId, new ArrayList<>());
+    }
+
+    postIndexIdsCache.get(actorId).add(postId);
+  }
+
+  /**
+   * 绉婚櫎鍚庣疆鎸囨爣.
+   *
+   * @param actorId
+   * @param postActorId
+   */
+  public void removePostIndexCache(String actorId, String postActorId) {
+    if (!postIndexIdsCache.containsKey(actorId)) {
+      postIndexIdsCache.put(actorId, new ArrayList<>());
+    }
+
+    postIndexIdsCache.get(actorId).remove(postActorId);
+  }
+
+  /**
+   * 鑾峰彇鍚庣疆鎸囨爣actorId.
+   *
+   * @param actorId
+   * @return
+   */
+  public List<String> getPostActorIds(String actorId) {
+    return postIndexIdsCache.getOrDefault(actorId, new ArrayList<>());
+  }
+
+  public void cacheAlarmItem(AlarmItem alarmItem) {
+    String actorId = ActorUtil.buildAlarmActorId(alarmItem);
+    alarmItemCache.put(actorId, alarmItem);
+  }
+
+  public void removeAlarmCache(String actorId) {
+    alarmItemCache.remove(actorId);
+  }
+
+  public void removeIndexCache(String actorId) {
+    indexStorageCache.remove(actorId);
+  }
+
+  public AlarmItem getAlarmItem(String actorId) {
+    return alarmItemCache.getOrDefault(actorId, null);
+  }
+
+  public void cacheAlarmStatus(String indexId, String timeType, String limitType,
+      AlarmStatus status) {
+    String statusId = ActorUtil.buildAlarmStatusId(indexId, timeType, limitType);
+    alarmCache.put(statusId, status);
+  }
+
+  public void cacheAlarmStatus(String statusId, AlarmStatus status) {
+    alarmCache.put(statusId, status);
+  }
+
+  public AlarmStatus getAlarmStatus(String indexId, String timeType, String limitType) {
+    String statusId = ActorUtil.buildAlarmStatusId(indexId, timeType, limitType);
+    return alarmCache.getOrDefault(statusId, null);
+  }
+
+  public void cacheTagValues(List<TagValue> tagValues) {
+    tagValues.forEach(tagValue -> tagValueCache.put(tagValue.getTagCode(), tagValue));
+  }
+
+  public void cacheLimitType(String limitCode, LimitType type) {
+    limitTypeCache.put(limitCode, type);
+  }
+
+  public LimitType getLimitType(String limitType) {
+    return limitTypeCache.getOrDefault(limitType, null);
+  }
+
+  public void cacheTagValue(TagValue tagValue) {
+    if (tagValue == null) {
+      return;
+    }
+
+    tagValueCache.put(tagValue.getTagCode(), tagValue);
+  }
+
+  public TagValue getTagValue(String indexCode) {
+    if (StringUtils.isBlank(indexCode)) {
+      return null;
+    }
+
+    return tagValueCache.getOrDefault(indexCode, null);
+  }
+
+  public void cacheDeviceStatusSetting(DeviceFormula deviceFormula) {
+    if (deviceFormula != null) {
+      String actorId = ActorUtil.buildActorId(deviceFormula);
+      deviceFormulaCache.put(actorId, deviceFormula);
+    }
+  }
+
+  public void removeDeviceStatusSetting(String actorId) {
+    deviceFormulaCache.remove(actorId);
+  }
+
+  public DeviceFormula getDeviceFormula(String actorId) {
+    return deviceFormulaCache.getOrDefault(actorId, null);
+  }
+
+  public DeviceStatus getDeviceStatus(String actorId) {
+    return deviceStatusCache.getOrDefault(actorId, null);
+  }
+
+  public void cacheDeviceStatus(String actorId, DeviceStatus lastStatus) {
+    deviceStatusCache.put(actorId, lastStatus);
+  }
+
+  public ConcurrentHashMap<TimeType, Set<String>> getRegisters() {
+    return registers;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ServiceProvicer.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ServiceProvicer.java
new file mode 100644
index 0000000..5395472
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/ServiceProvicer.java
@@ -0,0 +1,55 @@
+package com.dingzhuo.compute.engine.utils;
+
+import com.dingzhuo.compute.engine.config.CalculationConfig;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ServiceProvicer {
+
+  private static RealtimeDatabaseService realtimeDatabaseService;
+  private static PeriodDataService periodDataService;
+  private static CacheService cacheService;
+  private static CalculationConfig calculationConfig;
+
+  public static RealtimeDatabaseService getRealtimeDatabaseService() {
+    return realtimeDatabaseService;
+  }
+
+  public static PeriodDataService getPeriodDataService() {
+    return periodDataService;
+  }
+
+  public static CacheService getCacheService() {
+    return cacheService;
+  }
+
+  public static CalculationConfig getCalculationConfig() {
+    return calculationConfig;
+  }
+
+  @Autowired
+  public void setCalculationConfig(
+      CalculationConfig calculationConfig) {
+    ServiceProvicer.calculationConfig = calculationConfig;
+  }
+
+  @Autowired
+  public void setCacheService(CacheService cacheService) {
+    ServiceProvicer.cacheService = cacheService;
+  }
+
+  @Autowired
+  public void setPeriodDataService(
+      PeriodDataService periodDataService) {
+    ServiceProvicer.periodDataService = periodDataService;
+  }
+
+  @Autowired
+  public void setRealtimeDatabaseService(
+      RealtimeDatabaseService realtimeDatabaseService) {
+    ServiceProvicer.realtimeDatabaseService = realtimeDatabaseService;
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringActorProducer.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringActorProducer.java
new file mode 100644
index 0000000..aa930c9
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringActorProducer.java
@@ -0,0 +1,29 @@
+package com.dingzhuo.compute.engine.utils;
+
+import akka.actor.Actor;
+import akka.actor.IndirectActorProducer;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * @author fanxinfu
+ */
+public class SpringActorProducer implements IndirectActorProducer {
+
+  final private ApplicationContext applicationContext;
+  final private String actorBeanName;
+
+  public SpringActorProducer(ApplicationContext applicationContext, String actorBeanName) {
+    this.applicationContext = applicationContext;
+    this.actorBeanName = actorBeanName;
+  }
+
+  @Override
+  public Actor produce() {
+    return (Actor) applicationContext.getBean(actorBeanName);
+  }
+
+  @Override
+  public Class<? extends Actor> actorClass() {
+    return (Class<? extends Actor>) applicationContext.getType(actorBeanName);
+  }
+}
diff --git a/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringAkkaExtension.java b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringAkkaExtension.java
new file mode 100644
index 0000000..56b5db2
--- /dev/null
+++ b/compute-engine/src/main/java/com/dingzhuo/compute/engine/utils/SpringAkkaExtension.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.compute.engine.utils;
+
+import akka.actor.Extension;
+import akka.actor.Props;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author fanxinfu
+ */
+@Component
+public class SpringAkkaExtension implements Extension {
+
+  private ApplicationContext applicationContext;
+
+  public void initialize(ApplicationContext applicationContext) {
+    this.applicationContext = applicationContext;
+  }
+
+  public Props props(String actorBeanName) {
+    return Props.create(SpringActorProducer.class, applicationContext, actorBeanName);
+  }
+}
diff --git a/compute-engine/src/main/resources/akka.conf b/compute-engine/src/main/resources/akka.conf
new file mode 100644
index 0000000..b7d499b
--- /dev/null
+++ b/compute-engine/src/main/resources/akka.conf
@@ -0,0 +1,37 @@
+akka {
+  loglevel = "WARNING"
+  stdout-loglevel = "WARNING"
+
+  actor {
+    provider = "cluster"
+  }
+  remote.artery {
+    canonical {
+      hostname = "127.0.0.1"
+      port = 1026
+    }
+  }
+
+  cluster {
+    seed-nodes = ["akka://CsieComputeEngine@127.0.0.1:1026"]
+  }
+}
+
+computeDispatcher {
+  type = Dispatcher
+  executor = "thread-pool-executor"
+  thread-pool-executor {
+    # 绾跨▼缁存寔鏃堕棿
+    keep-alive-time = 4000s
+    # 鎬荤嚎绋嬫渶灏忔暟閲�
+    core-pool-size-min = 8
+    # 鎬荤嚎绋嬫渶澶ф暟閲�
+    core-pool-size-max = 24
+    # 姣忎釜CPU鏍镐腑鏈�澶х殑绾跨▼鏁伴噺
+    core-pool-size-factor = 3.0
+  }
+  # 鍚炲悙閲弤
+  throughput = 100
+  # 娑堟伅浼樺厛绾у畾涔�
+  mailbox-type = "com.xinhai.compute.ExecutePrioMailBox"
+}
\ No newline at end of file
diff --git a/compute-engine/src/main/resources/application-prod.yml b/compute-engine/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..e072e99
--- /dev/null
+++ b/compute-engine/src/main/resources/application-prod.yml
@@ -0,0 +1,18 @@
+# 鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    url: jdbc:postgresql://localhost:5432/energy_dongli
+    username: 
+    password: 
+  redis:
+    host: l
+    port: 6379
+server:
+  port: 8081
+
+rtdb:
+  host: localhost
+  port: 8086
+
+calc:
+  interval: 120
diff --git a/compute-engine/src/main/resources/application.yml b/compute-engine/src/main/resources/application.yml
new file mode 100644
index 0000000..0c2f89b
--- /dev/null
+++ b/compute-engine/src/main/resources/application.yml
@@ -0,0 +1,182 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: RuoYi
+  # 鐗堟湰
+  version: 2.0.0
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2019
+  # 瀹炰緥婕旂ず寮�鍏�
+  demoEnabled: true
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: D:/ruoyi/uploadPath
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: true
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: 8080
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  undertow:
+    # 璁剧疆IO绾跨▼鏁�, 瀹冧富瑕佹墽琛岄潪闃诲鐨勪换鍔�,瀹冧滑浼氳礋璐e涓繛鎺�, 榛樿璁剧疆姣忎釜CPU鏍稿績涓�涓嚎绋�
+    io-threads: 4
+    # 闃诲浠诲姟绾跨▼姹�, 褰撴墽琛岀被浼約ervlet璇锋眰闃诲IO鎿嶄綔, undertow浼氫粠杩欎釜绾跨▼姹犱腑鍙栧緱绾跨▼
+    # 瀹冪殑鍊艰缃彇鍐充簬绯荤粺绾跨▼鎵ц浠诲姟鐨勯樆濉炵郴鏁帮紝榛樿鍊兼槸IO绾跨▼鏁�*8
+    worker-threads: 32
+    # 浠ヤ笅鐨勯厤缃細褰卞搷buffer,杩欎簺buffer浼氱敤浜庢湇鍔″櫒杩炴帴鐨処O鎿嶄綔,鏈夌偣绫讳技netty鐨勬睜鍖栧唴瀛樼鐞�
+    # 姣忓潡buffer鐨勭┖闂村ぇ灏�,瓒婂皬鐨勭┖闂磋鍒╃敤瓒婂厖鍒嗭紝涓嶈璁剧疆澶ぇ锛屼互鍏嶅奖鍝嶅叾浠栧簲鐢紝鍚堥�傚嵆鍙�
+    buffer-size: 1024
+    # 鏄惁鍒嗛厤鐨勭洿鎺ュ唴瀛�(NIO鐩存帴鍒嗛厤鐨勫爢澶栧唴瀛�)
+    direct-buffers: true
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.ruoyi: debug
+    org.springframework: info
+
+# Spring閰嶇疆
+spring:
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: org.postgresql.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: ${spring.datasource.url}
+        username: ${spring.datasource.username}
+        password: ${spring.datasource.password}
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username:
+        login-password:
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 70000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  profiles:
+    active: prod
+  # 鏂囦欢涓婁紶
+  servlet:
+     multipart:
+       # 鍗曚釜鏂囦欢澶у皬
+       max-file-size:  10MB
+       # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+       max-request-size:  20MB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: true
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+    host: ${spring.redis.host}
+    # 绔彛锛岄粯璁や负6379
+    port: ${spring.redis.port}
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+    # 浠ょ墝鑷畾涔夋爣璇�
+    header: Authorization
+    # 浠ょ墝绉橀挜
+    secret: abcdefghijklmnopqrstuvwxyz
+    # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+    expireTime: 525600
+
+# MyBatis閰嶇疆
+mybatis:
+    # 鎼滅储鎸囧畾鍖呭埆鍚�
+    typeAliasesPackage: com.dingzhuo.energy.**.domain
+    # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+    mapperLocations: classpath*:mybatis/**/*Mapper.xml
+    # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+    configLocation: classpath:mybatis/mybatis-config.xml
+
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: PostgreSQL
+  reasonable: true
+  supportMethodsArguments: true
+  params: count=countSql
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice/*
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*,/meter/*,/facility/*
+
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: sys
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.dingzhuo.energy.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+
+rtdb:
+  host: ${rtdb.host}
+  port: ${rtdb.port}
diff --git a/compute-engine/src/main/resources/logback.xml b/compute-engine/src/main/resources/logback.xml
new file mode 100644
index 0000000..661e2ec
--- /dev/null
+++ b/compute-engine/src/main/resources/logback.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+  <!-- 鏃ュ織瀛樻斁璺緞 -->
+  <property name="log.path" value="logs" />
+  <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+  <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+  <!-- 鎺у埗鍙拌緭鍑� -->
+  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>${log.pattern}</pattern>
+    </encoder>
+  </appender>
+
+  <!-- 绯荤粺鏃ュ織杈撳嚭 -->
+  <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${log.path}/sys-info.log</file>
+    <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+      <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+      <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${log.pattern}</pattern>
+    </encoder>
+    <filter class="ch.qos.logback.classic.filter.LevelFilter">
+      <!-- 杩囨护鐨勭骇鍒� -->
+      <level>ERROR</level>
+      <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+      <onMatch>ACCEPT</onMatch>
+      <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+      <onMismatch>DENY</onMismatch>
+    </filter>
+  </appender>
+
+  <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    <file>${log.path}/sys-error.log</file>
+    <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+      <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+      <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+      <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+      <maxHistory>60</maxHistory>
+    </rollingPolicy>
+    <encoder>
+      <pattern>${log.pattern}</pattern>
+    </encoder>
+    <filter class="ch.qos.logback.classic.filter.LevelFilter">
+      <!-- 杩囨护鐨勭骇鍒� -->
+      <level>ERROR</level>
+      <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+      <onMatch>ACCEPT</onMatch>
+      <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+      <onMismatch>DENY</onMismatch>
+    </filter>
+  </appender>
+
+  <!-- 绯荤粺妯″潡鏃ュ織绾у埆鎺у埗  -->
+  <logger name="com.dingzhuo" level="error" />
+  <!-- Spring鏃ュ織绾у埆鎺у埗  -->
+  <logger name="org.springframework" level="error" />
+
+  <root level="error">
+    <appender-ref ref="console" />
+  </root>
+
+  <!--绯荤粺鎿嶄綔鏃ュ織-->
+  <root level="error">
+    <appender-ref ref="file_error" />
+  </root>
+</configuration>
diff --git a/data-model/pom.xml b/data-model/pom.xml
new file mode 100644
index 0000000..453c39f
--- /dev/null
+++ b/data-model/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>data-model</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>basic</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>basic-data</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+
+</project>
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/CalcFunctionController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/CalcFunctionController.java
new file mode 100644
index 0000000..c0942e9
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/CalcFunctionController.java
@@ -0,0 +1,115 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.data.model.domain.CalcFunction;
+import com.dingzhuo.energy.data.model.service.ICalcFunctionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 璁$畻鍑芥暟Controller
+ *
+ * @author fanxinfu
+ * @date 2020-03-10
+ */
+@RestController
+@RequestMapping("/basicsetting/function")
+@Api(value = "璁$畻鍏紡绠$悊",tags = {"璁$畻鍏紡绠$悊"})
+public class CalcFunctionController extends BaseController
+{
+    @Autowired
+    private ICalcFunctionService calcFunctionService;
+
+    /**
+     * 鏌ヨ璁$畻鍑芥暟鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:function:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "璁$畻鍑芥暟鍒楄〃")
+    public TableDataInfo list(CalcFunction calcFunction)
+    {
+        startPage();
+        List<CalcFunction> list = calcFunctionService.selectCalcFunctionList(calcFunction);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁$畻鍑芥暟鍒楄〃
+     */
+    @ApiOperation(value = "璁$畻鍑芥暟鍒楄〃瀵煎嚭")
+    @PreAuthorize("@ss.hasPermi('basicsetting:function:export')")
+    @Log(title = "璁$畻鍑芥暟", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(CalcFunction calcFunction)
+    {
+        List<CalcFunction> list = calcFunctionService.selectCalcFunctionList(calcFunction);
+        ExcelUtil<CalcFunction> util = new ExcelUtil<CalcFunction>(CalcFunction.class);
+        return util.exportExcel(list, "function");
+    }
+
+    /**
+     * 鑾峰彇璁$畻鍑芥暟璇︾粏淇℃伅
+     */
+    @ApiOperation(value = "鑾峰彇璁$畻鍑芥暟璇︾粏淇℃伅")
+    @PreAuthorize("@ss.hasPermi('basicsetting:function:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(calcFunctionService.selectCalcFunctionById(id));
+    }
+
+    /**
+     * 鏂板璁$畻鍑芥暟
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:function:add')")
+    @Log(title = "璁$畻鍑芥暟", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "鏂板璁$畻鍑芥暟")
+    public AjaxResult add(@RequestBody CalcFunction calcFunction)
+    {
+        calcFunction.setId(UUID.fastUUID().toString());
+        return toAjax(calcFunctionService.insertCalcFunction(calcFunction));
+    }
+
+    /**
+     * 淇敼璁$畻鍑芥暟
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:function:edit')")
+    @Log(title = "璁$畻鍑芥暟", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "缂栬緫璁$畻鍑芥暟")
+    public AjaxResult edit(@RequestBody CalcFunction calcFunction)
+    {
+        return toAjax(calcFunctionService.updateCalcFunction(calcFunction));
+    }
+
+    /**
+     * 鍒犻櫎璁$畻鍑芥暟
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:function:remove')")
+    @Log(title = "璁$畻鍑芥暟", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    @ApiOperation(value = "鍒犻櫎璁$畻鍑芥暟")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(calcFunctionService.deleteCalcFunctionByIds(ids));
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DaqTemplateController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DaqTemplateController.java
new file mode 100644
index 0000000..f08f1b2
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DaqTemplateController.java
@@ -0,0 +1,109 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.data.model.domain.DaqTemplate;
+import com.dingzhuo.energy.data.model.service.IDaqTemplateService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 閲囬泦鍙傛暟妯℃澘Controller
+ *
+ * @author ruoyi
+ * @date 2020-02-08
+ */
+@RestController
+@RequestMapping("/system/template")
+public class DaqTemplateController extends BaseController {
+  @Autowired
+  private IDaqTemplateService daqTemplateService;
+
+  /**
+   * 鏌ヨ閲囬泦鍙傛暟妯℃澘鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:template:query')")
+  @GetMapping("/list")
+  public TableDataInfo list(DaqTemplate daqTemplate) {
+    startPage();
+    List<DaqTemplate> list = daqTemplateService.selectDaqTemplateList(daqTemplate);
+    return getDataTable(list);
+  }
+
+  /**
+   * 瀵煎嚭閲囬泦鍙傛暟妯℃澘鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:template:query')")
+  @Log(title = "閲囬泦鍙傛暟妯℃澘" , businessType = BusinessType.EXPORT)
+  @GetMapping("/export")
+  public AjaxResult export(DaqTemplate daqTemplate) {
+    List<DaqTemplate> list = daqTemplateService.selectDaqTemplateList(daqTemplate);
+    ExcelUtil<DaqTemplate> util = new ExcelUtil<DaqTemplate>(DaqTemplate.class);
+    return util.exportExcel(list, "template");
+  }
+
+  /**
+   * 鑾峰彇閲囬泦鍙傛暟妯℃澘璇︾粏淇℃伅
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:template:query')")
+  @GetMapping(value = "/{id}")
+  public AjaxResult getInfo(@PathVariable("id") String id) {
+    return AjaxResult.success(daqTemplateService.selectDaqTemplateById(id));
+  }
+
+  /**
+   * 鏂板閲囬泦鍙傛暟妯℃澘
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:template:add')")
+  @Log(title = "閲囬泦鍙傛暟妯℃澘" , businessType = BusinessType.INSERT)
+  @PostMapping
+  public AjaxResult add(@RequestBody DaqTemplate daqTemplate) {
+    daqTemplate.setId(UUID.randomUUID().toString());
+    boolean isExist = daqTemplateService.dapHasExist(daqTemplate.getCode(), daqTemplate.getDeviceType());
+    if (isExist) {
+      return AjaxResult.error("鐩稿悓璁惧绫诲瀷涓嬬殑鍙傛暟缂栫爜涓嶈兘閲嶅锛�");
+    } else {
+      return toAjax(daqTemplateService.insertDaqTemplate(daqTemplate));
+    }
+  }
+
+  /**
+   * 淇敼閲囬泦鍙傛暟妯℃澘
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:template:edit')")
+  @Log(title = "閲囬泦鍙傛暟妯℃澘" , businessType = BusinessType.UPDATE)
+  @PutMapping
+  public AjaxResult edit(@RequestBody DaqTemplate daqTemplate) {
+    boolean isExist = daqTemplateService.dapHasExist(daqTemplate);
+    if (isExist) {
+      return AjaxResult.error("鐩稿悓璁惧绫诲瀷涓嬬殑鍙傛暟缂栫爜涓嶈兘閲嶅锛�");
+    } else {
+      return toAjax(daqTemplateService.updateDaqTemplate(daqTemplate));
+    }
+  }
+
+  /**
+   * 鍒犻櫎閲囬泦鍙傛暟妯℃澘
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:template:remove')")
+  @Log(title = "閲囬泦鍙傛暟妯℃澘" , businessType = BusinessType.DELETE)
+  @DeleteMapping("/{ids}")
+  public AjaxResult remove(@PathVariable String[] ids) {
+    return toAjax(daqTemplateService.deleteDaqTemplateByIds(ids));
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DataAuthController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DataAuthController.java
new file mode 100644
index 0000000..e3d498a
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/DataAuthController.java
@@ -0,0 +1,52 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import com.dingzhuo.energy.data.model.domain.AuthType;
+import com.dingzhuo.energy.data.model.service.DataAuthService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/data/auth")
+public class DataAuthController extends BaseController {
+
+  @Autowired
+  private DataAuthService dataAuthService;
+
+  @GetMapping("/{authType}/{modelCode}/{userOrRoleId}")
+  public AjaxResult selectDataAuth(
+      @PathVariable("authType") String authType,
+      @PathVariable("modelCode") String modelCode,
+      @PathVariable("userOrRoleId") String userOrRoleId) {
+    List<String> authIds;
+    if (AuthType.valueOf(authType.toUpperCase()) == AuthType.USER) {
+      authIds = dataAuthService.getUserDataAuth(modelCode, userOrRoleId);
+    } else {
+      authIds = dataAuthService.getRoleDataAuth(modelCode, userOrRoleId);
+    }
+
+    return AjaxResult.success(authIds);
+  }
+
+  @PostMapping("/{authType}/{modelCode}/{userOrRoleId}")
+  public AjaxResult setDataAuth(
+      @PathVariable("authType") String authType,
+      @PathVariable("modelCode") String modelCode,
+      @PathVariable("userOrRoleId") String userOrRoleId,
+      @RequestBody List<String> ids) {
+    if (AuthType.valueOf(authType.toUpperCase()) == AuthType.USER) {
+      dataAuthService.setUserDataAuth(userOrRoleId, modelCode, ids);
+    } else {
+      dataAuthService.setRoleDataAuth(userOrRoleId, modelCode, ids);
+    }
+
+    return AjaxResult.success();
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/EnergyIndexController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/EnergyIndexController.java
new file mode 100644
index 0000000..013cc7e
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/EnergyIndexController.java
@@ -0,0 +1,203 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.IndexType;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.domain.EnergyIndexQuery;
+import com.dingzhuo.energy.project.system.domain.SysUser;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.UUID;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 鎸囨爣淇℃伅Controller
+ *
+ * @author fanxinfu
+ * @date 2020-02-14
+ */
+@RestController
+@RequestMapping("/basicsetting/energyindex")
+public class EnergyIndexController extends BaseController {
+
+  @Autowired
+  private IEnergyIndexService energyIndexService;
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('energyindex:energyindex:query')")
+  @GetMapping("/list")
+  public TableDataInfo list(EnergyIndex energyIndex) {
+    startPage();
+    EnergyIndexQuery query = new EnergyIndexQuery(energyIndex.getNodeId(), energyIndex.getName(),
+        energyIndex.getIndexCategory(), energyIndex.getIndexType());
+    List<EnergyIndex> list = energyIndexService.selectEnergyIndexList(query);
+    return getDataTable(list);
+  }
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+   */
+  @GetMapping("/filter")
+  public AjaxResult filter(EnergyIndexQuery query) {
+    List<EnergyIndex> list = energyIndexService.selectEnergyIndexList(query);
+    return AjaxResult.success(list);
+  }
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('energyindex:energyindex:query')")
+  @GetMapping("/collectIndex")
+  public TableDataInfo listCollectIndex(String deviceId) {
+    startPage();
+    List<EnergyIndex> list = energyIndexService.selectCollectIndex(deviceId);
+    return getDataTable(list);
+  }
+
+  /**
+   * 瀵煎嚭鎸囨爣淇℃伅鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('energyindex:energyindex:export')")
+  @Log(title = "鎸囨爣淇℃伅", businessType = BusinessType.EXPORT)
+  @GetMapping("/export")
+  public AjaxResult export(EnergyIndex energyIndex) {
+    List<EnergyIndex> list = energyIndexService.selectEnergyIndexList(energyIndex);
+    ExcelUtil<EnergyIndex> util = new ExcelUtil<>(EnergyIndex.class);
+    return util.exportExcel(list, "energyindex");
+  }
+
+  /**
+   * 鑾峰彇鎸囨爣淇℃伅璇︾粏淇℃伅
+   */
+  @PreAuthorize("@ss.hasPermi('energyindex:energyindex:query')")
+  @GetMapping(value = "/{indexId}")
+  public AjaxResult getInfo(@PathVariable("indexId") String indexId) {
+    return AjaxResult.success(energyIndexService.selectEnergyIndexById(indexId));
+  }
+
+  /**
+   * 鏂板鎸囨爣淇℃伅
+   */
+  @PreAuthorize("@ss.hasPermi('energyindex:energyindex:add')")
+  @Log(title = "鎸囨爣淇℃伅", businessType = BusinessType.INSERT)
+  @PostMapping(value = "/{nodeId}")
+  public AjaxResult add(@PathVariable("nodeId") String nodeId,
+      @RequestBody EnergyIndex energyIndex) {
+    boolean isExist = energyIndexService.energyIndexHasExist(energyIndex.getCode());
+    if (isExist) {
+      return AjaxResult.error("鎸囨爣缂栫爜涓嶈兘閲嶅锛�");
+    } else {
+      energyIndex.setIndexId(UUID.randomUUID().toString());
+      return toAjax(energyIndexService.insertEnergyIndex(nodeId, energyIndex));
+    }
+  }
+
+  /**
+   * 淇敼鎸囨爣淇℃伅
+   */
+  @PreAuthorize("@ss.hasPermi('energyindex:energyindex:edit')")
+  @Log(title = "鎸囨爣淇℃伅", businessType = BusinessType.UPDATE)
+  @PutMapping
+  public AjaxResult edit(@RequestBody EnergyIndex energyIndex) {
+    boolean isExist = energyIndexService
+        .energyIndexHasExist(energyIndex.getIndexId(), energyIndex.getCode());
+    if (isExist) {
+      return AjaxResult.error("鎸囨爣缂栫爜涓嶈兘閲嶅锛�");
+    } else {
+      return toAjax(energyIndexService.updateEnergyIndex(energyIndex));
+    }
+  }
+
+  /**
+   * 鍒犻櫎鎸囨爣淇℃伅
+   */
+  @PreAuthorize("@ss.hasPermi('energyindex:energyindex:remove')")
+  @Log(title = "鎸囨爣淇℃伅", businessType = BusinessType.DELETE)
+  @DeleteMapping("/{nodeId}/{indexIds}")
+  public AjaxResult remove(@PathVariable String nodeId, @PathVariable String[] indexIds) {
+    List<EnergyIndex> energyIndexList = energyIndexService.getEnergyIndexByIds(
+        Arrays.asList(indexIds));
+    List<String> deleteIds = energyIndexList.stream()
+        .filter(f -> StringUtils.isBlank(f.getMeterId()))
+        .map(EnergyIndex::getIndexId)
+        .collect(Collectors.toList());
+    List<String> removeLink = energyIndexList.stream()
+        .filter(f -> StringUtils.isNotBlank(f.getMeterId()))
+        .map(EnergyIndex::getIndexId)
+        .collect(Collectors.toList());
+    if (!removeLink.isEmpty()) {
+      energyIndexService.removeNodeIndex(nodeId, removeLink);
+    }
+
+    if (!deleteIds.isEmpty()) {
+      energyIndexService.deleteEnergyIndexByIds(nodeId, deleteIds.toArray(new String[0]));
+    }
+    return AjaxResult.success();
+  }
+
+  @Log(title = "澧炲姞璁¢噺鍣ㄥ叿閲囬泦鐐�", businessType = BusinessType.INSERT)
+  @PostMapping("/meterIndex/{meterId}")
+  public AjaxResult addCollectIndex(@PathVariable("meterId") String meterId) {
+    try {
+      return energyIndexService.addMeterIndex(meterId);
+    } catch (Exception ex) {
+      logger.error("鍒涘缓璁¢噺鍣ㄥ叿閲囬泦鐐瑰け璐ワ紒", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @GetMapping("/meterIndex/{meterId}")
+  public AjaxResult getDeviceCollectIndex(@PathVariable("meterId") String meterId) {
+    return AjaxResult.success(energyIndexService.getMeterIndex(meterId));
+  }
+
+  @GetMapping("/includeChildrenNode/{nodeId}")
+  public AjaxResult getIndexByNodeAndChildrenNode(@PathVariable("nodeId") String nodeId) {
+    try {
+      return AjaxResult.success(energyIndexService.getIndexByNodeAndChildrenNode(nodeId));
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+    }
+  }
+
+  @GetMapping("/includeChildrenNode/search")
+  public AjaxResult searchIndexByNodeAndChildrenNode(String nodeId, String filter) {
+    try {
+      return AjaxResult
+          .success(energyIndexService.searchIndexByNodeAndChildrenNode(nodeId, filter));
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+    }
+  }
+
+  @GetMapping("/importTemplate")
+  public AjaxResult importTemplate() {
+    ExcelUtil<EnergyIndex> util = new ExcelUtil<>(EnergyIndex.class);
+    return util.importTemplateExcel("鎸囨爣鏁版嵁");
+  }
+
+  @PostMapping("/importData")
+  public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception {
+    ExcelUtil<EnergyIndex> util = new ExcelUtil<>(EnergyIndex.class);
+    List<EnergyIndex> energyIndexList = util.importExcel(file.getInputStream());
+    return energyIndexService.importEnergyIndex(energyIndexList, updateSupport);
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/IndexStorageController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/IndexStorageController.java
new file mode 100644
index 0000000..bfd5473
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/IndexStorageController.java
@@ -0,0 +1,156 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.data.model.domain.CalcType;
+import com.dingzhuo.energy.data.model.domain.IndexFormula;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.dingzhuo.energy.data.model.service.IIndexStorageService;
+import com.dingzhuo.energy.data.model.service.IndexFormulaService;
+import com.greenpineyu.fel.FelEngine;
+import com.greenpineyu.fel.FelEngineImpl;
+import com.greenpineyu.fel.parser.FelNode;
+import com.greenpineyu.fel.parser.VarAstNode;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+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.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author fanxinfu
+ */
+@RestController
+@RequestMapping("/basicsetting/indexStorage")
+public class IndexStorageController extends BaseController {
+
+  private final IIndexStorageService indexStorageService;
+
+  private final IndexFormulaService indexFormulaService;
+
+  @Autowired
+  public IndexStorageController(
+      IIndexStorageService indexStorageService, IndexFormulaService indexFormulaService) {
+    this.indexStorageService = indexStorageService;
+    this.indexFormulaService = indexFormulaService;
+  }
+
+  @GetMapping("/{indexId}")
+  public AjaxResult getIndexStorage(@PathVariable String indexId) {
+    JSONObject result = new JSONObject();
+    IndexFormula indexFormula = indexFormulaService.getIndexFormula(indexId);
+    List<IndexStorage> indexStorageList = indexStorageService.getIndexStorage(indexId);
+    List<IndexStorage> defaultStorageList = getDefaultIndexStorage();
+    Map<TimeType, IndexStorage> map = indexStorageList.stream()
+        .collect(Collectors.toMap(IndexStorage::getTimeType, storage -> storage));
+    List<IndexStorage> storageList;
+    if (!indexStorageList.isEmpty()) {
+      storageList = new ArrayList<>();
+      defaultStorageList.forEach(storage -> {
+        storageList.add(map.get(storage.getTimeType()));
+      });
+    } else {
+      storageList = defaultStorageList;
+    }
+
+    result.put("indexFormula", indexFormula);
+    result.put("indexStorage", storageList);
+    return AjaxResult.success(result);
+  }
+
+  @PostMapping("/{indexId}")
+  public AjaxResult saveIndexStorage(@RequestBody JSONObject param, @PathVariable String indexId) {
+    try {
+      IndexFormula indexFormula = param.getObject("indexFormula", IndexFormula.class);
+      List<IndexStorage> indexStorage =
+          param.getJSONArray("indexStorage").toJavaList(IndexStorage.class);
+      indexFormula.setIndexId(indexId);
+      indexStorageService.saveFormulaAndStorage(indexFormula, indexStorage, indexId);
+    } catch (Exception ex) {
+      logger.error("", ex);
+      return AjaxResult.error();
+    }
+
+    return AjaxResult.success();
+  }
+
+
+  @PostMapping("/parseFormula")
+  public AjaxResult parseFormula(@RequestBody JSONObject formulaText) {
+    String calcText = formulaText.getString("calcText");
+    FelEngine e = new FelEngineImpl();
+    Set<String> params = new HashSet<>();
+    try {
+      FelNode felNode = e.parse(calcText);
+      buildParam(felNode, params);
+    } catch (Exception ex) {
+      logger.error("鍏紡瑙f瀽鍑洪敊锛�");
+    }
+    return AjaxResult.success(params);
+  }
+
+  @GetMapping("/calcPeriod")
+  public AjaxResult getIndexStorage() {
+    List<IndexStorage> calcPeriods = getDefaultIndexStorage();
+    return AjaxResult.success(calcPeriods);
+  }
+
+  @NotNull
+  private List<IndexStorage> getDefaultIndexStorage() {
+    List<IndexStorage> calcPeriods = new ArrayList<>();
+    getPeriod(calcPeriods, TimeType.HOUR);
+    getPeriod(calcPeriods, TimeType.SCHEDULING);
+    getPeriod(calcPeriods, TimeType.DAY);
+    getPeriod(calcPeriods, TimeType.MONTH);
+    getPeriod(calcPeriods, TimeType.YEAR);
+    return calcPeriods;
+  }
+
+  private void getPeriod(List<IndexStorage> calcPeriods, TimeType timeType) {
+    IndexStorage hour = new IndexStorage();
+    hour.setTimeType(timeType);
+    hour.setCalcType(CalcType.CALC);
+    calcPeriods.add(hour);
+  }
+
+  private void buildParam(FelNode felNode, Set<String> params) {
+    if (felNode.getChildren() == null) {
+      if (isConfigParam(felNode.getText())) {
+        params.add(felNode.getText());
+      }
+    } else {
+      for (FelNode node : felNode.getChildren()) {
+        if (node.getChildren() == null) {
+          if (node instanceof VarAstNode && isConfigParam(node.getText())) {
+            params.add(node.getText());
+          }
+        } else {
+          buildParam(node, params);
+        }
+      }
+    }
+  }
+
+  private boolean isConfigParam(String param) {
+    if (param.startsWith("'") && param.endsWith("'")) {
+      return false;
+    }
+
+    if (param.startsWith("$")) {
+      return true;
+    }
+
+    return true;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/LimitTypeController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/LimitTypeController.java
new file mode 100644
index 0000000..48496eb
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/LimitTypeController.java
@@ -0,0 +1,126 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.data.model.domain.LimitType;
+import com.dingzhuo.energy.data.model.service.ILimitTypeService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 鎶ヨ闄愬�肩被鍨嬬淮鎶ontroller
+ *
+ * @author zw
+ * @date 2020-03-07
+ */
+@RestController
+@RequestMapping("/basicsetting/limitType")
+@Api(value = "棰勬姤璀︾鐞�",tags = {"棰勬姤璀︾鐞�"})
+public class LimitTypeController extends BaseController
+{
+    @Autowired
+    private ILimitTypeService limitTypeService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛�
+     */
+    //@PreAuthorize("@ss.hasPermi('basicsetting:limitType:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "鎶ヨ闄愬�煎垪琛�")
+    public TableDataInfo list(LimitType limitType)
+    {
+        startPage();
+        List<LimitType> list = limitTypeService.selectLimitTypeList(limitType);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:limitType:export')")
+    @Log(title = "鎶ヨ闄愬�肩被鍨嬬淮鎶�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation(value = "鎶ヨ闄愬�煎垪琛ㄥ鍑�")
+    public AjaxResult export(LimitType limitType)
+    {
+        List<LimitType> list = limitTypeService.selectLimitTypeList(limitType);
+        ExcelUtil<LimitType> util = new ExcelUtil<LimitType>(LimitType.class);
+        return util.exportExcel(list, "limitType");
+    }
+
+    /**
+     * 鑾峰彇鎶ヨ闄愬�肩被鍨嬬淮鎶よ缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:limitType:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation(value = "鑾峰彇鎶ヨ闄愬�肩被鍨嬬淮鎶よ缁嗕俊鎭�")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(limitTypeService.selectLimitTypeById(id));
+    }
+
+    /**
+     * 鏂板鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:limitType:add')")
+    @Log(title = "鎶ヨ闄愬�肩被鍨嬬淮鎶�", businessType = BusinessType.INSERT)
+    @PostMapping
+    @ApiOperation(value = "鏂板鎶ヨ闄愬��")
+    public AjaxResult add(@RequestBody LimitType limitType)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        limitType.setId(IdUtils.fastUUID());
+        limitType.setCreateBy(loginUser.getUsername());
+        return toAjax(limitTypeService.insertLimitType(limitType));
+    }
+
+    /**
+     * 淇敼鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:limitType:edit')")
+    @Log(title = "鎶ヨ闄愬�肩被鍨嬬淮鎶�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    @ApiOperation(value = "淇敼鎶ヨ闄愬��")
+    public AjaxResult edit(@RequestBody LimitType limitType)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        limitType.setUpdateBy(loginUser.getUsername());
+        return toAjax(limitTypeService.updateLimitType(limitType));
+    }
+
+    /**
+     * 鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:limitType:remove')")
+    @Log(title = "鎶ヨ闄愬�肩被鍨嬬淮鎶�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    @ApiOperation(value = "鍒犻櫎鎶ヨ闄愬��")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(limitTypeService.deleteLimitTypeByIds(ids));
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelInfoController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelInfoController.java
new file mode 100644
index 0000000..a37c7b2
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelInfoController.java
@@ -0,0 +1,116 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.ModelInfo;
+import com.dingzhuo.energy.data.model.domain.vo.PointDataVO;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelInfoService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 妯″瀷Controller
+ *
+ * @author fanxinfu
+ * @date 2020-02-17
+ */
+@RestController
+@RequestMapping("/basicsetting/model")
+public class ModelInfoController extends BaseController {
+  @Autowired
+  private IModelInfoService modelInfoService;
+
+  @Autowired
+  private IEnergyIndexService energyIndexService;
+
+  /**
+   * 鏌ヨ妯″瀷鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:model:list')")
+  @GetMapping("/list")
+  public AjaxResult list(ModelInfo modelInfo) {
+    List<ModelInfo> list = modelInfoService.selectModelInfoList(modelInfo);
+    return AjaxResult.success(list);
+  }
+
+  /**
+   * 瀵煎嚭妯″瀷鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:model:export')")
+  @Log(title = "妯″瀷", businessType = BusinessType.EXPORT)
+  @GetMapping("/export")
+  public AjaxResult export(ModelInfo modelInfo) {
+    List<ModelInfo> list = modelInfoService.selectModelInfoList(modelInfo);
+    ExcelUtil<ModelInfo> util = new ExcelUtil<ModelInfo>(ModelInfo.class);
+    return util.exportExcel(list, "model");
+  }
+
+  /**
+   * 鑾峰彇妯″瀷璇︾粏淇℃伅
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:model:query')")
+  @GetMapping(value = "/{modelCode}")
+  public AjaxResult getInfo(@PathVariable("modelCode") String modelCode) {
+    return AjaxResult.success(modelInfoService.selectModelInfoById(modelCode));
+  }
+
+  /**
+   * 鏂板妯″瀷
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:model:add')")
+  @Log(title = "妯″瀷", businessType = BusinessType.INSERT)
+  @PostMapping
+  public AjaxResult add(@RequestBody ModelInfo modelInfo) {
+    return toAjax(modelInfoService.insertModelInfo(modelInfo));
+  }
+
+  /**
+   * 淇敼妯″瀷
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:model:edit')")
+  @Log(title = "妯″瀷", businessType = BusinessType.UPDATE)
+  @PutMapping
+  public AjaxResult edit(@RequestBody ModelInfo modelInfo) {
+    return toAjax(modelInfoService.updateModelInfo(modelInfo));
+  }
+
+  /**
+   * 鍒犻櫎妯″瀷
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:model:remove')")
+  @Log(title = "妯″瀷", businessType = BusinessType.DELETE)
+  @DeleteMapping("/{modelCode}")
+  public AjaxResult remove(@PathVariable String modelCode) {
+    boolean hasConfig = energyIndexService.modelHasConfig(modelCode);
+    if (hasConfig) {
+      return AjaxResult.error("璇ユā鍨嬪凡缁忛厤缃妭鐐规垨鎸囨爣锛屼笉鑳藉垹闄わ紒");
+    }
+
+    return toAjax(modelInfoService.deleteModelInfoByCode(modelCode));
+  }
+
+  /**
+   * 鏍规嵁妯″瀷id鏌ヨ瀵瑰簲鐐逛綅淇℃伅
+   *
+   * @param modelId 鏌ヨ妯″瀷id
+   * @return
+   */
+  @ApiOperation("鏍规嵁妯″瀷id鏌ヨ瀵瑰簲鐐逛綅淇℃伅")
+  @GetMapping("/getEnergyIndexByModelId")
+  public AjaxResult listEnergyIndexByModelId(String modelId) {
+    if (StringUtils.isEmpty(modelId)) {
+      return AjaxResult.error("鏈壘鍒版煡璇㈡ā鍨嬩俊鎭�");
+    }
+    List<PointDataVO> voList = modelInfoService.listEnergyIndexByModelId(modelId);
+    return AjaxResult.success(voList);
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelNodeController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelNodeController.java
new file mode 100644
index 0000000..773eba9
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/ModelNodeController.java
@@ -0,0 +1,370 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.system.service.ISysRoleService;
+import com.dingzhuo.energy.project.system.service.ISysUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 妯″瀷鑺傜偣Controller
+ *
+ * @author fanxinfu
+ * @date 2020-02-10
+ */
+@RestController
+@RequestMapping("/basicsetting/modelnode")
+@Api(value = "妯″瀷鑺傜偣",tags = {"妯″瀷鑺傜偣"})
+public class ModelNodeController extends BaseController {
+
+  private final IModelNodeService modelNodeService;
+
+
+  @Autowired
+  public ModelNodeController(
+      IModelNodeService modelNodeService, IEnergyIndexService energyIndexService,
+      ISysUserService sysUserService,
+      ISysRoleService roleService) {
+    this.modelNodeService = modelNodeService;
+  }
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+   */
+  @ApiOperation(value = "鏌ヨ妯″瀷鑺傜偣鍒楄〃")
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:query')")
+  @GetMapping("/list")
+  public TableDataInfo list(ModelNode modelNode) {
+    startPage();
+    List<ModelNode> list = modelNodeService.selectModelNodeList(modelNode);
+    return getDataTable(list);
+  }
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:list')")
+  @GetMapping("/treelist")
+  @ApiOperation(value = "鏌ヨ妯″瀷鑺傜偣鏍戠姸鍒楄〃")
+  public AjaxResult treeList(String modelCode) {
+    List<ModelNode> list = modelNodeService.getModelNodeByModelCode(modelCode);
+    return AjaxResult.success(modelNodeService.buildModelNodeTree(list));
+  }
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+   */
+  @GetMapping("/treelist/withAuth")
+  @ApiOperation(value = "鏌ヨ妯″瀷鑺傜偣鍒楄〃")
+  public AjaxResult treeListWithAuth(String modelCode) {
+    Long userId = SecurityUtils.getUserId();
+    List<ModelNode> list = modelNodeService.getModelNodeByModelCodeWithAuth(modelCode, userId);
+    return AjaxResult.success(modelNodeService.buildModelNodeTree(list));
+  }
+
+  /**
+   * 瀵煎嚭妯″瀷鑺傜偣鍒楄〃
+   */
+  @ApiOperation(value = "瀵煎嚭妯″瀷鑺傜偣鍒楄〃")
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:export')")
+  @Log(title = "妯″瀷鑺傜偣", businessType = BusinessType.EXPORT)
+  @GetMapping("/export")
+  public AjaxResult export(ModelNode modelNode) {
+    List<ModelNode> list = modelNodeService.selectModelNodeList(modelNode);
+    ExcelUtil<ModelNode> util = new ExcelUtil<ModelNode>(ModelNode.class);
+    return util.exportExcel(list, "modelNode");
+  }
+
+  /**
+   * 鑾峰彇妯″瀷鑺傜偣璇︾粏淇℃伅
+   */
+  @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣璇︾粏淇℃伅")
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:query')")
+  @GetMapping(value = "/{nodeId}")
+  public AjaxResult getInfo(@PathVariable("nodeId") String nodeId) {
+    return AjaxResult.success(modelNodeService.selectModelNodeById(nodeId));
+  }
+
+  @GetMapping(value = "/hasEnergyIndex")
+  @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣璇︾粏淇℃伅")
+  public AjaxResult hasEnergyIndex(String nodeId) {
+    return AjaxResult.success(modelNodeService.hasEnergyIndex(nodeId));
+  }
+
+  /**
+   * 鏂板妯″瀷鑺傜偣
+   */
+  @ApiOperation(value = "鏂板妯″瀷鑺傜偣")
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:add')")
+  @Log(title = "妯″瀷鑺傜偣", businessType = BusinessType.INSERT)
+  @PostMapping
+  public AjaxResult add(@RequestBody ModelNode modelNode) {
+    boolean isExist = modelNodeService
+        .modelNodeHasExist(modelNode.getCode(), modelNode.getModelCode());
+    if (isExist) {
+      return AjaxResult.error("妯″瀷鑺傜偣缂栫爜涓嶈兘閲嶅锛�");
+    } else {
+      modelNode.setNodeId(UUID.randomUUID().toString());
+      modelNodeService.insertModelNode(modelNode);
+      return AjaxResult.success(modelNode);
+    }
+  }
+
+  /**
+   * 淇敼妯″瀷鑺傜偣
+   */
+  @ApiOperation(value = "淇敼妯″瀷鑺傜偣")
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "妯″瀷鑺傜偣", businessType = BusinessType.UPDATE)
+  @PutMapping
+  public AjaxResult edit(@RequestBody ModelNode modelNode) {
+    boolean isExist = modelNodeService.modelNodeHasExist(modelNode);
+    if (isExist) {
+      return AjaxResult.error("妯″瀷鑺傜偣缂栫爜涓嶈兘閲嶅锛�");
+    } else {
+      return toAjax(modelNodeService.updateModelNode(modelNode));
+    }
+  }
+
+  /**
+   * 淇敼妯″瀷鑺傜偣
+   */
+  @ApiOperation(value = "妯″瀷鑺傜偣鎺掑簭")
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "妯″瀷鑺傜偣", businessType = BusinessType.UPDATE)
+  @PutMapping("/order")
+  public AjaxResult order(@RequestBody JSONObject param) {
+    String nodeId = param.getString("nodeId");
+    String parentId = param.getString("parentId");
+    String[] children = param.getJSONArray("children").toArray(new String[0]);
+    modelNodeService.updateOrder(nodeId, parentId, children);
+    return AjaxResult.success();
+  }
+
+  /**
+   * 鍒犻櫎妯″瀷鑺傜偣
+   */
+  @ApiOperation(value = "鍒犻櫎妯″瀷鑺傜偣")
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:remove')")
+  @Log(title = "妯″瀷鑺傜偣", businessType = BusinessType.DELETE)
+  @DeleteMapping("/{nodeIds}")
+  public AjaxResult remove(@PathVariable String[] nodeIds) {
+    return toAjax(modelNodeService.deleteModelNodeByIds(nodeIds));
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈璁惧", businessType = BusinessType.UPDATE)
+  @GetMapping("/device/{nodeId}")
+  @ApiOperation(value = "璁剧疆妯″瀷鑺傜偣鍏宠仈璁惧")
+  public AjaxResult getSettingDevice(@PathVariable("nodeId") String nodeId) {
+    try {
+      return AjaxResult.success(modelNodeService.getSettingDevice(nodeId));
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍏宠仈璁惧鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍏宠仈璁惧鍑洪敊!");
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈璁惧", businessType = BusinessType.UPDATE)
+  @PostMapping("/device/{nodeId}")
+  @ApiOperation(value = "璁剧疆妯″瀷鑺傜偣鍏宠仈璁惧")
+  public AjaxResult setDevice(@PathVariable("nodeId") String nodeId,
+      @RequestBody String[] deviceIds) {
+    try {
+      modelNodeService.setDevice(nodeId, deviceIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("璁剧疆鍏宠仈璁惧鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈璁惧", businessType = BusinessType.UPDATE)
+  @DeleteMapping("/device/{nodeId}")
+  @ApiOperation(value = "鍒犻櫎妯″瀷鑺傜偣鍏宠仈璁惧")
+  public AjaxResult delDevice(@PathVariable("nodeId") String nodeId,
+      @RequestBody String[] deviceIds) {
+    try {
+      modelNodeService.delDevice(nodeId, deviceIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("鍒犻櫎鍏宠仈璁惧鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈鑳芥簮", businessType = BusinessType.UPDATE)
+  @GetMapping("/energy/{nodeId}")
+  @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣鍏宠仈鑳芥簮")
+  public AjaxResult getSettingEnergy(@PathVariable("nodeId") String nodeId) {
+    try {
+      return AjaxResult.success(modelNodeService.getSettingEnergy(nodeId));
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍏宠仈鑳芥簮鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍏宠仈鑳芥簮鍑洪敊!");
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈鑳芥簮", businessType = BusinessType.UPDATE)
+  @PostMapping("/energy/{nodeId}")
+  @ApiOperation(value = "璁剧疆妯″瀷鑺傜偣鍏宠仈鑳芥簮")
+  public AjaxResult setEnergy(@PathVariable("nodeId") String nodeId,
+      @RequestBody Integer[] energyIds) {
+    try {
+      modelNodeService.setEnergy(nodeId, energyIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("璁剧疆鍏宠仈鑳芥簮鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈鑳芥簮", businessType = BusinessType.UPDATE)
+  @DeleteMapping("/energy/{nodeId}")
+  @ApiOperation(value = "鍒犻櫎妯″瀷鑺傜偣鍏宠仈鑳芥簮")
+  public AjaxResult delEnergy(@PathVariable("nodeId") String nodeId,
+      @RequestBody Integer[] energyIds) {
+    try {
+      modelNodeService.delEnergy(nodeId, energyIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("鍒犻櫎鍏宠仈鑳芥簮鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈浜у搧", businessType = BusinessType.UPDATE)
+  @GetMapping("/product/{nodeId}")
+  @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣鍏宠仈浜у搧")
+  public AjaxResult getSettingProduct(@PathVariable("nodeId") String nodeId) {
+    try {
+      return AjaxResult.success(modelNodeService.getSettingProduct(nodeId));
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍏宠仈浜у搧鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍏宠仈浜у搧鍑洪敊!");
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈浜у搧", businessType = BusinessType.UPDATE)
+  @PostMapping("/product/{nodeId}")
+  @ApiOperation(value = "璁剧疆妯″瀷鑺傜偣鍏宠仈浜у搧")
+  public AjaxResult setProduct(@PathVariable("nodeId") String nodeId,
+      @RequestBody Integer[] productIds) {
+    try {
+      modelNodeService.setProduct(nodeId, productIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("璁剧疆鍏宠仈浜у搧鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈浜у搧", businessType = BusinessType.UPDATE)
+  @DeleteMapping("/product/{nodeId}")
+  @ApiOperation(value = "鍒犻櫎妯″瀷鑺傜偣鍏宠仈浜у搧")
+  public AjaxResult delProduct(@PathVariable("nodeId") String nodeId,
+      @RequestBody Integer[] productIds) {
+    try {
+      modelNodeService.delProduct(nodeId, productIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("鍒犻櫎鍏宠仈浜у搧鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @GetMapping("/energyIndex/{nodeId}")
+  @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣鍏宠仈鎸囨爣")
+  public AjaxResult getSettingIndex(@PathVariable("nodeId") String nodeId) {
+    try {
+      return AjaxResult.success(modelNodeService.getSettingIndex(nodeId));
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+    }
+  }
+
+  @GetMapping("/energyIndex/{indexType}/{nodeId}")
+  @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣鍏宠仈鎸囨爣")
+  public AjaxResult getSettingIndex(@PathVariable("indexType") String indexType,
+      @PathVariable("nodeId") String nodeId) {
+    try {
+      return AjaxResult.success(modelNodeService.getSettingIndex(indexType, nodeId));
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "璁剧疆妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣", businessType = BusinessType.UPDATE)
+  @PostMapping("/energyIndex/{nodeId}/{indexType}")
+  @ApiOperation(value = "璁剧疆妯″瀷鑺傜偣鍏宠仈鎸囨爣")
+  public AjaxResult setSettingIndex(@PathVariable("nodeId") String nodeId,
+      @PathVariable("indexType") String indexType,
+      @RequestBody String[] indexIds) {
+    try {
+      modelNodeService.setIndex(nodeId, indexType, indexIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("璁剧疆鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @PreAuthorize("@ss.hasPermi('basicsetting:modelNode:edit')")
+  @Log(title = "鍒犻櫎妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣", businessType = BusinessType.UPDATE)
+  @DeleteMapping("/energyIndex/{nodeId}")
+  @ApiOperation(value = "鍒犻櫎妯″瀷鑺傜偣鍏宠仈鎸囨爣")
+  public AjaxResult delSettingIndex(@PathVariable("nodeId") String nodeId,
+                                    @RequestBody String[] indexIds) {
+    try {
+      modelNodeService.delIndex(nodeId, indexIds);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("鍒犻櫎鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+  @Log(title = "鏍规嵁nodeId鏌ヨ鐐逛綅淇℃伅", businessType = BusinessType.UPDATE)
+  @GetMapping("/getIndexInforByNodeId")
+  @ApiOperation(value = "鏍规嵁nodeId鏌ヨ鐐逛綅淇℃伅")
+  public AjaxResult getIndexInforByNodeId(String nodeId) {
+    try {
+      List<EnergyIndex> settingIndex = modelNodeService.getSettingIndex(nodeId);
+
+
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      logger.error("鍒犻櫎鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+      return AjaxResult.error();
+    }
+  }
+
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/StateTypeController.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/StateTypeController.java
new file mode 100644
index 0000000..31f3fa1
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/controller/StateTypeController.java
@@ -0,0 +1,106 @@
+package com.dingzhuo.energy.data.model.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.data.model.domain.StateType;
+import com.dingzhuo.energy.data.model.service.IStateTypeService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 绯荤粺鐘舵�佺淮鎶ontroller
+ * 
+ * @author sys
+ * @date 2020-03-18
+ */
+@RestController
+@RequestMapping("/basicsetting/statetype")
+public class StateTypeController extends BaseController
+{
+    @Autowired
+    private IStateTypeService stateTypeService;
+
+    /**
+     * 鏌ヨ绯荤粺鐘舵�佺淮鎶ゅ垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:statetype:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(StateType stateType)
+    {
+        startPage();
+        List<StateType> list = stateTypeService.selectStateTypeList(stateType);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭绯荤粺鐘舵�佺淮鎶ゅ垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:statetype:export')")
+    @Log(title = "绯荤粺鐘舵�佺淮鎶�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(StateType stateType)
+    {
+        List<StateType> list = stateTypeService.selectStateTypeList(stateType);
+        ExcelUtil<StateType> util = new ExcelUtil<StateType>(StateType.class);
+        return util.exportExcel(list, "statetype");
+    }
+
+    /**
+     * 鑾峰彇绯荤粺鐘舵�佺淮鎶よ缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:statetype:query')")
+    @GetMapping(value = "/{stateId}")
+    public AjaxResult getInfo(@PathVariable("stateId") String stateId)
+    {
+        return AjaxResult.success(stateTypeService.selectStateTypeById(stateId));
+    }
+
+    /**
+     * 鏂板绯荤粺鐘舵�佺淮鎶�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:statetype:add')")
+    @Log(title = "绯荤粺鐘舵�佺淮鎶�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody StateType stateType)
+    {
+        stateType.setStateId(IdUtils.fastUUID());
+        return toAjax(stateTypeService.insertStateType(stateType));
+    }
+
+    /**
+     * 淇敼绯荤粺鐘舵�佺淮鎶�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:statetype:edit')")
+    @Log(title = "绯荤粺鐘舵�佺淮鎶�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody StateType stateType)
+    {
+        return toAjax(stateTypeService.updateStateType(stateType));
+    }
+
+    /**
+     * 鍒犻櫎绯荤粺鐘舵�佺淮鎶�
+     */
+    @PreAuthorize("@ss.hasPermi('basicsetting:statetype:remove')")
+    @Log(title = "绯荤粺鐘舵�佺淮鎶�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{stateIds}")
+    public AjaxResult remove(@PathVariable String[] stateIds)
+    {
+        return toAjax(stateTypeService.deleteStateTypeByIds(stateIds));
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/AuthType.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/AuthType.java
new file mode 100644
index 0000000..cc785cd
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/AuthType.java
@@ -0,0 +1,6 @@
+package com.dingzhuo.energy.data.model.domain;
+
+public enum AuthType {
+  USER,
+  ROLE
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcFunction.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcFunction.java
new file mode 100644
index 0000000..ec15050
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcFunction.java
@@ -0,0 +1,87 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.xmlbeans.impl.common.ValidatorListener;
+
+/**
+ * 璁$畻鍑芥暟瀵硅薄 calc_function
+ *
+ * @author fanxinfu
+ * @date 2020-03-10
+ */
+@ApiModel(value = "璁$畻鍑芥暟")
+public class CalcFunction extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    @ApiModelProperty(value = "涓婚敭")
+    private String id;
+
+    /** 鍑芥暟鍚� */
+    @Excel(name = "鍑芥暟鍚�")
+    @ApiModelProperty(value = "鍑芥暟鍚�")
+    private String funcName;
+
+    /** 鍑芥暟鏂囨湰 */
+    @Excel(name = "鍑芥暟鏂囨湰")
+    @ApiModelProperty(value = "鍑芥暟鏂囨湰")
+    private String funcText;
+
+    /** 浠嬬粛 */
+    @Excel(name = "浠嬬粛")
+    @ApiModelProperty(value = "浠嬬粛")
+    private String info;
+
+    public void setInfo(String info)
+    {
+        this.info = info;
+    }
+
+    public String getInfo()
+    {
+        return info;
+    }
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setFuncName(String funcName)
+    {
+        this.funcName = funcName;
+    }
+
+    public String getFuncName()
+    {
+        return funcName;
+    }
+    public void setFuncText(String funcText)
+    {
+        this.funcText = funcText;
+    }
+
+    public String getFuncText()
+    {
+        return funcText;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("info", getInfo())
+            .append("id", getId())
+            .append("funcName", getFuncName())
+            .append("funcText", getFuncText())
+            .toString();
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcPeriod.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcPeriod.java
new file mode 100644
index 0000000..411e986
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcPeriod.java
@@ -0,0 +1,34 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+
+public class CalcPeriod {
+
+  private String name;
+  private TimeType timeType;
+  private CalcType calcType;
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public CalcType getCalcType() {
+    return calcType;
+  }
+
+  public void setCalcType(CalcType calcType) {
+    this.calcType = calcType;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcType.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcType.java
new file mode 100644
index 0000000..6cd6cb3
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/CalcType.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.energy.data.model.domain;
+
+public enum CalcType {
+  /**
+   * 涓嶈绠�
+   */
+  NONE,
+  /**
+   * 鑷姩璁$畻
+   */
+  CALC,
+  /**
+   * 鎵嬪伐褰曞叆
+   */
+  INPUT
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/DaqTemplate.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/DaqTemplate.java
new file mode 100644
index 0000000..da35b84
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/DaqTemplate.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 閲囬泦鍙傛暟妯℃澘瀵硅薄 daq_template
+ *
+ * @author ruoyi
+ * @date 2020-02-08
+ */
+public class DaqTemplate extends BaseEntity {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 涓婚敭
+   */
+  private String id;
+
+  /**
+   * 鍙傛暟缂栫爜
+   */
+  @Excel(name = "鍙傛暟缂栫爜")
+  private String code;
+
+  /**
+   * 鍙傛暟鍚嶇О
+   */
+  @Excel(name = "鍙傛暟鍚嶇О")
+  private String name;
+
+  /**
+   * 鍙傛暟鎵�灞炵被鍨�
+   */
+  @Excel(name = "鍙傛暟鎵�灞炵被鍨�")
+  private String deviceType;
+
+  @Excel(name = "鍗曚綅")
+  private String unit;
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getId() {
+    return id;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setDeviceType(String deviceType) {
+    this.deviceType = deviceType;
+  }
+
+  public String getDeviceType() {
+    return deviceType;
+  }
+
+  @Override
+  public String toString() {
+    return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+        .append("id", getId())
+        .append("code", getCode())
+        .append("name", getName())
+        .append("deviceType", getDeviceType())
+        .append("unit", getUnit())
+        .toString();
+  }
+
+  public String getUnit() {
+    return unit;
+  }
+
+  public void setUnit(String unit) {
+    this.unit = unit;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndex.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndex.java
new file mode 100644
index 0000000..3e33c94
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndex.java
@@ -0,0 +1,213 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.data.annotation.Transient;
+
+
+/**
+ * 鎸囨爣淇℃伅瀵硅薄 energy_index
+ *
+ * @author fanxinfu
+ * @date 2020-02-14
+ */
+@ApiModel(value = "鎸囨爣淇℃伅")
+public class EnergyIndex extends BaseEntity {
+
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 涓婚敭
+   */
+  @ApiModelProperty(value = "涓婚敭")
+  private String indexId;
+
+  /**
+   * 鎸囨爣鍚嶇О
+   */
+  @ApiModelProperty(value = "鎸囨爣鍚嶇О")
+  @Excel(name = "鎸囨爣鍚嶇О", prompt = "蹇呭~")
+  private String name;
+
+  /**
+   * 鎸囨爣缂栫爜
+   */
+  @ApiModelProperty(value = "鎸囨爣缂栫爜")
+  @Excel(name = "鎸囨爣缂栫爜", prompt = "蹇呭~")
+  private String code;
+
+  /**
+   * 绯荤粺鎸囨爣绫诲瀷
+   */
+  @ApiModelProperty(value = "绯荤粺鎸囨爣绫诲瀷")
+  private IndexType indexType;
+
+  @Excel(name = "鎸囨爣绫诲瀷", combo = "COLLECT,STATISTIC")
+  @ApiModelProperty(value = "")
+  private String indexTypeCode;
+
+  /**
+   * 鎸囨爣鍒嗙被
+   */
+  @Excel(name = "鎸囨爣鍒嗙被")
+  @ApiModelProperty(value = "鎸囨爣鍒嗙被")
+  private String indexCategory;
+
+  /**
+   * 鍗曚綅涓婚敭
+   */
+  @Excel(name = "鍗曚綅涓婚敭")
+  @ApiModelProperty(value = "鍗曚綅涓婚敭")
+  private String unitId;
+
+  @Excel(name = "鎵�灞炶妭鐐�", prompt = "蹇呭~")
+  @ApiModelProperty(value = "鎵�灞炶妭鐐�")
+  private String nodeId;
+
+  @ApiModelProperty(value = "琛ㄨid")
+  private String meterId;
+  @ApiModelProperty(value = "椤哄簭鍙�")
+  @Excel(name = "椤哄簭鍙�")
+  private int orderNum;
+
+  @ApiModelProperty(value = "")
+  private String equipment;
+  @ApiModelProperty(value = "id")
+  private String energyId;
+
+  @Transient
+  private  String meterName;
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setIndexType(IndexType indexType) {
+    this.indexType = indexType;
+    if (StringUtils.isBlank(this.indexTypeCode)) {
+      this.indexTypeCode = indexType.name();
+    }
+  }
+
+  public IndexType getIndexType() {
+    if (indexType == null && StringUtils.isNotBlank(this.indexTypeCode)) {
+      return IndexType.valueOf(indexTypeCode);
+    }
+
+    return indexType;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  @Override
+  public String toString() {
+    return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+        .append("indexId", getIndexId())
+        .append("name", getName())
+        .append("code", getCode())
+        .append("indexType", getIndexType())
+        .append("remark", getRemark())
+        .append("unitId", getUnitId())
+        .toString();
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+  public String getMeterId() {
+    return meterId;
+  }
+
+  public void setMeterId(String meterId) {
+    this.meterId = meterId;
+  }
+
+  public String getIndexCategory() {
+    return indexCategory;
+  }
+
+  public void setIndexCategory(String indexCategory) {
+    this.indexCategory = indexCategory;
+  }
+
+  public String getIndexTypeCode() {
+    if (StringUtils.isBlank(indexTypeCode) && this.indexType != null) {
+      return this.indexType.name();
+    }
+    return indexTypeCode;
+  }
+
+  public void setIndexTypeCode(String indexTypeCode) {
+    this.indexTypeCode = indexTypeCode;
+    if (this.indexType == null) {
+      this.indexType = IndexType.valueOf(indexTypeCode);
+    }
+  }
+
+  public int getOrderNum() {
+    return orderNum;
+  }
+
+  public void setOrderNum(int orderNum) {
+    this.orderNum = orderNum;
+  }
+
+  public String getEquipment() {
+    return equipment;
+  }
+
+  public void setEquipment(String equipment) {
+    this.equipment = equipment;
+  }
+
+  public String getEnergyId() {
+    return energyId;
+  }
+
+  public void setEnergyId(String energyId) {
+    this.energyId = energyId;
+  }
+
+  public String getMeterName() {
+    return meterName;
+  }
+
+  public void setMeterName(String meterName) {
+    this.meterName = meterName;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndexQuery.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndexQuery.java
new file mode 100644
index 0000000..f9f7fe4
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/EnergyIndexQuery.java
@@ -0,0 +1,52 @@
+package com.dingzhuo.energy.data.model.domain;
+
+public class EnergyIndexQuery {
+
+  private String nodeId;
+  private String codeOrName;
+  private String indexCategory;
+  private IndexType indexType;
+
+  public EnergyIndexQuery() {
+  }
+
+  public EnergyIndexQuery(String nodeId, String codeOrName, String indexCategory,
+      IndexType energyType) {
+    this.nodeId = nodeId;
+    this.codeOrName = codeOrName;
+    this.indexCategory = indexCategory;
+    this.indexType = energyType;
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+  public String getCodeOrName() {
+    return codeOrName;
+  }
+
+  public void setCodeOrName(String codeOrName) {
+    this.codeOrName = codeOrName;
+  }
+
+  public String getIndexCategory() {
+    return indexCategory;
+  }
+
+  public void setIndexCategory(String indexCategory) {
+    this.indexCategory = indexCategory;
+  }
+
+  public IndexType getIndexType() {
+    return indexType;
+  }
+
+  public void setIndexType(IndexType indexType) {
+    this.indexType = indexType;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormula.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormula.java
new file mode 100644
index 0000000..7ed932a
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormula.java
@@ -0,0 +1,45 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class IndexFormula {
+
+  private String id;
+  private String formulaText;
+  private String indexId;
+  private List<IndexFormulaParam> indexFormulaParams = new ArrayList<>();
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getFormulaText() {
+    return formulaText;
+  }
+
+  public void setFormulaText(String formulaText) {
+    this.formulaText = formulaText;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public List<IndexFormulaParam> getIndexFormulaParams() {
+    return indexFormulaParams;
+  }
+
+  public void setIndexFormulaParams(
+      List<IndexFormulaParam> indexFormulaParams) {
+    this.indexFormulaParams = indexFormulaParams;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormulaParam.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormulaParam.java
new file mode 100644
index 0000000..d088ad5
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexFormulaParam.java
@@ -0,0 +1,50 @@
+package com.dingzhuo.energy.data.model.domain;
+
+public class IndexFormulaParam {
+
+  private String id;
+  private String indexId;
+  private String formulaId;
+  private String paramName;
+  private String paramValue;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getFormulaId() {
+    return formulaId;
+  }
+
+  public void setFormulaId(String formulaId) {
+    this.formulaId = formulaId;
+  }
+
+  public String getParamName() {
+    return paramName;
+  }
+
+  public void setParamName(String paramName) {
+    this.paramName = paramName;
+  }
+
+  public String getParamValue() {
+    return paramValue;
+  }
+
+  public void setParamValue(String paramValue) {
+    this.paramValue = paramValue;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorage.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorage.java
new file mode 100644
index 0000000..1b4130d
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorage.java
@@ -0,0 +1,82 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author fanxinfu
+ */
+public class IndexStorage implements Serializable {
+
+  private String id;
+  private String indexId;
+  private TimeType timeType;
+  private CalcType calcType;
+  private String calcText;
+  private Date createTime;
+  private Date updateTime;
+  private List<String> paramIndex = new ArrayList<>();
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public CalcType getCalcType() {
+    return calcType;
+  }
+
+  public void setCalcType(CalcType calcType) {
+    this.calcType = calcType;
+  }
+
+  public String getCalcText() {
+    return calcText;
+  }
+
+  public void setCalcText(String calcText) {
+    this.calcText = calcText;
+  }
+
+  public Date getCreateTime() {
+    return createTime;
+  }
+
+  public void setCreateTime(Date createTime) {
+    this.createTime = createTime;
+  }
+
+  public Date getUpdateTime() {
+    return updateTime;
+  }
+
+  public void setUpdateTime(Date updateTime) {
+    this.updateTime = updateTime;
+  }
+
+  public List<String> getParamIndex() {
+    return paramIndex;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorageParam.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorageParam.java
new file mode 100644
index 0000000..964310c
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexStorageParam.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.energy.data.model.domain;
+
+public class IndexStorageParam {
+
+  private String storageId;
+  private String indexId;
+
+  public String getStorageId() {
+    return storageId;
+  }
+
+  public void setStorageId(String storageId) {
+    this.storageId = storageId;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexType.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexType.java
new file mode 100644
index 0000000..8f141b6
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/IndexType.java
@@ -0,0 +1,12 @@
+package com.dingzhuo.energy.data.model.domain;
+
+public enum IndexType {
+  /**
+   * 閲囬泦鎸囨爣
+   */
+  COLLECT,
+  /**
+   * 缁熻鎸囨爣
+   */
+  STATISTIC
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/LimitType.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/LimitType.java
new file mode 100644
index 0000000..59559b9
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/LimitType.java
@@ -0,0 +1,119 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ璞� limit_type
+ *
+ * @author zw
+ * @date 2020-03-07
+ */
+@ApiModel(value = "鎶ヨ闄愬��")
+public class LimitType extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    @ApiModelProperty(value = "涓婚敭id")
+    private String id;
+
+    /** $column.columnComment */
+    @Excel(name = "闄愬�肩被鍨嬪悕绉�")
+    @ApiModelProperty(value = "闄愬�肩被鍨嬪悕绉�")
+    private String limitName;
+
+    /** $column.columnComment */
+    @Excel(name = "闄愬�肩被鍨嬬紪鐮�")
+    @ApiModelProperty(value = "闄愬�肩被鍨嬬紪鐮�")
+    private String limitCode;
+
+    /** $column.columnComment */
+    @Excel(name = "鑹插彿")
+    @ApiModelProperty(value = "鑹插彿")
+    private String colorNumber;
+
+    /** $column.columnComment */
+    @Excel(name = "姣旇緝杩愮畻绗�")
+    @ApiModelProperty(value = "姣旇緝杩愮畻绗�")
+    private String comparatorOperator;
+
+    /** $column.columnComment */
+    @Excel(name = "璀︽垝绫诲瀷")
+    @ApiModelProperty(value = "璀︽垝绫诲瀷")
+    private String alarmType;
+
+    public String getComparatorOperator() {
+        return comparatorOperator;
+    }
+
+    public void setComparatorOperator(String comparatorOperator) {
+        this.comparatorOperator = comparatorOperator;
+    }
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setLimitName(String limitName)
+    {
+        this.limitName = limitName;
+    }
+
+    public String getLimitName()
+    {
+        return limitName;
+    }
+    public void setLimitCode(String limitCode)
+    {
+        this.limitCode = limitCode;
+    }
+
+    public String getLimitCode()
+    {
+        return limitCode;
+    }
+    public void setColorNumber(String colorNumber)
+    {
+        this.colorNumber = colorNumber;
+    }
+
+    public String getColorNumber()
+    {
+        return colorNumber;
+    }
+
+    public void setAlarmType(String alarmType)
+    {
+        this.alarmType = alarmType;
+    }
+
+    public String getAlarmType()
+    {
+        return alarmType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("limitName", getLimitName())
+            .append("limitCode", getLimitCode())
+            .append("colorNumber", getColorNumber())
+            .append("alarmType", getAlarmType())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelInfo.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelInfo.java
new file mode 100644
index 0000000..2c88616
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelInfo.java
@@ -0,0 +1,75 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 妯″瀷瀵硅薄 model_info
+ * 
+ * @author fanxinfu
+ * @date 2020-02-17
+ */
+public class ModelInfo extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 妯″瀷缂栫爜 */
+    @Excel(name = "妯″瀷缂栫爜")
+    private String modelCode;
+
+    /** 妯″瀷鍚嶇О */
+    @Excel(name = "妯″瀷鍚嶇О")
+    private String modelName;
+
+    /** 鏄惁鏄剧ず */
+    private Integer isShow;
+
+    private String modelType;
+
+    public void setModelCode(String modelCode) 
+    {
+        this.modelCode = modelCode;
+    }
+
+    public String getModelCode() 
+    {
+        return modelCode;
+    }
+    public void setModelName(String modelName) 
+    {
+        this.modelName = modelName;
+    }
+
+    public String getModelName() 
+    {
+        return modelName;
+    }
+    public void setIsShow(Integer isShow) 
+    {
+        this.isShow = isShow;
+    }
+
+    public Integer getIsShow() 
+    {
+        return isShow;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("modelCode", getModelCode())
+            .append("modelName", getModelName())
+            .append("isShow", getIsShow())
+            .toString();
+    }
+
+    public String getModelType() {
+        return modelType;
+    }
+
+    public void setModelType(String modelType) {
+        this.modelType = modelType;
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelNode.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelNode.java
new file mode 100644
index 0000000..23e583c
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/ModelNode.java
@@ -0,0 +1,142 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 妯″瀷鑺傜偣瀵硅薄 model_node
+ *
+ * @author fanxinfu
+ * @date 2020-02-10
+ */
+public class ModelNode extends BaseEntity {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 涓婚敭
+   */
+  private String nodeId;
+
+  /**
+   * 缂栫爜
+   */
+  @Excel(name = "缂栫爜")
+  private String code;
+
+  /**
+   * 鍚嶇О
+   */
+  @Excel(name = "鍚嶇О")
+  private String name;
+
+  /**
+   * 鐖惰妭鐐� id
+   */
+  private String parentId;
+
+  /**
+   * 鍦板潃
+   */
+  private String address;
+
+  /**
+   * 妯″瀷 id
+   */
+  private String modelCode;
+
+  private String nodeCategory;
+
+  private int orderNum;
+
+  private List<ModelNode> children = new ArrayList<>();
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setParentId(String parentId) {
+    this.parentId = parentId;
+  }
+
+  public String getParentId() {
+    return parentId;
+  }
+
+  public void setAddress(String address) {
+    this.address = address;
+  }
+
+  public String getAddress() {
+    return address;
+  }
+
+  @Override
+  public String toString() {
+    return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+        .append("nodeId", getNodeId())
+        .append("code", getCode())
+        .append("name", getName())
+        .append("parentId", getParentId())
+        .append("address", getAddress())
+        .append("modelCode", getModelCode())
+        .append("orderNum", getOrderNum())
+        .toString();
+  }
+
+  public List<ModelNode> getChildren() {
+    return children;
+  }
+
+  public void setChildren(List<ModelNode> children) {
+    this.children = children;
+  }
+
+  public String getModelCode() {
+    return modelCode;
+  }
+
+  public void setModelCode(String modelCode) {
+    this.modelCode = modelCode;
+  }
+
+  public int getOrderNum() {
+    return orderNum;
+  }
+
+  public void setOrderNum(int orderNum) {
+    this.orderNum = orderNum;
+  }
+
+  public String getNodeCategory() {
+    return nodeCategory;
+  }
+
+  public void setNodeCategory(String nodeCategory) {
+    this.nodeCategory = nodeCategory;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/StateType.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/StateType.java
new file mode 100644
index 0000000..2bc679c
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/StateType.java
@@ -0,0 +1,84 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 绯荤粺鐘舵�佺淮鎶ゅ璞� state_type
+ * 
+ * @author sys
+ * @date 2020-03-18
+ */
+public class StateType extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 鐘舵�佷富閿甶d */
+    @Excel(name = "鐘舵�佷富閿甶d")
+    private String stateId;
+
+    /** 鐘舵�佸悕绉� */
+    @Excel(name = "鐘舵�佸悕绉�")
+    private String stateName;
+
+    /** 鐘舵�佺紪鐮� */
+    @Excel(name = "鐘舵�佺紪鐮�")
+    private String stateCode;
+
+    /** 鑹插彿 */
+    @Excel(name = "鑹插彿")
+    private String colorNumber;
+
+    public void setStateId(String stateId) 
+    {
+        this.stateId = stateId;
+    }
+
+    public String getStateId() 
+    {
+        return stateId;
+    }
+    public void setStateName(String stateName) 
+    {
+        this.stateName = stateName;
+    }
+
+    public String getStateName() 
+    {
+        return stateName;
+    }
+    public void setStateCode(String stateCode) 
+    {
+        this.stateCode = stateCode;
+    }
+
+    public String getStateCode() 
+    {
+        return stateCode;
+    }
+    public void setColorNumber(String colorNumber) 
+    {
+        this.colorNumber = colorNumber;
+    }
+
+    public String getColorNumber() 
+    {
+        return colorNumber;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("stateId", getStateId())
+            .append("stateName", getStateName())
+            .append("stateCode", getStateCode())
+            .append("colorNumber", getColorNumber())
+            .append("createTime", getCreateTime())
+            .append("createBy", getCreateBy())
+            .append("updateTime", getUpdateTime())
+            .append("updateBy", getUpdateBy())
+            .toString();
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/TreeObject.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/TreeObject.java
new file mode 100644
index 0000000..93b78e3
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/TreeObject.java
@@ -0,0 +1,66 @@
+package com.dingzhuo.energy.data.model.domain;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Treeselect鏍戠粨鏋勫疄浣撶被
+ *
+ * @author ruoyi
+ */
+public class TreeObject implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 鑺傜偣ID
+   */
+  private String id;
+
+  /**
+   * 鑺傜偣鍚嶇О
+   */
+  private String label;
+
+  /**
+   * 瀛愯妭鐐�
+   */
+  @JsonInclude(JsonInclude.Include.NON_EMPTY)
+  private List<TreeObject> children;
+
+  public TreeObject() {
+
+  }
+
+  public TreeObject(ModelNode modelNode) {
+    this.id = modelNode.getNodeId();
+    this.label = modelNode.getName();
+    this.children = modelNode.getChildren().stream().map(TreeObject::new).collect(Collectors.toList());
+  }
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getLabel() {
+    return label;
+  }
+
+  public void setLabel(String label) {
+    this.label = label;
+  }
+
+  public List<TreeObject> getChildren() {
+    return children;
+  }
+
+  public void setChildren(List<TreeObject> children) {
+    this.children = children;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/dto/EnergyIndexMonitorDTO.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/dto/EnergyIndexMonitorDTO.java
new file mode 100644
index 0000000..dc425c9
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/dto/EnergyIndexMonitorDTO.java
@@ -0,0 +1,47 @@
+package com.dingzhuo.energy.data.model.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotBlank;
+
+
+/**
+ * 鑳芥簮鐐逛綅鐩戞祴璇锋眰 DTO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/6
+ */
+@ApiModel(value = "鎸囨爣淇℃伅")
+public class EnergyIndexMonitorDTO {
+
+  /**
+   * 鐐逛綅绫诲瀷
+   */
+  @ApiModelProperty(value = "鐐逛綅绫诲瀷")
+  private String indexType;
+
+  /**
+   * 妯″瀷id
+   */
+  @NotBlank(message = "鏈壘鍒版ā鍨嬩俊鎭�")
+  @ApiModelProperty(value = "妯″瀷id")
+  private String nodeId;
+
+
+  public String getIndexType() {
+    return indexType;
+  }
+
+  public void setIndexType(String indexType) {
+    this.indexType = indexType;
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/ModelNodeIndexInfor.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/ModelNodeIndexInfor.java
new file mode 100644
index 0000000..18e8edc
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/ModelNodeIndexInfor.java
@@ -0,0 +1,53 @@
+package com.dingzhuo.energy.data.model.domain.vo;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+
+/**
+ * 妯″瀷鑺傜偣涓庣偣浣嶅叧绯诲璞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/2
+ */
+public class ModelNodeIndexInfor extends BaseEntity {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 涓婚敭
+   */
+  private String nodeId;
+
+  /**
+   * 鍚嶇О
+   */
+  private String name;
+
+  /**
+   * 鐐逛綅id
+   */
+  private String indexId;
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/PointDataVO.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/PointDataVO.java
new file mode 100644
index 0000000..cea0c1b
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/domain/vo/PointDataVO.java
@@ -0,0 +1,36 @@
+package com.dingzhuo.energy.data.model.domain.vo;
+
+/**
+ * 妯″瀷鐐逛綅id涓庡悕绉�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/6
+ */
+public class PointDataVO {
+
+  /**
+   * 鐐逛綅id
+   */
+  private String indexId;
+
+  /**
+   * 鐐逛綅鍚嶇О
+   */
+  private String indexName;
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/CalcFunctionMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/CalcFunctionMapper.java
new file mode 100644
index 0000000..c96566e
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/CalcFunctionMapper.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.data.model.domain.CalcFunction;
+
+import java.util.List;
+
+/**
+ * 璁$畻鍑芥暟Mapper鎺ュ彛
+ * 
+ * @author fanxinfu
+ * @date 2020-03-10
+ */
+public interface CalcFunctionMapper 
+{
+    /**
+     * 鏌ヨ璁$畻鍑芥暟
+     * 
+     * @param id 璁$畻鍑芥暟ID
+     * @return 璁$畻鍑芥暟
+     */
+    public CalcFunction selectCalcFunctionById(String id);
+
+    /**
+     * 鏌ヨ璁$畻鍑芥暟鍒楄〃
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 璁$畻鍑芥暟闆嗗悎
+     */
+    public List<CalcFunction> selectCalcFunctionList(CalcFunction calcFunction);
+
+    /**
+     * 鏂板璁$畻鍑芥暟
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 缁撴灉
+     */
+    public int insertCalcFunction(CalcFunction calcFunction);
+
+    /**
+     * 淇敼璁$畻鍑芥暟
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 缁撴灉
+     */
+    public int updateCalcFunction(CalcFunction calcFunction);
+
+    /**
+     * 鍒犻櫎璁$畻鍑芥暟
+     * 
+     * @param id 璁$畻鍑芥暟ID
+     * @return 缁撴灉
+     */
+    public int deleteCalcFunctionById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁$畻鍑芥暟
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteCalcFunctionByIds(String[] ids);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DaqTemplateMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DaqTemplateMapper.java
new file mode 100644
index 0000000..c9a1dfc
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DaqTemplateMapper.java
@@ -0,0 +1,66 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.data.model.domain.DaqTemplate;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 閲囬泦鍙傛暟妯℃澘Mapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-08
+ */
+public interface DaqTemplateMapper {
+  /**
+   * 鏌ヨ閲囬泦鍙傛暟妯℃澘
+   *
+   * @param id 閲囬泦鍙傛暟妯℃澘ID
+   * @return 閲囬泦鍙傛暟妯℃澘
+   */
+  DaqTemplate selectDaqTemplateById(String id);
+
+  /**
+   * 鏌ヨ閲囬泦鍙傛暟妯℃澘鍒楄〃
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 閲囬泦鍙傛暟妯℃澘闆嗗悎
+   */
+  List<DaqTemplate> selectDaqTemplateList(DaqTemplate daqTemplate);
+
+  /**
+   * 鏂板閲囬泦鍙傛暟妯℃澘
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 缁撴灉
+   */
+  int insertDaqTemplate(DaqTemplate daqTemplate);
+
+  /**
+   * 淇敼閲囬泦鍙傛暟妯℃澘
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 缁撴灉
+   */
+  int updateDaqTemplate(DaqTemplate daqTemplate);
+
+  /**
+   * 鍒犻櫎閲囬泦鍙傛暟妯℃澘
+   *
+   * @param id 閲囬泦鍙傛暟妯℃澘ID
+   * @return 缁撴灉
+   */
+  int deleteDaqTemplateById(String id);
+
+  /**
+   * 鎵归噺鍒犻櫎閲囬泦鍙傛暟妯℃澘
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+   * @return 缁撴灉
+   */
+  int deleteDaqTemplateByIds(String[] ids);
+
+  int dapHasExist(@Param("code") String code, @Param("deviceType") String deviceType);
+
+  int dapHasExistWhenUpdate(@Param("id") String id, @Param("code") String code, @Param("deviceType") String deviceType);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DataAuthMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DataAuthMapper.java
new file mode 100644
index 0000000..8ed050f
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/DataAuthMapper.java
@@ -0,0 +1,17 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface DataAuthMapper {
+
+  List<String> getUserDataAuth(@Param("modelCode") String modelCode, @Param("id") String id);
+
+  List<String> getRoleDataAuth(@Param("modelCode") String modelCode, @Param("id") String id);
+
+  void setUserDataAuth(@Param("id") String id, @Param("modelCode") String modelCode,
+      @Param("ids") List<String> ids);
+
+  void setRoleDataAuth(@Param("id") String id, @Param("modelCode") String modelCode,
+      @Param("ids") List<String> ids);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/EnergyIndexMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/EnergyIndexMapper.java
new file mode 100644
index 0000000..5b9f384
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/EnergyIndexMapper.java
@@ -0,0 +1,91 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.EnergyIndexQuery;
+import io.lettuce.core.dynamic.annotation.Param;
+
+import java.util.List;
+
+/**
+ * 鎸囨爣淇℃伅Mapper鎺ュ彛
+ *
+ * @author fanxinfu
+ * @date 2020-02-14
+ */
+public interface EnergyIndexMapper {
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅
+   *
+   * @param indexId 鎸囨爣淇℃伅ID
+   * @return 鎸囨爣淇℃伅
+   */
+  EnergyIndex selectEnergyIndexById(String indexId);
+
+  List<EnergyIndex> selectEnergyIndexByIds(@Param("indexIds") List<String> indexIds);
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+   *
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 鎸囨爣淇℃伅闆嗗悎
+   */
+  List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex);
+
+  /**
+   * 鏂板鎸囨爣淇℃伅
+   *
+   * @param nodeId
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 缁撴灉
+   */
+  int insertEnergyIndex(@Param("nodeId") String nodeId, @Param("energyIndex") EnergyIndex energyIndex);
+
+  /**
+   * 淇敼鎸囨爣淇℃伅
+   *
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 缁撴灉
+   */
+  int updateEnergyIndex(EnergyIndex energyIndex);
+
+  /**
+   * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
+   *
+   *
+   * @param nodeId
+   * @param indexIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
+   * @return 缁撴灉
+   */
+  int deleteEnergyIndexByIds(String nodeId, String[] indexIds);
+
+  int energyIndexHasExist(String code);
+
+  int energyIndexHasExistWhenUpdate(@Param("indexId") String indexId, @Param("code") String code);
+
+  void insertEnergyIndices(@Param("energyIndices") List<EnergyIndex> energyIndices);
+
+  List<EnergyIndex> getMeterIndex(String meterId);
+
+  void deleteIndexByMeterId(String meterId);
+
+  int modelHasConfig(String modelCode);
+
+  List<EnergyIndex> selectCollectIndex(String deviceId);
+
+  List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds);
+
+  List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes);
+
+  List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId);
+
+  List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter);
+
+  List<EnergyIndex> selectEnergyIndex(EnergyIndexQuery query);
+
+  void removeNodeIndex(String nodeId, List<String> indexIds);
+
+  void saveEnergyIndex(List<EnergyIndex> insertData);
+
+  List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes);
+
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexFormulaMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexFormulaMapper.java
new file mode 100644
index 0000000..10790f5
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexFormulaMapper.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.data.model.domain.IndexFormula;
+import com.dingzhuo.energy.data.model.domain.IndexFormulaParam;
+import java.util.List;
+
+public interface IndexFormulaMapper {
+
+  void insertIndexFormula(IndexFormula indexFormula);
+
+  void updateIndexFormula(IndexFormula indexFormula);
+
+  void saveIndexFormulaParam(String indexId, List<IndexFormulaParam> indexFormulaParams);
+
+  IndexFormula getFormula(String indexId);
+
+  List<IndexFormulaParam> getFormulaParam(String indexId);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexStorageMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexStorageMapper.java
new file mode 100644
index 0000000..823b03b
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/IndexStorageMapper.java
@@ -0,0 +1,25 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.CalcType;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.dingzhuo.energy.data.model.domain.IndexStorageParam;
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+public interface IndexStorageMapper {
+
+  void insertIndexStorage(IndexStorage storage);
+
+  void updateIndexStorage(IndexStorage storage);
+
+  List<IndexStorage> getIndexStorage(String indexId);
+
+  void saveParams(String storageId, List<String> parameterIds);
+
+  List<IndexStorageParam> getAllParameter();
+
+  List<IndexStorage> getAllCalcIndexStorage(CalcType calc);
+
+  IndexStorage getWithTimetype(@Param("indexId") String indexId, @Param("timeType") TimeType timeType);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/LimitTypeMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/LimitTypeMapper.java
new file mode 100644
index 0000000..eaa3e05
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/LimitTypeMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.data.model.domain.LimitType;
+import java.util.List;
+
+/**
+ * 鎶ヨ闄愬�肩被鍨嬬淮鎶apper鎺ュ彛
+ * 
+ * @author zw
+ * @date 2020-03-07
+ */
+public interface LimitTypeMapper 
+{
+    /**
+     * 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param id 鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     */
+    public LimitType selectLimitTypeById(String id);
+
+    /**
+     * 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 鎶ヨ闄愬�肩被鍨嬬淮鎶ら泦鍚�
+     */
+    public List<LimitType> selectLimitTypeList(LimitType limitType);
+
+    /**
+     * 鏂板鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 缁撴灉
+     */
+    public int insertLimitType(LimitType limitType);
+
+    /**
+     * 淇敼鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 缁撴灉
+     */
+    public int updateLimitType(LimitType limitType);
+
+    /**
+     * 鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param id 鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 缁撴灉
+     */
+    public int deleteLimitTypeById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteLimitTypeByIds(String[] ids);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelInfoMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelInfoMapper.java
new file mode 100644
index 0000000..dce0ab5
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelInfoMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.data.model.domain.ModelInfo;
+import java.util.List;
+
+/**
+ * 妯″瀷Mapper鎺ュ彛
+ * 
+ * @author fanxinfu
+ * @date 2020-02-17
+ */
+public interface ModelInfoMapper 
+{
+    /**
+     * 鏌ヨ妯″瀷
+     * 
+     * @param modelCode 妯″瀷ID
+     * @return 妯″瀷
+     */
+    ModelInfo selectModelInfoById(String modelCode);
+
+    /**
+     * 鏌ヨ妯″瀷鍒楄〃
+     * 
+     * @param modelInfo 妯″瀷
+     * @return 妯″瀷闆嗗悎
+     */
+    List<ModelInfo> selectModelInfoList(ModelInfo modelInfo);
+
+    /**
+     * 鏂板妯″瀷
+     * 
+     * @param modelInfo 妯″瀷
+     * @return 缁撴灉
+     */
+    int insertModelInfo(ModelInfo modelInfo);
+
+    /**
+     * 淇敼妯″瀷
+     * 
+     * @param modelInfo 妯″瀷
+     * @return 缁撴灉
+     */
+    int updateModelInfo(ModelInfo modelInfo);
+
+    /**
+     * 鍒犻櫎妯″瀷
+     * 
+     * @param modelCode 妯″瀷ID
+     * @return 缁撴灉
+     */
+    int deleteModelInfoById(String modelCode);
+
+    /**
+     * 鎵归噺鍒犻櫎妯″瀷
+     * 
+     * @param modelCodes 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteModelInfoByCode(String modelCodes);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelNodeMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelNodeMapper.java
new file mode 100644
index 0000000..0b82cab
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/ModelNodeMapper.java
@@ -0,0 +1,158 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 妯″瀷鑺傜偣Mapper鎺ュ彛
+ *
+ * @author fanxinfu
+ * @date 2020-02-10
+ */
+public interface ModelNodeMapper {
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣
+   *
+   * @param nodeId 妯″瀷鑺傜偣ID
+   * @return 妯″瀷鑺傜偣
+   */
+  ModelNode selectModelNodeById(String nodeId);
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 妯″瀷鑺傜偣闆嗗悎
+   */
+  List<ModelNode> selectModelNodeList(ModelNode modelNode);
+
+  /**
+   * 鏂板妯″瀷鑺傜偣
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 缁撴灉
+   */
+  int insertModelNode(ModelNode modelNode);
+
+  /**
+   * 淇敼妯″瀷鑺傜偣
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 缁撴灉
+   */
+  int updateModelNode(ModelNode modelNode);
+
+  /**
+   * 鍒犻櫎妯″瀷鑺傜偣
+   *
+   * @param nodeId 妯″瀷鑺傜偣ID
+   * @return 缁撴灉
+   */
+  int deleteModelNodeById(String nodeId);
+
+  /**
+   * 鎵归噺鍒犻櫎妯″瀷鑺傜偣
+   *
+   * @param nodeIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
+   * @return 缁撴灉
+   */
+  int deleteModelNodeByIds(String[] nodeIds);
+
+  List<ModelNode> getModelNodeByModelCode(String modelCode);
+
+  int getMaxOrder(String parentId);
+
+  void updateModelNodeParent(@Param("nodeId") String nodeId, @Param("parentId") String parentId);
+
+  void updateModelNodeOrder(@Param("orders") Map<String, Integer> orders);
+
+  int modelNodeHasExist(@Param("code") String code, @Param("modelCode") String modelCode);
+
+  int modelNodeHasExistWhenUpdate(@Param("nodeId") String nodeId, @Param("code") String code,
+      @Param("modelCode") String modelCode);
+
+  void setDevice(@Param("nodeId") String nodeId, @Param("deviceIds") String[] deviceIds);
+
+  List<MeterImplement> getSettingDevice(String nodeId);
+
+  List<EnergyIndex> getSettingIndex(String nodeId);
+
+
+  void delDevice(@Param("nodeId") String nodeId, @Param("deviceIds") String[] deviceIds);
+
+  List<SysEnergy> getSettingEnergy(String nodeId);
+
+  void setEnergy(@Param("nodeId") String nodeId, @Param("energyIds") Integer[] energyIds);
+
+  void delEnergy(@Param("nodeId") String nodeId, @Param("energyIds") Integer[] energyIds);
+
+  List<SysProduct> getSettingProduct(String nodeId);
+
+  void setProduct(@Param("nodeId") String nodeId, @Param("productIds") Integer[] productIds);
+
+  void delProduct(@Param("nodeId") String nodeId, @Param("productIds") Integer[] productIds);
+
+  void setIndex(@Param("nodeId") String nodeId, @Param("indexType") String indexType,
+      @Param("indexIds") String[] indexIds);
+
+  void delIndex(@Param("nodeId") String nodeId, @Param("indexIds") String[] indexIds);
+
+  List<EnergyIndex> getSettingIndexByType(@Param("indexType") String indexType,
+                                          @Param("nodeId") String nodeId);
+
+  List<ModelNode> getModelNodeByNodeCodes(List<String> nodeCodes);
+
+  List<ModelNode> getModelNodeByModelCodeWithAuth(@Param("modelCode") String modelCode,
+                                                  @Param("userId") String userId);
+
+  List<EnergyIndex> getSettingIndexByWhere(@Param("nodeId") String nodeId, @Param("indexName") String indexName);
+
+  /**
+   * 鏍规嵁nodeIds鑾峰彇idexId淇℃伅
+   *
+   * @param nodeIds
+   * @return
+   */
+  List<String> listIndesxByCodeList(@Param("nodeIds") List<String> nodeIds);
+
+  /**
+   * 鏍规嵁nodeCode鏌ヨ妯″瀷鑺傜偣涓庣偣浣峣d涔嬮棿鐨勫叧绯讳俊鎭�
+   *
+   * @param code
+   * @return
+   */
+  List<ModelNodeIndexInfor> getModelNodeIndexIdRelationInforByCode(@Param("code") String code);
+
+  /**
+   * 鏍规嵁nodeId鏌ヨ瀵瑰簲璇︾粏淇℃伅
+   *
+   * @param nodeId
+   * @return
+   */
+  List<ModelNodeIndexInfor> getModelNodeIndexIdRelationInforByNodeId(@Param("nodeId") String nodeId);
+
+  /**
+   * 鏍规嵁鐖秈d鏌ヨ璇︾粏淇℃伅
+   *
+   * @param parentId
+   * @return
+   */
+  List<ModelNodeIndexInfor> listModelNodeIndexIdRelationInforByParentId(@Param("parentId") String parentId);
+
+  /**
+   * 鏍规嵁code鏌ヨ鐖剁骇淇℃伅
+   *
+   * @param indexCode
+   * @return
+   */
+  ModelNode getModelNodeByModelCodeByIndexCode(@Param("indexCode") String indexCode);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/StateTypeMapper.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/StateTypeMapper.java
new file mode 100644
index 0000000..44fdc7c
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/mapper/StateTypeMapper.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.data.model.mapper;
+
+import com.dingzhuo.energy.data.model.domain.StateType;
+
+import java.util.List;
+
+/**
+ * 绯荤粺鐘舵�佺淮鎶apper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-18
+ */
+public interface StateTypeMapper 
+{
+    /**
+     * 鏌ヨ绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateId 绯荤粺鐘舵�佺淮鎶D
+     * @return 绯荤粺鐘舵�佺淮鎶�
+     */
+    public StateType selectStateTypeById(String stateId);
+
+    /**
+     * 鏌ヨ绯荤粺鐘舵�佺淮鎶ゅ垪琛�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 绯荤粺鐘舵�佺淮鎶ら泦鍚�
+     */
+    public List<StateType> selectStateTypeList(StateType stateType);
+
+    /**
+     * 鏂板绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 缁撴灉
+     */
+    public int insertStateType(StateType stateType);
+
+    /**
+     * 淇敼绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 缁撴灉
+     */
+    public int updateStateType(StateType stateType);
+
+    /**
+     * 鍒犻櫎绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateId 绯荤粺鐘舵�佺淮鎶D
+     * @return 缁撴灉
+     */
+    public int deleteStateTypeById(String stateId);
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteStateTypeByIds(String[] stateIds);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/DataAuthService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/DataAuthService.java
new file mode 100644
index 0000000..e615a40
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/DataAuthService.java
@@ -0,0 +1,14 @@
+package com.dingzhuo.energy.data.model.service;
+
+import java.util.List;
+
+public interface DataAuthService {
+
+  List<String> getUserDataAuth(String modelCode, String id);
+
+  List<String> getRoleDataAuth(String modelCode, String id);
+
+  void setUserDataAuth(String userOrRoleId, String modelCode, List<String> ids);
+
+  void setRoleDataAuth(String userOrRoleId, String modelCode, List<String> ids);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/ICalcFunctionService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/ICalcFunctionService.java
new file mode 100644
index 0000000..8baca28
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/ICalcFunctionService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.data.model.domain.CalcFunction;
+import java.util.List;
+
+/**
+ * 璁$畻鍑芥暟Service鎺ュ彛
+ * 
+ * @author fanxinfu
+ * @date 2020-03-10
+ */
+public interface ICalcFunctionService 
+{
+    /**
+     * 鏌ヨ璁$畻鍑芥暟
+     * 
+     * @param id 璁$畻鍑芥暟ID
+     * @return 璁$畻鍑芥暟
+     */
+    public CalcFunction selectCalcFunctionById(String id);
+
+    /**
+     * 鏌ヨ璁$畻鍑芥暟鍒楄〃
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 璁$畻鍑芥暟闆嗗悎
+     */
+    public List<CalcFunction> selectCalcFunctionList(CalcFunction calcFunction);
+
+    /**
+     * 鏂板璁$畻鍑芥暟
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 缁撴灉
+     */
+    public int insertCalcFunction(CalcFunction calcFunction);
+
+    /**
+     * 淇敼璁$畻鍑芥暟
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 缁撴灉
+     */
+    public int updateCalcFunction(CalcFunction calcFunction);
+
+    /**
+     * 鎵归噺鍒犻櫎璁$畻鍑芥暟
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁$畻鍑芥暟ID
+     * @return 缁撴灉
+     */
+    public int deleteCalcFunctionByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁$畻鍑芥暟淇℃伅
+     * 
+     * @param id 璁$畻鍑芥暟ID
+     * @return 缁撴灉
+     */
+    public int deleteCalcFunctionById(String id);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IDaqTemplateService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IDaqTemplateService.java
new file mode 100644
index 0000000..4b6cde1
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IDaqTemplateService.java
@@ -0,0 +1,72 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.data.model.domain.DaqTemplate;
+
+import java.util.List;
+
+/**
+ * 閲囬泦鍙傛暟妯℃澘Service鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-08
+ */
+public interface IDaqTemplateService {
+  /**
+   * 鏌ヨ閲囬泦鍙傛暟妯℃澘
+   *
+   * @param id 閲囬泦鍙傛暟妯℃澘ID
+   * @return 閲囬泦鍙傛暟妯℃澘
+   */
+  DaqTemplate selectDaqTemplateById(String id);
+
+  /**
+   * 鏌ヨ閲囬泦鍙傛暟妯℃澘鍒楄〃
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 閲囬泦鍙傛暟妯℃澘闆嗗悎
+   */
+  List<DaqTemplate> selectDaqTemplateList(DaqTemplate daqTemplate);
+
+  /**
+   * 鏂板閲囬泦鍙傛暟妯℃澘
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 缁撴灉
+   */
+  int insertDaqTemplate(DaqTemplate daqTemplate);
+
+  /**
+   * 淇敼閲囬泦鍙傛暟妯℃澘
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 缁撴灉
+   */
+  int updateDaqTemplate(DaqTemplate daqTemplate);
+
+  /**
+   * 鎵归噺鍒犻櫎閲囬泦鍙傛暟妯℃澘
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑閲囬泦鍙傛暟妯℃澘ID
+   * @return 缁撴灉
+   */
+  int deleteDaqTemplateByIds(String[] ids);
+
+  /**
+   * 鍒犻櫎閲囬泦鍙傛暟妯℃澘淇℃伅
+   *
+   * @param id 閲囬泦鍙傛暟妯℃澘ID
+   * @return 缁撴灉
+   */
+  int deleteDaqTemplateById(String id);
+
+  /**
+   * 鏌ヨ鐩稿悓璁惧绫诲瀷涓嬫槸鍚︽湁閲嶅鐨勭紪鐮�
+   *
+   * @param code       鍙傛暟缂栫爜
+   * @param deviceType 璁惧绫诲瀷
+   * @return 鏄惁瀛樺湪
+   */
+  boolean dapHasExist(String code, String deviceType);
+
+  boolean dapHasExist(DaqTemplate daqTemplate);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IEnergyIndexService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IEnergyIndexService.java
new file mode 100644
index 0000000..ad8eaef
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IEnergyIndexService.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndexQuery;
+import java.util.List;
+
+/**
+ * 鎸囨爣淇℃伅Service鎺ュ彛
+ *
+ * @author fanxinfu
+ * @date 2020-02-14
+ */
+public interface IEnergyIndexService {
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅
+   *
+   * @param indexId 鎸囨爣淇℃伅ID
+   * @return 鎸囨爣淇℃伅
+   */
+  EnergyIndex selectEnergyIndexById(String indexId);
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅
+   *
+   * @param indexId 鎸囨爣淇℃伅ID
+   * @return 鎸囨爣淇℃伅
+   */
+  List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId);
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+   *
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 鎸囨爣淇℃伅闆嗗悎
+   */
+  List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex);
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+   *
+   * @param query 鎸囨爣淇℃伅
+   * @return 鎸囨爣淇℃伅闆嗗悎
+   */
+  List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query);
+
+  /**
+   * 鏂板鎸囨爣淇℃伅
+   *
+   * @param nodeId
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 缁撴灉
+   */
+  int insertEnergyIndex(String nodeId, EnergyIndex energyIndex);
+
+  /**
+   * 淇敼鎸囨爣淇℃伅
+   *
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 缁撴灉
+   */
+  int updateEnergyIndex(EnergyIndex energyIndex);
+
+  /**
+   * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
+   *
+   *
+   * @param nodeId
+   * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
+   * @return 缁撴灉
+   */
+  int deleteEnergyIndexByIds(String nodeId, String[] indexIds);
+
+  boolean energyIndexHasExist(String code);
+
+  boolean energyIndexHasExist(String indexId, String code);
+
+  AjaxResult addMeterIndex(String meterId);
+
+  List<EnergyIndex> getMeterIndex(String meterId);
+
+  boolean modelHasConfig(String modelCode);
+
+  List<EnergyIndex> selectCollectIndex(String deviceId);
+
+  List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds);
+
+  List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes);
+
+  List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId);
+
+  List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter);
+
+  void removeNodeIndex(String nodeId, List<String> removeLink);
+
+  AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport);
+
+  List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IIndexStorageService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IIndexStorageService.java
new file mode 100644
index 0000000..b4a6e98
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IIndexStorageService.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.IndexFormula;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import java.util.List;
+
+/**
+ * @author fanxinfu
+ */
+public interface IIndexStorageService {
+
+  void saveIndexStorage(String indexId, List<IndexStorage> indexStorage);
+
+  void saveFormulaAndStorage(IndexFormula indexFormula, List<IndexStorage> indexStorage,
+      String indexId);
+
+  List<IndexStorage> getIndexStorage(String indexId);
+
+  List<IndexStorage> getAllCalcIndexStorage();
+
+  IndexStorage getIndexStorage(String indexId, TimeType timeType);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/ILimitTypeService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/ILimitTypeService.java
new file mode 100644
index 0000000..06a3ae8
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/ILimitTypeService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.data.model.domain.LimitType;
+import java.util.List;
+
+/**
+ * 鎶ヨ闄愬�肩被鍨嬬淮鎶ervice鎺ュ彛
+ * 
+ * @author zw
+ * @date 2020-03-07
+ */
+public interface ILimitTypeService 
+{
+    /**
+     * 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param id 鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     */
+    public LimitType selectLimitTypeById(String id);
+
+    /**
+     * 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 鎶ヨ闄愬�肩被鍨嬬淮鎶ら泦鍚�
+     */
+    public List<LimitType> selectLimitTypeList(LimitType limitType);
+
+    /**
+     * 鏂板鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 缁撴灉
+     */
+    public int insertLimitType(LimitType limitType);
+
+    /**
+     * 淇敼鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 缁撴灉
+     */
+    public int updateLimitType(LimitType limitType);
+
+    /**
+     * 鎵归噺鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 缁撴灉
+     */
+    public int deleteLimitTypeByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶や俊鎭�
+     * 
+     * @param id 鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 缁撴灉
+     */
+    public int deleteLimitTypeById(String id);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelInfoService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelInfoService.java
new file mode 100644
index 0000000..cf54399
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelInfoService.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.data.model.domain.ModelInfo;
+import com.dingzhuo.energy.data.model.domain.vo.PointDataVO;
+
+import java.util.List;
+
+/**
+ * 妯″瀷Service鎺ュ彛
+ * 
+ * @author fanxinfu
+ * @date 2020-02-17
+ */
+public interface IModelInfoService 
+{
+    /**
+     * 鏌ヨ妯″瀷
+     * 
+     * @param modelCode 妯″瀷ID
+     * @return 妯″瀷
+     */
+    public ModelInfo selectModelInfoById(String modelCode);
+
+    /**
+     * 鏌ヨ妯″瀷鍒楄〃
+     * 
+     * @param modelInfo 妯″瀷
+     * @return 妯″瀷闆嗗悎
+     */
+    public List<ModelInfo> selectModelInfoList(ModelInfo modelInfo);
+
+    /**
+     * 鏂板妯″瀷
+     * 
+     * @param modelInfo 妯″瀷
+     * @return 缁撴灉
+     */
+    public int insertModelInfo(ModelInfo modelInfo);
+
+    /**
+     * 淇敼妯″瀷
+     * 
+     * @param modelInfo 妯″瀷
+     * @return 缁撴灉
+     */
+    public int updateModelInfo(ModelInfo modelInfo);
+
+    /**
+     * 鎵归噺鍒犻櫎妯″瀷
+     * 
+     * @param modelCode 闇�瑕佸垹闄ょ殑妯″瀷ID
+     * @return 缁撴灉
+     */
+    public int deleteModelInfoByCode(String modelCode);
+
+    /**
+     * 鍒犻櫎妯″瀷淇℃伅
+     * 
+     * @param modelCode 妯″瀷ID
+     * @return 缁撴灉
+     */
+    public int deleteModelInfoById(String modelCode);
+
+    /**
+     * 鏍规嵁妯″瀷id鏌ヨ瀵瑰簲鐐逛綅淇℃伅
+     *
+     * @param modelId 鏌ヨ妯″瀷id
+     * @return
+     */
+    List<PointDataVO> listEnergyIndexByModelId(String modelId);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelNodeService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelNodeService.java
new file mode 100644
index 0000000..18e32d7
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IModelNodeService.java
@@ -0,0 +1,151 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.domain.TreeObject;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+
+import java.util.List;
+
+/**
+ * 妯″瀷鑺傜偣Service鎺ュ彛
+ *
+ * @author fanxinfu
+ * @date 2020-02-10
+ */
+public interface IModelNodeService {
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣
+   *
+   * @param nodeId 妯″瀷鑺傜偣ID
+   * @return 妯″瀷鑺傜偣
+   */
+  ModelNode selectModelNodeById(String nodeId);
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 妯″瀷鑺傜偣闆嗗悎
+   */
+  List<ModelNode> selectModelNodeList(ModelNode modelNode);
+
+  /**
+   * 鏂板妯″瀷鑺傜偣
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 缁撴灉
+   */
+  int insertModelNode(ModelNode modelNode);
+
+  /**
+   * 淇敼妯″瀷鑺傜偣
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 缁撴灉
+   */
+  int updateModelNode(ModelNode modelNode);
+
+  /**
+   * 鎵归噺鍒犻櫎妯″瀷鑺傜偣
+   *
+   * @param nodeIds 闇�瑕佸垹闄ょ殑妯″瀷鑺傜偣ID
+   * @return 缁撴灉
+   */
+  int deleteModelNodeByIds(String[] nodeIds);
+
+  /**
+   * 鍒犻櫎妯″瀷鑺傜偣淇℃伅
+   *
+   * @param nodeId 妯″瀷鑺傜偣ID
+   * @return 缁撴灉
+   */
+  int deleteModelNodeById(String nodeId);
+
+  List<ModelNode> getModelNodeByModelCode(String modelCode);
+
+  List<TreeObject> buildModelNodeTree(List<ModelNode> list);
+
+  void updateOrder(String nodeId, String parentId, String[] children);
+
+  boolean modelNodeHasExist(String code, String modelCode);
+
+  boolean modelNodeHasExist(ModelNode modelNode);
+
+  boolean hasEnergyIndex(String nodeId);
+
+  void setDevice(String nodeId, String[] deviceIds);
+
+  List<MeterImplement> getSettingDevice(String nodeId);
+
+  List<EnergyIndex> getSettingIndex(String nodeId);
+
+  List<EnergyIndex> getSettingIndexByWhere(String nodeId,String indexName);
+
+  void delDevice(String nodeId, String[] deviceIds);
+
+  List<SysEnergy> getSettingEnergy(String nodeId);
+
+  void setEnergy(String nodeId, Integer[] energyIds);
+
+  void delEnergy(String nodeId, Integer[] energyIds);
+
+  List<SysProduct> getSettingProduct(String nodeId);
+
+  void setProduct(String nodeId, Integer[] productIds);
+
+  void delProduct(String nodeId, Integer[] productIds);
+
+  void setIndex(String nodeId, String indexType, String[] indexIds);
+
+  void delIndex(String nodeId, String[] indexIds);
+
+  List<EnergyIndex> getSettingIndex(String indexType, String nodeId);
+
+  List<ModelNode> getModelNodeByNodeCodes(List<String> nodeCodes);
+
+  List<ModelNode> getModelNodeByModelCodeWithAuth(String modelCode, Long userId);
+
+  /**
+   * 鏍规嵁nodeCode鑾峰彇瀵瑰簲鐐逛綅淇℃伅
+   *
+   * @param nodeCode
+   * @return
+   */
+  List<String> listIndexIdsByModelCode(String nodeCode);
+
+  /**
+   * 鏍规嵁nodeCode鏌ヨ妯″瀷鑺傜偣涓庡瓙鐐逛綅id涔嬮棿鐨勫叧绯讳俊鎭�
+   *
+   * @param code
+   * @return
+   */
+  List<ModelNodeIndexInfor> getModelNodeIndexIdRelationInforByCode(String code);
+
+  /**
+   * 鏍规嵁nodeId鏌ヨ瀵瑰簲璇︾粏淇℃伅
+   *
+   * @param nodeId
+   * @return
+   */
+  List<ModelNodeIndexInfor> getModelNodeIndexIdRelationInforByNodeId(String nodeId);
+
+  /**
+   * 鏍规嵁鐖秈d鏌ヨ璇︾粏淇℃伅
+   *
+   * @param parentId
+   * @return
+   */
+  List<ModelNodeIndexInfor> listModelNodeIndexIdRelationInforByParentId(String parentId);
+
+  /**
+   * 鏍规嵁code鏌ヨ鐖剁骇淇℃伅
+   *
+   * @param indexCode
+   * @return
+   */
+  ModelNode getModelNodeByModelCodeByIndexCode(String indexCode);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IStateTypeService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IStateTypeService.java
new file mode 100644
index 0000000..e353703
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IStateTypeService.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.data.model.domain.StateType;
+
+import java.util.List;
+
+/**
+ * 绯荤粺鐘舵�佺淮鎶ervice鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-18
+ */
+public interface IStateTypeService 
+{
+    /**
+     * 鏌ヨ绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateId 绯荤粺鐘舵�佺淮鎶D
+     * @return 绯荤粺鐘舵�佺淮鎶�
+     */
+    public StateType selectStateTypeById(String stateId);
+
+    /**
+     * 鏌ヨ绯荤粺鐘舵�佺淮鎶ゅ垪琛�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 绯荤粺鐘舵�佺淮鎶ら泦鍚�
+     */
+    public List<StateType> selectStateTypeList(StateType stateType);
+
+    /**
+     * 鏂板绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 缁撴灉
+     */
+    public int insertStateType(StateType stateType);
+
+    /**
+     * 淇敼绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 缁撴灉
+     */
+    public int updateStateType(StateType stateType);
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateIds 闇�瑕佸垹闄ょ殑绯荤粺鐘舵�佺淮鎶D
+     * @return 缁撴灉
+     */
+    public int deleteStateTypeByIds(String[] stateIds);
+
+    /**
+     * 鍒犻櫎绯荤粺鐘舵�佺淮鎶や俊鎭�
+     * 
+     * @param stateId 绯荤粺鐘舵�佺淮鎶D
+     * @return 缁撴灉
+     */
+    public int deleteStateTypeById(String stateId);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IndexFormulaService.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IndexFormulaService.java
new file mode 100644
index 0000000..3bb8e05
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/IndexFormulaService.java
@@ -0,0 +1,10 @@
+package com.dingzhuo.energy.data.model.service;
+
+import com.dingzhuo.energy.data.model.domain.IndexFormula;
+
+public interface IndexFormulaService {
+
+  void saveIndexFormula(IndexFormula indexFormula);
+
+  IndexFormula getIndexFormula(String indexId);
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/CalcFunctionServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/CalcFunctionServiceImpl.java
new file mode 100644
index 0000000..f4c5273
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/CalcFunctionServiceImpl.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.data.model.mapper.CalcFunctionMapper;
+import com.dingzhuo.energy.data.model.domain.CalcFunction;
+import com.dingzhuo.energy.data.model.service.ICalcFunctionService;
+
+/**
+ * 璁$畻鍑芥暟Service涓氬姟灞傚鐞�
+ * 
+ * @author fanxinfu
+ * @date 2020-03-10
+ */
+@Service
+public class CalcFunctionServiceImpl implements ICalcFunctionService 
+{
+    @Autowired
+    private CalcFunctionMapper calcFunctionMapper;
+
+    /**
+     * 鏌ヨ璁$畻鍑芥暟
+     * 
+     * @param id 璁$畻鍑芥暟ID
+     * @return 璁$畻鍑芥暟
+     */
+    @Override
+    public CalcFunction selectCalcFunctionById(String id)
+    {
+        return calcFunctionMapper.selectCalcFunctionById(id);
+    }
+
+    /**
+     * 鏌ヨ璁$畻鍑芥暟鍒楄〃
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 璁$畻鍑芥暟
+     */
+    @Override
+    public List<CalcFunction> selectCalcFunctionList(CalcFunction calcFunction)
+    {
+        return calcFunctionMapper.selectCalcFunctionList(calcFunction);
+    }
+
+    /**
+     * 鏂板璁$畻鍑芥暟
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertCalcFunction(CalcFunction calcFunction)
+    {
+        return calcFunctionMapper.insertCalcFunction(calcFunction);
+    }
+
+    /**
+     * 淇敼璁$畻鍑芥暟
+     * 
+     * @param calcFunction 璁$畻鍑芥暟
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateCalcFunction(CalcFunction calcFunction)
+    {
+        return calcFunctionMapper.updateCalcFunction(calcFunction);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁$畻鍑芥暟
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁$畻鍑芥暟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteCalcFunctionByIds(String[] ids)
+    {
+        return calcFunctionMapper.deleteCalcFunctionByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璁$畻鍑芥暟淇℃伅
+     * 
+     * @param id 璁$畻鍑芥暟ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteCalcFunctionById(String id)
+    {
+        return calcFunctionMapper.deleteCalcFunctionById(id);
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DaqTemplateServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DaqTemplateServiceImpl.java
new file mode 100644
index 0000000..4ce4f91
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DaqTemplateServiceImpl.java
@@ -0,0 +1,99 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import java.util.List;
+
+import com.dingzhuo.energy.data.model.domain.DaqTemplate;
+import com.dingzhuo.energy.data.model.mapper.DaqTemplateMapper;
+import com.dingzhuo.energy.data.model.service.IDaqTemplateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 閲囬泦鍙傛暟妯℃澘Service涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-08
+ */
+@Service
+public class DaqTemplateServiceImpl implements IDaqTemplateService {
+  @Autowired
+  private DaqTemplateMapper daqTemplateMapper;
+
+  /**
+   * 鏌ヨ閲囬泦鍙傛暟妯℃澘
+   *
+   * @param id 閲囬泦鍙傛暟妯℃澘ID
+   * @return 閲囬泦鍙傛暟妯℃澘
+   */
+  @Override
+  public DaqTemplate selectDaqTemplateById(String id) {
+    return daqTemplateMapper.selectDaqTemplateById(id);
+  }
+
+  /**
+   * 鏌ヨ閲囬泦鍙傛暟妯℃澘鍒楄〃
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 閲囬泦鍙傛暟妯℃澘
+   */
+  @Override
+  public List<DaqTemplate> selectDaqTemplateList(DaqTemplate daqTemplate) {
+    return daqTemplateMapper.selectDaqTemplateList(daqTemplate);
+  }
+
+  /**
+   * 鏂板閲囬泦鍙傛暟妯℃澘
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 缁撴灉
+   */
+  @Override
+  public int insertDaqTemplate(DaqTemplate daqTemplate) {
+    return daqTemplateMapper.insertDaqTemplate(daqTemplate);
+  }
+
+  /**
+   * 淇敼閲囬泦鍙傛暟妯℃澘
+   *
+   * @param daqTemplate 閲囬泦鍙傛暟妯℃澘
+   * @return 缁撴灉
+   */
+  @Override
+  public int updateDaqTemplate(DaqTemplate daqTemplate) {
+    return daqTemplateMapper.updateDaqTemplate(daqTemplate);
+  }
+
+  /**
+   * 鎵归噺鍒犻櫎閲囬泦鍙傛暟妯℃澘
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑閲囬泦鍙傛暟妯℃澘ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteDaqTemplateByIds(String[] ids) {
+    return daqTemplateMapper.deleteDaqTemplateByIds(ids);
+  }
+
+  /**
+   * 鍒犻櫎閲囬泦鍙傛暟妯℃澘淇℃伅
+   *
+   * @param id 閲囬泦鍙傛暟妯℃澘ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteDaqTemplateById(String id) {
+    return daqTemplateMapper.deleteDaqTemplateById(id);
+  }
+
+  @Override
+  public boolean dapHasExist(String code, String deviceType) {
+    int count = daqTemplateMapper.dapHasExist(code, deviceType);
+    return count > 0;
+  }
+
+  @Override
+  public boolean dapHasExist(DaqTemplate daqTemplate) {
+    int count = daqTemplateMapper.dapHasExistWhenUpdate(daqTemplate.getId(), daqTemplate.getCode(), daqTemplate.getDeviceType());
+    return count > 0;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DataAuthServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DataAuthServiceImpl.java
new file mode 100644
index 0000000..5a62525
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/DataAuthServiceImpl.java
@@ -0,0 +1,34 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import com.dingzhuo.energy.data.model.mapper.DataAuthMapper;
+import com.dingzhuo.energy.data.model.service.DataAuthService;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DataAuthServiceImpl implements DataAuthService {
+
+  @Autowired
+  private DataAuthMapper dataAuthMapper;
+
+  @Override
+  public List<String> getUserDataAuth(String modelCode, String id) {
+    return dataAuthMapper.getUserDataAuth(modelCode, id);
+  }
+
+  @Override
+  public List<String> getRoleDataAuth(String modelCode, String id) {
+    return dataAuthMapper.getRoleDataAuth(modelCode, id);
+  }
+
+  @Override
+  public void setUserDataAuth(String userOrRoleId, String modelCode, List<String> ids) {
+    dataAuthMapper.setUserDataAuth(userOrRoleId, modelCode, ids);
+  }
+
+  @Override
+  public void setRoleDataAuth(String userOrRoleId, String modelCode, List<String> ids) {
+    dataAuthMapper.setRoleDataAuth(userOrRoleId, modelCode, ids);
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/EnergyIndexServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/EnergyIndexServiceImpl.java
new file mode 100644
index 0000000..3ed8a49
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/EnergyIndexServiceImpl.java
@@ -0,0 +1,271 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementService;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.data.model.domain.DaqTemplate;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.EnergyIndexQuery;
+import com.dingzhuo.energy.data.model.domain.IndexType;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.mapper.EnergyIndexMapper;
+import com.dingzhuo.energy.data.model.service.IDaqTemplateService;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鎸囨爣淇℃伅Service涓氬姟灞傚鐞�
+ *
+ * @author fanxinfu
+ * @date 2020-02-14
+ */
+@Service
+public class EnergyIndexServiceImpl implements IEnergyIndexService {
+
+  @Autowired
+  private EnergyIndexMapper energyIndexMapper;
+  @Autowired
+  private IDaqTemplateService daqTemplateService;
+  @Autowired
+  private IMeterImplementService meterImplementService;
+  @Autowired
+  private IModelNodeService modelNodeService;
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅
+   *
+   * @param indexId 鎸囨爣淇℃伅ID
+   * @return 鎸囨爣淇℃伅
+   */
+  @Override
+  public EnergyIndex selectEnergyIndexById(String indexId) {
+    return energyIndexMapper.selectEnergyIndexById(indexId);
+  }
+
+  @Override
+  public List<EnergyIndex> selectEnergyIndexByIds(List<String> indexId) {
+    if (CollectionUtils.isEmpty(indexId)) {
+      return Collections.emptyList();
+    }
+    return energyIndexMapper.selectEnergyIndexByIds(indexId);
+  }
+
+  @Override
+  public List<EnergyIndex> selectEnergyIndexList(EnergyIndex energyIndex) {
+    return energyIndexMapper.selectEnergyIndexList(energyIndex);
+  }
+
+  /**
+   * 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+   *
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 鎸囨爣淇℃伅
+   */
+  @Override
+  public List<EnergyIndex> selectEnergyIndexList(EnergyIndexQuery query) {
+    return energyIndexMapper.selectEnergyIndex(query);
+  }
+
+  /**
+   * 鏂板鎸囨爣淇℃伅
+   *
+   * @param nodeId
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 缁撴灉
+   */
+  @Override
+  public int insertEnergyIndex(String nodeId, EnergyIndex energyIndex) {
+    return energyIndexMapper.insertEnergyIndex(nodeId, energyIndex);
+  }
+
+  /**
+   * 淇敼鎸囨爣淇℃伅
+   *
+   * @param energyIndex 鎸囨爣淇℃伅
+   * @return 缁撴灉
+   */
+  @Override
+  public int updateEnergyIndex(EnergyIndex energyIndex) {
+    return energyIndexMapper.updateEnergyIndex(energyIndex);
+  }
+
+  /**
+   * 鎵归噺鍒犻櫎鎸囨爣淇℃伅
+   *
+   * @param nodeId
+   * @param indexIds 闇�瑕佸垹闄ょ殑鎸囨爣淇℃伅ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteEnergyIndexByIds(String nodeId, String[] indexIds) {
+    return energyIndexMapper.deleteEnergyIndexByIds(nodeId, indexIds);
+  }
+
+  @Override
+  public boolean energyIndexHasExist(String code) {
+    int count = energyIndexMapper.energyIndexHasExist(code);
+    return count > 0;
+  }
+
+  @Override
+  public boolean energyIndexHasExist(String indexId, String code) {
+    int count = energyIndexMapper.energyIndexHasExistWhenUpdate(indexId, code);
+    return count > 0;
+  }
+
+  @Override
+  public AjaxResult addMeterIndex(String meterId) {
+    MeterImplement meterImplement = meterImplementService.selectMeterImplementById(meterId);
+    if (meterImplement == null) {
+      return AjaxResult.error("鎵句笉鍒板搴旂殑璁¢噺鍣ㄥ叿锛�");
+    }
+
+    DaqTemplate query = new DaqTemplate();
+    query.setDeviceType(meterImplement.getMeterType());
+    List<DaqTemplate> daqTemplates = daqTemplateService.selectDaqTemplateList(query);
+    if (daqTemplates.isEmpty()) {
+      return AjaxResult.error("璁¢噺鍣ㄥ叿鎵�灞炵殑绫诲瀷娌℃湁鎵惧埌瀵瑰簲鐨勬ā鏉匡紒");
+    }
+
+    List<EnergyIndex> energyIndices = new ArrayList<>();
+    daqTemplates.forEach(daqTemplate -> {
+      EnergyIndex energyIndex = new EnergyIndex();
+      energyIndex.setIndexId(UUID.randomUUID().toString());
+      energyIndex.setCode(meterImplement.getCode() + "_" + daqTemplate.getCode());
+      energyIndex.setName(daqTemplate.getName());
+      energyIndex.setUnitId(daqTemplate.getUnit());
+      energyIndex.setIndexType(IndexType.COLLECT);
+      energyIndex.setMeterId(meterId);
+      energyIndices.add(energyIndex);
+    });
+
+    energyIndexMapper.deleteIndexByMeterId(meterId);
+    energyIndexMapper.insertEnergyIndices(energyIndices);
+    return AjaxResult.success();
+  }
+
+  @Override
+  public List<EnergyIndex> getMeterIndex(String meterId) {
+    return energyIndexMapper.getMeterIndex(meterId);
+  }
+
+  @Override
+  public boolean modelHasConfig(String modelCode) {
+    int count = energyIndexMapper.modelHasConfig(modelCode);
+    return count > 0;
+  }
+
+  @Override
+  public List<EnergyIndex> selectCollectIndex(String deviceId) {
+    return energyIndexMapper.selectCollectIndex(deviceId);
+  }
+
+  @Override
+  public List<EnergyIndex> getEnergyIndexByIds(List<String> indexIds) {
+    return energyIndexMapper.getEnergyIndexByIds(indexIds);
+  }
+
+  @Override
+  public List<EnergyIndex> getEnergyIndexByCodes(List<String> indexCodes) {
+    if (indexCodes.isEmpty()) {
+      return new ArrayList<>();
+    }
+
+    return energyIndexMapper.getEnergyIndexByCodes(indexCodes);
+  }
+
+  @Override
+  public List<EnergyIndex> getIndexByNodeAndChildrenNode(String nodeId) {
+    return energyIndexMapper.getIndexByNodeAndChildrenNode(nodeId);
+  }
+
+  @Override
+  public List<EnergyIndex> searchIndexByNodeAndChildrenNode(String nodeId, String filter) {
+    return energyIndexMapper.searchIndexByNodeAndChildrenNode(nodeId, filter);
+  }
+
+  @Override
+  public void removeNodeIndex(String nodeId, List<String> removeLink) {
+    energyIndexMapper.removeNodeIndex(nodeId, removeLink);
+  }
+
+  @Override
+  public AjaxResult importEnergyIndex(List<EnergyIndex> energyIndexList, boolean updateSupport) {
+    List<String> codes = energyIndexList.stream().map(EnergyIndex::getCode)
+        .collect(Collectors.toList());
+    List<String> nodeCodes = energyIndexList.stream().map(EnergyIndex::getNodeId)
+        .collect(Collectors.toList());
+    List<EnergyIndex> indexList = energyIndexMapper.getEnergyIndexByCodes(codes);
+    List<ModelNode> modelNodes = modelNodeService.getModelNodeByNodeCodes(nodeCodes);
+    Map<String, String> nodeCodeToId = modelNodes.stream()
+        .collect(Collectors.toMap(ModelNode::getCode, ModelNode::getNodeId));
+    Set<String> cacheIndexCodes = indexList.stream().map(EnergyIndex::getCode)
+        .collect(Collectors.toSet());
+
+    List<EnergyIndex> insertData = new ArrayList<>();
+    List<EnergyIndex> updateData = new ArrayList<>();
+    List<String> errorNodeCode = new ArrayList<>();
+    List<String> insertIndexCode = new ArrayList<>();
+    AtomicBoolean existDuplicateCode = new AtomicBoolean(false);
+    energyIndexList.forEach(energyIndex -> {
+      if (cacheIndexCodes.contains(energyIndex.getCode())) {
+        updateData.add(energyIndex);
+      } else {
+        String nodeCode = energyIndex.getNodeId();
+        if (nodeCodeToId.containsKey(nodeCode)) {
+          if (!insertIndexCode.contains(energyIndex.getCode())) {
+            insertIndexCode.add(energyIndex.getCode());
+            energyIndex.setIndexId(UUID.randomUUID().toString());
+            energyIndex.setNodeId(nodeCodeToId.get(nodeCode));
+            insertData.add(energyIndex);
+          } else {
+            existDuplicateCode.set(true);
+          }
+        } else if (!errorNodeCode.contains(nodeCode)) {
+          errorNodeCode.add(nodeCode);
+        }
+      }
+    });
+
+    if (updateSupport && !updateData.isEmpty()) {
+      updateData.forEach(energyIndexMapper::updateEnergyIndex);
+    }
+
+    if (!insertData.isEmpty()) {
+      energyIndexMapper.saveEnergyIndex(insertData);
+    }
+
+    String errMsg = "";
+    if (existDuplicateCode.get()) {
+      errMsg += "瀛樺湪閲嶅鐨勬寚鏍囩紪鐮侊紝宸茶嚜鍔ㄨ繃婊わ紒";
+    }
+
+    if (!errorNodeCode.isEmpty()) {
+      errMsg += String.join(",", errorNodeCode) + "娌℃湁鎵惧埌瀵瑰簲鐨勮妭鐐规暟鎹紝鍥犳鍏朵笅鐨勬墍鏈夋寚鏍囧鍏ュけ璐ワ紒";
+    }
+
+    if (StringUtils.isNotBlank(errMsg)) {
+      return AjaxResult.error(errMsg);
+    }
+    return AjaxResult.success("瀵煎叆鎴愬姛锛�");
+  }
+
+  @Override
+  public List<EnergyIndex> getEnergyIndexMeterByCodes(List<String> indexCodes) {
+    if (indexCodes.isEmpty()) {
+      return new ArrayList<>();
+    }
+
+    return energyIndexMapper.getEnergyIndexMeterByCodes(indexCodes);
+  }
+
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexFormulaServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexFormulaServiceImpl.java
new file mode 100644
index 0000000..d71608b
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexFormulaServiceImpl.java
@@ -0,0 +1,55 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.data.model.domain.IndexFormula;
+import com.dingzhuo.energy.data.model.domain.IndexFormulaParam;
+import com.dingzhuo.energy.data.model.mapper.IndexFormulaMapper;
+import com.dingzhuo.energy.data.model.service.IndexFormulaService;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author fanxinfu
+ */
+@Service
+public class IndexFormulaServiceImpl implements IndexFormulaService {
+
+  @Autowired
+  private IndexFormulaMapper indexFormulaMapper;
+
+  @Override
+  public void saveIndexFormula(IndexFormula indexFormula) {
+    if (StringUtils.isEmpty(indexFormula.getId())) {
+      indexFormula.setId(UUID.fastUUID().toString());
+      indexFormulaMapper.insertIndexFormula(indexFormula);
+    } else {
+      indexFormulaMapper.updateIndexFormula(indexFormula);
+    }
+
+    indexFormula.getIndexFormulaParams().forEach(param -> {
+      param.setId(UUID.fastUUID().toString());
+      param.setFormulaId(indexFormula.getId());
+      param.setIndexId(indexFormula.getIndexId());
+    });
+    indexFormulaMapper
+        .saveIndexFormulaParam(indexFormula.getIndexId(), indexFormula.getIndexFormulaParams());
+  }
+
+  @Override
+  public IndexFormula getIndexFormula(String indexId) {
+    IndexFormula indexFormula = indexFormulaMapper.getFormula(indexId);
+    if (indexFormula != null) {
+      List<IndexFormulaParam> indexFormulaParams = indexFormulaMapper.getFormulaParam(indexId);
+      if (!indexFormulaParams.isEmpty()) {
+        indexFormula.setIndexFormulaParams(indexFormulaParams);
+      }
+    } else {
+      indexFormula = new IndexFormula();
+    }
+
+    return indexFormula;
+  }
+
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexStorageServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexStorageServiceImpl.java
new file mode 100644
index 0000000..a874ebb
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/IndexStorageServiceImpl.java
@@ -0,0 +1,104 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import static org.apache.commons.lang3.StringUtils.equalsIgnoreCase;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.CalcType;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.IndexFormula;
+import com.dingzhuo.energy.data.model.domain.IndexFormulaParam;
+import com.dingzhuo.energy.data.model.domain.IndexStorage;
+import com.dingzhuo.energy.data.model.domain.IndexStorageParam;
+import com.dingzhuo.energy.data.model.mapper.IndexStorageMapper;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IIndexStorageService;
+import com.dingzhuo.energy.data.model.service.IndexFormulaService;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+@Service
+public class IndexStorageServiceImpl implements IIndexStorageService {
+
+  @Autowired
+  private IndexStorageMapper indexStorageMapper;
+  @Autowired
+  private IndexFormulaService indexFormulaService;
+  @Autowired
+  private IEnergyIndexService energyIndexService;
+
+  @Override
+  public void saveIndexStorage(String indexId, List<IndexStorage> indexStorage) {
+    indexStorage.forEach(storage -> {
+      storage.setIndexId(indexId);
+      if (StringUtils.isEmpty(storage.getId())) {
+        storage.setId(UUID.randomUUID().toString());
+        indexStorageMapper.insertIndexStorage(storage);
+      } else {
+        indexStorageMapper.updateIndexStorage(storage);
+      }
+
+      indexStorageMapper.saveParams(storage.getId(), storage.getParamIndex());
+    });
+  }
+
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  public void saveFormulaAndStorage(IndexFormula indexFormula, List<IndexStorage> indexStorage,
+      String indexId) {
+    indexFormulaService.saveIndexFormula(indexFormula);
+    String calcText = indexFormula.getFormulaText();
+    List<String> paramNames = new ArrayList<>();
+    for (IndexFormulaParam param : indexFormula.getIndexFormulaParams()) {
+      calcText = calcText
+              .replace("("+param.getParamName()+")", "("+String.format("'%s'", param.getParamValue())+")");
+      paramNames.add(param.getParamValue());
+    }
+
+    List<EnergyIndex> energyIndexList = energyIndexService.getEnergyIndexByCodes(paramNames);
+    List<String> paramIndex = energyIndexList.stream()
+        .map(EnergyIndex::getIndexId)
+        .collect(Collectors.toList());
+    for (IndexStorage storage : indexStorage) {
+      storage.setCalcText(calcText);
+      storage.getParamIndex().addAll(paramIndex);
+    }
+
+    saveIndexStorage(indexId, indexStorage);
+  }
+
+  @Override
+  public List<IndexStorage> getIndexStorage(String indexId) {
+    return indexStorageMapper.getIndexStorage(indexId);
+  }
+
+  @Override
+  public List<IndexStorage> getAllCalcIndexStorage() {
+    List<IndexStorage> indexStorageList = indexStorageMapper.getAllCalcIndexStorage(CalcType.CALC);
+    List<IndexStorageParam> params = indexStorageMapper.getAllParameter();
+    indexStorageList.forEach(storage -> {
+      List<String> indexIds = params.stream()
+          .filter(f -> equalsIgnoreCase(f.getStorageId(), storage.getId()))
+          .map(IndexStorageParam::getIndexId)
+          .collect(Collectors.toList());
+      if (!indexIds.isEmpty()) {
+        storage.getParamIndex().addAll(indexIds);
+      }
+    });
+
+    return indexStorageList;
+  }
+
+  @Override
+  public IndexStorage getIndexStorage(String indexId, TimeType timeType) {
+    return indexStorageMapper.getWithTimetype(indexId, timeType);
+  }
+
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/LimitTypeServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/LimitTypeServiceImpl.java
new file mode 100644
index 0000000..ecf0597
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/LimitTypeServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.data.model.mapper.LimitTypeMapper;
+import com.dingzhuo.energy.data.model.domain.LimitType;
+import com.dingzhuo.energy.data.model.service.ILimitTypeService;
+
+/**
+ * 鎶ヨ闄愬�肩被鍨嬬淮鎶ervice涓氬姟灞傚鐞�
+ * 
+ * @author zw
+ * @date 2020-03-07
+ */
+@Service
+public class LimitTypeServiceImpl implements ILimitTypeService 
+{
+    @Autowired
+    private LimitTypeMapper limitTypeMapper;
+
+    /**
+     * 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param id 鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     */
+    @Override
+    public LimitType selectLimitTypeById(String id)
+    {
+        return limitTypeMapper.selectLimitTypeById(id);
+    }
+
+    /**
+     * 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     */
+    @Override
+    public List<LimitType> selectLimitTypeList(LimitType limitType)
+    {
+        return limitTypeMapper.selectLimitTypeList(limitType);
+    }
+
+    /**
+     * 鏂板鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertLimitType(LimitType limitType)
+    {
+        limitType.setCreateTime(DateUtils.getNowDate());
+        return limitTypeMapper.insertLimitType(limitType);
+    }
+
+    /**
+     * 淇敼鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param limitType 鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateLimitType(LimitType limitType)
+    {
+        limitType.setUpdateTime(DateUtils.getNowDate());
+        return limitTypeMapper.updateLimitType(limitType);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteLimitTypeByIds(String[] ids)
+    {
+        return limitTypeMapper.deleteLimitTypeByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶や俊鎭�
+     * 
+     * @param id 鎶ヨ闄愬�肩被鍨嬬淮鎶D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteLimitTypeById(String id)
+    {
+        return limitTypeMapper.deleteLimitTypeById(id);
+    }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelInfoServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelInfoServiceImpl.java
new file mode 100644
index 0000000..af13fa8
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelInfoServiceImpl.java
@@ -0,0 +1,158 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementService;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelInfo;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import com.dingzhuo.energy.data.model.domain.vo.PointDataVO;
+import com.dingzhuo.energy.data.model.mapper.ModelInfoMapper;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelInfoService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 妯″瀷Service涓氬姟灞傚鐞�
+ *
+ * @author fanxinfu
+ * @date 2020-02-17
+ */
+@Service
+public class ModelInfoServiceImpl implements IModelInfoService {
+  @Autowired
+  private ModelInfoMapper modelInfoMapper;
+
+  @Autowired
+  private final IModelNodeService modelNodeService;
+
+  @Autowired
+  private final IEnergyIndexService energyIndexService;
+
+  @Autowired
+  private final IMeterImplementService meterImplementService;
+
+  public ModelInfoServiceImpl(IModelNodeService modelNodeService,
+                              IEnergyIndexService energyIndexService,
+                              IMeterImplementService meterImplementService) {
+    this.modelNodeService = modelNodeService;
+    this.energyIndexService = energyIndexService;
+    this.meterImplementService = meterImplementService;
+  }
+
+  /**
+   * 鏌ヨ妯″瀷
+   *
+   * @param modelCode 妯″瀷ID
+   * @return 妯″瀷
+   */
+  @Override
+  public ModelInfo selectModelInfoById(String modelCode) {
+    return modelInfoMapper.selectModelInfoById(modelCode);
+  }
+
+  /**
+   * 鏌ヨ妯″瀷鍒楄〃
+   *
+   * @param modelInfo 妯″瀷
+   * @return 妯″瀷
+   */
+  @Override
+  public List<ModelInfo> selectModelInfoList(ModelInfo modelInfo) {
+    return modelInfoMapper.selectModelInfoList(modelInfo);
+  }
+
+  /**
+   * 鏂板妯″瀷
+   *
+   * @param modelInfo 妯″瀷
+   * @return 缁撴灉
+   */
+  @Override
+  public int insertModelInfo(ModelInfo modelInfo) {
+    return modelInfoMapper.insertModelInfo(modelInfo);
+  }
+
+  /**
+   * 淇敼妯″瀷
+   *
+   * @param modelInfo 妯″瀷
+   * @return 缁撴灉
+   */
+  @Override
+  public int updateModelInfo(ModelInfo modelInfo) {
+    return modelInfoMapper.updateModelInfo(modelInfo);
+  }
+
+  /**
+   * 鎵归噺鍒犻櫎妯″瀷
+   *
+   * @param modelCode 闇�瑕佸垹闄ょ殑妯″瀷ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteModelInfoByCode(String modelCode) {
+    return modelInfoMapper.deleteModelInfoByCode(modelCode);
+  }
+
+  /**
+   * 鍒犻櫎妯″瀷淇℃伅
+   *
+   * @param modelCode 妯″瀷ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteModelInfoById(String modelCode) {
+    return modelInfoMapper.deleteModelInfoById(modelCode);
+  }
+
+  /**
+   * 鏍规嵁妯″瀷id鏌ヨ瀵瑰簲鐐逛綅淇℃伅
+   *
+   * @param modelId 鏌ヨ妯″瀷id
+   * @return
+   */
+  @Override
+  public List<PointDataVO> listEnergyIndexByModelId(String modelId) {
+    List<PointDataVO> voList = new ArrayList<>();
+    // 鏍规嵁id鏌ヨ涓嬬骇id涓巌ndexId
+    List<ModelNodeIndexInfor> inforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(modelId);
+    if (CollectionUtils.isEmpty(inforList)) {
+      List<ModelNodeIndexInfor> indexInforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(modelId);
+      if (CollectionUtils.isEmpty(indexInforList)) {
+        return voList;
+      }
+      inforList.addAll(indexInforList);
+    }
+    // 鍘婚櫎鎵�鏈夌偣浣峣d淇℃伅
+    List<String> indexIds = inforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+    List<EnergyIndex> energyIndexList = energyIndexService.getEnergyIndexByIds(indexIds);
+    // 鏍规嵁indexid鏌ヨ瀵瑰簲璁¢噺鍣ㄥ叿淇℃伅
+    List<String> meterIds = energyIndexList.stream().map(EnergyIndex::getMeterId).collect(Collectors.toList());
+    Map<String, List<MeterImplement>> meterImplementMap = meterImplementService.listMeterImplementByIds(meterIds).stream()
+            .filter(li -> StringUtils.isNotEmpty(li.getInstallactionLocation()))
+            .collect(Collectors.groupingBy(MeterImplement::getId));
+    for (EnergyIndex indexInfo : energyIndexList) {
+
+      PointDataVO pointData = new PointDataVO();
+      String indexName = indexInfo.getName();
+      List<MeterImplement> meterImplements = meterImplementMap.get(indexInfo.getMeterId());
+      if (CollectionUtils.isNotEmpty(meterImplements)) {
+        MeterImplement infor = meterImplements.get(0);
+        indexName = infor.getInstallactionLocation() + "_" + infor.getMeterName() + "_" + indexName;
+      }
+      pointData.setIndexName(indexName);
+      pointData.setIndexId(indexInfo.getIndexId());
+      voList.add(pointData);
+    }
+    return voList;
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelNodeServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelNodeServiceImpl.java
new file mode 100644
index 0000000..a925711
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/ModelNodeServiceImpl.java
@@ -0,0 +1,331 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy;
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.domain.TreeObject;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import com.dingzhuo.energy.data.model.mapper.ModelNodeMapper;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.apache.commons.lang3.StringUtils.equalsAnyIgnoreCase;
+import static org.apache.commons.lang3.StringUtils.isBlank;
+
+/**
+ * 妯″瀷鑺傜偣Service涓氬姟灞傚鐞�
+ *
+ * @author fanxinfu
+ * @date 2020-02-10
+ */
+@Service
+public class ModelNodeServiceImpl implements IModelNodeService {
+
+  @Autowired
+  private ModelNodeMapper modelNodeMapper;
+
+  @Autowired
+  private IEnergyIndexService energyIndexService;
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣
+   *
+   * @param nodeId 妯″瀷鑺傜偣ID
+   * @return 妯″瀷鑺傜偣
+   */
+  @Override
+  public ModelNode selectModelNodeById(String nodeId) {
+    return modelNodeMapper.selectModelNodeById(nodeId);
+  }
+
+  /**
+   * 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 妯″瀷鑺傜偣
+   */
+  @Override
+  public List<ModelNode> selectModelNodeList(ModelNode modelNode) {
+    return modelNodeMapper.selectModelNodeList(modelNode);
+  }
+
+  /**
+   * 鏂板妯″瀷鑺傜偣
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 缁撴灉
+   */
+  @Override
+  public int insertModelNode(ModelNode modelNode) {
+    int maxOrder = modelNodeMapper.getMaxOrder(modelNode.getParentId());
+    modelNode.setOrderNum(maxOrder + 1);
+    return modelNodeMapper.insertModelNode(modelNode);
+  }
+
+  /**
+   * 淇敼妯″瀷鑺傜偣
+   *
+   * @param modelNode 妯″瀷鑺傜偣
+   * @return 缁撴灉
+   */
+  @Override
+  public int updateModelNode(ModelNode modelNode) {
+    return modelNodeMapper.updateModelNode(modelNode);
+  }
+
+  /**
+   * 鎵归噺鍒犻櫎妯″瀷鑺傜偣
+   *
+   * @param nodeIds 闇�瑕佸垹闄ょ殑妯″瀷鑺傜偣ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteModelNodeByIds(String[] nodeIds) {
+    return modelNodeMapper.deleteModelNodeByIds(nodeIds);
+  }
+
+  /**
+   * 鍒犻櫎妯″瀷鑺傜偣淇℃伅
+   *
+   * @param nodeId 妯″瀷鑺傜偣ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteModelNodeById(String nodeId) {
+    return modelNodeMapper.deleteModelNodeById(nodeId);
+  }
+
+  @Override
+  public List<ModelNode> getModelNodeByModelCode(String modelCode) {
+    return modelNodeMapper.getModelNodeByModelCode(modelCode);
+  }
+
+  @Override
+  public List<TreeObject> buildModelNodeTree(List<ModelNode> modelNodes) {
+    List<ModelNode> modelNodeTree = modelNodes.stream()
+        .filter(f -> isBlank(f.getParentId()))
+        .collect(Collectors.toList());
+    for (ModelNode modelNode : modelNodeTree) {
+      List<ModelNode> children = modelNodes.stream()
+          .filter(f -> equalsAnyIgnoreCase(f.getParentId(), modelNode.getNodeId()))
+          .collect(Collectors.toList());
+      buildTree(modelNode, children, modelNodes);
+    }
+
+    return modelNodeTree.stream().map(TreeObject::new).collect(Collectors.toList());
+  }
+
+  @Override
+  public void updateOrder(String nodeId, String parentId, String[] children) {
+    modelNodeMapper.updateModelNodeParent(nodeId, parentId);
+    Map<String, Integer> orders = new HashMap<>();
+    for (int i = 0; i < children.length; i++) {
+      orders.put(children[i], i);
+    }
+    modelNodeMapper.updateModelNodeOrder(orders);
+  }
+
+  @Override
+  public boolean modelNodeHasExist(String code, String modelCode) {
+    int count = modelNodeMapper.modelNodeHasExist(code, modelCode);
+    return count > 0;
+  }
+
+  @Override
+  public boolean modelNodeHasExist(ModelNode modelNode) {
+    int count = modelNodeMapper
+        .modelNodeHasExistWhenUpdate(modelNode.getNodeId(), modelNode.getCode(),
+            modelNode.getModelCode());
+    return count > 0;
+  }
+
+  @Override
+  public boolean hasEnergyIndex(String nodeId) {
+    EnergyIndex energyIndex = new EnergyIndex();
+    energyIndex.setNodeId(nodeId);
+    List<EnergyIndex> energyIndices = energyIndexService.selectEnergyIndexList(energyIndex);
+    return energyIndices.size() > 0;
+  }
+
+  @Override
+  public void setDevice(String nodeId, String[] deviceIds) {
+    modelNodeMapper.setDevice(nodeId, deviceIds);
+  }
+
+  @Override
+  public List<MeterImplement> getSettingDevice(String nodeId) {
+    return modelNodeMapper.getSettingDevice(nodeId);
+  }
+
+  @Override
+  public List<EnergyIndex> getSettingIndex(String nodeId) {
+    return modelNodeMapper.getSettingIndex(nodeId);
+  }
+
+  @Override
+  public List<EnergyIndex> getSettingIndexByWhere(String nodeId,String indexName) {
+    return modelNodeMapper.getSettingIndexByWhere(nodeId,indexName);
+  }
+
+  @Override
+  public void delDevice(String nodeId, String[] deviceIds) {
+    if (deviceIds.length == 0) {
+      return;
+    }
+
+    modelNodeMapper.delDevice(nodeId, deviceIds);
+  }
+
+  @Override
+  public List<SysEnergy> getSettingEnergy(String nodeId) {
+    return modelNodeMapper.getSettingEnergy(nodeId);
+  }
+
+  @Override
+  public void setEnergy(String nodeId, Integer[] energyIds) {
+    modelNodeMapper.setEnergy(nodeId, energyIds);
+  }
+
+  @Override
+  public void delEnergy(String nodeId, Integer[] energyIds) {
+    if (energyIds.length == 0) {
+      return;
+    }
+
+    modelNodeMapper.delEnergy(nodeId, energyIds);
+  }
+
+  @Override
+  public List<SysProduct> getSettingProduct(String nodeId) {
+    return modelNodeMapper.getSettingProduct(nodeId);
+  }
+
+  @Override
+  public void setProduct(String nodeId, Integer[] productIds) {
+    modelNodeMapper.setProduct(nodeId, productIds);
+  }
+
+  @Override
+  public void delProduct(String nodeId, Integer[] productIds) {
+    if (productIds.length == 0) {
+      return;
+    }
+
+    modelNodeMapper.delProduct(nodeId, productIds);
+  }
+
+  @Override
+  public void setIndex(String nodeId, String indexType, String[] indexIds) {
+    modelNodeMapper.setIndex(nodeId, indexType, indexIds);
+  }
+
+  @Override
+  public void delIndex(String nodeId, String[] indexIds) {
+    if (indexIds.length == 0) {
+      return;
+    }
+
+    modelNodeMapper.delIndex(nodeId, indexIds);
+  }
+
+  @Override
+  public List<EnergyIndex> getSettingIndex(String indexType, String nodeId) {
+    return modelNodeMapper.getSettingIndexByType(indexType, nodeId);
+  }
+
+  @Override
+  public List<ModelNode> getModelNodeByNodeCodes(List<String> nodeCodes) {
+    return modelNodeMapper.getModelNodeByNodeCodes(nodeCodes);
+  }
+
+  @Override
+  public List<ModelNode> getModelNodeByModelCodeWithAuth(String modelCode, Long userId) {
+    return modelNodeMapper.getModelNodeByModelCodeWithAuth(modelCode, String.valueOf(userId));
+  }
+
+  /**
+   * 鏍规嵁nodeCode鑾峰彇瀵瑰簲鐐逛綅淇℃伅
+   *
+   * @param nodeCode
+   * @return
+   */
+  @Override
+  public List<String> listIndexIdsByModelCode(String nodeCode) {
+    // 鏍规嵁code鑾峰彇modelNode淇℃伅
+    List<ModelNode> modelNodeList = getModelNodeByModelCode(nodeCode);
+    if (CollectionUtils.isEmpty(modelNodeList)) {
+      return Collections.emptyList();
+    }
+    List<String> nodeIds = modelNodeList.stream().map(ModelNode::getNodeId).collect(Collectors.toList());
+
+    return modelNodeMapper.listIndesxByCodeList(nodeIds);
+  }
+
+  /**
+   * 鏍规嵁nodeCode鏌ヨ妯″瀷鑺傜偣涓庣偣浣峣d涔嬮棿鐨勫叧绯讳俊鎭�
+   *
+   * @param code
+   * @return
+   */
+  @Override
+  public List<ModelNodeIndexInfor> getModelNodeIndexIdRelationInforByCode(String code) {
+    return modelNodeMapper.getModelNodeIndexIdRelationInforByCode(code);
+  }
+
+  /**
+   * 鏍规嵁nodeId鏌ヨ瀵瑰簲璇︾粏淇℃伅
+   *
+   * @param nodeId
+   * @return
+   */
+  @Override
+  public List<ModelNodeIndexInfor> getModelNodeIndexIdRelationInforByNodeId(String nodeId) {
+    return modelNodeMapper.getModelNodeIndexIdRelationInforByNodeId(nodeId);
+  }
+
+  /**
+   * 鏍规嵁鐖秈d鏌ヨ璇︾粏淇℃伅
+   *
+   * @param parentId
+   * @return
+   */
+  @Override
+  public List<ModelNodeIndexInfor> listModelNodeIndexIdRelationInforByParentId(String parentId) {
+    return modelNodeMapper.listModelNodeIndexIdRelationInforByParentId(parentId);
+  }
+
+  /**
+   * 鏍规嵁code鏌ヨ鐖剁骇淇℃伅
+   *
+   * @param indexCode
+   * @return
+   */
+  @Override
+  public ModelNode getModelNodeByModelCodeByIndexCode(String indexCode) {
+    return modelNodeMapper.getModelNodeByModelCodeByIndexCode(indexCode);
+  }
+
+  private void buildTree(ModelNode parent, List<ModelNode> children, List<ModelNode> modelNodes) {
+    parent.setChildren(children);
+
+    for (ModelNode modelNode : children) {
+      List<ModelNode> tmp = modelNodes.stream()
+              .filter(f -> equalsAnyIgnoreCase(f.getParentId(), modelNode.getNodeId()))
+              .collect(Collectors.toList());
+      if (!tmp.isEmpty()) {
+        buildTree(modelNode, tmp, modelNodes);
+      }
+    }
+  }
+}
diff --git a/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/StateTypeServiceImpl.java b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/StateTypeServiceImpl.java
new file mode 100644
index 0000000..509b40a
--- /dev/null
+++ b/data-model/src/main/java/com/dingzhuo/energy/data/model/service/impl/StateTypeServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.data.model.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.data.model.domain.StateType;
+import com.dingzhuo.energy.data.model.mapper.StateTypeMapper;
+import com.dingzhuo.energy.data.model.service.IStateTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 绯荤粺鐘舵�佺淮鎶ervice涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-18
+ */
+@Service
+public class StateTypeServiceImpl implements IStateTypeService
+{
+    @Autowired
+    private StateTypeMapper stateTypeMapper;
+
+    /**
+     * 鏌ヨ绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateId 绯荤粺鐘舵�佺淮鎶D
+     * @return 绯荤粺鐘舵�佺淮鎶�
+     */
+    @Override
+    public StateType selectStateTypeById(String stateId)
+    {
+        return stateTypeMapper.selectStateTypeById(stateId);
+    }
+
+    /**
+     * 鏌ヨ绯荤粺鐘舵�佺淮鎶ゅ垪琛�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 绯荤粺鐘舵�佺淮鎶�
+     */
+    @Override
+    public List<StateType> selectStateTypeList(StateType stateType)
+    {
+        return stateTypeMapper.selectStateTypeList(stateType);
+    }
+
+    /**
+     * 鏂板绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertStateType(StateType stateType)
+    {
+        stateType.setCreateTime(DateUtils.getNowDate());
+        return stateTypeMapper.insertStateType(stateType);
+    }
+
+    /**
+     * 淇敼绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateType 绯荤粺鐘舵�佺淮鎶�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateStateType(StateType stateType)
+    {
+        stateType.setUpdateTime(DateUtils.getNowDate());
+        return stateTypeMapper.updateStateType(stateType);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎绯荤粺鐘舵�佺淮鎶�
+     * 
+     * @param stateIds 闇�瑕佸垹闄ょ殑绯荤粺鐘舵�佺淮鎶D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteStateTypeByIds(String[] stateIds)
+    {
+        return stateTypeMapper.deleteStateTypeByIds(stateIds);
+    }
+
+    /**
+     * 鍒犻櫎绯荤粺鐘舵�佺淮鎶や俊鎭�
+     * 
+     * @param stateId 绯荤粺鐘舵�佺淮鎶D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteStateTypeById(String stateId)
+    {
+        return stateTypeMapper.deleteStateTypeById(stateId);
+    }
+}
diff --git a/data-model/src/main/resources/mybatis/basicsetting/CalcFunctionMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/CalcFunctionMapper.xml
new file mode 100644
index 0000000..b953e48
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/CalcFunctionMapper.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.CalcFunctionMapper">
+
+    <resultMap type="com.dingzhuo.energy.data.model.domain.CalcFunction" id="CalcFunctionResult">
+        <result property="id" column="id"/>
+        <result property="info" column="info"/>
+        <result property="funcName" column="func_name"/>
+        <result property="funcText" column="func_text"/>
+    </resultMap>
+
+    <sql id="selectCalcFunctionVo">
+        select id, func_name, func_text, info
+        from calc_function
+    </sql>
+
+    <select id="selectCalcFunctionList" parameterType="com.dingzhuo.energy.data.model.domain.CalcFunction" resultMap="CalcFunctionResult">
+        <include refid="selectCalcFunctionVo"/>
+        <where>
+            <if test="funcName != null  and funcName != ''">and func_name like concat('%', #{funcName}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectCalcFunctionById" parameterType="String" resultMap="CalcFunctionResult">
+        <include refid="selectCalcFunctionVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertCalcFunction" parameterType="com.dingzhuo.energy.data.model.domain.CalcFunction">
+        insert into calc_function
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="funcName != null  and funcName != ''">func_name,</if>
+            <if test="funcText != null  and funcText != ''">func_text,</if>
+            <if test="info != null  and info != ''">info,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="funcName != null  and funcName != ''">#{funcName},</if>
+            <if test="funcText != null  and funcText != ''">#{funcText},</if>
+            <if test="info != null  and info != ''">#{info},</if>
+        </trim>
+    </insert>
+
+    <update id="updateCalcFunction" parameterType="com.dingzhuo.energy.data.model.domain.CalcFunction">
+        update calc_function
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="info != null  and info != ''">info = #{info},</if>
+            <if test="funcName != null  and funcName != ''">func_name = #{funcName},</if>
+            <if test="funcText != null  and funcText != ''">func_text = #{funcText},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteCalcFunctionById" parameterType="String">
+        delete
+        from calc_function
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteCalcFunctionByIds" parameterType="String">
+        delete from calc_function where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/basicsetting/DaqTemplateMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/DaqTemplateMapper.xml
new file mode 100644
index 0000000..0dce4c0
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/DaqTemplateMapper.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.DaqTemplateMapper">
+
+    <resultMap type="DaqTemplate" id="DaqTemplateResult">
+        <result property="id" column="id"/>
+        <result property="code" column="code"/>
+        <result property="name" column="name"/>
+        <result property="deviceType" column="device_type"/>
+        <result property="unit" column="unit"/>
+    </resultMap>
+
+    <sql id="selectDaqTemplateVo">
+        select id, code, name, device_type, unit
+        from daq_template
+    </sql>
+
+    <select id="selectDaqTemplateList" parameterType="DaqTemplate" resultMap="DaqTemplateResult">
+        <include refid="selectDaqTemplateVo"/>
+        <where>
+            <if test="code != null  and code != ''">and code = #{code}</if>
+            <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
+            <if test="deviceType != null  and deviceType != ''">and device_type = #{deviceType}</if>
+        </where>
+        order by device_type, code
+    </select>
+
+    <select id="selectDaqTemplateById" parameterType="String" resultMap="DaqTemplateResult">
+        <include refid="selectDaqTemplateVo"/>
+        where id = #{id}
+    </select>
+    <select id="dapHasExist" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM daq_template
+        WHERE code = #{code}
+          AND device_type = #{deviceType}
+    </select>
+    <select id="dapHasExistWhenUpdate" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM daq_template
+        WHERE code = #{code}
+          AND device_type = #{deviceType}
+          AND id != #{id}
+    </select>
+
+    <insert id="insertDaqTemplate" parameterType="DaqTemplate">
+        insert into daq_template
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="deviceType != null  and deviceType != ''">device_type,</if>
+            <if test="unit != null  and unit != ''">unit,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="deviceType != null  and deviceType != ''">#{deviceType},</if>
+            <if test="unit != null  and unit != ''">#{unit},</if>
+        </trim>
+    </insert>
+
+    <update id="updateDaqTemplate" parameterType="DaqTemplate">
+        update daq_template
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="deviceType != null  and deviceType != ''">device_type = #{deviceType},</if>
+            <if test="unit != null  and unit != ''">unit = #{unit},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDaqTemplateById" parameterType="String">
+        delete
+        from daq_template
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteDaqTemplateByIds" parameterType="String">
+        delete from daq_template where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/basicsetting/IndexFormulaMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/IndexFormulaMapper.xml
new file mode 100644
index 0000000..81140f1
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/IndexFormulaMapper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.IndexFormulaMapper">
+  <resultMap id="formulaMap" type="com.dingzhuo.energy.data.model.domain.IndexFormula">
+    <result property="id" column="id"/>
+    <result property="indexId" column="index_id"/>
+    <result property="formulaText" column="formula_text"/>
+  </resultMap>
+  <resultMap id="formulaParamMap" type="com.dingzhuo.energy.data.model.domain.IndexFormulaParam">
+    <result property="formulaId" column="formula_id"/>
+    <result property="paramName" column="param_name"/>
+    <result property="paramValue" column="param_value"/>
+  </resultMap>
+  <insert id="insertIndexFormula">
+    insert into index_formula (id, index_id, formula_text)
+    values (#{id}, #{indexId}, #{formulaText});
+  </insert>
+  <insert id="saveIndexFormulaParam">
+    delete
+    from index_formula_param
+    where index_id = #{indexId};
+    <foreach collection="indexFormulaParams" item="formulaParam" separator=";">
+      insert into index_formula_param (id, formula_id,index_id, param_name, param_value) values
+      (#{formulaParam.id}, #{formulaParam.formulaId}, #{formulaParam.indexId},
+      #{formulaParam.paramName},
+      #{formulaParam.paramValue})
+    </foreach>
+  </insert>
+  <update id="updateIndexFormula">
+    update index_formula
+    set formula_text = #{formulaText}
+    where id = #{id}
+  </update>
+  <select id="getFormula" resultMap="formulaMap">
+    select *
+    from index_formula
+    where index_id = #{indexId}
+  </select>
+  <select id="getFormulaParam" resultMap="formulaParamMap">
+    select *
+    from index_formula_param
+    where index_id = #{indexId}
+  </select>
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/basicsetting/IndexStorageMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/IndexStorageMapper.xml
new file mode 100644
index 0000000..6eaaef5
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/IndexStorageMapper.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.IndexStorageMapper">
+  <resultMap id="indexStorageMap" type="com.dingzhuo.energy.data.model.domain.IndexStorage">
+    <result property="id" column="id"/>
+    <result property="indexId" column="index_id"/>
+    <result property="timeType" column="time_type"/>
+    <result property="calcType" column="calc_type"/>
+    <result property="calcText" column="calc_text"/>
+    <result property="updateTime" column="update_time"/>
+    <result property="createTime" column="create_time"/>
+  </resultMap>
+  <insert id="insertIndexStorage">
+    insert into index_storage (id, index_id, time_type, calc_type, calc_text, create_time,
+                               update_time)
+    values (#{id}, #{indexId}, #{timeType}, #{calcType}, #{calcText}, now(), now());
+  </insert>
+  <insert id="saveParams">
+    delete from storage_parameter where storage_id = #{storageId};
+    <foreach collection="parameterIds" item="paramId" separator=";">
+      insert into storage_parameter (storage_id, index_id)
+      values (#{storageId}, #{paramId});
+    </foreach>
+  </insert>
+  <update id="updateIndexStorage">
+    update index_storage
+    set index_id    = #{indexId},
+        calc_type   = #{calcType},
+        calc_text   = #{calcText},
+        update_time = now()
+    where id = #{id};
+  </update>
+  <select id="getIndexStorage" resultMap="indexStorageMap">
+    select *
+    from index_storage
+    where index_id = #{indexId};
+  </select>
+  <select id="getAllCalcIndexStorage" resultMap="indexStorageMap">
+    select *
+    from index_storage
+    where calc_type = #{calcType}
+  </select>
+  <select id="getAllParameter"
+    resultType="com.dingzhuo.energy.data.model.domain.IndexStorageParam">
+    select storage_id as storageId, index_id as indexId
+    from storage_parameter
+  </select>
+  <select id="getWithTimetype" resultMap="indexStorageMap">
+    select *
+    from index_storage
+    where index_id = #{indexId}
+      AND time_type = #{timeType};
+  </select>
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/basicsetting/LimitTypeMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/LimitTypeMapper.xml
new file mode 100644
index 0000000..9132299
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/LimitTypeMapper.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.LimitTypeMapper">
+    
+    <resultMap type="LimitType" id="LimitTypeResult">
+        <result property="id"    column="id"    />
+        <result property="limitName"    column="limit_name"    />
+        <result property="limitCode"    column="limit_code"    />
+        <result property="colorNumber"    column="color_number"    />
+        <result property="comparatorOperator"    column="comparator_operator"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="alarmType"    column="alarm_type"    />
+    </resultMap>
+
+    <sql id="selectLimitTypeVo">
+        select id, limit_name, limit_code, color_number,comparator_operator,alarm_type,create_time, create_by, update_time, update_by from limit_type
+    </sql>
+
+    <select id="selectLimitTypeList" parameterType="LimitType" resultMap="LimitTypeResult">
+        <include refid="selectLimitTypeVo"/>
+        <where>  
+            <if test="limitName != null  and limitName != ''"> and limit_name like concat('%', #{limitName}, '%')</if>
+        </where>
+        order by limit_code
+    </select>
+    
+    <select id="selectLimitTypeById" parameterType="String" resultMap="LimitTypeResult">
+        <include refid="selectLimitTypeVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertLimitType" parameterType="LimitType">
+        insert into limit_type
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="limitName != null  and limitName != ''">limit_name,</if>
+            <if test="limitCode != null  and limitCode != ''">limit_code,</if>
+            <if test="colorNumber != null  and colorNumber != ''">color_number,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="comparatorOperator != null  and comparatorOperator != ''">comparator_operator,</if>
+            <if test="alarmType != null  and alarmType != ''">alarm_type,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="limitName != null  and limitName != ''">#{limitName},</if>
+            <if test="limitCode != null  and limitCode != ''">#{limitCode},</if>
+            <if test="colorNumber != null  and colorNumber != ''">#{colorNumber},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="comparatorOperator != null  and comparatorOperator != ''">#{comparatorOperator},</if>
+            <if test="alarmType != null  and alarmType != ''">#{alarmType},</if>
+         </trim>
+    </insert>
+
+    <update id="updateLimitType" parameterType="LimitType">
+        update limit_type
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="limitName != null  and limitName != ''">limit_name = #{limitName},</if>
+            <if test="limitCode != null  and limitCode != ''">limit_code = #{limitCode},</if>
+            <if test="colorNumber != null  and colorNumber != ''">color_number = #{colorNumber},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="comparatorOperator != null  and comparatorOperator != ''">comparator_operator = #{comparatorOperator},</if>
+            <if test="alarmType != null  and alarmType != ''">alarm_type = #{alarmType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteLimitTypeById" parameterType="String">
+        delete from limit_type where id = #{id}
+    </delete>
+
+    <delete id="deleteLimitTypeByIds" parameterType="String">
+        delete from limit_type where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/basicsetting/ModelInfoMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/ModelInfoMapper.xml
new file mode 100644
index 0000000..aa4c3fe
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/ModelInfoMapper.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.ModelInfoMapper">
+
+    <resultMap type="com.dingzhuo.energy.data.model.domain.ModelInfo" id="ModelInfoResult">
+        <result property="modelCode" column="model_code"/>
+        <result property="modelName" column="model_name"/>
+        <result property="isShow" column="is_show"/>
+        <result property="modelType" column="model_type"/>
+    </resultMap>
+
+    <sql id="selectModelInfoVo">
+        select model_code, model_name, is_show, model_type
+        from model_info
+    </sql>
+
+    <select id="selectModelInfoList" parameterType="com.dingzhuo.energy.data.model.domain.ModelInfo"
+            resultMap="ModelInfoResult">
+        <include refid="selectModelInfoVo"/>
+        <where>
+            <if test="modelCode != null  and modelCode != ''">and model_code like concat('%', #{modelCode}, '%')</if>
+            <if test="modelName != null  and modelName != ''">and model_name like concat('%', #{modelName}, '%')</if>
+            <if test="isShow != null">and is_show = #{isShow}</if>
+        </where>
+        order by model_code;
+    </select>
+
+    <select id="selectModelInfoById" parameterType="String" resultMap="ModelInfoResult">
+        <include refid="selectModelInfoVo"/>
+        where model_code = #{modelCode}
+    </select>
+
+    <insert id="insertModelInfo" parameterType="ModelInfo">
+        insert into model_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="modelCode != null  and modelCode != ''">model_code,</if>
+            <if test="modelName != null  and modelName != ''">model_name,</if>
+            <if test="modelType != null  and modelType != ''">model_type,</if>
+            is_show,
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="modelCode != null  and modelCode != ''">#{modelCode},</if>
+            <if test="modelName != null  and modelName != ''">#{modelName},</if>
+            <if test="modelType != null  and modelType != ''">#{modelType},</if>
+            1,
+        </trim>
+    </insert>
+
+    <update id="updateModelInfo" parameterType="ModelInfo">
+        update model_info
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="modelName != null  and modelName != ''">model_name = #{modelName},</if>
+            <if test="isShow != null ">is_show = #{isShow},</if>
+        </trim>
+        where model_code = #{modelCode}
+    </update>
+
+    <delete id="deleteModelInfoById" parameterType="String">
+        delete
+        from model_info
+        where model_code = #{modelCode}
+    </delete>
+
+    <delete id="deleteModelInfoByCode" parameterType="String">
+        delete
+        from model_info
+        where model_code = #{modelCode};
+    </delete>
+
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/basicsetting/ModelNodeMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/ModelNodeMapper.xml
new file mode 100644
index 0000000..ab99e87
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/ModelNodeMapper.xml
@@ -0,0 +1,344 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.ModelNodeMapper">
+
+  <resultMap type="com.dingzhuo.energy.data.model.domain.ModelNode" id="ModelNodeResult">
+    <result property="nodeId" column="node_id"/>
+    <result property="code" column="code"/>
+    <result property="name" column="name"/>
+    <result property="parentId" column="parent_id"/>
+    <result property="address" column="address"/>
+    <result property="modelCode" column="model_code"/>
+    <result property="nodeCategory" column="node_category"/>
+  </resultMap>
+
+  <sql id="selectModelNodeVo">
+    select node_id, code, name, parent_id, address, model_code, node_category
+    from model_node
+  </sql>
+
+  <select id="selectModelNodeList"
+    parameterType="com.dingzhuo.energy.data.model.domain.ModelNode"
+    resultMap="ModelNodeResult">
+    <include refid="selectModelNodeVo"/>
+    <where>
+      <if test="code != null  and code != ''">and code like concat('%', #{code}, '%')</if>
+      <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
+    </where>
+    order by order_num
+  </select>
+
+  <select id="selectModelNodeById" parameterType="String" resultMap="ModelNodeResult">
+    <include refid="selectModelNodeVo"/>
+    where node_id = #{nodeId}
+  </select>
+  <select id="getModelNodeByModelCode" resultMap="ModelNodeResult">
+    <include refid="selectModelNodeVo"/>
+    where model_code = #{modelCode}
+    order by order_num
+  </select>
+  <select id="getMaxOrder" resultType="java.lang.Integer">
+    select COALESCE(max(order_num), 0)
+    from model_node
+    where parent_id = #{parentId}
+  </select>
+  <select id="modelNodeHasExist" resultType="java.lang.Integer">
+    select count(*)
+    from model_node
+    where code = #{code}
+      and model_code = #{modelCode};
+  </select>
+  <select id="modelNodeHasExistWhenUpdate" resultType="java.lang.Integer">
+    select count(*)
+    from model_node
+    where code = #{code}
+      and model_code = #{modelCode}
+      AND node_id != #{nodeId};
+  </select>
+  <select id="getSettingDevice"
+    resultType="com.dingzhuo.energy.basic.data.meter.domain.MeterImplement">
+    select id, code, meter_name as meterName
+    from meter_implement m
+           left join node_device nd on m.id = nd.device_id
+    where nd.node_id = #{nodeId};
+  </select>
+  <select id="getSettingIndex"
+    resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
+    select ei.index_id as indexId, code, name, index_type as indexType
+    from energy_index ei
+           left join node_index ni on ei.index_id = ni.index_id
+    where ni.node_id = #{nodeId}
+  </select>
+  <select id="getSettingEnergy"
+    resultType="com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy">
+    select enerid, enersno, enername
+    from sys_energy e
+           left join node_energy ne on e.enerid = ne.energy_id
+    where ne.node_id = #{nodeId};
+  </select>
+  <select id="getSettingProduct"
+    resultType="com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct">
+    select productid, productsno, productname
+    from sys_product p
+           left join node_product np on p.productid = np.product_id
+    where np.node_id = #{nodeId};
+  </select>
+  <select id="getSettingIndexByType"
+    resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
+    select ei.index_id as indexId, code, name, index_type as indexType
+    from energy_index ei
+           left join node_index ni on ei.index_id = ni.index_id
+    where ni.node_id = #{nodeId}
+      and ei.index_type = #{indexType}
+  </select>
+  <select id="getModelNodeByNodeCodes" resultMap="ModelNodeResult">
+    <include refid="selectModelNodeVo"/>
+    where code in
+    <foreach item="nodeCode" collection="list" open="(" separator="," close=")">
+      #{nodeCode}
+    </foreach>
+    order by order_num
+  </select>
+  <select id="getModelNodeByModelCodeWithAuth" resultMap="ModelNodeResult">
+    <include refid="selectModelNodeVo"/>
+    where model_code = #{modelCode}
+    and (
+      node_id in (
+        select node_id from data_auth_user where user_id = #{userId} and model_code = #{modelCode}
+      )
+      or node_id in (
+        select node_id from data_auth_role where role_id in (
+          select cast(r.role_id as varchar) from sys_role r
+          left join sys_user_role ur on ur.role_id = r.role_id
+          left join sys_user u on u.user_id = ur.user_id
+          where cast(u.user_id as VARCHAR) = #{userId}
+        ) and model_code = #{modelCode}
+      )
+    )
+    order by order_num
+  </select>
+
+  <insert id="insertModelNode"
+    parameterType="com.dingzhuo.energy.data.model.domain.ModelNode">
+    insert into model_node
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="nodeId != null  and nodeId != ''">node_id,</if>
+      <if test="code != null  and code != ''">code,</if>
+      <if test="name != null  and name != ''">name,</if>
+      <if test="parentId != null  and parentId != ''">parent_id,</if>
+      <if test="address != null  and address != ''">address,</if>
+      <if test="modelCode != null  and modelCode != ''">model_code,</if>
+      <if test="nodeCategory != null  and nodeCategory != ''">node_category,</if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="nodeId != null  and nodeId != ''">#{nodeId},</if>
+      <if test="code != null  and code != ''">#{code},</if>
+      <if test="name != null  and name != ''">#{name},</if>
+      <if test="parentId != null  and parentId != ''">#{parentId},</if>
+      <if test="address != null  and address != ''">#{address},</if>
+      <if test="modelCode != null  and modelCode != ''">#{modelCode},</if>
+      <if test="nodeCategory != null  and nodeCategory != ''">#{nodeCategory},</if>
+    </trim>
+  </insert>
+  <insert id="setDevice">
+    delete
+    from node_device
+    where node_id = #{nodeId};
+    <foreach collection="deviceIds" item="deviceId" separator=";">
+      insert into node_device (node_id, device_id)
+      values (#{nodeId}, #{deviceId})
+    </foreach>
+  </insert>
+  <insert id="setEnergy">
+    delete
+    from node_energy
+    where node_id = #{nodeId};
+    <foreach collection="energyIds" item="energyId" separator=";">
+      insert into node_energy (node_id, energy_id)
+      values (#{nodeId}, #{energyId})
+    </foreach>
+  </insert>
+  <insert id="setProduct">
+    delete
+    from node_product
+    where node_id = #{nodeId};
+    <foreach collection="productIds" item="productId" separator=";">
+      insert into node_product (node_id, product_id)
+      values (#{nodeId}, #{productId})
+    </foreach>
+  </insert>
+
+  <update id="updateModelNode"
+    parameterType="com.dingzhuo.energy.data.model.domain.ModelNode">
+    update model_node
+    <trim prefix="SET" suffixOverrides=",">
+      <if test="code != null  and code != ''">code = #{code},</if>
+      <if test="name != null  and name != ''">name = #{name},</if>
+      <if test="parentId != null  and parentId != ''">parent_id = #{parentId},</if>
+      <if test="address != null  and address != ''">address = #{address},</if>
+      <if test="modelCode != null  and modelCode != ''">model_code = #{modelCode},</if>
+      <if test="nodeCategory != null and nodeCategory != ''">node_category = #{nodeCategory},</if>
+    </trim>
+    where node_id = #{nodeId}
+  </update>
+  <update id="updateModelNodeParent">
+    update model_node
+    set parent_id = #{parentId}
+    where node_id = #{nodeId};
+
+    update model_node
+    set address = replace(address, (select address from model_node where node_id = #{nodeId}),
+                          (select address ||
+                                  (select code from model_node where node_id = #{nodeId}) ||
+                                  ','
+                           from model_node
+                           where node_id = #{parentId}))
+    where parent_id = #{nodeId}
+       or node_id = #{nodeId};
+  </update>
+  <update id="updateModelNodeOrder">
+    <foreach collection="orders" index="id" item="order" separator=";">
+      update model_node
+      set order_num = #{order}
+      where node_id = #{id}
+    </foreach>
+  </update>
+  <update id="setIndex">
+    delete
+    from node_index
+    where node_id = #{nodeId} and index_id in (select ni.index_id
+    from node_index ni left join energy_index ei on ni.index_id = ei.index_id
+    where node_id = #{nodeId} and ei.index_type = #{indexType});
+    <foreach collection="indexIds" item="indexId" separator=";">
+      insert into node_index (node_id, index_id)
+      values (#{nodeId}, #{indexId})
+    </foreach>
+  </update>
+
+  <delete id="deleteModelNodeById" parameterType="String">
+    delete
+    from model_node
+    where node_id = #{nodeId}
+  </delete>
+
+  <delete id="deleteModelNodeByIds" parameterType="String">
+    delete from model_node where node_id in
+    <foreach item="nodeId" collection="array" open="(" separator="," close=")">
+      #{nodeId}
+    </foreach>
+  </delete>
+  <delete id="delDevice">
+    delete
+    from node_device
+    where node_id = #{nodeId} and device_id in
+    <foreach item="deviceId" collection="deviceIds" open="(" separator="," close=")">
+      #{deviceId}
+    </foreach>
+  </delete>
+  <delete id="delEnergy">
+    delete
+    from node_energy
+    where node_id = #{nodeId} and energy_id in
+    <foreach item="energyId" collection="energyIds" open="(" separator="," close=")">
+      #{energyId}
+    </foreach>
+  </delete>
+  <delete id="delProduct">
+    delete
+    from node_product
+    where node_id = #{nodeId} and product_id in
+    <foreach item="productId" collection="productIds" open="(" separator="," close=")">
+      #{productId}
+    </foreach>
+  </delete>
+  <delete id="delIndex">
+    delete
+    from node_index
+    where node_id = #{nodeId} and index_id in
+    <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+  </delete>
+
+  <select id="getSettingIndexByWhere"
+          resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
+    select ei.index_id as indexId, code, name, index_type as indexType
+    from energy_index ei
+           left join node_index ni on ei.index_id = ni.index_id
+    where ni.node_id = #{nodeId}
+    <if test="indexName!=null and indexName!=''">
+      and ei.name like concat('%', #{indexName}, '%')
+    </if>
+  </select>
+
+  <select id="listIndesxByCodeList" resultType="java.lang.String">
+    SELECT
+      index_id
+    FROM
+      "node_index"
+    WHERE
+      node_id IN
+    <foreach item="nodeId" collection="nodeIds" open="(" separator="," close=")">
+      #{nodeId}
+    </foreach>
+  </select>
+
+  <select id="getModelNodeIndexIdRelationInforByCode"
+          resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
+    SELECT
+      mn.node_id nodeId,
+      mn."name" name,
+      ni.index_id indexId
+    FROM
+      "model_node" mn
+      LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
+    WHERE
+      mn.model_code = #{code}
+      AND   mn.parent_id IS NOT NULL
+  </select>
+
+  <select id="listModelNodeIndexIdRelationInforByParentId" resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
+    SELECT
+      mn.node_id nodeId,
+      mn."name" name,
+      ni.index_id indexId
+    FROM
+      "model_node" mn
+      LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
+    WHERE
+      mn.parent_id = #{parentId}
+  </select>
+
+  <select id="getModelNodeIndexIdRelationInforByNodeId"
+          resultType="com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor">
+    SELECT
+      mn.node_id nodeId,
+      mn."name" name,
+      ni.index_id indexId
+    FROM
+      "model_node" mn
+      LEFT JOIN "node_index" ni ON mn.node_id = ni.node_id
+    WHERE
+      mn.node_id = #{nodeId}
+  </select>
+
+  <select id="getModelNodeByModelCodeByIndexCode" resultType="com.dingzhuo.energy.data.model.domain.ModelNode">
+    SELECT
+      node_id nodeId,
+      code,
+      "name",
+      parent_id parentId,
+      address,
+      model_code modelCode,
+      node_category nodeCategory
+    FROM
+      "model_node"
+    WHERE
+      model_code = #{indexCode}
+      AND parent_id IS NULL
+      LIMIT 1;
+  </select>
+
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/basicsetting/StateTypeMapper.xml b/data-model/src/main/resources/mybatis/basicsetting/StateTypeMapper.xml
new file mode 100644
index 0000000..1e9ee6f
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/basicsetting/StateTypeMapper.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.StateTypeMapper">
+    
+    <resultMap type="StateType" id="StateTypeResult">
+        <result property="stateId"    column="state_id"    />
+        <result property="stateName"    column="state_name"    />
+        <result property="stateCode"    column="state_code"    />
+        <result property="colorNumber"    column="color_number"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+    </resultMap>
+
+    <sql id="selectStateTypeVo">
+        select state_id, state_name, state_code, color_number, create_time, create_by, update_time, update_by from state_type
+    </sql>
+
+    <select id="selectStateTypeList" parameterType="StateType" resultMap="StateTypeResult">
+        <include refid="selectStateTypeVo"/>
+        <where>  
+            <if test="stateName != null  and stateName != ''"> and state_name like concat('%', #{stateName}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectStateTypeById" parameterType="String" resultMap="StateTypeResult">
+        <include refid="selectStateTypeVo"/>
+        where state_id = #{stateId}
+    </select>
+        
+    <insert id="insertStateType" parameterType="StateType">
+        insert into state_type
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="stateId != null  and stateId != ''">state_id,</if>
+            <if test="stateName != null  and stateName != ''">state_name,</if>
+            <if test="stateCode != null  and stateCode != ''">state_code,</if>
+            <if test="colorNumber != null  and colorNumber != ''">color_number,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="stateId != null  and stateId != ''">#{stateId},</if>
+            <if test="stateName != null  and stateName != ''">#{stateName},</if>
+            <if test="stateCode != null  and stateCode != ''">#{stateCode},</if>
+            <if test="colorNumber != null  and colorNumber != ''">#{colorNumber},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+         </trim>
+    </insert>
+
+    <update id="updateStateType" parameterType="StateType">
+        update state_type
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="stateName != null  and stateName != ''">state_name = #{stateName},</if>
+            <if test="stateCode != null  and stateCode != ''">state_code = #{stateCode},</if>
+            <if test="colorNumber != null  and colorNumber != ''">color_number = #{colorNumber},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+        </trim>
+        where state_id = #{stateId}
+    </update>
+
+    <delete id="deleteStateTypeById" parameterType="String">
+        delete from state_type where state_id = #{stateId}
+    </delete>
+
+    <delete id="deleteStateTypeByIds" parameterType="String">
+        delete from state_type where state_id in 
+        <foreach item="stateId" collection="array" open="(" separator="," close=")">
+            #{stateId}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/data-model/src/main/resources/mybatis/dataAuth/DataAuthMapper.xml b/data-model/src/main/resources/mybatis/dataAuth/DataAuthMapper.xml
new file mode 100644
index 0000000..0c052f7
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/dataAuth/DataAuthMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.DataAuthMapper">
+  <update id="setUserDataAuth">
+    delete
+    from data_auth_user
+    where user_id = #{id}
+    and model_code = #{modelCode};
+    <foreach collection="ids" item="authId" separator=";">
+      insert into data_auth_user (user_id, node_id, model_code)
+      values (#{id},#{authId},#{modelCode})
+    </foreach>
+  </update>
+  <update id="setRoleDataAuth">
+    delete
+    from data_auth_role
+    where role_id = #{id}
+    and model_code = #{modelCode};
+    <foreach collection="ids" item="authId" separator=";">
+      insert into data_auth_role (role_id, node_id, model_code)
+      values (#{id},#{authId},#{modelCode})
+    </foreach>
+  </update>
+  <select id="getUserDataAuth" resultType="java.lang.String">
+    select node_id
+    from data_auth_user
+    where user_id = #{id}
+      and model_code = #{modelCode};
+  </select>
+  <select id="getRoleDataAuth" resultType="java.lang.String">
+    select node_id
+    from data_auth_role
+    where role_id = #{id}
+      and model_code = #{modelCode};
+  </select>
+</mapper>
diff --git a/data-model/src/main/resources/mybatis/energyindex/EnergyIndexMapper.xml b/data-model/src/main/resources/mybatis/energyindex/EnergyIndexMapper.xml
new file mode 100644
index 0000000..31c260e
--- /dev/null
+++ b/data-model/src/main/resources/mybatis/energyindex/EnergyIndexMapper.xml
@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.model.mapper.EnergyIndexMapper">
+
+  <resultMap type="EnergyIndex" id="EnergyIndexResult">
+    <result property="indexId" column="index_id"/>
+    <result property="name" column="name"/>
+    <result property="code" column="code"/>
+    <result property="indexType" column="index_type"/>
+    <result property="indexCategory" column="index_category"/>
+    <result property="remark" column="remark"/>
+    <result property="unitId" column="unit_id"/>
+    <result property="meterId" column="meter_id"/>
+    <result property="orderNum" column="order_num"/>
+    <result property="equipment" column="equipment"/>
+    <result property="energyId" column="energy_id"/>
+    <result property="meterName" column="meter_name"/>
+  </resultMap>
+
+  <sql id="selectEnergyIndexVo">
+    select index_id,
+           name,
+           code,
+           index_type,
+           index_category,
+           remark,
+           unit_id,
+           meter_id,
+           order_num,
+           equipment,
+           energy_id
+    from energy_index
+  </sql>
+
+  <select id="selectEnergyIndexList" parameterType="EnergyIndex" resultMap="EnergyIndexResult">
+    select ni.index_id, name, code, index_type, remark, unit_id, index_category
+    from energy_index ei left join node_index ni on ei.index_id = ni.index_id
+    <where>
+      <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
+      <if test="code != null  and code != ''">and code like concat('%', #{code}, '%')</if>
+      <if test="indexType != null">and index_type = #{indexType}</if>
+      <if test="nodeId != null  and nodeId != ''">and node_id = #{nodeId}</if>
+      <if test="indexCategory != null  and indexCategory != ''">and index_category =
+        #{indexCategory}
+      </if>
+    </where>
+    order by ei.order_num
+  </select>
+
+  <select id="selectEnergyIndexById" parameterType="String" resultMap="EnergyIndexResult">
+    <include refid="selectEnergyIndexVo"/>
+    where index_id = #{indexId}
+    order by order_num
+  </select>
+
+  <select id="selectEnergyIndexByIds" resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
+    <include refid="selectEnergyIndexVo"/>
+    where
+        index_id IN
+        <foreach collection="list" item="indexId" open="(" separator="," close=")">
+          #{indexId}
+        </foreach>
+  </select>
+
+  <select id="energyIndexHasExist" resultType="java.lang.Integer">
+    select count(*)
+    from energy_index
+    where code = #{code};
+  </select>
+  <select id="energyIndexHasExistWhenUpdate" resultType="java.lang.Integer">
+    select count(*)
+    from energy_index
+    where code = #{code}
+      AND index_id != #{indexId};
+  </select>
+  <select id="getMeterIndex" resultMap="EnergyIndexResult">
+    <include refid="selectEnergyIndexVo"/>
+    where meter_id = #{meterId}
+    order by order_num
+  </select>
+  <select id="modelHasConfig" resultType="java.lang.Integer">
+    select count(*)
+    from model_node
+    where model_code = #{modelCode};
+  </select>
+  <select id="selectCollectIndex" resultMap="EnergyIndexResult">
+    <include refid="selectEnergyIndexVo"/>
+    where meter_id = #{deviceId}
+    order by order_num
+  </select>
+  <select id="getEnergyIndexByIds" resultMap="EnergyIndexResult">
+    <include refid="selectEnergyIndexVo"/>
+    where index_id in
+    <foreach item="indexId" collection="list" open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+    order by order_num
+  </select>
+  <select id="getEnergyIndexByCodes" resultMap="EnergyIndexResult">
+    <include refid="selectEnergyIndexVo"/>
+    where code in
+    <foreach item="indexCode" collection="list" open="(" separator="," close=")">
+      #{indexCode}
+    </foreach>
+    order by order_num
+  </select>
+  <select id="getIndexByNodeAndChildrenNode" resultMap="EnergyIndexResult">
+    select ei.*
+    from energy_index ei
+           left join node_index ni on ei.index_id = ni.index_id
+    where ni.node_id in (select node_id
+                         from model_node
+                         where address like (select address
+                                             from model_node
+                                             where node_id = #{nodeId}) || '%')
+    order by ei.order_num
+  </select>
+  <select id="searchIndexByNodeAndChildrenNode" resultMap="EnergyIndexResult">
+    select ei.*
+    from energy_index ei
+           left join node_index ni on ei.index_id = ni.index_id
+    where ni.node_id in (select node_id
+                         from model_node
+                         where address like (select address
+                                             from model_node
+                                             where node_id = #{nodeId}) || '%')
+      and (ei.code like concat('%', #{filter}, '%') or ei.name like concat('%', #{filter}, '%'))
+    order by ei.order_num
+  </select>
+  <select id="selectEnergyIndex" resultMap="EnergyIndexResult">
+    select ni.index_id, name, code, index_type, remark, unit_id, index_category
+    from energy_index ei left join node_index ni on ei.index_id = ni.index_id
+    <where>
+      <if test="codeOrName != null  and codeOrName != ''">and (name like concat('%', #{codeOrName},
+        '%') or code like concat('%', #{codeOrName}, '%'))
+      </if>
+      <if test="nodeId != null  and nodeId != ''">and node_id = #{nodeId}</if>
+      <if test="indexType != null">and index_type = #{indexType}</if>
+      <if test="indexCategory != null  and indexCategory != ''">and index_category =
+        #{indexCategory}
+      </if>
+    </where>
+    order by ei.order_num
+  </select>
+
+  <insert id="insertEnergyIndex" parameterType="EnergyIndex">
+    insert into energy_index
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">index_id,</if>
+      <if test="energyIndex.name != null  and energyIndex.name != ''">name,</if>
+      <if test="energyIndex.code != null  and energyIndex.code != ''">code,</if>
+      <if test="energyIndex.indexType != null">index_type,</if>
+      <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
+        index_category,
+      </if>
+      <if test="energyIndex.remark != null  and energyIndex.remark != ''">remark,</if>
+      <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">unit_id,</if>
+      <if test="energyIndex.orderNum != null">order_num,</if>
+      <if test="energyIndex.equipment != null">equipment,</if>
+      <if test="energyIndex.energyId != null">energy_id,</if>
+    </trim>
+    <trim prefix="values (" suffix=");" suffixOverrides=",">
+      <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">
+        #{energyIndex.indexId},
+      </if>
+      <if test="energyIndex.name != null  and energyIndex.name != ''">#{energyIndex.name},</if>
+      <if test="energyIndex.code != null  and energyIndex.code != ''">#{energyIndex.code},</if>
+      <if test="energyIndex.indexType != null">
+        #{energyIndex.indexType},
+      </if>
+      <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
+        #{energyIndex.indexCategory},
+      </if>
+      <if test="energyIndex.remark != null  and energyIndex.remark != ''">#{energyIndex.remark},
+      </if>
+      <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">#{energyIndex.unitId},
+      </if>
+      <if test="energyIndex.orderNum != null">#{energyIndex.orderNum},
+      </if>
+      <if test="energyIndex.equipment != null">#{energyIndex.equipment},
+      </if>
+      <if test="energyIndex.energyId != null">#{energyIndex.energyId},
+      </if>
+    </trim>
+    insert into node_index (node_id, index_id) values (#{nodeId}, #{energyIndex.indexId});
+  </insert>
+  <insert id="insertEnergyIndices">
+    <foreach collection="list" item="energyIndex" separator=";">
+      insert into energy_index
+      <trim prefix="(" suffix=")" suffixOverrides=",">
+        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">index_id,</if>
+        <if test="energyIndex.name != null  and energyIndex.name != ''">name,</if>
+        <if test="energyIndex.code != null  and energyIndex.code != ''">code,</if>
+        <if test="energyIndex.indexType != null">index_type,</if>
+        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
+          index_category,
+        </if>
+        <if test="energyIndex.remark != null  and energyIndex.remark != ''">remark,</if>
+        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">unit_id,</if>
+        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">meter_id,</if>
+        <if test="energyIndex.orderNum != null">order_num,</if>
+      </trim>
+      <trim prefix="values (" suffix=")" suffixOverrides=",">
+        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">
+          #{energyIndex.indexId},
+        </if>
+        <if test="energyIndex.name != null  and energyIndex.name != ''">#{energyIndex.name},</if>
+        <if test="energyIndex.code != null  and energyIndex.code != ''">#{energyIndex.code},</if>
+        <if test="energyIndex.indexType != null">
+          #{energyIndex.indexType},
+        </if>
+        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
+          #{energyIndex.indexCategory},
+        </if>
+        <if test="energyIndex.remark != null  and energyIndex.remark != ''">#{energyIndex.remark},
+        </if>
+        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">#{energyIndex.unitId},
+        </if>
+        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">
+          #{energyIndex.meterId},
+        </if>
+        <if test="energyIndex.orderNum != null">#{energyIndex.orderNum},</if>
+      </trim>
+    </foreach>
+  </insert>
+  <insert id="saveEnergyIndex">
+    <foreach collection="list" item="energyIndex" separator=";">
+      insert into energy_index
+      <trim prefix="(" suffix=")" suffixOverrides=",">
+        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">index_id,</if>
+        <if test="energyIndex.name != null  and energyIndex.name != ''">name,</if>
+        <if test="energyIndex.code != null  and energyIndex.code != ''">code,</if>
+        <if test="energyIndex.indexType != null">index_type,</if>
+        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
+          index_category,
+        </if>
+        <if test="energyIndex.remark != null  and energyIndex.remark != ''">remark,</if>
+        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">unit_id,</if>
+        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">meter_id,</if>
+        <if test="energyIndex.orderNum != null">order_num,</if>
+      </trim>
+      <trim prefix="values (" suffix=")" suffixOverrides=",">
+        <if test="energyIndex.indexId != null  and energyIndex.indexId != ''">
+          #{energyIndex.indexId},
+        </if>
+        <if test="energyIndex.name != null  and energyIndex.name != ''">#{energyIndex.name},</if>
+        <if test="energyIndex.code != null  and energyIndex.code != ''">#{energyIndex.code},</if>
+        <if test="energyIndex.indexType != null">
+          #{energyIndex.indexType},
+        </if>
+        <if test="energyIndex.indexCategory != null  and energyIndex.indexCategory != ''">
+          #{energyIndex.indexCategory},
+        </if>
+        <if test="energyIndex.remark != null  and energyIndex.remark != ''">#{energyIndex.remark},
+        </if>
+        <if test="energyIndex.unitId != null  and energyIndex.unitId != ''">#{energyIndex.unitId},
+        </if>
+        <if test="energyIndex.meterId != null  and energyIndex.meterId != ''">
+          #{energyIndex.meterId},
+        </if>
+        <if test="energyIndex.orderNum != null">#{energyIndex.orderNum},</if>
+      </trim>
+      ;
+      insert into node_index (node_id, index_id) values (#{energyIndex.nodeId},
+      #{energyIndex.indexId});
+    </foreach>
+  </insert>
+
+  <update id="updateEnergyIndex" parameterType="EnergyIndex">
+    update energy_index
+    <trim prefix="SET" suffixOverrides=",">
+      <if test="name != null  and name != ''">name = #{name},</if>
+      <if test="code != null  and code != ''">code = #{code},</if>
+      <if test="indexType != null">index_type = #{indexType},</if>
+      <if test="indexCategory != null  and indexCategory != ''">index_category = #{indexCategory},
+      </if>
+      <if test="remark != null  and remark != ''">remark = #{remark},</if>
+      <if test="unitId != null  and unitId != ''">unit_id = #{unitId},</if>
+      <if test="orderNum != null">order_num = #{orderNum},</if>
+      <if test="equipment != null">equipment = #{equipment},</if>
+      <if test="energyId != null">energy_id=#{energyId},</if>
+    </trim>
+    where index_id = #{indexId}
+  </update>
+
+  <delete id="deleteEnergyIndexByIds" parameterType="String">
+    delete from energy_index where index_id in
+    <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
+      #{indexId}
+    </foreach>;
+    delete from node_index where node_id = #{nodeId} and index_id in
+    <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
+      #{indexId}
+    </foreach>;
+  </delete>
+  <delete id="deleteIndexByMeterId">
+    delete
+    from energy_index
+    where meter_id = #{meterId}
+  </delete>
+  <delete id="removeNodeIndex">
+    delete from node_index where node_id = #{nodeId} and index_id in
+    <foreach item="indexId" collection="indexIds" open="(" separator="," close=")">
+      #{indexId}
+    </foreach>;
+  </delete>
+
+  <select id="getEnergyIndexMeterByCodes" resultMap="EnergyIndexResult">
+    select ei.index_id,
+        ei.name,
+        ei.code,
+        ei.index_type,
+        ei.index_category,
+        ei.remark,
+        ei.unit_id,
+        ei.meter_id,
+        ei.order_num,
+        ei.equipment,
+        ei.energy_id,
+        meter_name
+        from energy_index as ei,meter_implement as me
+    where ei.code in
+    <foreach item="indexCode" collection="list" open="(" separator="," close=")">
+      #{indexCode}
+    </foreach>
+    and ei.meter_id = me.id
+    order by ei.order_num
+  </select>
+
+</mapper>
diff --git a/data-monitoring/pom.xml b/data-monitoring/pom.xml
new file mode 100644
index 0000000..e622472
--- /dev/null
+++ b/data-monitoring/pom.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>data-monitoring</artifactId>
+  <dependencies>
+      <dependency>
+          <groupId>com.dingzhuo</groupId>
+          <artifactId>basic</artifactId>
+          <version>${project.version}</version>
+      </dependency>
+      <dependency>
+          <groupId>cn.hutool</groupId>
+          <artifactId>hutool-core</artifactId>
+          <version>5.3.8</version>
+      </dependency>
+      <dependency>
+          <groupId>com.dingzhuo</groupId>
+          <artifactId>data-model</artifactId>
+          <version>1.0.0</version>
+          <scope>compile</scope>
+      </dependency>
+      <dependency>
+          <groupId>com.dingzhuo</groupId>
+          <artifactId>data-service</artifactId>
+          <version>1.0.0</version>
+          <scope>compile</scope>
+      </dependency>
+  </dependencies>
+</project>
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/AlarmItemController.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/AlarmItemController.java
new file mode 100644
index 0000000..f5f379b
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/AlarmItemController.java
@@ -0,0 +1,139 @@
+package com.dingzhuo.energy.data.monitoring.alarm.controller;
+
+import java.util.List;
+import java.util.Map;
+
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IAlarmItemService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 棰勬姤璀﹁缃瓹ontroller
+ *
+ * @author sys
+ * @date 2020-03-02
+ */
+@RestController
+@RequestMapping("/system/alarmitem")
+public class AlarmItemController extends BaseController {
+
+    @Autowired
+    private IAlarmItemService alarmItemService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    /**
+     * 鏌ヨ棰勬姤璀﹁缃垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(AlarmItem alarmItem) {
+        startPage();
+        List<AlarmItem> list = alarmItemService.selectAlarmItemList(alarmItem);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭棰勬姤璀﹁缃垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:export')")
+    @Log(title = "棰勬姤璀﹁缃�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(AlarmItem alarmItem) {
+        List<AlarmItem> list = alarmItemService.selectAlarmItemList(alarmItem);
+        ExcelUtil<AlarmItem> util = new ExcelUtil<AlarmItem>(AlarmItem.class);
+        return util.exportExcel(list, "set");
+    }
+
+    /**
+     * 鑾峰彇棰勬姤璀﹁缃缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return AjaxResult.success(alarmItemService.selectAlarmItemById(id));
+    }
+
+    /**
+     * 鏂板棰勬姤璀﹁缃�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:add')")
+    @Log(title = "棰勬姤璀﹁缃�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody AlarmItem alarmItem) {
+        return toAjax(alarmItemService.insertAlarmItem(alarmItem));
+    }
+
+    /**
+     * 淇敼棰勬姤璀﹁缃惎鍋滅姸鎬�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:edit')")
+    @Log(title = "棰勬姤璀﹁缃�", businessType = BusinessType.UPDATE)
+    @PostMapping(value = "/startstop/{flag}")
+    public AjaxResult edit(@PathVariable String flag, @RequestBody String[] ids) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String username = loginUser.getUsername();
+        return toAjax(alarmItemService.updateStartStop(ids, flag, username));
+    }
+
+    /**
+     * 鍒犻櫎棰勬姤璀﹁缃�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:remove')")
+    @Log(title = "棰勬姤璀﹁缃�", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(alarmItemService.deleteAlarmItemByIds(ids));
+    }
+
+    /**
+     * 鑾峰彇棰勬姤璀﹁缃缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:query1')")
+    @GetMapping(value = "/getSettingInfo/{id}")
+    public AjaxResult getSettingInfo(@PathVariable("id") String id) {
+        return AjaxResult.success(alarmItemService.selectAlarmItemtingById(id));
+    }
+
+    /**
+     * 鑾峰彇涓昏〃姣忚鍚仠鐘舵�佸��
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:query1')")
+    @GetMapping(value = "/getStartStop/{indexid}")
+    public AjaxResult getStartStop(@PathVariable("indexid") String indexid) {
+        return AjaxResult.success(alarmItemService.getStartStop(indexid));
+    }
+
+    /**
+     * 淇敼寮瑰嚭妗嗛檺鍊�
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:edit')")
+    @Log(title = "淇敼寮瑰嚭妗嗛檺鍊�", businessType = BusinessType.UPDATE)
+    @PutMapping(value = "/editLimitVal")
+    public AjaxResult editLimitVal(@RequestBody List<Map<String, Object>> listMap) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String username = loginUser.getUsername();
+        return toAjax(alarmItemService.updateLimitVal(listMap, username));
+    }
+
+    /**
+     * 鏌ヨ棰刬d涓嬭缃檺鍊肩殑鏁伴噺
+     */
+    @PreAuthorize("@ss.hasPermi('system:alarmitem:query1')")
+    @GetMapping(value = "/getSettingCount/{id}")
+    public AjaxResult getSettingCount(@PathVariable("id") String[] id) {
+        return AjaxResult.success(alarmItemService.getSettingCount(id));
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/HistoryAlarmController.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/HistoryAlarmController.java
new file mode 100644
index 0000000..4fd4b2b
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/HistoryAlarmController.java
@@ -0,0 +1,178 @@
+package com.dingzhuo.energy.data.monitoring.alarm.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.DaqTemplate;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.HistoryTable;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkHistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.HistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IHistoryAlarmService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鎶ヨ鐩戞祴 涓�  鍘嗗彶鎶ヨ鐩戞祴 Controller
+ *
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+@Api(value = "鎶ヨ妫�娴嬧�斿巻鍙叉姤璀︽娴�",tags = {"鎶ヨ妫�娴�"})
+@RestController
+@RequestMapping("/energyAlarm/historicalAlarm")
+public class HistoryAlarmController extends BaseController
+{
+    @Autowired
+    private IHistoryAlarmService iHistoryAlarmService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+
+    /**
+     * 鍘嗗彶鎶ヨ 椤甸潰 鏍规嵁 鑺傜偣鐩綍鍜� 鏉′欢鏌ヨ
+     */
+    @ApiOperation("鍘嗗彶鎶ヨ鏌ヨ")
+//    @PreAuthorize("@ss.hasPermi('energyAlarm:historicalAlarm:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(JkHistoryAlarm jkHistoryAlarm)
+    {
+        startPage();
+        List<JkHistoryAlarm> list = iHistoryAlarmService.selectJkHistoryAlarmList(jkHistoryAlarm);
+        return getDataTable(list);
+    }
+    /**
+     * 瀵煎嚭鍘嗗彶鎶ヨ鐩戞帶鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energyAlarm:historicalAlarm:export')")
+    @Log(title = "鍘嗗彶鎶ヨ", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(JkHistoryAlarm jkHistoryAlarm)
+    {
+        List<JkHistoryAlarm> list = iHistoryAlarmService.selectJkHistoryAlarmListExcel(jkHistoryAlarm);
+        ExcelUtil<JkHistoryAlarm> util = new ExcelUtil<JkHistoryAlarm>(JkHistoryAlarm.class);
+        return util.exportExcel(list, "alarm");
+    }
+
+    /**
+     * 鍘嗗彶鎶ヨ 缁勪欢 鍘嗗彶鏁版嵁鑾峰彇
+     */
+    @ApiOperation("鍘嗗彶鎶ヨ鏁版嵁鏌ヨ")
+    @PreAuthorize("@ss.hasPermi('energyAlarm:realTimeAlarm:list')")
+    @GetMapping("/historyData/{code}/{start}/{end}/{pointCount}")
+    public AjaxResult historyDataList(@PathVariable("code") String code, @PathVariable("start") String start, @PathVariable("end") String end, @PathVariable("pointCount") String pointCount)
+    {
+        int count = Integer.parseInt(pointCount);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date sdate = null;
+        Date edate = null;
+        try {
+            sdate = formatter.parse(start);
+            edate = formatter.parse(end);
+            List<TagValue> TagValuelist = realtimeDatabaseService.retrieve(code,sdate,edate, RetrievalModes.BestFit,count);
+            System.out.println("TagValuelist>>>>>>>>>"+TagValuelist);
+            System.out.println("TagValuelist size>>>>>>>>>"+TagValuelist.size());
+            for(TagValue tagVal:TagValuelist){
+                System.out.println("TagValue>>>>>>>>>"+tagVal);
+                if(ObjectUtils.isEmpty(tagVal)){
+                    tagVal = new TagValue();
+                }
+                tagVal.setShowDataTime("yyyy-MM-dd HH:mm:ss");
+                if(ObjectUtils.isEmpty(tagVal.getValue())){
+                    tagVal.setValue(0.00);
+                }else{
+                    BigDecimal b   =   new   BigDecimal(tagVal.getValue());
+                    tagVal.setValue( b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+                }
+
+            }
+            return AjaxResult.success(TagValuelist);
+        } catch (ParseException e) {
+            e.printStackTrace();
+            return AjaxResult.success("鏁版嵁鏌ヨ澶辫触");
+        }
+//        Collections.reverse(TagValuelist);
+
+    }
+
+    /**
+     * 鍘嗗彶鎶ヨ 缁勪欢 鍘嗗彶鎶ヨ琛ㄦ牸瀵煎嚭
+     */
+    @ApiOperation("鍘嗗彶鎶ヨ琛ㄦ牸瀵煎嚭")
+    @PreAuthorize("@ss.hasPermi('energyAlarm:realTimeAlarm:list')")
+    @GetMapping("/historyDataExcel/{code}/{start}/{end}/{pointCount}/{indexName}/{indexUnit}")
+    public AjaxResult historyDataExcel(@PathVariable("code") String code,
+                                       @PathVariable("start") String start,
+                                       @PathVariable("end") String end,
+                                       @PathVariable("pointCount") String pointCount,
+                                       @PathVariable("indexName") String indexName,
+                                       @PathVariable("indexUnit") String indexUnit)
+    {
+        int count = Integer.parseInt(pointCount);
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date sdate = null;
+        Date edate = null;
+        try {
+            sdate = formatter.parse(start);
+            edate = formatter.parse(end);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        List<TagValue> tagValuelist = realtimeDatabaseService.retrieve(code,sdate,edate, RetrievalModes.BestFit,count);
+        List<HistoryTable> historyTableList = new ArrayList<>();
+        for(TagValue tagVal:tagValuelist)
+        {
+            tagVal.setShowDataTime("yyyy-MM-dd HH:mm:ss");
+            HistoryTable hh = new HistoryTable();
+            hh.setCode(tagVal.getTagCode());
+            hh.setAlarmTime(tagVal.getShowDataTime());
+            BigDecimal b   =   new   BigDecimal(tagVal.getValue());
+            hh.setEarlyWarningValue(b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+            hh.setIndexName(indexName);
+            hh.setUnitName(indexUnit);
+            historyTableList.add(hh);
+        }
+        ExcelUtil<HistoryTable> util = new ExcelUtil<HistoryTable>(HistoryTable.class);
+        return util.exportExcel(historyTableList, "template");
+    }
+
+    /**
+     * 瀹炴椂妫�娴� 鍔熻兘 鐨勫 sheet椤�  灞曠ず 缁勬�佸浘  娴嬬偣 鎶ヨ淇℃伅
+     */
+    @ApiOperation("瀹炴椂妫�娴嬫姤璀︿俊鎭煡璇�")
+    @GetMapping("/listNote")
+    public TableDataInfo listNote(JkHistoryAlarm jkHistoryAlarm)
+    {
+        startPage();
+        List<JkHistoryAlarm> list = iHistoryAlarmService.selectHistoryAlarmNoteList(jkHistoryAlarm);
+        return getDataTable(list);
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/RealTimeAlarmController.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/RealTimeAlarmController.java
new file mode 100644
index 0000000..4562f83
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/controller/RealTimeAlarmController.java
@@ -0,0 +1,94 @@
+package com.dingzhuo.energy.data.monitoring.alarm.controller;
+
+
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IRealtimeAlarmService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鎶ヨ鐩戞祴 涓� 瀹炴椂鎶ヨ鐩戞祴 Controller
+ *
+ * @author zhaowei
+ * @date 2020-02-12
+ */
+@Api("鎶ヨ妫�娴嬧�斺�斿疄鏃舵姤璀︽娴�")
+@RestController
+@RequestMapping("/energyAlarm/realTimeAlarm")
+public class RealTimeAlarmController extends BaseController
+{
+    @Autowired
+    private IRealtimeAlarmService iRealtimeAlarmService;
+
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+
+    @Autowired
+    private TokenService tokenService;
+
+
+    /**
+     * 瀹炴椂鎶ヨ 椤甸潰 鏍规嵁 鑺傜偣鐩綍鍜� 鏉′欢鏌ヨ
+     */
+//    @ApiOperation("瀹炴椂鎶ヨ鏌ヨ")
+    @PreAuthorize("@ss.hasPermi('energyAlarm:realTimeAlarm:list')")
+    @GetMapping("/list")
+    public AjaxResult list(JkRealTimeAlarmList jkRealTimeAlarmList)
+    {
+        //startPage();
+        List<JkRealTimeAlarmList> list = iRealtimeAlarmService.selectRealtimeAlarmJkList(jkRealTimeAlarmList);
+        //return getDataTable(list);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 瀹炴椂鎶ヨ 缁勪欢 瀹炴椂鏁版嵁鑾峰彇
+     */
+//    @ApiOperation("瀹炴椂鎶ヨ鏌ヨ")
+    @PreAuthorize("@ss.hasPermi('energyAlarm:realTimeAlarm:list')")
+    @GetMapping("/liveHistoryData/{code}/{minute}/{pointCount}")
+    public AjaxResult liveList(@PathVariable("code") String code,@PathVariable("minute") String minute,@PathVariable("pointCount") String pointCount)
+    {
+        int time = Integer.parseInt(minute);
+        int count = Integer.parseInt(pointCount);
+        Calendar c = Calendar.getInstance();
+        Date  endTime= c.getTime();
+        c.add(Calendar.MINUTE, -time);
+        Date startTime = c.getTime();
+        List<TagValue> TagValuelist = realtimeDatabaseService.retrieve(code,startTime,endTime,RetrievalModes.BestFit,count);
+        for(TagValue tagVal:TagValuelist)
+        {
+            if(ObjectUtils.isEmpty(tagVal)){
+                tagVal = new TagValue();
+            }
+            tagVal.setShowDataTime("HH:mm:ss");
+            if(ObjectUtils.isEmpty(tagVal.getValue())){
+                tagVal.setValue(0.00);
+            }else{
+                BigDecimal b   =   new   BigDecimal(tagVal.getValue());
+                tagVal.setValue( b.setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+            }
+
+        }
+//        Collections.reverse(TagValuelist);
+        return AjaxResult.success(TagValuelist);
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmItem.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmItem.java
new file mode 100644
index 0000000..ad0e34b
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmItem.java
@@ -0,0 +1,182 @@
+package com.dingzhuo.energy.data.monitoring.alarm.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 棰勬姤璀﹁缃璞� warn_set
+ *
+ * @author sys
+ * @date 2020-03-02
+ */
+public class AlarmItem extends BaseEntity {
+
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 涓婚敭id
+   */
+  private String id;
+
+  /**
+   * 鎸囨爣鐨勪富閿甶d
+   */
+  @Excel(name = "鎸囨爣鐨勪富閿甶d")
+  private String dwid;
+
+  /**
+   * 鎸囨爣缂栫爜
+   */
+  private String indexCode;
+
+  /**
+   * 鍚仠鐘舵�� 1鍚姩2鍋滄
+   */
+  @Excel(name = "鍚仠鐘舵�� 1鍚姩2鍋滄")
+  private String startStop;
+
+  /**
+   * 鏃舵
+   */
+  @Excel(name = "鏃舵")
+  private String timeSlot;
+
+  /**
+   * 闄�   1涓婇檺2涓嬮檺
+   */
+  @Excel(name = "闄�   1涓婇檺2涓嬮檺")
+  private String limitType;
+
+  /**
+   * 闄愬��
+   */
+  @Excel(name = "闄愬��")
+  private String limitVal;
+
+  /**
+   * 鎶ヨ绾у埆
+   */
+  @Excel(name = "鎶ヨ绾у埆")
+  private String alarmLevel;
+
+  public String getAlarmCode() {
+    return alarmCode;
+  }
+
+  public void setAlarmCode(String alarmCode) {
+    this.alarmCode = alarmCode;
+  }
+
+  /**
+   * 鎶ヨ缂栫爜鎷兼帴锛宨ndexid:time_slot:limit_type
+   */
+  private String alarmCode;
+
+  /**
+   * nodeid
+   */
+  @Excel(name = "鑺傜偣ID")
+  private String nodeId;
+
+  private String calcText;
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getId() {
+    return id;
+  }
+
+  public void setDwid(String dwid) {
+    this.dwid = dwid;
+  }
+
+  public String getDwid() {
+    return dwid;
+  }
+
+  public void setStartStop(String startStop) {
+    this.startStop = startStop;
+  }
+
+  public String getStartStop() {
+    return startStop;
+  }
+
+  public void setTimeSlot(String timeSlot) {
+    this.timeSlot = timeSlot;
+  }
+
+  public String getTimeSlot() {
+    return timeSlot;
+  }
+
+  public void setLimitType(String limitType) {
+    this.limitType = limitType;
+  }
+
+  public String getLimitType() {
+    return limitType;
+  }
+
+  public void setLimitVal(String limitVal) {
+    this.limitVal = limitVal;
+  }
+
+  public String getLimitVal() {
+    return limitVal;
+  }
+
+  public void setAlarmLevel(String alarmLevel) {
+    this.alarmLevel = alarmLevel;
+  }
+
+  public String getAlarmLevel() {
+    return alarmLevel;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  @Override
+  public String toString() {
+    return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+        .append("id", getId())
+        .append("createTime", getCreateTime())
+        .append("createBy", getCreateBy())
+        .append("updateTime", getUpdateTime())
+        .append("updateBy", getUpdateBy())
+        .append("dwid", getDwid())
+        .append("startStop", getStartStop())
+        .append("timeSlot", getTimeSlot())
+        .append("limitType", getLimitType())
+        .append("limitVal", getLimitVal())
+        .append("alarmLevel", getAlarmLevel())
+        .append("nodeId", getNodeId())
+        .toString();
+  }
+
+    public String getCalcText() {
+        return calcText;
+    }
+
+    public void setCalcText(String calcText) {
+        this.calcText = calcText;
+    }
+
+  public String getIndexCode() {
+    return indexCode;
+  }
+
+  public void setIndexCode(String indexCode) {
+    this.indexCode = indexCode;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmJudgeDirection.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmJudgeDirection.java
new file mode 100644
index 0000000..098ed3e
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/AlarmJudgeDirection.java
@@ -0,0 +1,47 @@
+package com.dingzhuo.energy.data.monitoring.alarm.domain;
+
+public enum AlarmJudgeDirection {
+  /**
+   * 澶т簬
+   */
+  G(">"),
+  /**
+   * 澶т簬绛変簬
+   */
+  GE(">="),
+  /**
+   * 灏忎簬
+   */
+  L("<"),
+  /**
+   * 灏忎簬绛変簬
+   */
+  LE("<="),
+  /**
+   * 绛変簬
+   */
+  E("=");
+
+  private String code;
+
+  AlarmJudgeDirection(String code) {
+    this.code = code;
+  }
+
+  public static AlarmJudgeDirection value(String code) {
+    switch (code) {
+      case ">":
+        return AlarmJudgeDirection.G;
+      case ">=":
+        return AlarmJudgeDirection.GE;
+      case "<":
+        return AlarmJudgeDirection.L;
+      case "<=":
+        return AlarmJudgeDirection.LE;
+      case "=":
+        return AlarmJudgeDirection.E;
+      default:
+        return AlarmJudgeDirection.E;
+    }
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryAlarm.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryAlarm.java
new file mode 100644
index 0000000..9375a94
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryAlarm.java
@@ -0,0 +1,171 @@
+package com.dingzhuo.energy.data.monitoring.alarm.domain;
+
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import java.util.Date;
+
+public class HistoryAlarm {
+
+  /**
+   * 涓婚敭
+   */
+  private String id;
+  /**
+   * 鎸囨爣涓婚敭
+   */
+  private String indexId;
+  /**
+   * 鎸囨爣鍚嶇О
+   */
+  private String indexName;
+  private String itemId;
+  /**
+   * 鎶ヨ閰嶇疆椤�
+   */
+  private AlarmItem alarmItem;
+  /**
+   * 闄愬��
+   */
+  private double limitingValue;
+  /**
+   * 鎶ヨ鏃剁殑鍊�
+   */
+  private double alarmValue;
+  /**
+   * 鎶ヨ鏄暟鎹川閲�
+   */
+  private Quality alarmValueQuality;
+  /**
+   * 鎶ヨ浜嬩欢
+   */
+  private Date beginTime;
+  /**
+   * 鎶ヨ缁撴潫鏃堕棿
+   */
+  private Date endTime;
+  private String timeCode;
+  /**
+   * 鎶ヨ鎸佺画鏃堕棿
+   */
+  private double duration;
+  /**
+   * 鎶ヨ鎻忚堪
+   */
+  private String content;
+
+  public String getAlarmCode() {
+    return alarmCode;
+  }
+
+  public void setAlarmCode(String alarmCode) {
+    this.alarmCode = alarmCode;
+  }
+
+  /**
+   * 鎶ヨ缂栫爜鎷兼帴锛宨ndexid:time_slot:limit_type
+   */
+  private String alarmCode;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+  public AlarmItem getAlarmItem() {
+    return alarmItem;
+  }
+
+  public void setAlarmItem(AlarmItem alarmItem) {
+    this.alarmItem = alarmItem;
+  }
+
+  public double getLimitingValue() {
+    return limitingValue;
+  }
+
+  public void setLimitingValue(double limitingValue) {
+    this.limitingValue = limitingValue;
+  }
+
+  public double getAlarmValue() {
+    return alarmValue;
+  }
+
+  public void setAlarmValue(double alarmValue) {
+    this.alarmValue = alarmValue;
+  }
+
+  public Quality getAlarmValueQuality() {
+    return alarmValueQuality;
+  }
+
+  public void setAlarmValueQuality(Quality alarmValueQuality) {
+    this.alarmValueQuality = alarmValueQuality;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+
+  public Date getEndTime() {
+    return endTime;
+  }
+
+  public void setEndTime(Date endTime) {
+    this.endTime = endTime;
+  }
+
+  public double getDuration() {
+    return duration;
+  }
+
+  public void setDuration(double duration) {
+    this.duration = duration;
+  }
+
+  public String getContent() {
+    return content;
+  }
+
+  public void setContent(String content) {
+    this.content = content;
+  }
+
+  public String getItemId() {
+    return itemId;
+  }
+
+  public void setItemId(String itemId) {
+    this.itemId = itemId;
+  }
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryTable.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryTable.java
new file mode 100644
index 0000000..f1885ea
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/HistoryTable.java
@@ -0,0 +1,84 @@
+package com.dingzhuo.energy.data.monitoring.alarm.domain;
+
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+/**
+ * 鍘嗗彶琛ㄦ牸瀵煎嚭
+ *
+ * @author
+ * @date 2020-03-20
+ */
+public class HistoryTable {
+
+    /**
+     * 鎶ヨ鏃堕棿
+     */
+    @Excel(name = "鎶ヨ鏃堕棿",width = 30)
+    private String alarmTime;
+
+    /**
+     * 鎸囨爣缂栫爜
+     */
+   @Excel(name = "鎸囨爣缂栫爜")
+   private String code;
+
+    /**
+     * 鎸囨爣鍚嶇О
+     */
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+
+    /**
+     * 鍗曚綅鍚嶇О
+     */
+    @Excel(name = "鍗曚綅鍚嶇О")
+    private String unitName;
+
+    /**
+     * 瀹炴椂鍊�
+     */
+    @Excel(name = "瀹炴椂鍊�")
+    private Double earlyWarningValue;
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getAlarmTime() {
+        return alarmTime;
+    }
+
+    public void setAlarmTime(String alarmTime) {
+        this.alarmTime = alarmTime;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getUnitName() {
+        return unitName;
+    }
+
+    public void setUnitName(String unitName) {
+        this.unitName = unitName;
+    }
+
+    public Double getEarlyWarningValue() {
+        return earlyWarningValue;
+    }
+
+    public void setEarlyWarningValue(Double earlyWarningValue) {
+        this.earlyWarningValue = earlyWarningValue;
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkHistoryAlarm.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkHistoryAlarm.java
new file mode 100644
index 0000000..cde701a
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkHistoryAlarm.java
@@ -0,0 +1,248 @@
+package com.dingzhuo.energy.data.monitoring.alarm.domain;
+
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+
+public class JkHistoryAlarm extends BaseEntity {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 妯″瀷鑺傜偣鍚嶇О
+   * */
+  @Excel(name = "鍗曚綅鍚嶇О")
+  private String modelName;
+  /**
+   * 鎸囨爣缂栧彿
+   * */
+  @Excel(name = "鎸囨爣缂栫爜")
+  private String code;
+  /**
+   * 鎸囨爣鍚嶇О*/
+  @Excel(name = "鎸囨爣鍚嶇О")
+  private String indexName;
+  /**
+   * 鎸囨爣鍗曚綅绫诲瀷ID*/
+  @Excel(name = "鎸囨爣鍗曚綅")
+  private String unitId;
+  /**
+   * 鎶ヨ绾у埆*/
+  @Excel(name = "鎶ヨ绾у埆")
+  private String alarmLevel;
+  /**
+   * 闄愬�肩被鍨�
+   * */
+  @Excel(name = "闄愬�肩被鍨�")
+  private String limitType;
+  /**
+   * 闄愬��
+   * */
+  @Excel(name = "闄愬��")
+  private double limitingValue;
+  /**
+   * 鎶ヨ鍊�
+   * */
+  @Excel(name = "鎶ヨ鍊�")
+  private double alarmValue;
+  /**
+   * 鎸囨爣涓婚敭id
+   * */
+  private String indexId;
+  /**
+   * 妯″瀷鑺傜偣涓婚敭id
+   * */
+  private String nodeId;
+  /**
+   * 妯″瀷鏌ヨ灞傜骇鏍囧織 B鏈骇  ALL鍖呭惈涓嬬骇
+   * */
+  private String eierarchyFlag;
+  /**
+   * 鎸囨爣绫诲瀷 COLLECT閲囬泦鐐�  STATISTIC鎸囨爣
+   * */
+  private String indexType;
+
+  /** 鎶ヨ鏃堕暱 */
+  @Excel(name = "鎸佺画鏃堕暱(鍒嗛挓)")
+  private Double duration;
+
+  /**
+   * 鎶ヨ寮�濮嬫椂闂�
+   */
+  @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+  @Excel(name = "鎶ヨ寮�濮嬫椂闂�", dateFormat = "yyyy-MM-dd HH:mm:ss")
+  private Date alarmBeginTime;
+
+  /**
+   * 鎶ヨ缁撴潫鏃堕棿
+   */
+  @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+  @Excel(name = "鎶ヨ缁撴潫鏃堕棿", dateFormat = "yyyy-MM-dd HH:mm:ss")
+  private Date alarmEndTime;
+  /**
+   * SVG鏂囦欢鐨処D
+   */
+  private Integer svgId;
+  /** 鎶ヨ鍐呭 */
+  private String content;
+  private String id;
+  private String alarmValueQuality;
+
+  public Double getDuration() {
+    return duration;
+  }
+
+  public void setDuration(Double duration) {
+    this.duration = duration;
+  }
+
+  public Date getAlarmBeginTime() {
+    return alarmBeginTime;
+  }
+
+  public void setAlarmBeginTime(Date alarmBeginTime) {
+    this.alarmBeginTime = alarmBeginTime;
+  }
+
+  public Date getAlarmEndTime() {
+    return alarmEndTime;
+  }
+
+  public void setAlarmEndTime(Date alarmEndTime) {
+    this.alarmEndTime = alarmEndTime;
+  }
+
+  public String getIndexType() {
+    return indexType;
+  }
+
+  public void setIndexType(String indexType) {
+    this.indexType = indexType;
+  }
+
+  public String getEierarchyFlag() {
+    return eierarchyFlag;
+  }
+
+  public void setEierarchyFlag(String eierarchyFlag) {
+    this.eierarchyFlag = eierarchyFlag;
+  }
+
+  public String getModelName() {
+    return modelName;
+  }
+
+  public void setModelName(String modelName) {
+    this.modelName = modelName;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public String getAlarmLevel() {
+    return alarmLevel;
+  }
+
+  public void setAlarmLevel(String alarmLevel) {
+    this.alarmLevel = alarmLevel;
+  }
+
+  public String getLimitType() {
+    return limitType;
+  }
+
+  public void setLimitType(String limitType) {
+    this.limitType = limitType;
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+
+  public double getLimitingValue() {
+    return limitingValue;
+  }
+
+  public void setLimitingValue(double limitingValue) {
+    this.limitingValue = limitingValue;
+  }
+
+  public double getAlarmValue() {
+    return alarmValue;
+  }
+
+  public void setAlarmValue(double alarmValue) {
+    this.alarmValue = alarmValue;
+  }
+
+  public String getAlarmValueQuality() {
+    return alarmValueQuality;
+  }
+
+  public void setAlarmValueQuality(String alarmValueQuality) {
+    this.alarmValueQuality = alarmValueQuality;
+  }
+
+
+  public String getContent() {
+    return content;
+  }
+
+  public void setContent(String content) {
+    this.content = content;
+  }
+
+  public Integer getSvgId() {
+    return svgId;
+  }
+
+  public void setSvgId(Integer svgId) {
+    this.svgId = svgId;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkRealTimeAlarmList.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkRealTimeAlarmList.java
new file mode 100644
index 0000000..19732e4
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/JkRealTimeAlarmList.java
@@ -0,0 +1,208 @@
+package com.dingzhuo.energy.data.monitoring.alarm.domain;
+
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+
+public class JkRealTimeAlarmList extends BaseEntity {
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 妯″瀷鑺傜偣鍚嶇О
+   * */
+  private String modelName;
+  /**
+   * 鎸囨爣缂栧彿
+   * */
+  private String code;
+  /**
+   * 鎸囨爣鍚嶇О*/
+  private String indexName;
+  /**
+   * 鎸囨爣鍗曚綅绫诲瀷ID*/
+  private String unitId;
+  /**
+   * 鎶ヨ绾у埆*/
+  private String alarmLevel;
+  /**
+   * 闄愬�肩被鍨�
+   * */
+  private String limitType;
+  /**
+   * 闄愬��
+   * */
+  private double limitingValue;
+  /**
+   * 鎶ヨ鍊�
+   * */
+  private double alarmValue;
+  /**
+   * 鎸囨爣涓婚敭id
+   * */
+  private String indexId;
+  /**
+   * 妯″瀷鑺傜偣涓婚敭id
+   * */
+  private String nodeId;
+  /**
+   * 妯″瀷鏌ヨ灞傜骇鏍囧織 B鏈骇  ALL鍖呭惈涓嬬骇
+   * */
+  private String eierarchyFlag;
+  /**
+   * 鎸囨爣绫诲瀷 COLLECT閲囬泦鐐�  STATISTIC鎸囨爣
+   * */
+  private String indexType;
+
+  /**
+   * 鎶ヨ寮�濮嬫椂闂�
+   */
+  @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+  private Date alarmBeginTime;
+
+
+  private String id;
+  private String alarmValueQuality;
+  private String content;
+
+  public Date getAlarmBeginTime() {
+    return alarmBeginTime;
+  }
+
+  public void setAlarmBeginTime(Date alarmBeginTime) {
+    this.alarmBeginTime = alarmBeginTime;
+  }
+
+  public String getIndexType() {
+    return indexType;
+  }
+
+  public void setIndexType(String indexType) {
+    this.indexType = indexType;
+  }
+
+  public String getEierarchyFlag() {
+    return eierarchyFlag;
+  }
+
+  public void setEierarchyFlag(String eierarchyFlag) {
+    this.eierarchyFlag = eierarchyFlag;
+  }
+
+  public String getModelName() {
+    return modelName;
+  }
+
+  public void setModelName(String modelName) {
+    this.modelName = modelName;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public String getAlarmLevel() {
+    return alarmLevel;
+  }
+
+  public void setAlarmLevel(String alarmLevel) {
+    this.alarmLevel = alarmLevel;
+  }
+
+  public String getLimitType() {
+    return limitType;
+  }
+
+  public void setLimitType(String limitType) {
+    this.limitType = limitType;
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+//  public AlarmItem getAlarmItem() {
+//    return alarmItem;
+//  }
+//
+//  public void setAlarmItem(AlarmItem alarmItem) {
+//    this.alarmItem = alarmItem;
+//  }
+
+  public double getLimitingValue() {
+    return limitingValue;
+  }
+
+  public void setLimitingValue(double limitingValue) {
+    this.limitingValue = limitingValue;
+  }
+
+  public double getAlarmValue() {
+    return alarmValue;
+  }
+
+  public void setAlarmValue(double alarmValue) {
+    this.alarmValue = alarmValue;
+  }
+
+  public String getAlarmValueQuality() {
+    return alarmValueQuality;
+  }
+
+  public void setAlarmValueQuality(String alarmValueQuality) {
+    this.alarmValueQuality = alarmValueQuality;
+  }
+
+
+  public String getContent() {
+    return content;
+  }
+
+  public void setContent(String content) {
+    this.content = content;
+  }
+
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/RealTimeAlarm.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/RealTimeAlarm.java
new file mode 100644
index 0000000..d07b52f
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/domain/RealTimeAlarm.java
@@ -0,0 +1,177 @@
+package com.dingzhuo.energy.data.monitoring.alarm.domain;
+
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import java.util.Date;
+
+public class RealTimeAlarm  {
+  private static final long serialVersionUID = 1L;
+
+  /** 涓婚敭id */
+  private String id;
+
+  /** 鎸囨爣id */
+  @Excel(name = "鎸囨爣id")
+  private String indexId;
+
+  /** 鎸囨爣鍚嶇О */
+  @Excel(name = "鎸囨爣鍚嶇О")
+  private String indexName;
+
+  /** 鎶ヨ椤筰d */
+  @Excel(name = "鎶ヨ椤筰d")
+  private String itemId;
+
+  /** 鎶ヨ闄愬�� */
+  @Excel(name = "鎶ヨ闄愬��")
+  private Double limitingValue;
+
+  /** 鎶ヨ鍊� */
+  @Excel(name = "鎶ヨ鍊�")
+  private Double alarmValue;
+
+  /** 鎶ヨ鍊艰川閲� */
+  @Excel(name = "鎶ヨ鍊艰川閲�")
+  private Quality alarmValueQuality;
+
+  private String timeCode;
+
+  /** 鎶ヨ鏃堕棿 */
+  @Excel(name = "鎶ヨ鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+  private Date beginTime;
+
+  /** 鍐呭 */
+  @Excel(name = "鍐呭")
+  private String content;
+
+  private AlarmItem alarmItem;
+
+  public String getAlarmCode() {
+    return alarmCode;
+  }
+
+  public void setAlarmCode(String alarmCode) {
+    this.alarmCode = alarmCode;
+  }
+
+  /**
+   * 鎶ヨ缂栫爜鎷兼帴锛宨ndexid:time_slot:limit_type
+   */
+  private String alarmCode;
+
+  public void setId(String id)
+  {
+    this.id = id;
+  }
+
+  public String getId()
+  {
+    return id;
+  }
+  public void setIndexId(String indexId)
+  {
+    this.indexId = indexId;
+  }
+
+  public String getIndexId()
+  {
+    return indexId;
+  }
+  public void setIndexName(String indexName)
+  {
+    this.indexName = indexName;
+  }
+
+  public String getIndexName()
+  {
+    return indexName;
+  }
+  public void setItemId(String itemId)
+  {
+    this.itemId = itemId;
+  }
+
+  public String getItemId()
+  {
+    return itemId;
+  }
+  public void setLimitingValue(Double limitingValue)
+  {
+    this.limitingValue = limitingValue;
+  }
+
+  public Double getLimitingValue()
+  {
+    return limitingValue;
+  }
+  public void setAlarmValue(Double alarmValue)
+  {
+    this.alarmValue = alarmValue;
+  }
+
+  public Double getAlarmValue()
+  {
+    return alarmValue;
+  }
+  public void setAlarmValueQuality(Quality alarmValueQuality)
+  {
+    this.alarmValueQuality = alarmValueQuality;
+  }
+
+  public Quality getAlarmValueQuality()
+  {
+    return alarmValueQuality;
+  }
+  public void setBeginTime(Date beginTime)
+  {
+    this.beginTime = beginTime;
+  }
+
+  public Date getBeginTime()
+  {
+    return beginTime;
+  }
+  public void setContent(String content)
+  {
+    this.content = content;
+  }
+
+  public String getContent()
+  {
+    return content;
+  }
+
+  @Override
+  public String toString() {
+    return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("indexId", getIndexId())
+            .append("indexName", getIndexName())
+            .append("itemId", getItemId())
+            .append("limitingValue", getLimitingValue())
+            .append("alarmValue", getAlarmValue())
+            .append("alarmValueQuality", getAlarmValueQuality())
+            .append("beginTime", getBeginTime())
+            .append("content", getContent())
+            .toString();
+  }
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+
+  public AlarmItem getAlarmItem() {
+    return alarmItem;
+  }
+
+  public void setAlarmItem(AlarmItem alarmItem) {
+    this.alarmItem = alarmItem;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/AlarmItemMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/AlarmItemMapper.java
new file mode 100644
index 0000000..e177eea
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/AlarmItemMapper.java
@@ -0,0 +1,128 @@
+package com.dingzhuo.energy.data.monitoring.alarm.mapper;
+
+
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 棰勬姤璀﹁缃甅apper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-03-02
+ */
+public interface AlarmItemMapper {
+
+  /**
+   * 鏌ヨ棰勬姤璀﹁缃�
+   *
+   * @param id 棰勬姤璀﹁缃甀D
+   * @return 棰勬姤璀﹁缃�
+   */
+  AlarmItem selectAlarmItemById(String id);
+
+  /**
+   * 鏌ヨ棰勬姤璀﹁缃垪琛�
+   *
+   * @param alarmItem 棰勬姤璀﹁缃�
+   * @return 棰勬姤璀﹁缃泦鍚�
+   */
+  List<AlarmItem> selectAlarmItemList(AlarmItem alarmItem);
+
+  /**
+   * 鏂板棰勬姤璀﹁缃�
+   *
+   * @param alarmItem 棰勬姤璀﹁缃�
+   * @return 缁撴灉
+   */
+  int insertAlarmItem(AlarmItem alarmItem);
+
+  /**
+   * 淇敼棰勬姤璀﹁缃�
+   *
+   * @param alarmItem 棰勬姤璀﹁缃�
+   * @return 缁撴灉
+   */
+  int updateAlarmItem(AlarmItem alarmItem);
+
+  /**
+   * 鍒犻櫎棰勬姤璀﹁缃�
+   *
+   * @param id 棰勬姤璀﹁缃甀D
+   * @return 缁撴灉
+   */
+  int deleteAlarmItemById(String id);
+
+  /**
+   * 鎵归噺鍒犻櫎棰勬姤璀﹁缃�
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+   * @return 缁撴灉
+   */
+  int deleteAlarmItemByIds(String[] ids);
+
+  /**
+   * 鏌ヨ棰勬姤璀﹁缃�
+   *
+   * @param id 棰勬姤璀﹁缃甀D
+   * @return 棰勬姤璀﹁缃�
+   */
+  List<AlarmItem> selectAlarmItemtingById(String id);
+
+  /**
+   * 淇敼棰勬姤璀﹁缃�
+   *
+   * @param ids       棰勬姤璀﹁缃�
+   * @param update_by 棰勬姤璀﹁缃�
+   * @param flag      棰勬姤璀﹁缃�
+   * @return 缁撴灉
+   */
+  int updateStartStop(String[] ids, String flag, String update_by);
+
+  /**
+   * @return 缁撴灉
+   */
+  String getStartStop(String indexid);
+
+  /**
+   * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
+   *
+   * @param data 銆愯濉啓鍔熻兘鍚嶇О銆�
+   * @param username 褰撳墠鐧诲綍浜虹敤鎴峰悕
+   * @return 缁撴灉
+   */
+  int updateLimitVal(@Param("data") List data, @Param("id") String id, String username);
+
+  /**
+   * 淇敼銆愭煡璇㈡槸鍚﹀瓨鍦ㄦ祴鐐硅缃��
+   *
+   * @return 缁撴灉
+   */
+  int selectCountById(String id);
+
+  /**
+   * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
+   *
+   * @param data 銆愯濉啓鍔熻兘鍚嶇О銆�
+   * @return 缁撴灉
+   */
+  int updateLimitValNoDel(@Param("data") List data, @Param("id") String id, String username);
+
+  /**
+   * 淇敼銆愭煡璇㈡槸鍚﹀瓨鍦ㄦ祴鐐硅缃��
+   *
+   * @return 缁撴灉
+   */
+  int deleteAllLimitVal(String id);
+
+  /**
+   * 鏌ヨ棰勬姤璀﹁缃�
+   *
+   * @param id 棰勬姤璀﹁缃甀D
+   * @return 棰勬姤璀﹁缃�
+   */
+  int getSettingCount(String id);
+
+  List<AlarmItem> getAllAlarmItem();
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/HistoryAlarmMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/HistoryAlarmMapper.java
new file mode 100644
index 0000000..39395fe
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/HistoryAlarmMapper.java
@@ -0,0 +1,39 @@
+package com.dingzhuo.energy.data.monitoring.alarm.mapper;
+
+
+import com.dingzhuo.energy.data.monitoring.alarm.domain.HistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkHistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 瀹炴椂鎶ヨ鑾峰彇Mapper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-03-02
+ */
+public interface HistoryAlarmMapper {
+
+  /**
+   * 鑾峰彇鍘嗗彶鎶ヨ闆嗗悎
+   *
+   * @param jkHistoryAlarm 鎶ヨ鍙傛暟
+   * @return 棰勬姤璀﹁缃泦鍚�
+   */
+  List<JkHistoryAlarm> selectJkHistoryAlarmList(JkHistoryAlarm jkHistoryAlarm);
+
+  List<JkHistoryAlarm> selectJkHistoryAlarmListExcel(JkHistoryAlarm jkHistoryAlarm);
+
+  /**
+   * 瀹炴椂妫�娴� 鍔熻兘 鐨勫 sheet椤�  灞曠ず 缁勬�佸浘  娴嬬偣 鎶ヨ淇℃伅
+   *
+   * @param jkHistoryAlarm
+   * @return
+   */
+  List<JkHistoryAlarm> selectHistoryAlarmNoteList(JkHistoryAlarm jkHistoryAlarm);
+
+  void updateHistoryAlarm(@Param("alarmCode") String alarmCode,
+      @Param("historyAlarm") HistoryAlarm historyAlarm);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/RealtimeAlarmMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/RealtimeAlarmMapper.java
new file mode 100644
index 0000000..8ba66e8
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/mapper/RealtimeAlarmMapper.java
@@ -0,0 +1,79 @@
+package com.dingzhuo.energy.data.monitoring.alarm.mapper;
+
+
+import com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+
+import java.util.List;
+
+/**
+ * 瀹炴椂鎶ヨ鐩戞帶Mapper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-03-18
+ */
+public interface RealtimeAlarmMapper {
+
+  /**
+   * 鏌ヨ瀹炴椂鎶ヨ鐩戞帶
+   *
+   * @param id 瀹炴椂鎶ヨ鐩戞帶ID
+   * @return 瀹炴椂鎶ヨ鐩戞帶
+   */
+  public RealTimeAlarm selectRealtimeAlarmById(String id);
+
+  /**
+   * 鏌ヨ瀹炴椂鎶ヨ鐩戞帶鍒楄〃
+   *
+   * @param realtimeAlarm 瀹炴椂鎶ヨ鐩戞帶
+   * @return 瀹炴椂鎶ヨ鐩戞帶闆嗗悎
+   */
+  public List<RealTimeAlarm> selectRealtimeAlarmList(RealTimeAlarm realtimeAlarm);
+
+  /**
+   * 鏂板瀹炴椂鎶ヨ鐩戞帶
+   *
+   * @param realtimeAlarm 瀹炴椂鎶ヨ鐩戞帶
+   * @return 缁撴灉
+   */
+  public int insertRealtimeAlarm(RealTimeAlarm realtimeAlarm);
+
+  /**
+   * 淇敼瀹炴椂鎶ヨ鐩戞帶
+   *
+   * @param realtimeAlarm 瀹炴椂鎶ヨ鐩戞帶
+   * @return 缁撴灉
+   */
+  public int updateRealtimeAlarm(RealTimeAlarm realtimeAlarm);
+
+  /**
+   * 鍒犻櫎瀹炴椂鎶ヨ鐩戞帶
+   *
+   * @param id 瀹炴椂鎶ヨ鐩戞帶ID
+   * @return 缁撴灉
+   */
+  public int deleteRealtimeAlarmById(String id);
+
+  /**
+   * 鎵归噺鍒犻櫎瀹炴椂鎶ヨ鐩戞帶
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+   * @return 缁撴灉
+   */
+  public int deleteRealtimeAlarmByIds(String[] ids);
+
+  /**
+   * 瀹炴椂鎶ヨ鐩戞帶鐢ㄥ垪琛�
+   *
+   * @param jkRealTimeAlarmList 瀹炴椂鎶ヨ鐩戞帶
+   * @return 瀹炴椂鎶ヨ鐩戞帶闆嗗悎
+   */
+  public List<JkRealTimeAlarmList> selectRealtimeAlarmJkList(
+      JkRealTimeAlarmList jkRealTimeAlarmList);
+
+  RealTimeAlarm getRealTimeAlarmByAlarmCode(String alarmCode);
+
+  List<RealTimeAlarm> getRealTimeAlarm();
+
+  RealTimeAlarm getAlarmByItemIdAndTimeCode(String itemId, String timeCode);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IAlarmItemService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IAlarmItemService.java
new file mode 100644
index 0000000..0bfa1e1
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IAlarmItemService.java
@@ -0,0 +1,105 @@
+package com.dingzhuo.energy.data.monitoring.alarm.service;
+
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 棰勬姤璀﹁缃甋ervice鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-03-02
+ */
+public interface IAlarmItemService {
+
+  /**
+   * 鏌ヨ棰勬姤璀﹁缃�
+   *
+   * @param id 棰勬姤璀﹁缃甀D
+   * @return 棰勬姤璀﹁缃�
+   */
+  AlarmItem selectAlarmItemById(String id);
+
+  /**
+   * 鏌ヨ棰勬姤璀﹁缃垪琛�
+   *
+   * @param alarmItem 棰勬姤璀﹁缃�
+   * @return 棰勬姤璀﹁缃泦鍚�
+   */
+  List<AlarmItem> selectAlarmItemList(AlarmItem alarmItem);
+
+  /**
+   * 鏂板棰勬姤璀﹁缃�
+   *
+   * @param alarmItem 棰勬姤璀﹁缃�
+   * @return 缁撴灉
+   */
+  int insertAlarmItem(AlarmItem alarmItem);
+
+  /**
+   * 淇敼棰勬姤璀﹁缃�
+   *
+   * @param alarmItem 棰勬姤璀﹁缃�
+   * @return 缁撴灉
+   */
+  int updateAlarmItem(AlarmItem alarmItem);
+
+  /**
+   * 淇敼棰勬姤璀﹁缃�
+   *
+   * @param ids,flag 棰勬姤璀﹁缃�
+   * @return 缁撴灉
+   */
+  int updateStartStop(String[] ids, String flag, String username);
+
+  /**
+   * 鎵归噺鍒犻櫎棰勬姤璀﹁缃�
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑棰勬姤璀﹁缃甀D
+   * @return 缁撴灉
+   */
+  int deleteAlarmItemByIds(String[] ids);
+
+  /**
+   * 鍒犻櫎棰勬姤璀﹁缃俊鎭�
+   *
+   * @param id 棰勬姤璀﹁缃甀D
+   * @return 缁撴灉
+   */
+  int deleteAlarmItemById(String id);
+
+  /**
+   * 鏌ヨ棰勬姤璀﹁缃垪琛�
+   *
+   * @param id 棰勬姤璀﹁缃�
+   * @return 棰勬姤璀﹁缃泦鍚�
+   */
+  List<AlarmItem> selectAlarmItemtingById(String id);
+
+  /**
+   * 鏌ヨ棰勬姤璀﹀垪琛ㄨ鍚仠鍊�
+   *
+   * @param indexid 棰勬姤璀﹁缃�
+   * @return 棰勬姤璀﹁缃泦鍚�
+   */
+  String getStartStop(String indexid);
+
+  /**
+   * 淇敼寮瑰嚭妗嗛檺鍊�
+   *
+   * @param data 銆愪慨鏀瑰脊鍑烘闄愬�笺��
+   * @return 缁撴灉
+   */
+  int updateLimitVal(List data, String username);
+
+  /**
+   * 鏌ヨ棰刬d涓嬭缃檺鍊肩殑鏁伴噺
+   *
+   * @param id 棰勬姤璀﹁缃�
+   * @return 鏁�
+   */
+  ArrayList getSettingCount(String[] id);
+
+  List<AlarmItem> getAllAlarmItem();
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IHistoryAlarmService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IHistoryAlarmService.java
new file mode 100644
index 0000000..36c0209
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IHistoryAlarmService.java
@@ -0,0 +1,33 @@
+package com.dingzhuo.energy.data.monitoring.alarm.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.HistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkHistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+
+import java.util.Date;
+import java.util.List;
+
+public interface IHistoryAlarmService {
+
+  List<HistoryAlarm> getHistoryAlarm(Date beginTime, Date endTime);
+
+  List<HistoryAlarm> getHistoryAlarm(Date beginTime, Date endTime, TimeType timeType);
+
+  List<HistoryAlarm> getHistoryAlarm(Date beginTime, Date endTime, String alarmType);
+  /**
+   * @param jkHistoryAlarm 鏍规嵁鍘嗗彶鎶ヨ瀵硅薄鍙栧��
+   * @return
+   */
+  List<JkHistoryAlarm> selectJkHistoryAlarmList(JkHistoryAlarm jkHistoryAlarm);
+  List<JkHistoryAlarm> selectJkHistoryAlarmListExcel(JkHistoryAlarm jkHistoryAlarm);
+
+  /**
+   * 瀹炴椂妫�娴� 鍔熻兘 鐨勫 sheet椤�  灞曠ず 缁勬�佸浘  娴嬬偣 鎶ヨ淇℃伅
+   * @param jkHistoryAlarm
+   * @return
+   */
+  List<JkHistoryAlarm> selectHistoryAlarmNoteList(JkHistoryAlarm jkHistoryAlarm);
+
+  void updateHistoryAlarm(String alarmCode, HistoryAlarm historyAlarm);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IRealtimeAlarmService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IRealtimeAlarmService.java
new file mode 100644
index 0000000..230e605
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/IRealtimeAlarmService.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.data.monitoring.alarm.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.HistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+
+import java.util.List;
+
+public interface IRealtimeAlarmService {
+  /**
+   * 鑾峰彇褰撳墠鎵�鏈夊疄鏃舵姤璀﹁褰�
+   *
+   * @return 瀹炴椂鎶ヨ
+   */
+  List<RealTimeAlarm> getRealTimeAlarm();
+
+  /**
+   * @param timeType 鎶ヨ浜嬩欢绫诲瀷
+   * @return
+   */
+  List<RealTimeAlarm> getRealTimeAlarm(TimeType timeType);
+
+  /**
+   * @param alarmLevel 鎶ヨ绾у埆涓婇檺銆佷笂涓婇檺銆佷笅闄愪笅涓嬮檺
+   * @return
+   */
+  List<RealTimeAlarm> getRealTimeAlarm(String alarmLevel);
+
+  /**
+   * @param jkRealTimeAlarmList 瀹炴椂鎶ヨ鐩戞帶鐢ㄥ垪琛�
+   * @return
+   */
+  List<JkRealTimeAlarmList> selectRealtimeAlarmJkList(JkRealTimeAlarmList jkRealTimeAlarmList);
+
+
+  void insert(RealTimeAlarm realTimeAlarm);
+
+  RealTimeAlarm getRealTimeAlarmByAlarmCode(String alarmCode);
+
+  RealTimeAlarm getAlarmByItemIdAndTimeCode(String itemId, String timeCode);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/AlarmItemServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/AlarmItemServiceImpl.java
new file mode 100644
index 0000000..305ce65
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/AlarmItemServiceImpl.java
@@ -0,0 +1,198 @@
+package com.dingzhuo.energy.data.monitoring.alarm.service.impl;
+
+import java.util.*;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.IdUtils;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.mapper.AlarmItemMapper;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IAlarmItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 棰勬姤璀﹁缃甋ervice涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-03-02
+ */
+@Service
+public class AlarmItemServiceImpl implements IAlarmItemService {
+    @Autowired
+    private AlarmItemMapper alarmItemMapper;
+
+    /**
+     * 鏌ヨ棰勬姤璀﹁缃�
+     *
+     * @param id 棰勬姤璀﹁缃甀D
+     * @return 棰勬姤璀﹁缃�
+     */
+    @Override
+    public AlarmItem selectAlarmItemById(String id) {
+        return alarmItemMapper.selectAlarmItemById(id);
+    }
+
+    /**
+     * 鏌ヨ棰勬姤璀﹁缃垪琛�
+     *
+     * @param alarmItem 棰勬姤璀﹁缃�
+     * @return 棰勬姤璀﹁缃�
+     */
+    @Override
+    public List<AlarmItem> selectAlarmItemList(AlarmItem alarmItem) {
+        return alarmItemMapper.selectAlarmItemList(alarmItem);
+    }
+
+    /**
+     * 鏂板棰勬姤璀﹁缃�
+     *
+     * @param alarmItem 棰勬姤璀﹁缃�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertAlarmItem(AlarmItem alarmItem) {
+        alarmItem.setCreateTime(DateUtils.getNowDate());
+        return alarmItemMapper.insertAlarmItem(alarmItem);
+    }
+
+    /**
+     * 淇敼棰勬姤璀﹁缃�
+     *
+     * @param alarmItem 棰勬姤璀﹁缃�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateAlarmItem(AlarmItem alarmItem) {
+        alarmItem.setUpdateTime(DateUtils.getNowDate());
+        return alarmItemMapper.updateAlarmItem(alarmItem);
+    }
+
+    /**
+     * 淇敼棰勬姤璀﹁缃�
+     *
+     * @param ids,flag 棰勬姤璀﹁缃�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateStartStop(String[] ids, String flag, String username) {
+
+        return alarmItemMapper.updateStartStop(ids, flag, username);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎棰勬姤璀﹁缃�
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑棰勬姤璀﹁缃甀D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteAlarmItemByIds(String[] ids) {
+        return alarmItemMapper.deleteAlarmItemByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎棰勬姤璀﹁缃俊鎭�
+     *
+     * @param id 棰勬姤璀﹁缃甀D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteAlarmItemById(String id) {
+        return alarmItemMapper.deleteAlarmItemById(id);
+    }
+
+    /**
+     * 鏌ヨ棰勬姤璀﹁缃�
+     *
+     * @param id 棰勬姤璀﹁缃甀D
+     * @return 棰勬姤璀﹁缃�
+     */
+    @Override
+    public List<AlarmItem> selectAlarmItemtingById(String id) {
+        return alarmItemMapper.selectAlarmItemtingById(id);
+    }
+
+    /**
+     * 鏌ヨ棰勬姤璀﹁缃�
+     *
+     * @return 棰勬姤璀﹁缃�
+     */
+    @Override
+    public String getStartStop(String indexid) {
+        return alarmItemMapper.getStartStop(indexid);
+    }
+
+    /**
+     * 淇敼寮瑰嚭妗嗛檺鍊�
+     *
+     * @param data 銆愪慨鏀瑰脊鍑烘闄愬�笺��
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateLimitVal(List data, String username) {
+        String id = "";
+        int num = 0;
+        int dataNum = data.size();
+        Map<String, Object> map = (Map<String, Object>) data.get(0);
+        id = map.get("indexId").toString();
+        for (int i = 0; i < data.size(); i++) {
+            Map<String, Object> map1 = (Map<String, Object>) data.get(i);
+            String val = map1.get("limitVal").toString().trim();
+            if ("".equals(val) || null == val) {
+                data.remove(i);
+                i--;
+                num++;
+            }
+            map1.put("id", IdUtils.fastUUID());
+            map1.put("alarmCode", map1.get("indexId").toString() + ":" + map1.get("timeSlotVal").toString() + ":" + map1.get("limitTypeVal").toString());
+        }
+        //鏌ヨ鏉℃暟
+        int count = alarmItemMapper.selectCountById(id);
+        if (num == dataNum) {//瀵规瘮鍏ㄧ┖鏁版嵁闇�瑕佹妸鏁版嵁搴撻噷id涓�鑷寸殑鍏ㄥ垹闄�
+            if (count > 0) {
+                return alarmItemMapper.deleteAllLimitVal(id);
+            } else {
+                return 1;
+            }
+        } else {
+            if (count > 0) {
+                return alarmItemMapper.updateLimitVal(data, id, username);
+            } else {
+                return alarmItemMapper.updateLimitValNoDel(data, id, username);
+            }
+        }
+    }
+
+    /**
+     * 鏌ヨ棰勬姤璀﹁缃�
+     *
+     * @param id 棰勬姤璀﹁缃甀D
+     * @return 棰勬姤璀﹁缃�
+     */
+    @Override
+    public ArrayList getSettingCount(String[] id) {
+        ArrayList list = new ArrayList();
+        for (int i = 0; i < id.length; i++) {
+            int count = alarmItemMapper.getSettingCount(id[i]);
+            if (count > 0) {
+                list.add(count);
+            } else {
+                list.add(0);
+            }
+        }
+
+        return list;
+    }
+
+    @Override
+    public List<AlarmItem> getAllAlarmItem() {
+        return alarmItemMapper.getAllAlarmItem();
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/HistoryAlarmServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/HistoryAlarmServiceImpl.java
new file mode 100644
index 0000000..a60fe34
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/HistoryAlarmServiceImpl.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.data.monitoring.alarm.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.HistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkHistoryAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+import com.dingzhuo.energy.data.monitoring.alarm.mapper.HistoryAlarmMapper;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IHistoryAlarmService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class HistoryAlarmServiceImpl implements IHistoryAlarmService {
+
+  @Autowired
+  private HistoryAlarmMapper historyAlarmMapper;
+
+  @Override
+  public List<HistoryAlarm> getHistoryAlarm(Date beginTime, Date endTime) {
+    return null;
+  }
+
+  @Override
+  public List<HistoryAlarm> getHistoryAlarm(Date beginTime, Date endTime, TimeType timeType) {
+    return null;
+  }
+
+  @Override
+  public List<HistoryAlarm> getHistoryAlarm(Date beginTime, Date endTime, String alarmType) {
+    return null;
+  }
+
+  @Override
+  public List<JkHistoryAlarm> selectJkHistoryAlarmList(JkHistoryAlarm jkHistoryAlarm) {
+    return historyAlarmMapper.selectJkHistoryAlarmList(jkHistoryAlarm);
+  }
+
+  @Override
+  public List<JkHistoryAlarm> selectJkHistoryAlarmListExcel(JkHistoryAlarm jkHistoryAlarm) {
+    return historyAlarmMapper.selectJkHistoryAlarmListExcel(jkHistoryAlarm);
+  }
+
+  /**
+   * 瀹炴椂妫�娴� 鍔熻兘 鐨勫 sheet椤�  灞曠ず 缁勬�佸浘  娴嬬偣 鎶ヨ淇℃伅
+   *
+   * @param jkHistoryAlarm
+   * @return
+   */
+  @Override
+  public List<JkHistoryAlarm> selectHistoryAlarmNoteList(JkHistoryAlarm jkHistoryAlarm) {
+    return historyAlarmMapper.selectHistoryAlarmNoteList(jkHistoryAlarm);
+  }
+
+  @Override
+  public void updateHistoryAlarm(String alarmCode, HistoryAlarm historyAlarm) {
+    historyAlarmMapper.updateHistoryAlarm(alarmCode, historyAlarm);
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/RealtimeAlarmServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/RealtimeAlarmServiceImpl.java
new file mode 100644
index 0000000..4ccad3b
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/alarm/service/impl/RealtimeAlarmServiceImpl.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.data.monitoring.alarm.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.JkRealTimeAlarmList;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm;
+import com.dingzhuo.energy.data.monitoring.alarm.mapper.AlarmItemMapper;
+import com.dingzhuo.energy.data.monitoring.alarm.mapper.RealtimeAlarmMapper;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IAlarmItemService;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IRealtimeAlarmService;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class RealtimeAlarmServiceImpl implements IRealtimeAlarmService {
+
+  @Autowired
+  private RealtimeAlarmMapper realtimeAlarmMapper;
+
+  @Override
+  public List<RealTimeAlarm> getRealTimeAlarm() {
+    return realtimeAlarmMapper.getRealTimeAlarm();
+  }
+
+  @Override
+  public List<RealTimeAlarm> getRealTimeAlarm(TimeType timeType) {
+    return null;
+  }
+
+  @Override
+  public List<RealTimeAlarm> getRealTimeAlarm(String alarmLevel) {
+    return null;
+  }
+
+  /**
+   * @param jkRealTimeAlarmList 瀹炴椂鎶ヨ鐩戞帶鐢ㄥ垪琛�
+   * @return
+   */
+  @Override
+  public List<JkRealTimeAlarmList> selectRealtimeAlarmJkList(
+      JkRealTimeAlarmList jkRealTimeAlarmList) {
+    return realtimeAlarmMapper.selectRealtimeAlarmJkList(jkRealTimeAlarmList);
+  }
+
+  @Override
+  public void insert(RealTimeAlarm realTimeAlarm) {
+    realtimeAlarmMapper.insertRealtimeAlarm(realTimeAlarm);
+  }
+
+  @Override
+  public RealTimeAlarm getRealTimeAlarmByAlarmCode(String alarmCode) {
+    return realtimeAlarmMapper.getRealTimeAlarmByAlarmCode(alarmCode);
+  }
+
+  @Override
+  public RealTimeAlarm getAlarmByItemIdAndTimeCode(String itemId, String timeCode) {
+    return realtimeAlarmMapper.getAlarmByItemIdAndTimeCode(itemId, timeCode);
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusHistoryController.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusHistoryController.java
new file mode 100644
index 0000000..27ca779
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusHistoryController.java
@@ -0,0 +1,143 @@
+package com.dingzhuo.energy.data.monitoring.device.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusHistory;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusHistoryService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 璁惧鍚仠鍘嗗彶鐩戞祴Controller
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@RestController
+@RequestMapping("/historyMonitoring/historyMonitoring")
+public class DeviceStatusHistoryController extends BaseController
+{
+    private final IEnergyIndexService energyIndexService;
+    private final IModelNodeService modelNodeService;
+
+    @Autowired
+    private IDeviceStatusHistoryService deviceStatusHistoryService;
+
+    @Autowired
+    public DeviceStatusHistoryController(
+            IModelNodeService modelNodeService, IEnergyIndexService energyIndexService) {
+        this.modelNodeService = modelNodeService;
+        this.energyIndexService = energyIndexService;
+    }
+
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(DeviceStatusHistory deviceStatusHistory)
+    {
+        startPage();
+        List<DeviceStatusHistory> list = deviceStatusHistoryService.selectDeviceStatusHistoryList(deviceStatusHistory);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:export')")
+    @Log(title = "璁惧鍚仠鍘嗗彶鐩戞祴", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DeviceStatusHistory deviceStatusHistory)
+    {
+        List<DeviceStatusHistory> list = deviceStatusHistoryService.selectDeviceStatusHistoryList(deviceStatusHistory);
+        ExcelUtil<DeviceStatusHistory> util = new ExcelUtil<DeviceStatusHistory>(DeviceStatusHistory.class);
+        return util.exportExcel(list, "historyMonitoring");
+    }
+
+    /**
+     * 鑾峰彇璁惧鍚仠鍘嗗彶鐩戞祴璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(deviceStatusHistoryService.selectDeviceStatusHistoryById(id));
+    }
+
+    /**
+     * 鏂板璁惧鍚仠鍘嗗彶鐩戞祴
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:add')")
+    @Log(title = "璁惧鍚仠鍘嗗彶鐩戞祴", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody DeviceStatusHistory deviceStatusHistory)
+    {
+        return toAjax(deviceStatusHistoryService.insertDeviceStatusHistory(deviceStatusHistory));
+    }
+
+    /**
+     * 淇敼璁惧鍚仠鍘嗗彶鐩戞祴
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:edit')")
+    @Log(title = "璁惧鍚仠鍘嗗彶鐩戞祴", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody DeviceStatusHistory deviceStatusHistory)
+    {
+        return toAjax(deviceStatusHistoryService.updateDeviceStatusHistory(deviceStatusHistory));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:remove')")
+    @Log(title = "璁惧鍚仠鍘嗗彶鐩戞祴", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(deviceStatusHistoryService.deleteDeviceStatusHistoryByIds(ids));
+    }
+
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:list')")
+    @GetMapping("/history/list")
+    public TableDataInfo listTable(DeviceStatusHistory deviceStatusHistory)
+    {
+        startPage();
+        List<DeviceStatusHistory> historyList = deviceStatusHistoryService.selectDeviceStatusHistoryListNew(deviceStatusHistory);
+        return getDataTable(historyList);
+    }
+
+    /**
+     * 瀵煎嚭璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃(鏂�)
+     */
+    @PreAuthorize("@ss.hasPermi('historyMonitoring:historyMonitoring:export')")
+    @Log(title = "璁惧鍚仠鍘嗗彶鐩戞祴", businessType = BusinessType.EXPORT)
+    @GetMapping("/export/tableList")
+    public AjaxResult exportNew(DeviceStatusHistory deviceStatusHistory)
+    {
+        List<DeviceStatusHistory> historyList = deviceStatusHistoryService.selectDeviceStatusHistoryListNew(deviceStatusHistory);
+        ExcelUtil<DeviceStatusHistory> util = new ExcelUtil<DeviceStatusHistory>(DeviceStatusHistory.class);
+        return util.exportExcel(historyList, "historyMonitoring");
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusLiveController.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusLiveController.java
new file mode 100644
index 0000000..a7fa779
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStatusLiveController.java
@@ -0,0 +1,166 @@
+package com.dingzhuo.energy.data.monitoring.device.controller;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.data.model.service.IStateTypeService;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.device.domain.EquipmentMeasuringPointParameters;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusLive;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusLiveService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴Controller
+ * 
+ * @author sys
+ * @date 2020-03-23
+ */
+@RestController
+@RequestMapping("/realTimeMonitoring/realTimeMonitoring")
+public class DeviceStatusLiveController extends BaseController
+{
+    private final IModelNodeService modelNodeService;
+    private final IEnergyIndexService energyIndexService;
+    @Autowired
+    private IDeviceStatusLiveService deviceStatusLiveService;
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+    @Autowired
+    private IStateTypeService iStateTypeService;
+
+
+    @Autowired
+    public DeviceStatusLiveController(
+            IModelNodeService modelNodeService, IEnergyIndexService energyIndexService) {
+        this.modelNodeService = modelNodeService;
+        this.energyIndexService = energyIndexService;
+    }
+
+    /**
+     * 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('realTimeMonitoring:realTimeMonitoring:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(DeviceStatusLive deviceStatusLive)
+    {
+        startPage();
+        List<DeviceStatusLive> list = deviceStatusLiveService.selectDeviceStatusLiveList(deviceStatusLive);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭璁惧鍚仠瀹炴椂鐩戞祴鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('realTimeMonitoring:realTimeMonitoring:export')")
+    @Log(title = "璁惧鍚仠瀹炴椂鐩戞祴", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DeviceStatusLive deviceStatusLive)
+    {
+        List<DeviceStatusLive> list = deviceStatusLiveService.selectDeviceStatusLiveList(deviceStatusLive);
+        ExcelUtil<DeviceStatusLive> util = new ExcelUtil<DeviceStatusLive>(DeviceStatusLive.class);
+        return util.exportExcel(list, "realTimeMonitoring");
+    }
+
+    /**
+     * 鑾峰彇璁惧鍚仠瀹炴椂鐩戞祴璇︾粏淇℃伅
+     */
+//    @PreAuthorize("@ss.hasPermi('realTimeMonitoring:realTimeMonitoring:query')")
+    @GetMapping(value = "/{id}")
+    public TableDataInfo getInfo(@PathVariable("id") String id)
+    {
+        List<DeviceStatusLive> list = new ArrayList<>();
+        list.add(deviceStatusLiveService.selectDeviceStatusLiveById(id));
+        list.stream().forEach(x->{
+            if(x!=null)
+            x.setStateType(iStateTypeService.selectStateTypeById(x.getStatusId()));
+        });
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏂板璁惧鍚仠瀹炴椂鐩戞祴
+     */
+    @PreAuthorize("@ss.hasPermi('realTimeMonitoring:realTimeMonitoring:add')")
+    @Log(title = "璁惧鍚仠瀹炴椂鐩戞祴", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody DeviceStatusLive deviceStatusLive)
+    {
+        return toAjax(deviceStatusLiveService.insertDeviceStatusLive(deviceStatusLive));
+    }
+
+    /**
+     * 淇敼璁惧鍚仠瀹炴椂鐩戞祴
+     */
+    @PreAuthorize("@ss.hasPermi('realTimeMonitoring:realTimeMonitoring:edit')")
+    @Log(title = "璁惧鍚仠瀹炴椂鐩戞祴", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody DeviceStatusLive deviceStatusLive)
+    {
+        return toAjax(deviceStatusLiveService.updateDeviceStatusLive(deviceStatusLive));
+    }
+
+    /**
+     * 鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴
+     */
+    @PreAuthorize("@ss.hasPermi('realTimeMonitoring:realTimeMonitoring:remove')")
+    @Log(title = "璁惧鍚仠瀹炴椂鐩戞祴", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(deviceStatusLiveService.deleteDeviceStatusLiveByIds(ids));
+    }
+
+    @Log(title = "鑾峰彇妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣", businessType = BusinessType.UPDATE)
+    @GetMapping("/energyIndex/list")
+    public AjaxResult getSettingIndex(EnergyIndex energyIndex) {
+        try {
+            List<EnergyIndex> infoList = energyIndexService.selectEnergyIndexList(energyIndex);
+            List<String> codeList= infoList.stream().map(EnergyIndex::getCode).collect(Collectors.toList());
+            List<TagValue> valList = realtimeDatabaseService.retrieve(codeList);
+            List resultList = new ArrayList();
+            for(int i = 0;i<infoList.size();i++){
+                EquipmentMeasuringPointParameters item = new EquipmentMeasuringPointParameters();
+                item.setCode(infoList.get(i).getCode());
+                item.setIndexName(infoList.get(i).getName());
+                item.setIndexUnit(infoList.get(i).getUnitId());
+
+                valList.forEach(x->{
+                    if(x.getTagCode().equals(item.getCode()))
+                    {
+                        item.setValue(new   BigDecimal(x.getValue()).setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+                    }
+                });
+                resultList.add(item);
+            }
+            return AjaxResult.success(resultList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+        }
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStorageController.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStorageController.java
new file mode 100644
index 0000000..4b978a0
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/controller/DeviceStorageController.java
@@ -0,0 +1,115 @@
+package com.dingzhuo.energy.data.monitoring.device.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.data.model.domain.StateType;
+import com.dingzhuo.energy.data.model.service.IStateTypeService;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceFormulaParamService;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceFormulaService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 璁惧鐘舵�侀厤缃瓹ontroller
+ * 
+ * @author zhaow
+ * @date 2020-03-02
+ */
+@RestController
+@RequestMapping("/basicsetting/deviceStorage")
+public class DeviceStorageController extends BaseController
+{
+
+    @Autowired
+    private  IDeviceFormulaService deviceFormulaService;
+
+    @Autowired
+    private IDeviceFormulaParamService deviceFormulaParamService;
+
+    @Autowired
+    private IStateTypeService stateTypeService;
+    /**
+     * 璁惧鐘舵�佺鐞嗙偣鍑荤姸鎬佽繘琛岄厤缃椂鐨� 鍒濆鍖栭〉闈㈡暟鎹�
+     * @param deviceFormula
+     * @return
+     */
+    @GetMapping("/getDeviceStateByNodeIds")
+    public TableDataInfo getDeviceStateByNodeIds(DeviceFormula deviceFormula) {
+
+        startPage();
+        //鑺傜偣璁惧宸茶缃殑 鐘舵�佷俊鎭泦鍚�
+        List<DeviceFormula> deviceFormulas = new ArrayList<>();
+        //鍙栫郴缁熼粯璁よ缃墍鏈夌殑璁惧鐘舵��
+        List<StateType> list = stateTypeService.selectStateTypeList(new StateType());
+        //杩唬绯荤粺鍙傛暟鏁伴噺濉厖 宸茶缃殑鐘舵��
+        list.forEach(param ->{
+            DeviceFormula tempDev = deviceFormulaService.getDeviceFormula(deviceFormula.getDeviceId(),param.getStateId());
+            if(tempDev.getIsEnable()==null || tempDev.getIsEnable().isEmpty())
+            {
+                tempDev.setIsEnable("N");
+            }
+            tempDev.setStateType(param);
+            deviceFormulas.add(tempDev);
+        });
+        return getDataTable(deviceFormulas);
+    }
+
+    /**
+     * 璁惧鐘舵�佺鐞嗙偣鍑荤姸鎬佽繘琛岄厤缃椂鐨� 鍒濆鍖栭〉闈㈡暟鎹�
+     * @param nodeId
+     * @return
+     */
+    @GetMapping("/{nodeId}/{stateId}")
+    public AjaxResult getDeviceStorage(@PathVariable String nodeId,@PathVariable String stateId) {
+        JSONObject result = new JSONObject();
+        //1銆佸彇鏍规嵁 璁惧妯″瀷 鑺傜偣ID  鍜�  璁惧鐘舵�佷富閿� ID  鍙�  璁惧鍏紡淇℃伅
+        DeviceFormula deviceFormula = deviceFormulaService.getDeviceFormula(nodeId,stateId);
+
+        result.put("deviceFormula", deviceFormula);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 璁惧鐘舵�� 閰嶇疆 鍏紡淇濆瓨
+     * @param param
+     * @param nodeId
+     * @param stateId
+     * @return
+     */
+    @PostMapping("/{nodeId}/{stateId}")
+    public AjaxResult saveDeviceStorage(@RequestBody JSONObject param, @PathVariable String nodeId, @PathVariable String stateId) {
+        try {
+            DeviceFormula deviceFormula = param.getObject("deviceFormula", DeviceFormula.class);
+            deviceFormula.setDeviceId(nodeId);
+            deviceFormula.setStateId(stateId);
+            deviceFormulaService.saveDeviceFormula(deviceFormula);
+        } catch (Exception ex) {
+            logger.error("", ex);
+            return AjaxResult.error();
+        }
+
+        return AjaxResult.success();
+    }
+
+    /**
+     * 璁惧鐘舵�� 鍏紡 鍚敤璁剧疆
+     */
+    @Log(title = "澶囩姸鎬佸叕寮忓惎鐢ㄨ缃�", businessType = BusinessType.UPDATE)
+    @PostMapping(value="/setIsEnable/{nodeId}/{isEnable}")
+    public AjaxResult editDeviceFormulaIsEnable(@PathVariable String nodeId,@PathVariable String isEnable,@RequestBody String[] ids)
+    {
+        return toAjax(deviceFormulaService.editDeviceFormulaIsEnable(nodeId,isEnable,ids));
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormula.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormula.java
new file mode 100644
index 0000000..b6e9cff
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormula.java
@@ -0,0 +1,130 @@
+package com.dingzhuo.energy.data.monitoring.device.domain;
+
+import com.dingzhuo.energy.data.model.domain.StateType;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 璁惧璁$畻鍏紡瀵硅薄 device_formula
+ * 
+ * @author zhaow
+ * @date 2020-03-20
+ */
+public class DeviceFormula extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    private String id;
+
+    /** 璁惧妯″瀷鏍戠殑nodeid */
+    private String deviceId;
+
+    /** 璁惧鐘舵�佽〃鐨刬d */
+    private String stateId;
+
+    /** 璁惧鐘舵�佽缃殑璁$畻鍏紡 */
+    private String formulaText;
+
+    /** 寮曟搸鐢ㄨ绠楁枃鏈� */
+    private String calcText;
+    /**
+     * 鏄惁鍚敤
+     */
+    private String isEnable;
+
+    /**
+     * 璁惧鎸囧畾鐨勭郴缁熺姸鎬佷俊鎭�
+     */
+    private StateType stateType;
+    /**
+     * 璁惧鐘舵�佽绠楀叕寮忎笅鐨� 鍙傛暟闆嗗悎瀵硅薄
+     */
+    private List<DeviceFormulaParam> deviceFormulaParams = new ArrayList<>();
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setDeviceId(String deviceId) 
+    {
+        this.deviceId = deviceId;
+    }
+
+    public String getDeviceId() 
+    {
+        return deviceId;
+    }
+    public void setStateId(String stateId) 
+    {
+        this.stateId = stateId;
+    }
+
+    public String getStateId() 
+    {
+        return stateId;
+    }
+    public void setFormulaText(String formulaText) 
+    {
+        this.formulaText = formulaText;
+    }
+
+    public String getFormulaText() 
+    {
+        return formulaText;
+    }
+    public void setCalcText(String calcText) 
+    {
+        this.calcText = calcText;
+    }
+
+    public String getCalcText() 
+    {
+        return calcText;
+    }
+
+    public List<DeviceFormulaParam> getDeviceFormulaParams() {
+        return deviceFormulaParams;
+    }
+
+    public void setDeviceFormulaParams(List<DeviceFormulaParam> deviceFormulaParams) {
+        this.deviceFormulaParams = deviceFormulaParams;
+    }
+
+    public String getIsEnable() {
+        return isEnable;
+    }
+
+    public void setIsEnable(String isEnable) {
+        this.isEnable = isEnable;
+    }
+
+    public StateType getStateType() {
+        return stateType;
+    }
+
+    public void setStateType(StateType stateType) {
+        this.stateType = stateType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("deviceId", getDeviceId())
+            .append("stateId", getStateId())
+            .append("formulaText", getFormulaText())
+            .append("calcText", getCalcText())
+            .toString();
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormulaParam.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormulaParam.java
new file mode 100644
index 0000000..43ea6c3
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceFormulaParam.java
@@ -0,0 +1,76 @@
+package com.dingzhuo.energy.data.monitoring.device.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 璁惧鐘舵�佸弬鏁板璞� device_formula_param
+ * 
+ * @author zhaow
+ * @date 2020-03-20
+ */
+public class DeviceFormulaParam extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    private String id;
+
+    /** device_formula琛ㄧ殑涓婚敭Id */
+    private String devFormulaId;
+
+    /** 璁$畻鍏紡涓弬鏁板悕绉� */
+    private String paramName;
+
+    /** 璁$畻鍏紡涓弬鏁板�� */
+    private String paramValue;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setDevFormulaId(String devFormulaId) 
+    {
+        this.devFormulaId = devFormulaId;
+    }
+
+    public String getDevFormulaId() 
+    {
+        return devFormulaId;
+    }
+    public void setParamName(String paramName) 
+    {
+        this.paramName = paramName;
+    }
+
+    public String getParamName() 
+    {
+        return paramName;
+    }
+    public void setParamValue(String paramValue) 
+    {
+        this.paramValue = paramValue;
+    }
+
+    public String getParamValue() 
+    {
+        return paramValue;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("devFormulaId", getDevFormulaId())
+            .append("paramName", getParamName())
+            .append("paramValue", getParamValue())
+            .toString();
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusHistory.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusHistory.java
new file mode 100644
index 0000000..355dfe0
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusHistory.java
@@ -0,0 +1,177 @@
+package com.dingzhuo.energy.data.monitoring.device.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 璁惧鍚仠鍘嗗彶鐩戞祴瀵硅薄 device_status_history
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class DeviceStatusHistory extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /**
+     * 鍚嶇О
+     * */
+    @Excel(name = "璁惧鍚嶇О")
+    private String indexName;
+
+    /** 璁惧涓婚敭 */
+//    @Excel(name = "璁惧涓婚敭")
+    private String deviceId;
+
+    /** 鍏宠仈鐘舵�侀厤缃� */
+//    @Excel(name = "鍏宠仈鐘舵�侀厤缃�")
+    private String statusId;
+
+    /** 璁惧鐘舵�佸悕绉� */
+    @Excel(name = "璁惧鐘舵��")
+    private String statusName;
+
+    /** 璁惧鐘舵�佺爜 */
+//    @Excel(name = "璁惧鐘舵�佺爜")
+    private String statusCode;
+
+    /** 鐘舵�佸紑濮嬫椂闂� */
+    @Excel(name = "寮�濮嬫椂闂�", width = 30)
+    private String devBeginTime;
+
+    /** 鐘舵�佺粨鏉熸椂闂� */
+    @Excel(name = "缁撴潫鏃堕棿", width = 30)
+    private String devEndTime;
+
+    /** 鐘舵�佹寔缁椂闂� */
+    @Excel(name = "鎸佺画鏃堕棿")
+    private String duration;
+
+    /**
+     * 妯″瀷鏌ヨ灞傜骇鏍囧織 B鏈骇  ALL鍖呭惈涓嬬骇
+     * */
+    private String eierarchyFlag;
+    /**
+     * 鎸囨爣绫诲瀷 COLLECT閲囬泦鐐�  STATISTIC鎸囨爣
+     * */
+    private String indexType;
+
+
+
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setDeviceId(String deviceId) 
+    {
+        this.deviceId = deviceId;
+    }
+
+    public String getDeviceId() 
+    {
+        return deviceId;
+    }
+    public void setStatusId(String statusId) 
+    {
+        this.statusId = statusId;
+    }
+
+    public String getStatusId() 
+    {
+        return statusId;
+    }
+    public void setStatusName(String statusName) 
+    {
+        this.statusName = statusName;
+    }
+
+    public String getStatusName() 
+    {
+        return statusName;
+    }
+    public void setStatusCode(String statusCode) 
+    {
+        this.statusCode = statusCode;
+    }
+
+    public String getStatusCode() 
+    {
+        return statusCode;
+    }
+
+    public String getDevBeginTime() {
+        return devBeginTime;
+    }
+
+    public void setDevBeginTime(String devBeginTime) {
+        this.devBeginTime = devBeginTime;
+    }
+
+    public String getDevEndTime() {
+        return devEndTime;
+    }
+
+    public void setDevEndTime(String devEndTime) {
+        this.devEndTime = devEndTime;
+    }
+
+    public void setDuration(String duration)
+    {
+        this.duration = duration;
+    }
+
+    public String getDuration()
+    {
+        return duration;
+    }
+
+    public String getEierarchyFlag() {
+        return eierarchyFlag;
+    }
+
+    public void setEierarchyFlag(String eierarchyFlag) {
+        this.eierarchyFlag = eierarchyFlag;
+    }
+
+    public String getIndexType() {
+        return indexType;
+    }
+
+    public void setIndexType(String indexType) {
+        this.indexType = indexType;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("deviceId", getDeviceId())
+            .append("statusId", getStatusId())
+            .append("statusName", getStatusName())
+            .append("statusCode", getStatusCode())
+            .append("beginTime", getBeginTime())
+            .append("endTime", getEndTime())
+            .append("duration", getDuration())
+            .toString();
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusLive.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusLive.java
new file mode 100644
index 0000000..d36d02e
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/DeviceStatusLive.java
@@ -0,0 +1,133 @@
+package com.dingzhuo.energy.data.monitoring.device.domain;
+
+import com.dingzhuo.energy.data.model.domain.StateType;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴瀵硅薄 device_status_live
+ * 
+ * @author sys
+ * @date 2020-03-23
+ */
+public class DeviceStatusLive extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 璁惧涓婚敭鍏宠仈妯″瀷鐨勮妭鐐笽D */
+    @Excel(name = "璁惧涓婚敭鍏宠仈妯″瀷鐨勮妭鐐笽D")
+    private String deviceId;
+
+    /** 鍏宠仈鐘舵�侀厤缃紝鍏宠仈state_type.id */
+    @Excel(name = "鍏宠仈鐘舵�侀厤缃紝鍏宠仈state_type.id")
+    private String statusId;
+
+    /** 璁惧鐘舵�佸悕绉� */
+    @Excel(name = "璁惧鐘舵�佸悕绉�")
+    private String statusName;
+
+    /** 璁惧鐘舵�佺爜 */
+    @Excel(name = "璁惧鐘舵�佺爜")
+    private String statusCode;
+
+    /** 鐘舵�佸紑濮嬫椂闂� */
+    @Excel(name = "鐘舵�佸紑濮嬫椂闂�", width = 30, dateFormat = "yyyy-MM-dd")
+    private String beginTime;
+    /**
+     * 妯″瀷涓枃鍚嶇О
+     */
+    private String modelNodeName;
+    /**
+     * 鐘舵�佺被鍨�
+     */
+    private StateType stateType;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setDeviceId(String deviceId) 
+    {
+        this.deviceId = deviceId;
+    }
+
+    public String getDeviceId() 
+    {
+        return deviceId;
+    }
+    public void setStatusId(String statusId) 
+    {
+        this.statusId = statusId;
+    }
+
+    public String getStatusId() 
+    {
+        return statusId;
+    }
+    public void setStatusName(String statusName) 
+    {
+        this.statusName = statusName;
+    }
+
+    public String getStatusName() 
+    {
+        return statusName;
+    }
+    public void setStatusCode(String statusCode) 
+    {
+        this.statusCode = statusCode;
+    }
+
+    public String getStatusCode() 
+    {
+        return statusCode;
+    }
+    public void setBeginTime(String beginTime)
+    {
+        this.beginTime = beginTime;
+    }
+
+    public String getBeginTime()
+    {
+        return beginTime;
+    }
+
+    public StateType getStateType() {
+        return stateType;
+    }
+
+    public void setStateType(StateType stateType) {
+        this.stateType = stateType;
+    }
+
+    public String getModelNodeName() {
+        return modelNodeName;
+    }
+
+    public void setModelNodeName(String modelNodeName) {
+        this.modelNodeName = modelNodeName;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("deviceId", getDeviceId())
+            .append("statusId", getStatusId())
+            .append("statusName", getStatusName())
+            .append("statusCode", getStatusCode())
+            .append("beginTime", getBeginTime())
+            .toString();
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/EquipmentMeasuringPointParameters.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/EquipmentMeasuringPointParameters.java
new file mode 100644
index 0000000..400fea7
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/EquipmentMeasuringPointParameters.java
@@ -0,0 +1,72 @@
+package com.dingzhuo.energy.data.monitoring.device.domain;
+
+
+/**
+ * 璁惧鐩戞祴鍙傛暟鍒楄〃瀵硅薄
+ *
+ * @author
+ * @date 2020-03-24
+ */
+public class EquipmentMeasuringPointParameters {
+
+
+    private String code;
+
+    private String indexName;
+
+    private String indexUnit;
+
+    private Double value;
+
+    private String yValue;
+
+    private String meteName;
+
+    public String getyValue() {
+        return yValue;
+    }
+
+    public void setyValue(String yValue) {
+        this.yValue = yValue;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getIndexUnit() {
+        return indexUnit;
+    }
+
+    public void setIndexUnit(String indexUnit) {
+        this.indexUnit = indexUnit;
+    }
+
+    public Double getValue() {
+        return value;
+    }
+
+    public void setValue(Double value) {
+        this.value = value;
+    }
+
+    public String getMeteName() {
+        return meteName;
+    }
+
+    public void setMeteName(String meteName) {
+        this.meteName = meteName;
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/HistoryDeviceStatus.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/HistoryDeviceStatus.java
new file mode 100644
index 0000000..aab2f27
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/HistoryDeviceStatus.java
@@ -0,0 +1,60 @@
+package com.dingzhuo.energy.data.monitoring.device.domain;
+
+import java.util.Date;
+
+public class HistoryDeviceStatus {
+  private String id;
+  private String deviceId;
+  private Date beginTime;
+  private Date endTime;
+  private String status;
+  private double duration;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getDeviceId() {
+    return deviceId;
+  }
+
+  public void setDeviceId(String deviceId) {
+    this.deviceId = deviceId;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+
+  public Date getEndTime() {
+    return endTime;
+  }
+
+  public void setEndTime(Date endTime) {
+    this.endTime = endTime;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public double getDuration() {
+    return duration;
+  }
+
+  public void setDuration(double duration) {
+    this.duration = duration;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/RealtimeDeviceStatus.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/RealtimeDeviceStatus.java
new file mode 100644
index 0000000..24ac7c4
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/RealtimeDeviceStatus.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.data.monitoring.device.domain;
+
+import java.util.Date;
+
+public class RealtimeDeviceStatus {
+  private String id;
+  private String deviceId;
+  private Date beginTime;
+  private String status;
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public String getDeviceId() {
+    return deviceId;
+  }
+
+  public void setDeviceId(String deviceId) {
+    this.deviceId = deviceId;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersExcel.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersExcel.java
new file mode 100644
index 0000000..80af8e1
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersExcel.java
@@ -0,0 +1,70 @@
+package com.dingzhuo.energy.data.monitoring.device.domain.vo;
+
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+/**
+ * 璁惧鐐逛綅瀹炴椂鏁版嵁杩斿洖 Excel
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/6
+ */
+public class EquipmentPointParametersExcel {
+
+    /**
+     * 鐐逛綅鍚嶇О
+     */
+    @Excel(name = "鐐逛綅鍚嶇О")
+    private String indexName;
+
+    /**
+     * 鍊�
+     */
+    @Excel(name = "褰撳墠鍊�")
+    private String value;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    private String indexUnit;
+
+    /**
+     * 鏃堕棿瀛楃涓�
+     */
+    @Excel(name = "鏃堕棿")
+    private String timeString;
+
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getIndexUnit() {
+        return indexUnit;
+    }
+
+    public void setIndexUnit(String indexUnit) {
+        this.indexUnit = indexUnit;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeString() {
+        return timeString;
+    }
+
+    public void setTimeString(String timeString) {
+        this.timeString = timeString;
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersVO.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersVO.java
new file mode 100644
index 0000000..1895342
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/domain/vo/EquipmentPointParametersVO.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.data.monitoring.device.domain.vo;
+
+
+/**
+ * 璁惧鐐逛綅瀹炴椂鏁版嵁杩斿洖 vo
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/6
+ */
+public class EquipmentPointParametersVO {
+
+    /**
+     * 鐐逛綅缂栫爜
+     */
+    private String code;
+
+    /**
+     * 鐐逛綅鍚嶇О
+     */
+    private String indexName;
+
+    /**
+     * 鏃堕棿瀛楃涓�
+     */
+    private String timeString;
+
+    /**
+     * 鐐逛綅鍗曚綅
+     */
+    private String indexUnit;
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getIndexUnit() {
+        return indexUnit;
+    }
+
+    public void setIndexUnit(String indexUnit) {
+        this.indexUnit = indexUnit;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeString() {
+        return timeString;
+    }
+
+    public void setTimeString(String timeString) {
+        this.timeString = timeString;
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaMapper.java
new file mode 100644
index 0000000..9037114
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaMapper.java
@@ -0,0 +1,76 @@
+package com.dingzhuo.energy.data.monitoring.device.mapper;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import java.util.List;
+
+/**
+ * 璁惧璁$畻鍏紡Mapper鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-03-20
+ */
+public interface DeviceFormulaMapper 
+{
+    /**
+     * 鏌ヨ璁惧璁$畻鍏紡
+     * 
+     * @param id 璁惧璁$畻鍏紡ID
+     * @return 璁惧璁$畻鍏紡
+     */
+    DeviceFormula selectDeviceFormulaById(String id);
+
+    /**
+     * 鏌ヨ璁惧璁$畻鍏紡鍒楄〃
+     * 
+     * @param deviceFormula 璁惧璁$畻鍏紡
+     * @return 璁惧璁$畻鍏紡闆嗗悎
+     */
+    List<DeviceFormula> selectDeviceFormulaList(DeviceFormula deviceFormula);
+
+    /**
+     * 鏂板璁惧璁$畻鍏紡
+     * 
+     * @param deviceFormula 璁惧璁$畻鍏紡
+     * @return 缁撴灉
+     */
+    int insertDeviceFormula(DeviceFormula deviceFormula);
+
+    /**
+     * 淇敼璁惧璁$畻鍏紡
+     * 
+     * @param deviceFormula 璁惧璁$畻鍏紡
+     * @return 缁撴灉
+     */
+    int updateDeviceFormula(DeviceFormula deviceFormula);
+
+    /**
+     * 鍒犻櫎璁惧璁$畻鍏紡
+     * 
+     * @param id 璁惧璁$畻鍏紡ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceFormulaById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧璁$畻鍏紡
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceFormulaByIds(String[] ids);
+
+    /**
+     * 鍙栨牴鎹� 璁惧妯″瀷 鑺傜偣ID  鍜�  璁惧鐘舵�佷富閿� ID  鍙�  璁惧鍏紡淇℃伅
+     * @param nodeId
+     * @param stateId
+     * @return
+     */
+    DeviceFormula getDeviceFormula(String nodeId, String stateId) ;
+
+    /**
+     * 璁惧鐘舵�� 鍏紡 鍚敤璁剧疆
+     */
+    int editDeviceFormulaIsEnable(String nodeId, String isEnable, String[] ids);
+
+    List<DeviceFormula> getAllDeviceFormula();
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaParamMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaParamMapper.java
new file mode 100644
index 0000000..c03363d
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceFormulaParamMapper.java
@@ -0,0 +1,76 @@
+package com.dingzhuo.energy.data.monitoring.device.mapper;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormulaParam;
+import java.util.List;
+
+/**
+ * 璁惧鐘舵�佸弬鏁癕apper鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-03-20
+ */
+public interface DeviceFormulaParamMapper 
+{
+    /**
+     * 鏌ヨ璁惧鐘舵�佸弬鏁�
+     * 
+     * @param id 璁惧鐘舵�佸弬鏁癐D
+     * @return 璁惧鐘舵�佸弬鏁�
+     */
+    public DeviceFormulaParam selectDeviceFormulaParamById(String id);
+
+    /**
+     * 鏌ヨ璁惧鐘舵�佸弬鏁板垪琛�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 璁惧鐘舵�佸弬鏁伴泦鍚�
+     */
+    public List<DeviceFormulaParam> selectDeviceFormulaParamList(DeviceFormulaParam deviceFormulaParam);
+
+    /**
+     * 鏂板璁惧鐘舵�佸弬鏁�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 缁撴灉
+     */
+    public int insertDeviceFormulaParam(DeviceFormulaParam deviceFormulaParam);
+
+    /**
+     * 淇敼璁惧鐘舵�佸弬鏁�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 缁撴灉
+     */
+    public int updateDeviceFormulaParam(DeviceFormulaParam deviceFormulaParam);
+
+    /**
+     * 鍒犻櫎璁惧鐘舵�佸弬鏁�
+     * 
+     * @param id 璁惧鐘舵�佸弬鏁癐D
+     * @return 缁撴灉
+     */
+    public int deleteDeviceFormulaParamById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鐘舵�佸弬鏁�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteDeviceFormulaParamByIds(String[] ids);
+
+    /**
+     * 鏍规嵁 璁惧鍏紡琛ㄤ富閿甀D鏌ヨ璁惧鐘舵�佸弬鏁板垪琛�
+     *
+     * @param devFormulaId 璁惧鍏紡琛ㄤ富閿甀D
+     * @return 璁惧鐘舵�佸弬鏁伴泦鍚�
+     */
+    public List<DeviceFormulaParam> getFormulaParam(String devFormulaId);
+
+    /**
+     * 淇濆瓨璁惧閰嶇疆鐨勭姸鎬佺殑鍏紡鍙傛暟 鏍规嵁鍏紡涓婚敭鍜屽弬鏁伴泦鍚�
+     * @param devFormulaId
+     * @param deviceFormulaParams
+     */
+    void saveDeviceFormulaParam(String devFormulaId, List<DeviceFormulaParam> deviceFormulaParams);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusHistoryMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusHistoryMapper.java
new file mode 100644
index 0000000..fec7060
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusHistoryMapper.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.data.monitoring.device.mapper;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusHistory;
+import java.util.List;
+
+/**
+ * 璁惧鍚仠鍘嗗彶鐩戞祴Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface DeviceStatusHistoryMapper 
+{
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param id 璁惧鍚仠鍘嗗彶鐩戞祴ID
+     * @return 璁惧鍚仠鍘嗗彶鐩戞祴
+     */
+    DeviceStatusHistory selectDeviceStatusHistoryById(String id);
+
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+     * 
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 璁惧鍚仠鍘嗗彶鐩戞祴闆嗗悎
+     */
+    List<DeviceStatusHistory> selectDeviceStatusHistoryList(DeviceStatusHistory deviceStatusHistory);
+
+    /**
+     * 鏂板璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 缁撴灉
+     */
+    int insertDeviceStatusHistory(DeviceStatusHistory deviceStatusHistory);
+
+    /**
+     * 淇敼璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 缁撴灉
+     */
+    int updateDeviceStatusHistory(DeviceStatusHistory deviceStatusHistory);
+
+    /**
+     * 鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param id 璁惧鍚仠鍘嗗彶鐩戞祴ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusHistoryById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusHistoryByIds(String[] ids);
+
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃锛堟柊鍔狅級
+     *
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 璁惧鍚仠鍘嗗彶鐩戞祴闆嗗悎
+     */
+    List<DeviceStatusHistory> selectDeviceStatusHistoryListNew(DeviceStatusHistory deviceStatusHistory);
+
+  void saveHistoryStatus(DeviceStatusHistory history);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusLiveMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusLiveMapper.java
new file mode 100644
index 0000000..8bc5614
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/mapper/DeviceStatusLiveMapper.java
@@ -0,0 +1,63 @@
+package com.dingzhuo.energy.data.monitoring.device.mapper;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusLive;
+import java.util.List;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-23
+ */
+public interface DeviceStatusLiveMapper 
+{
+    /**
+     * 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param id 璁惧鍚仠瀹炴椂鐩戞祴ID
+     * @return 璁惧鍚仠瀹炴椂鐩戞祴
+     */
+    DeviceStatusLive selectDeviceStatusLiveById(String id);
+
+    /**
+     * 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴鍒楄〃
+     * 
+     * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+     * @return 璁惧鍚仠瀹炴椂鐩戞祴闆嗗悎
+     */
+    List<DeviceStatusLive> selectDeviceStatusLiveList(DeviceStatusLive deviceStatusLive);
+
+    /**
+     * 鏂板璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+     * @return 缁撴灉
+     */
+    int insertDeviceStatusLive(DeviceStatusLive deviceStatusLive);
+
+    /**
+     * 淇敼璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+     * @return 缁撴灉
+     */
+    int updateDeviceStatusLive(DeviceStatusLive deviceStatusLive);
+
+    /**
+     * 鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param id 璁惧鍚仠瀹炴椂鐩戞祴ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusLiveById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusLiveByIds(String[] ids);
+
+    DeviceStatusLive getDeviceStatus(String deviceId, String statusId);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaParamService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaParamService.java
new file mode 100644
index 0000000..9acaf13
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaParamService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.data.monitoring.device.service;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormulaParam;
+import java.util.List;
+
+/**
+ * 璁惧鐘舵�佸弬鏁癝ervice鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-03-20
+ */
+public interface IDeviceFormulaParamService 
+{
+    /**
+     * 鏌ヨ璁惧鐘舵�佸弬鏁�
+     * 
+     * @param id 璁惧鐘舵�佸弬鏁癐D
+     * @return 璁惧鐘舵�佸弬鏁�
+     */
+    public DeviceFormulaParam selectDeviceFormulaParamById(String id);
+
+    /**
+     * 鏌ヨ璁惧鐘舵�佸弬鏁板垪琛�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 璁惧鐘舵�佸弬鏁伴泦鍚�
+     */
+    public List<DeviceFormulaParam> selectDeviceFormulaParamList(DeviceFormulaParam deviceFormulaParam);
+
+    /**
+     * 鏂板璁惧鐘舵�佸弬鏁�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 缁撴灉
+     */
+    public int insertDeviceFormulaParam(DeviceFormulaParam deviceFormulaParam);
+
+    /**
+     * 淇敼璁惧鐘舵�佸弬鏁�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 缁撴灉
+     */
+    public int updateDeviceFormulaParam(DeviceFormulaParam deviceFormulaParam);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鐘舵�佸弬鏁�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧鐘舵�佸弬鏁癐D
+     * @return 缁撴灉
+     */
+    public int deleteDeviceFormulaParamByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁惧鐘舵�佸弬鏁颁俊鎭�
+     * 
+     * @param id 璁惧鐘舵�佸弬鏁癐D
+     * @return 缁撴灉
+     */
+    public int deleteDeviceFormulaParamById(String id);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaService.java
new file mode 100644
index 0000000..4d153ba
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceFormulaService.java
@@ -0,0 +1,92 @@
+package com.dingzhuo.energy.data.monitoring.device.service;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * 璁惧璁$畻鍏紡Service鎺ュ彛
+ *
+ * @author zhaow
+ * @date 2020-03-20
+ */
+public interface IDeviceFormulaService {
+
+  /**
+   * 鏌ヨ璁惧璁$畻鍏紡
+   *
+   * @param id 璁惧璁$畻鍏紡ID
+   * @return 璁惧璁$畻鍏紡
+   */
+  DeviceFormula selectDeviceFormulaById(String id);
+
+  /**
+   * 鏌ヨ璁惧璁$畻鍏紡鍒楄〃
+   *
+   * @param deviceFormula 璁惧璁$畻鍏紡
+   * @return 璁惧璁$畻鍏紡闆嗗悎
+   */
+  List<DeviceFormula> selectDeviceFormulaList(DeviceFormula deviceFormula);
+
+  /**
+   * 鏂板璁惧璁$畻鍏紡
+   *
+   * @param deviceFormula 璁惧璁$畻鍏紡
+   * @return 缁撴灉
+   */
+  int insertDeviceFormula(DeviceFormula deviceFormula);
+
+  /**
+   * 淇敼璁惧璁$畻鍏紡
+   *
+   * @param deviceFormula 璁惧璁$畻鍏紡
+   * @return 缁撴灉
+   */
+  int updateDeviceFormula(DeviceFormula deviceFormula);
+
+  /**
+   * 鎵归噺鍒犻櫎璁惧璁$畻鍏紡
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑璁惧璁$畻鍏紡ID
+   * @return 缁撴灉
+   */
+  int deleteDeviceFormulaByIds(String[] ids);
+
+  /**
+   * 鍒犻櫎璁惧璁$畻鍏紡淇℃伅
+   *
+   * @param id 璁惧璁$畻鍏紡ID
+   * @return 缁撴灉
+   */
+  int deleteDeviceFormulaById(String id);
+
+  /**
+   * 鍙栨牴鎹� 璁惧妯″瀷 鑺傜偣ID  鍜�  璁惧鐘舵�佷富閿� ID  鍙�  璁惧鍏紡淇℃伅
+   *
+   * @param nodeId
+   * @param stateId
+   * @return
+   */
+  DeviceFormula getDeviceFormula(String nodeId, String stateId);
+
+  /**
+   * 璁惧鐘舵�� 閰嶇疆 鍏紡淇濆瓨
+   *
+   * @param deviceFormula
+   * @return
+   */
+  void saveDeviceFormula(DeviceFormula deviceFormula);
+
+  /**
+   * 璁惧鐘舵�� 鍏紡 鍚敤璁剧疆
+   */
+  int editDeviceFormulaIsEnable(String nodeId, String isEnable, String[] ids);
+
+  List<DeviceFormula> getAllDeviceFormula();
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusHistoryService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusHistoryService.java
new file mode 100644
index 0000000..7e70c14
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusHistoryService.java
@@ -0,0 +1,72 @@
+package com.dingzhuo.energy.data.monitoring.device.service;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusHistory;
+import java.util.List;
+
+/**
+ * 璁惧鍚仠鍘嗗彶鐩戞祴Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IDeviceStatusHistoryService 
+{
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param id 璁惧鍚仠鍘嗗彶鐩戞祴ID
+     * @return 璁惧鍚仠鍘嗗彶鐩戞祴
+     */
+    DeviceStatusHistory selectDeviceStatusHistoryById(String id);
+
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+     * 
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 璁惧鍚仠鍘嗗彶鐩戞祴闆嗗悎
+     */
+    List<DeviceStatusHistory> selectDeviceStatusHistoryList(DeviceStatusHistory deviceStatusHistory);
+
+    /**
+     * 鏂板璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 缁撴灉
+     */
+    int insertDeviceStatusHistory(DeviceStatusHistory deviceStatusHistory);
+
+    /**
+     * 淇敼璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 缁撴灉
+     */
+    int updateDeviceStatusHistory(DeviceStatusHistory deviceStatusHistory);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧鍚仠鍘嗗彶鐩戞祴ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusHistoryByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴淇℃伅
+     * 
+     * @param id 璁惧鍚仠鍘嗗彶鐩戞祴ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusHistoryById(String id);
+
+
+    /**
+     * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃锛堟柊鍔狅級
+     *
+     * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+     * @return 璁惧鍚仠鍘嗗彶鐩戞祴闆嗗悎
+     */
+    List<DeviceStatusHistory> selectDeviceStatusHistoryListNew(DeviceStatusHistory deviceStatusHistory);
+
+    void saveHistoryStatus(DeviceStatusHistory history);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusLiveService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusLiveService.java
new file mode 100644
index 0000000..e9a3300
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IDeviceStatusLiveService.java
@@ -0,0 +1,63 @@
+package com.dingzhuo.energy.data.monitoring.device.service;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusLive;
+import java.util.List;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-23
+ */
+public interface IDeviceStatusLiveService 
+{
+    /**
+     * 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param id 璁惧鍚仠瀹炴椂鐩戞祴ID
+     * @return 璁惧鍚仠瀹炴椂鐩戞祴
+     */
+    DeviceStatusLive selectDeviceStatusLiveById(String id);
+
+    /**
+     * 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴鍒楄〃
+     * 
+     * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+     * @return 璁惧鍚仠瀹炴椂鐩戞祴闆嗗悎
+     */
+    List<DeviceStatusLive> selectDeviceStatusLiveList(DeviceStatusLive deviceStatusLive);
+
+    /**
+     * 鏂板璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+     * @return 缁撴灉
+     */
+    int insertDeviceStatusLive(DeviceStatusLive deviceStatusLive);
+
+    /**
+     * 淇敼璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+     * @return 缁撴灉
+     */
+    int updateDeviceStatusLive(DeviceStatusLive deviceStatusLive);
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧鍚仠瀹炴椂鐩戞祴ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusLiveByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴淇℃伅
+     * 
+     * @param id 璁惧鍚仠瀹炴椂鐩戞祴ID
+     * @return 缁撴灉
+     */
+    int deleteDeviceStatusLiveById(String id);
+
+    DeviceStatusLive getDeviceStatus(String deviceId, String stateId);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IHistoryDeviceStatus.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IHistoryDeviceStatus.java
new file mode 100644
index 0000000..fbf9620
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IHistoryDeviceStatus.java
@@ -0,0 +1,13 @@
+package com.dingzhuo.energy.data.monitoring.device.service;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.HistoryDeviceStatus;
+
+import java.util.Date;
+import java.util.List;
+
+public interface IHistoryDeviceStatus {
+  List<HistoryDeviceStatus> getHistoryDeviceStatus(Date beginTime, Date endTime);
+
+  List<HistoryDeviceStatus> getHistoryDeviceStatus(Date beginTime, Date endTime, String status);
+
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IRealtimeDeviceStatus.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IRealtimeDeviceStatus.java
new file mode 100644
index 0000000..efabfa1
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/IRealtimeDeviceStatus.java
@@ -0,0 +1,9 @@
+package com.dingzhuo.energy.data.monitoring.device.service;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.RealtimeDeviceStatus;
+
+import java.util.List;
+
+public interface IRealtimeDeviceStatus {
+  List<RealtimeDeviceStatus> getRealtimeDeviceStatus();
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaParamServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaParamServiceImpl.java
new file mode 100644
index 0000000..ff3bfce
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaParamServiceImpl.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.data.monitoring.device.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.data.monitoring.device.mapper.DeviceFormulaParamMapper;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormulaParam;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceFormulaParamService;
+
+/**
+ * 璁惧鐘舵�佸弬鏁癝ervice涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-03-20
+ */
+@Service
+public class DeviceFormulaParamServiceImpl implements IDeviceFormulaParamService 
+{
+    @Autowired
+    private DeviceFormulaParamMapper deviceFormulaParamMapper;
+
+    /**
+     * 鏌ヨ璁惧鐘舵�佸弬鏁�
+     * 
+     * @param id 璁惧鐘舵�佸弬鏁癐D
+     * @return 璁惧鐘舵�佸弬鏁�
+     */
+    @Override
+    public DeviceFormulaParam selectDeviceFormulaParamById(String id)
+    {
+        return deviceFormulaParamMapper.selectDeviceFormulaParamById(id);
+    }
+
+    /**
+     * 鏌ヨ璁惧鐘舵�佸弬鏁板垪琛�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 璁惧鐘舵�佸弬鏁�
+     */
+    @Override
+    public List<DeviceFormulaParam> selectDeviceFormulaParamList(DeviceFormulaParam deviceFormulaParam)
+    {
+        return deviceFormulaParamMapper.selectDeviceFormulaParamList(deviceFormulaParam);
+    }
+
+    /**
+     * 鏂板璁惧鐘舵�佸弬鏁�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDeviceFormulaParam(DeviceFormulaParam deviceFormulaParam)
+    {
+        return deviceFormulaParamMapper.insertDeviceFormulaParam(deviceFormulaParam);
+    }
+
+    /**
+     * 淇敼璁惧鐘舵�佸弬鏁�
+     * 
+     * @param deviceFormulaParam 璁惧鐘舵�佸弬鏁�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateDeviceFormulaParam(DeviceFormulaParam deviceFormulaParam)
+    {
+        return deviceFormulaParamMapper.updateDeviceFormulaParam(deviceFormulaParam);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧鐘舵�佸弬鏁�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧鐘舵�佸弬鏁癐D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceFormulaParamByIds(String[] ids)
+    {
+        return deviceFormulaParamMapper.deleteDeviceFormulaParamByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璁惧鐘舵�佸弬鏁颁俊鎭�
+     * 
+     * @param id 璁惧鐘舵�佸弬鏁癐D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceFormulaParamById(String id)
+    {
+        return deviceFormulaParamMapper.deleteDeviceFormulaParamById(id);
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaServiceImpl.java
new file mode 100644
index 0000000..12fe709
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceFormulaServiceImpl.java
@@ -0,0 +1,171 @@
+package com.dingzhuo.energy.data.monitoring.device.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormulaParam;
+import com.dingzhuo.energy.data.monitoring.device.mapper.DeviceFormulaParamMapper;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.data.monitoring.device.mapper.DeviceFormulaMapper;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceFormula;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceFormulaService;
+
+
+/**
+ * 璁惧璁$畻鍏紡Service涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-03-20
+ */
+@Service
+public class DeviceFormulaServiceImpl implements IDeviceFormulaService 
+{
+    @Autowired
+    private DeviceFormulaMapper deviceFormulaMapper;
+
+    @Autowired
+    private DeviceFormulaParamMapper deviceFormulaParamMapper;
+
+    /**
+     * 鏌ヨ璁惧璁$畻鍏紡
+     * 
+     * @param id 璁惧璁$畻鍏紡ID
+     * @return 璁惧璁$畻鍏紡
+     */
+    @Override
+    public DeviceFormula selectDeviceFormulaById(String id)
+    {
+        return deviceFormulaMapper.selectDeviceFormulaById(id);
+    }
+
+    /**
+     * 鏌ヨ璁惧璁$畻鍏紡鍒楄〃
+     * 
+     * @param deviceFormula 璁惧璁$畻鍏紡
+     * @return 璁惧璁$畻鍏紡
+     */
+    @Override
+    public List<DeviceFormula> selectDeviceFormulaList(DeviceFormula deviceFormula)
+    {
+        return deviceFormulaMapper.selectDeviceFormulaList(deviceFormula);
+    }
+
+    /**
+     * 鏂板璁惧璁$畻鍏紡
+     * 
+     * @param deviceFormula 璁惧璁$畻鍏紡
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDeviceFormula(DeviceFormula deviceFormula)
+    {
+        return deviceFormulaMapper.insertDeviceFormula(deviceFormula);
+    }
+
+    /**
+     * 淇敼璁惧璁$畻鍏紡
+     * 
+     * @param deviceFormula 璁惧璁$畻鍏紡
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateDeviceFormula(DeviceFormula deviceFormula)
+    {
+        return deviceFormulaMapper.updateDeviceFormula(deviceFormula);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎璁惧璁$畻鍏紡
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑璁惧璁$畻鍏紡ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceFormulaByIds(String[] ids)
+    {
+        return deviceFormulaMapper.deleteDeviceFormulaByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎璁惧璁$畻鍏紡淇℃伅
+     * 
+     * @param id 璁惧璁$畻鍏紡ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDeviceFormulaById(String id)
+    {
+        return deviceFormulaMapper.deleteDeviceFormulaById(id);
+    }
+
+    /**
+     * 鍙栨牴鎹� 璁惧妯″瀷 鑺傜偣ID  鍜�  璁惧鐘舵�佷富閿� ID  鍙�  璁惧鍏紡淇℃伅
+     * @param nodeId
+     * @param stateId
+     * @return
+     */
+    @Override
+    public DeviceFormula getDeviceFormula(String nodeId,String stateId) {
+        //鏍规嵁 妯″瀷鑺傜偣ID 鍜� 璁惧鐘舵�佷富閿甀D鑾峰彇 璁惧鍏紡淇℃伅
+        DeviceFormula deviceFormula = deviceFormulaMapper.getDeviceFormula(nodeId,stateId);
+        if (deviceFormula != null) {
+            //鏍规嵁璁惧 璁惧鍏紡琛ㄤ富閿甀D鑾峰彇 璁惧瀵瑰簲鐨勫弬鏁伴泦鍚�
+            List<DeviceFormulaParam> deviceFormulaParams = deviceFormulaParamMapper.getFormulaParam(deviceFormula.getId());
+            if (!deviceFormulaParams.isEmpty()) {
+                deviceFormula.setDeviceFormulaParams(deviceFormulaParams);
+            }
+        } else {
+            deviceFormula = new DeviceFormula();
+        }
+
+        return deviceFormula;
+    }
+
+    /**
+     * 璁惧鐘舵�� 閰嶇疆 鍏紡淇濆瓨
+     * @param deviceFormula
+     * @return
+     */
+    @Override
+    public void saveDeviceFormula(DeviceFormula deviceFormula) {
+
+        String calcText = deviceFormula.getFormulaText();
+        List<String> paramNames = new ArrayList<>();
+        for (DeviceFormulaParam param : deviceFormula.getDeviceFormulaParams()) {
+            calcText = calcText.replace(param.getParamName(), String.format("'%s'", param.getParamValue()));
+        }
+            deviceFormula.setCalcText(calcText);
+        //1銆佷繚瀛� 鐘舵�佺殑閰嶇疆鍏紡
+        if (StringUtils.isEmpty(deviceFormula.getId())) {
+            deviceFormula.setId(UUID.fastUUID().toString());
+            deviceFormulaMapper.insertDeviceFormula(deviceFormula);
+        } else {
+            deviceFormulaMapper.updateDeviceFormula(deviceFormula);
+        }
+
+        //2銆佸鐞� 鍏紡瀵瑰簲鐨勫弬鏁� 骞惰繘琛屼繚瀛�
+        deviceFormula.getDeviceFormulaParams().forEach(param -> {
+            param.setId(UUID.fastUUID().toString());
+            param.setDevFormulaId(deviceFormula.getId());
+        });
+        deviceFormulaParamMapper
+                .saveDeviceFormulaParam(deviceFormula.getId(), deviceFormula.getDeviceFormulaParams());
+    }
+
+    /**
+     * 璁惧鐘舵�� 鍏紡 鍚敤璁剧疆
+     */
+    @Override
+    public int editDeviceFormulaIsEnable(String nodeId,String isEnable, String[] ids)
+    {
+        return deviceFormulaMapper.editDeviceFormulaIsEnable(nodeId,isEnable, ids);
+    }
+
+    @Override
+    public List<DeviceFormula> getAllDeviceFormula() {
+        return deviceFormulaMapper.getAllDeviceFormula();
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusHistoryServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusHistoryServiceImpl.java
new file mode 100644
index 0000000..9e4f6d1
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusHistoryServiceImpl.java
@@ -0,0 +1,105 @@
+package com.dingzhuo.energy.data.monitoring.device.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.data.monitoring.device.mapper.DeviceStatusHistoryMapper;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusHistory;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusHistoryService;
+
+/**
+ * 璁惧鍚仠鍘嗗彶鐩戞祴Service涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class DeviceStatusHistoryServiceImpl implements IDeviceStatusHistoryService {
+
+  @Autowired
+  private DeviceStatusHistoryMapper deviceStatusHistoryMapper;
+
+  /**
+   * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴
+   *
+   * @param id 璁惧鍚仠鍘嗗彶鐩戞祴ID
+   * @return 璁惧鍚仠鍘嗗彶鐩戞祴
+   */
+  @Override
+  public DeviceStatusHistory selectDeviceStatusHistoryById(String id) {
+    return deviceStatusHistoryMapper.selectDeviceStatusHistoryById(id);
+  }
+
+  /**
+   * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+   *
+   * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+   * @return 璁惧鍚仠鍘嗗彶鐩戞祴
+   */
+  @Override
+  public List<DeviceStatusHistory> selectDeviceStatusHistoryList(
+      DeviceStatusHistory deviceStatusHistory) {
+    return deviceStatusHistoryMapper.selectDeviceStatusHistoryList(deviceStatusHistory);
+  }
+
+  /**
+   * 鏂板璁惧鍚仠鍘嗗彶鐩戞祴
+   *
+   * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+   * @return 缁撴灉
+   */
+  @Override
+  public int insertDeviceStatusHistory(DeviceStatusHistory deviceStatusHistory) {
+    return deviceStatusHistoryMapper.insertDeviceStatusHistory(deviceStatusHistory);
+  }
+
+  /**
+   * 淇敼璁惧鍚仠鍘嗗彶鐩戞祴
+   *
+   * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+   * @return 缁撴灉
+   */
+  @Override
+  public int updateDeviceStatusHistory(DeviceStatusHistory deviceStatusHistory) {
+    return deviceStatusHistoryMapper.updateDeviceStatusHistory(deviceStatusHistory);
+  }
+
+  /**
+   * 鎵归噺鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑璁惧鍚仠鍘嗗彶鐩戞祴ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteDeviceStatusHistoryByIds(String[] ids) {
+    return deviceStatusHistoryMapper.deleteDeviceStatusHistoryByIds(ids);
+  }
+
+  /**
+   * 鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴淇℃伅
+   *
+   * @param id 璁惧鍚仠鍘嗗彶鐩戞祴ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteDeviceStatusHistoryById(String id) {
+    return deviceStatusHistoryMapper.deleteDeviceStatusHistoryById(id);
+  }
+
+  /**
+   * 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+   *
+   * @param deviceStatusHistory 璁惧鍚仠鍘嗗彶鐩戞祴
+   * @return 璁惧鍚仠鍘嗗彶鐩戞祴
+   */
+  @Override
+  public List<DeviceStatusHistory> selectDeviceStatusHistoryListNew(
+      DeviceStatusHistory deviceStatusHistory) {
+    return deviceStatusHistoryMapper.selectDeviceStatusHistoryListNew(deviceStatusHistory);
+  }
+
+  @Override
+  public void saveHistoryStatus(DeviceStatusHistory history) {
+    deviceStatusHistoryMapper.saveHistoryStatus(history);
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusLiveServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusLiveServiceImpl.java
new file mode 100644
index 0000000..3b2d695
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/DeviceStatusLiveServiceImpl.java
@@ -0,0 +1,92 @@
+package com.dingzhuo.energy.data.monitoring.device.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.data.monitoring.device.mapper.DeviceStatusLiveMapper;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusLive;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusLiveService;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴Service涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-03-23
+ */
+@Service
+public class DeviceStatusLiveServiceImpl implements IDeviceStatusLiveService {
+
+  @Autowired
+  private DeviceStatusLiveMapper deviceStatusLiveMapper;
+
+  /**
+   * 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴
+   *
+   * @param id 璁惧鍚仠瀹炴椂鐩戞祴ID
+   * @return 璁惧鍚仠瀹炴椂鐩戞祴
+   */
+  @Override
+  public DeviceStatusLive selectDeviceStatusLiveById(String id) {
+    return deviceStatusLiveMapper.selectDeviceStatusLiveById(id);
+  }
+
+  /**
+   * 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴鍒楄〃
+   *
+   * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+   * @return 璁惧鍚仠瀹炴椂鐩戞祴
+   */
+  @Override
+  public List<DeviceStatusLive> selectDeviceStatusLiveList(DeviceStatusLive deviceStatusLive) {
+    return deviceStatusLiveMapper.selectDeviceStatusLiveList(deviceStatusLive);
+  }
+
+  /**
+   * 鏂板璁惧鍚仠瀹炴椂鐩戞祴
+   *
+   * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+   * @return 缁撴灉
+   */
+  @Override
+  public int insertDeviceStatusLive(DeviceStatusLive deviceStatusLive) {
+    return deviceStatusLiveMapper.insertDeviceStatusLive(deviceStatusLive);
+  }
+
+  /**
+   * 淇敼璁惧鍚仠瀹炴椂鐩戞祴
+   *
+   * @param deviceStatusLive 璁惧鍚仠瀹炴椂鐩戞祴
+   * @return 缁撴灉
+   */
+  @Override
+  public int updateDeviceStatusLive(DeviceStatusLive deviceStatusLive) {
+    return deviceStatusLiveMapper.updateDeviceStatusLive(deviceStatusLive);
+  }
+
+  /**
+   * 鎵归噺鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴
+   *
+   * @param ids 闇�瑕佸垹闄ょ殑璁惧鍚仠瀹炴椂鐩戞祴ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteDeviceStatusLiveByIds(String[] ids) {
+    return deviceStatusLiveMapper.deleteDeviceStatusLiveByIds(ids);
+  }
+
+  /**
+   * 鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴淇℃伅
+   *
+   * @param id 璁惧鍚仠瀹炴椂鐩戞祴ID
+   * @return 缁撴灉
+   */
+  @Override
+  public int deleteDeviceStatusLiveById(String id) {
+    return deviceStatusLiveMapper.deleteDeviceStatusLiveById(id);
+  }
+
+  @Override
+  public DeviceStatusLive getDeviceStatus(String deviceId, String stateId) {
+    return deviceStatusLiveMapper.getDeviceStatus(deviceId, stateId);
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/HistoryDeviceStatusImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/HistoryDeviceStatusImpl.java
new file mode 100644
index 0000000..fc29179
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/HistoryDeviceStatusImpl.java
@@ -0,0 +1,21 @@
+package com.dingzhuo.energy.data.monitoring.device.service.impl;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.HistoryDeviceStatus;
+import com.dingzhuo.energy.data.monitoring.device.service.IHistoryDeviceStatus;
+
+import java.util.Date;
+import java.util.List;
+import org.springframework.stereotype.Service;
+
+@Service
+public class HistoryDeviceStatusImpl implements IHistoryDeviceStatus {
+  @Override
+  public List<HistoryDeviceStatus> getHistoryDeviceStatus(Date beginTime, Date endTime) {
+    return null;
+  }
+
+  @Override
+  public List<HistoryDeviceStatus> getHistoryDeviceStatus(Date beginTime, Date endTime, String status) {
+    return null;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/RealtimeDeviceStatusImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/RealtimeDeviceStatusImpl.java
new file mode 100644
index 0000000..5a77653
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/device/service/impl/RealtimeDeviceStatusImpl.java
@@ -0,0 +1,13 @@
+package com.dingzhuo.energy.data.monitoring.device.service.impl;
+
+import com.dingzhuo.energy.data.monitoring.device.domain.RealtimeDeviceStatus;
+import com.dingzhuo.energy.data.monitoring.device.service.IRealtimeDeviceStatus;
+
+import java.util.List;
+
+public class RealtimeDeviceStatusImpl implements IRealtimeDeviceStatus {
+  @Override
+  public List<RealtimeDeviceStatus> getRealtimeDeviceStatus() {
+    return null;
+  }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/controller/HistoryDataController.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/controller/HistoryDataController.java
new file mode 100644
index 0000000..4045795
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/controller/HistoryDataController.java
@@ -0,0 +1,31 @@
+package com.dingzhuo.energy.data.monitoring.historical.controller;
+
+
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.data.monitoring.historical.service.IHistoryDataService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 鍘嗗彶鏁版嵁缁熻  鎺у埗灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/6
+ */
+@Api(value = "鎶ヨ妫�娴嬧�斿巻鍙叉姤璀︽娴�", tags = {"鎶ヨ妫�娴�"})
+@RestController
+@RequestMapping("/historical")
+public class HistoryDataController extends BaseController {
+
+    @Autowired
+    private IHistoryDataService dataService;
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+
+
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/IHistoryDataService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/IHistoryDataService.java
new file mode 100644
index 0000000..ea33c22
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/IHistoryDataService.java
@@ -0,0 +1,12 @@
+package com.dingzhuo.energy.data.monitoring.historical.service;
+
+
+/**
+ * 鍘嗗彶鏁版嵁缁熻       鎺ュ彛灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/6
+ */
+public interface IHistoryDataService {
+
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/impl/HistoryDataServiceImpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/impl/HistoryDataServiceImpl.java
new file mode 100644
index 0000000..b8bafe9
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/historical/service/impl/HistoryDataServiceImpl.java
@@ -0,0 +1,15 @@
+package com.dingzhuo.energy.data.monitoring.historical.service.impl;
+
+
+import com.dingzhuo.energy.data.monitoring.historical.service.IHistoryDataService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鍘嗗彶鏁版嵁缁熻  鎺ュ彛瀹炵幇灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/6
+ */
+@Service
+public class HistoryDataServiceImpl implements IHistoryDataService {
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/controller/HistoryDataTrend.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/controller/HistoryDataTrend.java
new file mode 100644
index 0000000..53abd84
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/controller/HistoryDataTrend.java
@@ -0,0 +1,225 @@
+package com.dingzhuo.energy.data.monitoring.trend.history.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementService;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IStateTypeService;
+import com.dingzhuo.energy.data.monitoring.trend.history.domain.dto.HistoricalDataDTO;
+import com.dingzhuo.energy.data.monitoring.trend.history.domain.vo.HistoricalDataExcel;
+import com.dingzhuo.energy.data.monitoring.trend.history.domain.vo.HistoricalDataVO;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴Controller
+ *
+ * @author sys
+ * @date 2020-03-30
+ */
+@RestController
+@RequestMapping("/dataMonitoring/historyDataTrend")
+public class HistoryDataTrend extends BaseController {
+    @Autowired
+    private final IEnergyIndexService energyIndexService;
+
+    @Autowired
+    private final IMeterImplementService meterImplementService;
+
+    @Autowired
+    private final RealtimeDatabaseService realtimeDatabaseService;
+
+
+    public HistoryDataTrend(IEnergyIndexService energyIndexService,
+                            IMeterImplementService meterImplementService,
+                            RealtimeDatabaseService realtimeDatabaseService,
+                            IStateTypeService iStateTypeService) {
+        this.energyIndexService = energyIndexService;
+        this.meterImplementService = meterImplementService;
+        this.realtimeDatabaseService = realtimeDatabaseService;
+    }
+
+
+    @Log(title = "鑾峰彇妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣", businessType = BusinessType.UPDATE)
+    @GetMapping("/energyIndex/list")
+    public AjaxResult getSettingIndex(EnergyIndex energyIndex) {
+        try {
+            List<EnergyIndex> infoList = energyIndexService.selectEnergyIndexList(energyIndex);
+//            List<String> codeList= infoList.stream().map(EnergyIndex::getCode).collect(Collectors.toList());
+//            List<TagValue> valList = realtimeDatabaseService.retrieve(codeList);
+//            List resultList = new ArrayList();
+            return AjaxResult.success(infoList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+        }
+    }
+
+    @Log(title = "鏍规嵁鏃堕棿涓庣偣浣嶆煡璇㈠巻鍙茬洃娴嬫暟鎹�", businessType = BusinessType.UPDATE)
+    @GetMapping("/getHistoricalDataByIndexId")
+    public AjaxResult getHistoricalDataByIndexId(HistoricalDataDTO dto) {
+        try {
+            // 鑾峰彇鐐逛綅淇℃伅
+            EnergyIndex energyIndex = energyIndexService.selectEnergyIndexById(dto.getIndexId());
+            if (ObjectUtils.isEmpty(energyIndex)) {
+                return AjaxResult.error("鏈壘鍒扮偣浣嶄俊鎭�");
+            }
+            Date beginTime = dto.getDataTime();
+            Date endTime;
+            // 鏌ヨ鏉℃暟
+            int count = 23;
+            if ("DAY".equals(dto.getTimeType())) {
+                endTime = DateUtil.endOfDay(beginTime);
+            } else {
+                count = 19;
+                endTime = DateUtil.offsetSecond(DateUtil.offsetHour(beginTime, 1), -1);
+            }
+            // 鏌ヨ璁¢噺鍣ㄥ叿
+            MeterImplement infor = meterImplementService.selectMeterImplementById(energyIndex.getMeterId());
+            List<TagValue> tagValueList = realtimeDatabaseService.retrieve(energyIndex.getCode(), beginTime, endTime,
+                    RetrievalModes.BestFit, count);
+            List<HistoricalDataVO> voList = new ArrayList<>();
+            Date date = DateUtil.date();
+            for (int i = 0; i < count + 1; i++) {
+                HistoricalDataVO vo = new HistoricalDataVO();
+                vo.setIndexId(energyIndex.getIndexId());
+                String indexName = energyIndex.getName();
+                if (ObjectUtils.isNotEmpty(infor)) {
+                    indexName = infor.getInstallactionLocation() + "_" + infor.getMeterName() + "_" + indexName;
+                }
+                vo.setIndexName(indexName);
+                // 鍙栧��
+                String value = "--";
+                String usedValue = "--";
+                if (beginTime.getTime() <= date.getTime()) {
+                    try {
+                        TagValue tagValue = tagValueList.get(i);
+                        BigDecimal cumulative = BigDecimal.valueOf(tagValue.getValue());
+
+                        if ("SWWSDJ_SD".equals(energyIndex.getCode()) || "SWWSDJ_WD".equals(energyIndex.getCode())) {
+                            cumulative = cumulative.multiply(BigDecimal.valueOf(0.1));
+                        }
+                        if (i > 0) {
+                            TagValue previousTagValue = tagValueList.get(i - 1);
+                            BigDecimal previousValue = BigDecimal.ZERO;
+                            if (ObjectUtils.isNotEmpty(previousTagValue.getValue())) {
+                                previousValue = BigDecimal.valueOf(previousTagValue.getValue());
+                            }
+                            if ("SWWSDJ_SD".equals(energyIndex.getCode()) || "SWWSDJ_WD".equals(energyIndex.getCode())) {
+                                previousValue = previousValue.multiply(BigDecimal.valueOf(0.1));
+
+                            }
+                            usedValue = String.valueOf(cumulative.subtract(previousValue).setScale(2, RoundingMode.HALF_UP));
+                        }
+
+                        value = String.valueOf(cumulative.setScale(2, RoundingMode.HALF_UP));
+                    } catch (Exception ignored) {
+                    }
+                }
+                // 鏃堕棿
+                String timeName = DateUtil.formatDateTime(beginTime);
+                vo.setDataTime(timeName);
+                if ("DAY".equals(dto.getTimeType())) {
+                    beginTime = DateUtil.offsetHour(beginTime, 1);
+                } else {
+                    beginTime = DateUtil.offsetMinute(beginTime, 3);
+                }
+                vo.setUsedValue(String.valueOf(usedValue));
+                vo.setValue(String.valueOf(value));
+                voList.add(vo);
+            }
+            return AjaxResult.success(voList);
+        } catch (Exception ex) {
+            logger.error("鏌ヨ鍘嗗彶鐩戞祴鏁版嵁鍑洪敊锛�", ex);
+            return AjaxResult.error("鏌ヨ鍘嗗彶鐩戞祴鏁版嵁鍑洪敊!");
+        }
+    }
+
+    @Log(title = "瀵煎嚭Excel", businessType = BusinessType.UPDATE)
+    @GetMapping("/export")
+    public AjaxResult export(HistoricalDataDTO dto) {
+        try {
+            // 鑾峰彇鐐逛綅淇℃伅
+            EnergyIndex energyIndex = energyIndexService.selectEnergyIndexById(dto.getIndexId());
+            if (ObjectUtils.isEmpty(energyIndex)) {
+                return AjaxResult.success("鏈壘鍒扮偣浣嶄俊鎭�");
+            }
+            Date beginTime = dto.getDataTime();
+            Date endTime;
+            // 鏌ヨ鏉℃暟
+            int count = 23;
+            if ("DAY".equals(dto.getTimeType())) {
+                endTime = DateUtil.endOfDay(beginTime);
+            } else {
+                count = 19;
+                endTime = DateUtil.offsetSecond(DateUtil.offsetHour(beginTime, 1), -1);
+            }
+            // 鏌ヨ璁¢噺鍣ㄥ叿
+            MeterImplement infor = meterImplementService.selectMeterImplementById(energyIndex.getMeterId());
+            List<TagValue> tagValueList = realtimeDatabaseService.retrieve(energyIndex.getCode(), beginTime, endTime,
+                    RetrievalModes.BestFit, count);
+            List<HistoricalDataExcel> excelList = new ArrayList<>();
+            Date date = DateUtil.date();
+            for (int i = 0; i < count + 1; i++) {
+                HistoricalDataExcel vo = new HistoricalDataExcel();
+                String indexName = energyIndex.getName();
+                if (ObjectUtils.isNotEmpty(infor)) {
+                    indexName = infor.getInstallactionLocation() + "_" + infor.getMeterName() + "_" + indexName;
+                }
+                vo.setIndexName(indexName);
+                // 鍙栧��
+                String value = "--";
+                String usedValue = "--";
+                if (beginTime.getTime() <= date.getTime()) {
+                    try {
+                        TagValue tagValue = tagValueList.get(i);
+                        BigDecimal cumulative = BigDecimal.valueOf(tagValue.getValue());
+                        if (i > 0) {
+                            TagValue previousTagValue = tagValueList.get(i - 1);
+                            BigDecimal previousValue = BigDecimal.valueOf(previousTagValue.getValue());
+                            usedValue = String.valueOf(cumulative.subtract(previousValue).setScale(2, RoundingMode.HALF_UP));
+                        }
+                        value = String.valueOf(cumulative.setScale(2, RoundingMode.HALF_UP));
+                    } catch (Exception ignored) {
+                    }
+                }
+                // 鏃堕棿
+                String timeName = DateUtil.formatDateTime(beginTime);
+                vo.setDataTime(timeName);
+                if ("DAY".equals(dto.getTimeType())) {
+                    beginTime = DateUtil.offsetHour(beginTime, 1);
+                } else {
+                    beginTime = DateUtil.offsetMinute(beginTime, 3);
+                }
+                vo.setValue(String.valueOf(value));
+                vo.setUsedValue(String.valueOf(usedValue));
+                excelList.add(vo);
+            }
+            ExcelUtil<HistoricalDataExcel> util = new ExcelUtil<>(HistoricalDataExcel.class);
+            String sheetName = "鍘嗗彶鏁版嵁缁熻" + DateUtil.formatDate(dto.getDataTime());
+            return util.exportRealTimeDataExcel(excelList, sheetName);
+        } catch (Exception ex) {
+            logger.error("瀵煎嚭Excel鏁版嵁鍑洪敊锛�", ex);
+            return AjaxResult.error("瀵煎嚭Excel鏁版嵁鍑洪敊!");
+        }
+    }
+
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/dto/HistoricalDataDTO.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/dto/HistoricalDataDTO.java
new file mode 100644
index 0000000..ea9e8ad
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/dto/HistoricalDataDTO.java
@@ -0,0 +1,63 @@
+package com.dingzhuo.energy.data.monitoring.trend.history.domain.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 鍘嗗彶鐩戞祴鏁版嵁璇锋眰 DTO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/7
+ */
+public class HistoricalDataDTO {
+
+    /**
+     * 鐐逛綅id
+     */
+    @NotBlank(message = "鏈壘鍒扮偣浣嶄俊鎭�")
+    private String indexId;
+
+    /**
+     * 鏃堕棿绫诲瀷
+     */
+    @NotBlank(message = "鏈壘鍒版椂闂寸被鍨�")
+    private String timeType;
+
+    /**
+     * 鏌ヨ鏃堕棿
+     */
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @NotNull(message = "鏈壘鍒版椂闂翠俊鎭�")
+    private Date dataTime;
+
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+}
\ No newline at end of file
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataExcel.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataExcel.java
new file mode 100644
index 0000000..c0a1e76
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataExcel.java
@@ -0,0 +1,70 @@
+package com.dingzhuo.energy.data.monitoring.trend.history.domain.vo;
+
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+/**
+ * 鍘嗗彶鐩戞祴鏁版嵁杩斿洖 Excel
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/7
+ */
+public class HistoricalDataExcel {
+
+    /**
+     * 鐐逛綅鍚嶇О
+     */
+    @Excel(name = "鐐逛綅鍚嶇О")
+    private String indexName;
+
+    /**
+     * 鍊�
+     */
+    @Excel(name = "鍊�")
+    private String value;
+
+    /**
+     * 浣跨敤閲�
+     */
+    @Excel(name = "浣跨敤閲�")
+    private String usedValue;
+
+    /**
+     * 鏃堕棿
+     */
+    @Excel(name = "鏃堕棿")
+    private String dataTime;
+
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getUsedValue() {
+        return usedValue;
+    }
+
+    public void setUsedValue(String usedValue) {
+        this.usedValue = usedValue;
+    }
+}
\ No newline at end of file
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataVO.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataVO.java
new file mode 100644
index 0000000..bb9a2ce
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/history/domain/vo/HistoricalDataVO.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.data.monitoring.trend.history.domain.vo;
+
+
+/**
+ * 鍘嗗彶鐩戞祴鏁版嵁杩斿洖 VO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/7
+ */
+public class HistoricalDataVO {
+
+    /**
+     * 鐐逛綅id
+     */
+    private String indexId;
+
+    /**
+     * 鐐逛綅鍚嶇О
+     */
+    private String indexName;
+
+    /**
+     * 鏃堕棿
+     */
+    private String dataTime;
+
+    /**
+     * 鍊�
+     */
+    private String value;
+
+    /**
+     * 浣跨敤閲�
+     */
+    private String usedValue;
+
+
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getUsedValue() {
+        return usedValue;
+    }
+
+    public void setUsedValue(String usedValue) {
+        this.usedValue = usedValue;
+    }
+}
\ No newline at end of file
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/controller/RealTimeTrend.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/controller/RealTimeTrend.java
new file mode 100644
index 0000000..aa3d8b0
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/controller/RealTimeTrend.java
@@ -0,0 +1,335 @@
+package com.dingzhuo.energy.data.monitoring.trend.realtime.controller;
+
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.basic.data.meter.domain.MeterImplement;
+import com.dingzhuo.energy.basic.data.meter.service.IMeterImplementService;
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.dto.EnergyIndexMonitorDTO;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.data.model.service.IStateTypeService;
+import com.dingzhuo.energy.data.monitoring.device.domain.EquipmentMeasuringPointParameters;
+import com.dingzhuo.energy.data.monitoring.device.domain.vo.EquipmentPointParametersExcel;
+import com.dingzhuo.energy.data.monitoring.device.domain.vo.EquipmentPointParametersVO;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusLiveService;
+import com.dingzhuo.energy.data.monitoring.trend.realtime.domain.CollectHistory;
+import com.dingzhuo.energy.data.monitoring.trend.svg.service.ISvgTrendService;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴Controller
+ *
+ * @author sys
+ * @date 2020-03-30
+ */
+@RestController
+@RequestMapping("/dataMonitoring/realTimeTrend")
+@Api(value = "瀹炴椂妫�娴�", tags = {"瀹炴椂鐩戞祴"})
+public class RealTimeTrend extends BaseController {
+
+    @Autowired
+    private ISvgTrendService iSvgTrendService;
+
+    @Autowired
+    private IStateTypeService iStateTypeService;
+
+    @Autowired
+    private final IModelNodeService modelNodeService;
+
+    @Autowired
+    private final IEnergyIndexService energyIndexService;
+
+    @Autowired
+    private IMeterImplementService meterImplementService;
+
+    @Autowired
+    private IDeviceStatusLiveService deviceStatusLiveService;
+
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+
+
+    @Autowired
+    public RealTimeTrend(
+            IModelNodeService modelNodeService, IEnergyIndexService energyIndexService) {
+        this.modelNodeService = modelNodeService;
+        this.energyIndexService = energyIndexService;
+    }
+
+    @Log(title = "鑾峰彇妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣", businessType = BusinessType.UPDATE)
+    @GetMapping("/energyIndex/list")
+    @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣")
+    public AjaxResult getSettingIndex(@Validated EnergyIndexMonitorDTO dto) {
+        try {
+            List<EquipmentPointParametersVO> resultList = new ArrayList<>();
+            // 妯″瀷id
+            String nodeId = dto.getNodeId();
+            // 鏌ヨ浼犲叆鐨刵odeId
+            List<ModelNodeIndexInfor> nodeInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(nodeId);
+            // 濡傛灉鏄┖瀛樺湪涓ょ鎯呭喌锛�1锛歩d鏈夐棶棰橈紝2锛氭渶搴曞眰
+            if (CollectionUtils.isEmpty(nodeInforList)) {
+                List<ModelNodeIndexInfor> inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(nodeId);
+                if (CollectionUtils.isNotEmpty(inforList)) {
+                    nodeInforList.addAll(inforList);
+                }
+            }
+            if (CollectionUtils.isEmpty(nodeInforList)) {
+                return AjaxResult.success(resultList);
+            }
+            // 鎵惧嚭鎵�鏈夌偣浣峣d淇℃伅
+            List<String> indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            // 鎺掑簭
+            List<EnergyIndex> infoList = energyIndexService.getEnergyIndexByIds(indexIds).stream()
+                    .sorted(Comparator.comparing(EnergyIndex::getCode)).collect(Collectors.toList());
+            // 鑾峰彇鎵�鏈夎〃id
+            List<String> codeList = new ArrayList<>();
+            List<String> meterIdList = new ArrayList<>();
+            infoList.forEach(li -> {
+                codeList.add(li.getCode());
+                meterIdList.add(li.getMeterId());
+            });
+            // 褰撳墠鏃堕棿
+            String timeString = DateUtil.formatDateTime(DateUtil.date());
+            Map<String, List<MeterImplement>> meterImplementMap = meterImplementService.listMeterImplementByIds(meterIdList).stream()
+                    .collect(Collectors.groupingBy(MeterImplement::getId));
+            List<TagValue> valList = realtimeDatabaseService.retrieve(codeList);
+            for (EnergyIndex energyIndex : infoList) {
+                // 鑾峰彇鐐逛綅鍚嶇О
+                String modelNodeName = "";
+                List<MeterImplement> meterImplementList = meterImplementMap.get(energyIndex.getMeterId());
+                if (CollectionUtils.isNotEmpty(meterImplementList)) {
+                    MeterImplement infor = meterImplementList.get(0);
+                    modelNodeName = infor.getInstallactionLocation() + "_" + infor.getMeterName();
+                }
+                String indexName = modelNodeName + "_" + energyIndex.getName();
+                EquipmentPointParametersVO item = new EquipmentPointParametersVO();
+                item.setCode(energyIndex.getCode());
+                item.setIndexName(indexName);
+                item.setIndexUnit(energyIndex.getUnitId());
+                item.setTimeString(timeString);
+                String value = "--";
+                if (CollectionUtils.isNotEmpty(valList)) {
+                    double sum = valList.stream().filter(x -> item.getCode().equals(x.getTagCode())).mapToDouble(TagValue::getValue).sum();
+                    if ("SWWSDJ_SD".equals(energyIndex.getCode()) || "SWWSDJ_WD".equals(energyIndex.getCode())) {
+                        sum = sum * 0.1;
+                    }
+                    value = String.valueOf(BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP));
+                }
+                item.setValue(value);
+                resultList.add(item);
+            }
+            return AjaxResult.success(resultList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+        }
+    }
+
+    //    @Log(title = "鑾峰彇鎶樼嚎鍥炬暟鎹�", businessType = BusinessType.UPDATE)
+    @GetMapping("/energyIndex/lineList/{codes}/{minute}/{count}")
+    @ApiOperation(value = "鑾峰彇鎶樼嚎鍥炬暟鎹�")
+    public AjaxResult getSettingIndexLine(@PathVariable String[] codes, @PathVariable Integer minute, @PathVariable Integer count) {
+        try {
+            List<String> codesList = new ArrayList<>(Arrays.asList(codes));
+            Date endDate = DateUtil.date();
+            long time = minute * 60 * 1000;//鍒嗛挓
+            Date startDate = new Date(endDate.getTime() - time);
+            List<List<TagValue>> resultList = new ArrayList<>();
+            for (int i = 0; i < codesList.size(); i++) {
+                List<TagValue> valList = realtimeDatabaseService.retrieve(codesList.get(i), startDate, endDate, RetrievalModes.Full, count);
+                for (TagValue tagVal : valList) {
+                    if (tagVal.getValue() != null) {
+                        double value = BigDecimal.valueOf(tagVal.getValue()).setScale(2, RoundingMode.HALF_UP).doubleValue();
+
+                        if ("SWWSDJ_SD".equals(tagVal.getTagCode()) || "SWWSDJ_WD".equals(tagVal.getTagCode())) {
+                            value = value * 0.1;
+                        }
+
+                        tagVal.setValue(BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP).doubleValue());
+                    }
+                    tagVal.setDataTime(tagVal.getDataTime());
+                    tagVal.setShowDataTime("yyyy-MM-dd HH:mm:ss");
+                }
+                resultList.add(valList);
+            }
+            return AjaxResult.success(resultList);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+        }
+    }
+
+    @Log(title = "鑾峰彇妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣", businessType = BusinessType.UPDATE)
+    @GetMapping("/svgTrendView/energyIndex/list")
+    @ApiOperation(value = "鑾峰彇妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣")
+    public AjaxResult getSvgTrendViewSettingIndex(EnergyIndex energyIndex) {
+        try {
+            List<EnergyIndex> infoList = iSvgTrendService.selectSvgList(energyIndex);
+            List<String> codeList = infoList.stream().map(EnergyIndex::getCode).collect(Collectors.toList());
+            List<TagValue> valList = realtimeDatabaseService.retrieve(codeList);
+            List resultList = new ArrayList();
+            if (valList != null && valList.size() > 0) {
+                for (int i = 0; i < infoList.size(); i++) {
+                    EquipmentMeasuringPointParameters item = new EquipmentMeasuringPointParameters();
+                    item.setCode(infoList.get(i).getCode());
+                    item.setIndexName(infoList.get(i).getName());
+                    item.setIndexUnit(infoList.get(i).getUnitId());
+                    item.setMeteName(infoList.get(i).getMeterName());
+                    valList.forEach(x -> {
+                        if (x.getTagCode().equals(item.getCode())) {
+                            item.setValue(new BigDecimal(x.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+                        }
+                    });
+                    item.setyValue("y0");
+                    resultList.add(item);
+                }
+            }
+            return AjaxResult.success(resultList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+        }
+    }
+
+    @Log(title = "鑾峰彇鎸囧畾閲囬泦鐐逛綅鐨勫皬鏃跺疄鏃舵暟鎹�", businessType = BusinessType.UPDATE)
+    @GetMapping("/svgTrendView/energyIndex/history/{code}/{dataTime}")
+    @ApiOperation(value = "鑾峰彇鎸囧畾閲囬泦鐐逛綅鐨勫皬鏃跺疄鏃舵暟鎹�")
+    public AjaxResult getIndexHistoryValueList(@PathVariable("code") String code, @PathVariable("dataTime") String dataTime) {
+        try {
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date sdate = null;
+            Date edate = null;
+            try {
+                if (StringUtils.isEmpty(dataTime)) {
+                    dataTime = formatter.format(new Date());
+                }
+                if (dataTime.length() < 18) {
+                    dataTime = dataTime + ":00:00";
+                }
+                sdate = formatter.parse(dataTime);
+                edate = formatter.parse(dataTime);
+                //杩欓噷瑕佸姞涓�灏忔椂
+                edate = DateUtils.addHours(edate, 1);
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            List<String> codes = new ArrayList<>();
+            codes.add(code);
+            List<EnergyIndex> infoList = energyIndexService.getEnergyIndexByCodes(codes);
+            EnergyIndex ei = infoList.get(0);
+            if (CollectionUtils.isEmpty(infoList)) {
+                ei = new EnergyIndex();
+            }
+
+            List<TagValue> tagValuelist = realtimeDatabaseService.retrieve(code, sdate, edate, RetrievalModes.Full, 0);
+            List resultList = new ArrayList();
+            for (TagValue tagVal : tagValuelist) {
+                tagVal.setShowDataTime("yyyy-MM-dd HH:mm:ss");
+                CollectHistory hh = new CollectHistory();
+                hh.setTagCode(tagVal.getTagCode());
+                hh.setDataTime(tagVal.getShowDataTime());
+                BigDecimal b = new BigDecimal(tagVal.getValue());
+                hh.setValue(b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+                hh.setUnitId(ei.getUnitId());
+                resultList.add(hh);
+            }
+
+            return AjaxResult.success(resultList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇閲囬泦鐐瑰巻鍙插皬鏃堕敊璇紒", ex);
+            return AjaxResult.error("鑾峰彇閲囬泦鐐瑰巻鍙插皬鏃堕敊璇�!");
+        }
+    }
+
+    @Log(title = "瀵煎嚭瀹炴椂鐩戞祴Excel淇℃伅", businessType = BusinessType.UPDATE)
+    @GetMapping("/export")
+    @ApiOperation(value = "瀵煎嚭瀹炴椂鐩戞祴Excel淇℃伅")
+    public AjaxResult export(@Validated EnergyIndexMonitorDTO dto) {
+        try {
+            List<EquipmentPointParametersExcel> excelList = new ArrayList<>();
+            // 妯″瀷id
+            String nodeId = dto.getNodeId();
+            // 鏌ヨ浼犲叆鐨刵odeId
+            List<ModelNodeIndexInfor> nodeInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(nodeId);
+            // 濡傛灉鏄┖瀛樺湪涓ょ鎯呭喌锛�1锛歩d鏈夐棶棰橈紝2锛氭渶搴曞眰
+            if (CollectionUtils.isEmpty(nodeInforList)) {
+                List<ModelNodeIndexInfor> inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(nodeId);
+                if (CollectionUtils.isNotEmpty(inforList)) {
+                    nodeInforList.addAll(inforList);
+                }
+            }
+            if (CollectionUtils.isEmpty(nodeInforList)) {
+                return AjaxResult.success("鏆傛棤鏁版嵁");
+            }
+            // 鎵惧嚭鎵�鏈夌偣浣峣d淇℃伅
+            List<String> indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            List<EnergyIndex> infoList = energyIndexService.getEnergyIndexByIds(indexIds);
+            // 鑾峰彇鎵�鏈夎〃id
+            List<String> codeList = new ArrayList<>();
+            List<String> meterIdList = new ArrayList<>();
+            infoList.forEach(li -> {
+                codeList.add(li.getCode());
+                meterIdList.add(li.getMeterId());
+            });
+            // 褰撳墠鏃堕棿
+            String timeString = DateUtil.formatDateTime(DateUtil.date());
+            Map<String, List<MeterImplement>> meterImplementMap = meterImplementService.listMeterImplementByIds(meterIdList)
+                    .stream().collect(Collectors.groupingBy(MeterImplement::getId));
+            List<TagValue> valList = realtimeDatabaseService.retrieve(codeList);
+            for (EnergyIndex energyIndex : infoList) {
+                // 鑾峰彇鐐逛綅鍚嶇О
+                String modelNodeName = "";
+                List<MeterImplement> meterImplementList = meterImplementMap.get(energyIndex.getMeterId());
+                if (CollectionUtils.isNotEmpty(meterImplementList)) {
+                    MeterImplement infor = meterImplementList.get(0);
+                    modelNodeName = infor.getInstallactionLocation() + "_" + infor.getMeterName();
+                }
+                String indexName = modelNodeName + "_" + energyIndex.getName();
+                EquipmentPointParametersExcel item = new EquipmentPointParametersExcel();
+                item.setIndexName(indexName);
+                item.setIndexUnit(energyIndex.getUnitId());
+                item.setTimeString(timeString);
+                String value = "--";
+                if (CollectionUtils.isNotEmpty(valList)) {
+                    double sum = valList.stream().filter(x -> energyIndex.getCode().equals(x.getTagCode())).mapToDouble(TagValue::getValue).sum();
+                    value = String.valueOf(BigDecimal.valueOf(sum).setScale(2, RoundingMode.HALF_UP));
+                }
+                item.setValue(value);
+                excelList.add(item);
+            }
+
+            ExcelUtil<EquipmentPointParametersExcel> util = new ExcelUtil<>(EquipmentPointParametersExcel.class);
+            return util.exportExcel(excelList, "瀹炴椂鐩戞祴");
+        } catch (Exception ex) {
+            logger.error("瀵煎嚭鏁版嵁鍑洪敊锛�", ex);
+            return AjaxResult.error("瀵煎嚭鏁版嵁鍑洪敊!");
+        }
+    }
+
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/CollectHistory.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/CollectHistory.java
new file mode 100644
index 0000000..aa05243
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/CollectHistory.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.data.monitoring.trend.realtime.domain;
+
+/**
+ * 缁勬�佸浘灞曠ず鐨勮秼鍔块�夐」鍗′笅 鏁版嵁琛ㄦ牸瀵硅薄
+ */
+public class CollectHistory {
+
+    private String tagCode;
+    private String tagName;
+    private String unitId;
+    private String dataTime;
+    private Double value;
+    private int quality;
+    private String meteName;
+
+    public String getTagCode() {
+        return tagCode;
+    }
+
+    public void setTagCode(String tagCode) {
+        this.tagCode = tagCode;
+    }
+
+    public String getTagName() {
+        return tagName;
+    }
+
+    public void setTagName(String tagName) {
+        this.tagName = tagName;
+    }
+
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue() {
+        return value;
+    }
+
+    public void setValue(Double value) {
+        this.value = value;
+    }
+
+    public int getQuality() {
+        return quality;
+    }
+
+    public void setQuality(int quality) {
+        this.quality = quality;
+    }
+
+    public String getMeteName() {
+        return meteName;
+    }
+
+    public void setMeteName(String meteName) {
+        this.meteName = meteName;
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/RealTimeTrend.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/RealTimeTrend.java
new file mode 100644
index 0000000..da122c6
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/realtime/domain/RealTimeTrend.java
@@ -0,0 +1,51 @@
+package com.dingzhuo.energy.data.monitoring.trend.realtime.domain;
+
+import com.dingzhuo.energy.data.model.domain.IndexType;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+public class RealTimeTrend  extends BaseEntity {
+
+    private String nodeId;
+
+    /**
+     * 绯荤粺鎸囨爣绫诲瀷
+     */
+    private IndexType indexType;
+
+    private int minute;
+
+    private int count;
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    public IndexType getIndexType() {
+        return indexType;
+    }
+
+    public void setIndexType(IndexType indexType) {
+        this.indexType = indexType;
+    }
+
+    public int getMinute() {
+        return minute;
+    }
+
+    public void setMinute(int minute) {
+        this.minute = minute;
+    }
+
+    public int getCount() {
+        return count;
+    }
+
+    public void setCount(int count) {
+        this.count = count;
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/controller/SvgTrendView.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/controller/SvgTrendView.java
new file mode 100644
index 0000000..82c4dc6
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/controller/SvgTrendView.java
@@ -0,0 +1,74 @@
+package com.dingzhuo.energy.data.monitoring.trend.svg.controller;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.data.model.service.IStateTypeService;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.device.domain.EquipmentMeasuringPointParameters;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.data.monitoring.device.domain.DeviceStatusLive;
+import com.dingzhuo.energy.data.monitoring.device.service.IDeviceStatusLiveService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 璁惧鍚仠瀹炴椂鐩戞祴Controller
+ * 
+ * @author sys
+ * @date 2020-03-30
+ */
+@RestController
+@RequestMapping("/dataMonitoring/svgTrendView")
+public class SvgTrendView extends BaseController
+{
+    private final IModelNodeService modelNodeService;
+    private final IEnergyIndexService energyIndexService;
+    @Autowired
+    private IDeviceStatusLiveService deviceStatusLiveService;
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+    @Autowired
+    private IStateTypeService iStateTypeService;
+
+
+    @Autowired
+    public SvgTrendView(
+            IModelNodeService modelNodeService, IEnergyIndexService energyIndexService) {
+        this.modelNodeService = modelNodeService;
+        this.energyIndexService = energyIndexService;
+    }
+
+    @Log(title = "鑾峰彇妯″瀷鑺傜偣鍏宠仈閲囬泦鎸囨爣", businessType = BusinessType.UPDATE)
+    @GetMapping("/energyIndex/list")
+    public AjaxResult getSettingIndex(EnergyIndex energyIndex) {
+        try {
+            List<EnergyIndex> infoList = energyIndexService.selectEnergyIndexList(energyIndex);
+            return AjaxResult.success(infoList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍏宠仈閲囬泦鎸囨爣鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍏宠仈鎸囨爣鍑洪敊!");
+        }
+    }
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/mapper/SvgTrendMapper.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/mapper/SvgTrendMapper.java
new file mode 100644
index 0000000..97384c6
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/mapper/SvgTrendMapper.java
@@ -0,0 +1,15 @@
+package com.dingzhuo.energy.data.monitoring.trend.svg.mapper;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+
+import java.util.List;
+
+public interface SvgTrendMapper {
+    /**
+     * 瀹炴椂妫�娴� 鍔熻兘 鐨勫 sheet椤�  灞曠ず 缁勬�佸浘  娴嬬偣 鎶ヨ淇℃伅
+     *
+     * @param energyIndex
+     * @return
+     */
+    List<EnergyIndex> selectSvgTrendList(EnergyIndex energyIndex);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/ISvgTrendService.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/ISvgTrendService.java
new file mode 100644
index 0000000..55552d2
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/ISvgTrendService.java
@@ -0,0 +1,15 @@
+package com.dingzhuo.energy.data.monitoring.trend.svg.service;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+
+import java.util.List;
+
+public interface ISvgTrendService {
+
+    /**
+     * 瀹炴椂妫�娴� 鍔熻兘 鐨勫 sheet椤�  灞曠ず瓒嬪娍鍥�
+     * @param energyIndex
+     * @return
+     */
+    List<EnergyIndex> selectSvgList(EnergyIndex energyIndex);
+}
diff --git a/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/impl/SvgTrendServicelmpl.java b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/impl/SvgTrendServicelmpl.java
new file mode 100644
index 0000000..66a7b5c
--- /dev/null
+++ b/data-monitoring/src/main/java/com/dingzhuo/energy/data/monitoring/trend/svg/service/impl/SvgTrendServicelmpl.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.data.monitoring.trend.svg.service.impl;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.monitoring.trend.svg.mapper.SvgTrendMapper;
+import com.dingzhuo.energy.data.monitoring.trend.svg.service.ISvgTrendService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SvgTrendServicelmpl implements ISvgTrendService {
+
+    @Autowired
+    private SvgTrendMapper svgTrendMapper;
+    /**
+     * 鏌ヨ鎸囨爣淇℃伅
+     *
+     * @param energyIndex 鎸囨爣淇℃伅ID
+     * @return 鎸囨爣淇℃伅
+     */
+    @Override
+    public List<EnergyIndex> selectSvgList(EnergyIndex energyIndex) {
+        return svgTrendMapper.selectSvgTrendList(energyIndex);
+    }
+}
diff --git a/data-monitoring/src/main/resources/mybatis/alarm/AlarmItemMapper.xml b/data-monitoring/src/main/resources/mybatis/alarm/AlarmItemMapper.xml
new file mode 100644
index 0000000..431b88b
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/alarm/AlarmItemMapper.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.alarm.mapper.AlarmItemMapper">
+
+  <resultMap type="AlarmItem" id="AlarmItemResult">
+    <result property="id" column="id"/>
+    <result property="createTime" column="create_time"/>
+    <result property="createBy" column="create_by"/>
+    <result property="updateTime" column="update_time"/>
+    <result property="updateBy" column="update_by"/>
+    <result property="dwid" column="dwid"/>
+    <result property="startStop" column="start_stop"/>
+    <result property="timeSlot" column="time_slot"/>
+    <result property="limitType" column="limit_type"/>
+    <result property="limitVal" column="limit_val"/>
+    <result property="alarmLevel" column="alarm_level"/>
+    <result property="nodeId" column="node_id"/>
+    <result property="indexCode" column="index_code"/>
+    <result property="alarmCode" column="alarm_code"/>
+  </resultMap>
+
+  <sql id="selectAlarmItemVo">
+    select id,
+           create_time,
+           create_by,
+           update_time,
+           update_by,
+           dwid,
+           start_stop,
+           time_slot,
+           limit_type,
+           limit_val,
+           alarm_level,
+           node_id
+    from alarm_item
+  </sql>
+
+  <select id="selectAlarmItemList" parameterType="AlarmItem" resultMap="AlarmItemResult">
+    <include refid="selectAlarmItemVo"/>
+    <where>
+    </where>
+  </select>
+
+  <select id="selectAlarmItemById" parameterType="String" resultMap="AlarmItemResult">
+    <include refid="selectAlarmItemVo"/>
+    where id = #{id}
+  </select>
+
+  <insert id="insertAlarmItem" parameterType="AlarmItem">
+    insert into alarm_item
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">id,</if>
+      <if test="createTime != null ">create_time,</if>
+      <if test="createBy != null  and createBy != ''">create_by,</if>
+      <if test="updateTime != null ">update_time,</if>
+      <if test="updateBy != null  and updateBy != ''">update_by,</if>
+      <if test="dwid != null  and dwid != ''">dwid,</if>
+      <if test="startStop != null  and startStop != ''">start_stop,</if>
+      <if test="timeSlot != null  and timeSlot != ''">time_slot,</if>
+      <if test="limit_type != null  and limit_type != ''">limit_type,</if>
+      <if test="limitVal != null  and limitVal != ''">limit_val,</if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">#{id},</if>
+      <if test="createTime != null ">#{createTime},</if>
+      <if test="createBy != null  and createBy != ''">#{createBy},</if>
+      <if test="updateTime != null ">#{updateTime},</if>
+      <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+      <if test="dwid != null  and dwid != ''">#{dwid},</if>
+      <if test="startStop != null  and startStop != ''">#{startStop},</if>
+      <if test="timeSlot != null  and timeSlot != ''">#{timeSlot},</if>
+      <if test="limitType != null  and limitType != ''">#{limitType},</if>
+      <if test="limitVal != null  and limitVal != ''">#{limitVal},</if>
+    </trim>
+  </insert>
+
+  <update id="updateAlarmItem" parameterType="AlarmItem">
+    update alarm_item
+    <trim prefix="SET" suffixOverrides=",">
+      <if test="createTime != null ">create_time = #{createTime},</if>
+      <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+      <if test="updateTime != null ">update_time = #{updateTime},</if>
+      <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+      <if test="dwid != null  and dwid != ''">dwid = #{dwid},</if>
+      <if test="startStop != null  and startStop != ''">start_stop = #{startStop},</if>
+      <if test="timeSlot != null  and timeSlot != ''">time_slot = #{timeSlot},</if>
+      <if test="limitType != null  and limitType != ''">limit = #{limitType},</if>
+      <if test="limitVal != null  and limitVal != ''">limit_val = #{limitVal},</if>
+    </trim>
+    where id = #{id}
+  </update>
+
+  <delete id="deleteAlarmItemById" parameterType="String">
+    delete
+    from alarm_item
+    where id = #{id}
+  </delete>
+
+  <delete id="deleteAlarmItemByIds" parameterType="String">
+    delete from alarm_item where id in
+    <foreach item="id" collection="array" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </delete>
+
+  <select id="selectAlarmItemtingById" parameterType="String" resultMap="AlarmItemResult">
+    <include refid="selectAlarmItemVo"/>
+    where dwid = #{id}
+  </select>
+
+  <update id="updateStartStop">
+    update alarm_item SET start_stop=#{flag},update_time=now(),update_by=#{update_by} where dwid in
+    <foreach item="id" collection="ids" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </update>
+  <select id="getStartStop" resultType="String">
+    select DISTINCT start_stop
+    from alarm_item
+    where dwid = #{indexid};
+  </select>
+
+  <update id="updateLimitVal">
+    delete from alarm_item where dwid = #{id};
+    <foreach collection="data" item="item" index="index" separator=";">
+      insert into alarm_item
+      <trim prefix="(" suffix=")" suffixOverrides=",">
+        <if test="id != null  and id != ''">id,</if>
+        <if test="item.indexId != null  and item.indexId != ''">dwid,</if>
+        <if test="item.state != null  and item.state != ''">start_stop,</if>
+        <if test="item.timeSlotVal != null  and item.timeSlotVal != ''">time_slot,</if>
+        <if test="item.limitTypeVal != null  and item.limitTypeVal != ''">limit_type,</if>
+        <if test="item.limitVal != null  and item.limitVal != ''">limit_val,</if>
+        <if test="item.alarmLevel != null  and item.alarmLevel != ''">alarm_level,</if>
+        <if test="item.nodeId != null  and item.nodeId != ''">node_id,</if>
+        <if test="id != null  and id != ''">update_time,</if>
+        <if test="id != null  and id != ''">create_time,</if>
+        <if test="id != null  and id != ''">update_by,</if>
+        <if test="id != null  and id != ''">create_by,</if>
+        <if test="id != null  and id != ''">alarm_code,</if>
+      </trim>
+      <trim prefix="values (" suffix=")" suffixOverrides=",">
+        <if test="id != null  and id != ''">#{item.id},</if>
+        <if test="item.indexId != null  and item.indexId != ''">#{item.indexId},</if>
+        <if test="item.state != null  and item.state != ''">#{item.state},</if>
+        <if test="item.timeSlotVal != null  and item.timeSlotVal != ''">#{item.timeSlotVal},</if>
+        <if test="item.limitTypeVal != null  and item.limitTypeVal != ''">#{item.limitTypeVal},</if>
+        <if test="item.limitVal != null  and item.limitVal != ''">#{item.limitVal},</if>
+        <if test="item.alarmLevel != null  and item.alarmLevel != ''">#{item.alarmLevel},</if>
+        <if test="item.nodeId != null  and item.nodeId != ''">#{item.nodeId},</if>
+        <if test="id != null  and id != ''">now(),</if>
+        <if test="id != null  and id != ''">now(),</if>
+        <if test="id != null  and id != ''">#{username},</if>
+        <if test="id != null  and id != ''">#{username},</if>
+        <if test="id != null  and id != ''">#{item.alarmCode},</if>
+      </trim>
+    </foreach>
+  </update>
+  <update id="updateLimitValNoDel">
+    <foreach collection="data" item="item" index="index" separator=";">
+      insert into alarm_item
+      <trim prefix="(" suffix=")" suffixOverrides=",">
+        <if test="id != null  and id != ''">id,</if>
+        <if test="item.indexId != null  and item.indexId != ''">dwid,</if>
+        <if test="item.state != null  and item.state != ''">start_stop,</if>
+        <if test="item.timeSlotVal != null  and item.timeSlotVal != ''">time_slot,</if>
+        <if test="item.limitTypeVal != null  and item.limitTypeVal != ''">limit_type,</if>
+        <if test="item.limitVal != null  and item.limitVal != ''">limit_val,</if>
+        <if test="item.alarmLevel != null  and item.alarmLevel != ''">alarm_level,</if>
+        <if test="item.nodeId != null  and item.nodeId != ''">node_id,</if>
+        <if test="id != null  and id != ''">update_time,</if>
+        <if test="id != null  and id != ''">create_time,</if>
+        <if test="id != null  and id != ''">update_by,</if>
+        <if test="id != null  and id != ''">create_by,</if>
+        <if test="id != null  and id != ''">alarm_code,</if>
+      </trim>
+      <trim prefix="values (" suffix=")" suffixOverrides=",">
+        <if test="id != null  and id != ''">#{item.id},</if>
+        <if test="item.indexId != null  and item.indexId != ''">#{item.indexId},</if>
+        <if test="item.state != null  and item.state != ''">#{item.state},</if>
+        <if test="item.timeSlotVal != null  and item.timeSlotVal != ''">#{item.timeSlotVal},</if>
+        <if test="item.limitTypeVal != null  and item.limitTypeVal != ''">#{item.limitTypeVal},</if>
+        <if test="item.limitVal != null  and item.limitVal != ''">#{item.limitVal},</if>
+        <if test="item.alarmLevel != null  and item.alarmLevel != ''">#{item.alarmLevel},</if>
+        <if test="item.nodeId != null  and item.nodeId != ''">#{item.nodeId},</if>
+        <if test="id != null  and id != ''">now(),</if>
+        <if test="id != null  and id != ''">now(),</if>
+        <if test="id != null  and id != ''">#{username},</if>
+        <if test="id != null  and id != ''">#{username},</if>
+        <if test="id != null  and id != ''">#{item.alarm_code},</if>
+      </trim>
+    </foreach>
+  </update>
+  <select id="selectCountById" resultType="int">
+    select count(id)
+    from alarm_item
+    where dwid = #{id};
+  </select>
+  <delete id="deleteAllLimitVal">
+    delete
+    from alarm_item
+    where dwid = #{id};
+  </delete>
+  <select id="getSettingCount" resultType="int">
+    select count(id)
+    from alarm_item
+    where dwid = #{id};
+  </select>
+  <select id="getAllAlarmItem" resultMap="AlarmItemResult">
+    select ai.*, ei.code as index_code
+    from alarm_item ai
+           left join energy_index ei on ai.dwid = ei.index_id
+    where start_stop = '1';
+  </select>
+</mapper>
diff --git a/data-monitoring/src/main/resources/mybatis/alarm/HistoryAlarmMapper.xml b/data-monitoring/src/main/resources/mybatis/alarm/HistoryAlarmMapper.xml
new file mode 100644
index 0000000..d0d5a56
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/alarm/HistoryAlarmMapper.xml
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.alarm.mapper.HistoryAlarmMapper">
+
+  <resultMap type="HistoryAlarm" id="HistoryAlarmResult">
+    <result property="id" column="id"/>
+    <result property="indexId" column="index_id"/>
+    <result property="indexName" column="index_name"/>
+    <result property="itemId" column="item_id"/>
+    <result property="limitingValue" column="limiting_value"/>
+    <result property="alarmValue" column="alarm_value"/>
+    <result property="alarmValueQuality" column="alarm_value_quality"/>
+    <result property="beginTime" column="begin_time"/>
+    <result property="endTime" column="end_time"/>
+    <result property="duration" column="duration"/>
+    <result property="content" column="content"/>
+  </resultMap>
+
+  <resultMap type="JkHistoryAlarm" id="JkHistoryAlarmResult">
+    <result property="modelName" column="modelname"/>
+    <result property="code" column="code"/>
+    <result property="indexName" column="indexname"/>
+    <result property="unitId" column="unit_id"/>
+    <result property="alarmLevel" column="alarm_level"/>
+    <result property="limitType" column="limit_type"/>
+    <result property="limitingValue" column="limiting_value"/>
+    <result property="alarmBeginTime" column="begin_time"/>
+    <result property="alarmValue" column="alarm_value"/>
+    <result property="indexId" column="index_id"/>
+    <result property="nodeId" column="node_id"/>
+    <result property="duration" column="duration"/>
+    <result property="alarmBeginTime" column="begin_time"/>
+    <result property="alarmEndTime" column="end_time"/>
+  </resultMap>
+
+  <sql id="selectHistoryAlarmVo">
+    select id,
+           index_id,
+           index_name,
+           item_id,
+           limiting_value,
+           alarm_value,
+           alarm_value_quality,
+           begin_time,
+           end_time,
+           duration,
+           content
+    from history_alarm
+  </sql>
+
+  <select id="selectHistoryAlarmList" parameterType="HistoryAlarm" resultMap="HistoryAlarmResult">
+    <include refid="selectHistoryAlarmVo"/>
+    <where>
+      <if test="indexName != null  and indexName != ''">and index_name like concat('%',
+        #{indexName}, '%')
+      </if>
+      <if test="itemId != null  and itemId != ''">and item_id like concat('%', #{itemId}, '%')</if>
+      <if test="limitingValue != null ">and limiting_value like concat('%', #{limitingValue}, '%')
+      </if>
+      <if test="alarmValue != null ">and alarm_value like concat('%', #{alarmValue}, '%')</if>
+      <if test="alarmValueQuality != null  and alarmValueQuality != ''">and alarm_value_quality like
+        concat('%', #{alarmValueQuality}, '%')
+      </if>
+      <if test="beginTime != null ">and begin_time like concat('%', #{beginTime}, '%')</if>
+      <if test="endTime != null ">and end_time like concat('%', #{endTime}, '%')</if>
+      <if test="duration != null ">and duration like concat('%', #{duration}, '%')</if>
+      <if test="content != null  and content != ''">and content like concat('%', #{content}, '%')
+      </if>
+    </where>
+  </select>
+
+  <select id="selectHistoryAlarmById" parameterType="String" resultMap="HistoryAlarmResult">
+    <include refid="selectHistoryAlarmVo"/>
+    where id = #{id}
+  </select>
+
+
+  <update id="updateHistoryAlarm" parameterType="HistoryAlarm">
+    delete from realtime_alarm where alarm_code = #{alarmCode};
+    insert into history_alarm
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="historyAlarm.id != null  and historyAlarm.id != ''">id,</if>
+      <if test="historyAlarm.indexId != null  and historyAlarm.indexId != ''">index_id,</if>
+      <if test="historyAlarm.indexName != null  and historyAlarm.indexName != ''">index_name,</if>
+      <if test="historyAlarm.itemId != null  and historyAlarm.itemId != ''">item_id,</if>
+      <if test="historyAlarm.limitingValue != null ">limiting_value,</if>
+      <if test="historyAlarm.alarmValue != null ">alarm_value,</if>
+      <if test="historyAlarm.alarmValueQuality != null">alarm_value_quality,</if>
+      <if test="historyAlarm.beginTime != null ">begin_time,</if>
+      <if test="historyAlarm.endTime != null ">end_time,</if>
+      <if test="historyAlarm.duration != null ">duration,</if>
+      <if test="historyAlarm.content != null  and historyAlarm.content != ''">content,</if>
+      <if test="historyAlarm.timeCode != null and historyAlarm.timeCode != ''">time_code,</if>
+      <if test="historyAlarm.alarmCode != null and historyAlarm.alarmCode != ''">alarm_code,</if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="historyAlarm.id != null  and historyAlarm.id != ''">#{historyAlarm.id},</if>
+      <if test="historyAlarm.indexId != null  and historyAlarm.indexId != ''">#{historyAlarm.indexId},</if>
+      <if test="historyAlarm.indexName != null  and historyAlarm.indexName != ''">#{historyAlarm.indexName},</if>
+      <if test="historyAlarm.itemId != null  and historyAlarm.itemId != ''">#{historyAlarm.itemId},</if>
+      <if test="historyAlarm.limitingValue != null ">#{historyAlarm.limitingValue},</if>
+      <if test="historyAlarm.alarmValue != null ">#{historyAlarm.alarmValue},</if>
+      <if test="historyAlarm.alarmValueQuality != null">#{historyAlarm.alarmValueQuality},</if>
+      <if test="historyAlarm.beginTime != null ">#{historyAlarm.beginTime},</if>
+      <if test="historyAlarm.endTime != null ">#{historyAlarm.endTime},</if>
+      <if test="historyAlarm.duration != null ">#{historyAlarm.duration},</if>
+      <if test="historyAlarm.content != null  and historyAlarm.content != ''">#{historyAlarm.content},</if>
+      <if test="historyAlarm.timeCode != null and historyAlarm.timeCode != ''">#{historyAlarm.timeCode},</if>
+      <if test="historyAlarm.alarmCode != null and historyAlarm.alarmCode != ''">#{historyAlarm.alarmCode},</if>
+    </trim>
+    ;
+  </update>
+
+  <delete id="deleteHistoryAlarmById" parameterType="String">
+    delete
+    from history_alarm
+    where id = #{id}
+  </delete>
+
+  <delete id="deleteHistoryAlarmByIds" parameterType="String">
+    delete from history_alarm where id in
+    <foreach item="id" collection="array" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </delete>
+
+  <!--鍘嗗彶 鎶ヨ鍒楄〃椤甸潰 閲囬泦鐐� 涓婚〉闈㈠垪琛ㄦ煡璇�-->
+  <select id="selectJkHistoryAlarmList" parameterType="JkHistoryAlarm"
+    resultMap="JkHistoryAlarmResult">
+    SELECT
+    mo."name" AS modelname,
+    ei.code,
+    ei.NAME AS indexname,
+    ei.unit_id,
+    alit.alarm_level,
+    alit.limit_type,
+    bj.limiting_value,
+    bj.begin_time,
+    bj.end_time,
+    bj.alarm_value,
+    bj.duration,
+    ei.index_id,
+    mo.node_id
+    FROM
+    energy_index ei,
+    node_index ni,
+    model_node mo,
+    history_alarm bj ,
+    alarm_item alit
+    WHERE
+    ni.node_id IN (
+    SELECT node_id FROM model_node WHERE address LIKE (
+    SELECT address FROM model_node WHERE node_id = #{nodeId} )
+    <if test='eierarchyFlag=="ALL"'>
+      || '%'
+    </if>
+    )
+    AND ei.index_id = ni.index_id
+    AND mo.node_id = ni.node_id
+    AND bj.index_id = ei.index_id
+    AND alit.alarm_code = bj.alarm_code
+    AND alit.time_slot='LIVE'
+    AND ei.index_type=#{indexType}
+    <if test="indexName != null  and indexName != ''">and ei.name like concat('%', #{indexName},
+      '%')
+    </if>
+    <if test="limitType != null  and limitType != ''">and alit.limit_type=#{limitType}</if>
+    <if test="alarmLevel != null  and alarmLevel != ''">and alit.alarm_level=#{alarmLevel}</if>
+    <if test="beginTime != null and beginTime != ''">and begin_time &gt;=
+      to_timestamp(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+    </if>
+    <if test="endTime != null and endTime != ''">and begin_time &lt;=
+      to_timestamp(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+    </if>
+    order by alarm_level,mo.node_id,limit_type asc
+  </select>
+
+  <select id="selectJkHistoryAlarmListExcel" parameterType="JkHistoryAlarm"
+    resultMap="JkHistoryAlarmResult">
+    SELECT
+    mo."name" AS modelname,
+    ei.code,
+    ei.NAME AS indexname,
+    fun_getdicedata('sys_unit',ei.unit_id) as unit_id,
+    fun_getdicedata('alarm_level',alit.alarm_level) as alarm_level,
+    lt.limit_name as limit_type,
+    bj.limiting_value,
+    bj.begin_time,
+    bj.end_time,
+    bj.alarm_value,
+    bj.duration,
+    ei.index_id,
+    mo.node_id
+    FROM
+    energy_index ei,
+    node_index ni,
+    model_node mo,
+    history_alarm bj ,
+    alarm_item alit,
+    limit_type lt
+    WHERE
+    ni.node_id IN (
+    SELECT node_id FROM model_node WHERE address LIKE (
+    SELECT address FROM model_node WHERE node_id = #{nodeId} )
+    <if test='eierarchyFlag=="ALL"'>
+      || '%'
+    </if>
+    )
+    AND ei.index_id = ni.index_id
+    AND mo.node_id = ni.node_id
+    AND bj.index_id = ei.index_id
+    AND alit.alarm_code = bj.alarm_code
+    AND alit.time_slot='LIVE'
+    AND ei.index_type=#{indexType}
+    AND lt.limit_code=alit.limit_type
+    <if test="indexName != null  and indexName != ''">and ei.name like concat('%', #{indexName},
+      '%')
+    </if>
+    <if test="limitType != null  and limitType != ''">and alit.limit_type=#{limitType}</if>
+    <if test="alarmLevel != null  and alarmLevel != ''">and alit.alarm_level=#{alarmLevel}</if>
+    <if test="beginTime != null and beginTime != '' ">and begin_time &gt;=
+      to_timestamp(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+    </if>
+    <if test="endTime != null and endTime != ''">and begin_time &lt;=
+      to_timestamp(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+    </if>
+    order by alarm_level,mo.node_id,limit_type asc
+  </select>
+
+  <select id="selectHistoryAlarmNoteList" parameterType="JkHistoryAlarm"
+    resultMap="JkHistoryAlarmResult">
+    SELECT
+    ei.code,
+    ei.NAME AS indexname,
+    fun_getdicedata('sys_unit',ei.unit_id) as unit_id,
+    fun_getdicedata('alarm_level',alit.alarm_level) as alarm_level,
+    lt.limit_name as limit_type,
+    bj.limiting_value,
+    bj.begin_time,
+    bj.end_time,
+    bj.alarm_value,
+    bj.duration,
+    ei.index_id
+    FROM
+    energy_index ei,
+    history_alarm bj ,
+    sys_svg_info svg,
+    alarm_item alit,
+    limit_type lt
+    WHERE
+    svg.node_id=#{nodeId}
+    AND ei.code = svg.tag
+    AND bj.index_id = ei.index_id
+    AND alit.alarm_code = bj.alarm_code
+    AND alit.time_slot='LIVE'
+    AND ei.index_type=#{indexType}
+    AND lt.limit_code=alit.limit_type
+    <if test="indexName != null  and indexName != ''">and ei.name like concat('%', #{indexName},
+      '%')
+    </if>
+    <if test="limitType != null  and limitType != ''">and alit.limit_type=#{limitType}</if>
+    <if test="alarmLevel != null  and alarmLevel != ''">and alit.alarm_level=#{alarmLevel}</if>
+    <if test="beginTime != null and beginTime != '' ">and begin_time &gt;=
+      to_timestamp(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+    </if>
+    <if test="endTime != null and endTime != ''">and begin_time &lt;=
+      to_timestamp(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+    </if>
+    order by alarm_level,limit_type asc
+  </select>
+
+</mapper>
diff --git a/data-monitoring/src/main/resources/mybatis/alarm/RealtimeAlarmMapper.xml b/data-monitoring/src/main/resources/mybatis/alarm/RealtimeAlarmMapper.xml
new file mode 100644
index 0000000..82aee9b
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/alarm/RealtimeAlarmMapper.xml
@@ -0,0 +1,198 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.alarm.mapper.RealtimeAlarmMapper">
+
+
+  <resultMap type="com.dingzhuo.energy.data.monitoring.alarm.domain.RealTimeAlarm"
+    id="RealTimeAlarmResult">
+    <result property="id" column="id"/>
+    <result property="indexId" column="index_id"/>
+    <result property="indexName" column="index_name"/>
+    <result property="itemId" column="item_id"/>
+    <result property="limitingValue" column="limiting_value"/>
+    <result property="alarmValue" column="alarm_value"/>
+    <result property="alarmValueQuality" column="alarm_value_quality"/>
+    <result property="beginTime" column="begin_time"/>
+    <result property="content" column="content"/>
+    <result property="timeCode" column="time_code"/>
+    <result property="alarmCode" column="alarm_code"/>
+    <association property="alarmItem"
+      javaType="com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem">
+      <result property="id" column="itemId"/>
+      <result property="timeSlot" column="time_slot"/>
+      <result property="limitType" column="limit_type"/>
+      <result property="alarmLevel" column="alarm_level"/>
+    </association>
+  </resultMap>
+
+  <resultMap type="JkRealTimeAlarmList" id="JkRealTimeAlarmListResult">
+    <result property="modelName" column="modelname"/>
+    <result property="code" column="code"/>
+    <result property="indexName" column="indexname"/>
+    <result property="unitId" column="unit_id"/>
+    <result property="alarmLevel" column="alarm_level"/>
+    <result property="limitType" column="limit_type"/>
+    <result property="limitingValue" column="limiting_value"/>
+    <result property="alarmBeginTime" column="begin_time"/>
+    <result property="alarmValue" column="alarm_value"/>
+    <result property="indexId" column="index_id"/>
+    <result property="nodeId" column="node_id"/>
+  </resultMap>
+
+
+  <select id="selectRealtimeAlarmList" parameterType="RealTimeAlarm"
+    resultMap="RealTimeAlarmResult">
+    select id, index_id, index_name, item_id, limiting_value, alarm_value, alarm_value_quality,
+    begin_time, content from realtime_alarm
+    <where>
+      <if test="indexName != null  and indexName != ''">and index_name like concat('%',
+        #{indexName}, '%')
+      </if>
+      <if test="itemId != null  and itemId != ''">and item_id like concat('%', #{itemId}, '%')</if>
+      <if test="limitingValue != null ">and limiting_value like concat('%', #{limitingValue}, '%')
+      </if>
+      <if test="alarmValue != null ">and alarm_value like concat('%', #{alarmValue}, '%')</if>
+      <if test="alarmValueQuality != null">and alarm_value_quality like
+        concat('%', #{alarmValueQuality}, '%')
+      </if>
+      <if test="beginTime != null ">and begin_time like concat('%', #{beginTime}, '%')</if>
+      <if test="content != null  and content != ''">and content like concat('%', #{content}, '%')
+      </if>
+    </where>
+  </select>
+
+  <select id="selectRealtimeAlarmById" parameterType="String" resultMap="RealTimeAlarmResult">
+    select id,
+           index_id,
+           index_name,
+           item_id,
+           limiting_value,
+           alarm_value,
+           alarm_value_quality,
+           begin_time,
+           content
+    from realtime_alarm
+    where id = #{id}
+  </select>
+
+  <insert id="insertRealtimeAlarm" parameterType="RealTimeAlarm">
+    insert into realtime_alarm
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">id,</if>
+      <if test="indexId != null  and indexId != ''">index_id,</if>
+      <if test="indexName != null  and indexName != ''">index_name,</if>
+      <if test="itemId != null  and itemId != ''">item_id,</if>
+      <if test="limitingValue != null ">limiting_value,</if>
+      <if test="alarmValue != null ">alarm_value,</if>
+      <if test="alarmValueQuality != null">alarm_value_quality,</if>
+      <if test="beginTime != null ">begin_time,</if>
+      <if test="content != null  and content != ''">content,</if>
+      <if test="timeCode != null  and timeCode != ''">time_code,</if>
+      <if test="alarmCode != null  and alarmCode != ''">alarm_code,</if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">#{id},</if>
+      <if test="indexId != null  and indexId != ''">#{indexId},</if>
+      <if test="indexName != null  and indexName != ''">#{indexName},</if>
+      <if test="itemId != null  and itemId != ''">#{itemId},</if>
+      <if test="limitingValue != null ">#{limitingValue},</if>
+      <if test="alarmValue != null ">#{alarmValue},</if>
+      <if test="alarmValueQuality != null">#{alarmValueQuality},</if>
+      <if test="beginTime != null ">#{beginTime},</if>
+      <if test="content != null  and content != ''">#{content},</if>
+      <if test="timeCode != null  and timeCode != ''">#{timeCode},</if>
+      <if test="alarmCode != null  and alarmCode != ''">#{alarmCode},</if>
+    </trim>
+  </insert>
+
+  <update id="updateRealtimeAlarm" parameterType="RealTimeAlarm">
+    update realtime_alarm
+    <trim prefix="SET" suffixOverrides=",">
+      <if test="indexId != null  and indexId != ''">index_id = #{indexId},</if>
+      <if test="indexName != null  and indexName != ''">index_name = #{indexName},</if>
+      <if test="itemId != null  and itemId != ''">item_id = #{itemId},</if>
+      <if test="limitingValue != null ">limiting_value = #{limitingValue},</if>
+      <if test="alarmValue != null ">alarm_value = #{alarmValue},</if>
+      <if test="alarmValueQuality != null">alarm_value_quality =
+        #{alarmValueQuality},
+      </if>
+      <if test="beginTime != null ">begin_time = #{beginTime},</if>
+      <if test="content != null  and content != ''">content = #{content},</if>
+    </trim>
+    where id = #{id}
+  </update>
+
+  <delete id="deleteRealtimeAlarmById" parameterType="String">
+    delete
+    from realtime_alarm
+    where id = #{id}
+  </delete>
+
+  <delete id="deleteRealtimeAlarmByIds" parameterType="String">
+    delete from realtime_alarm where id in
+    <foreach item="id" collection="array" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </delete>
+
+  <!--瀹炴椂鎶ヨ鍒楄〃椤甸潰 閲囬泦鐐� 涓婚〉闈㈠垪琛ㄦ煡璇�-->
+  <select id="selectRealtimeAlarmJkList" parameterType="JkRealTimeAlarmList"
+    resultMap="JkRealTimeAlarmListResult">
+    SELECT
+    mo."name" AS modelname,
+    ei.code,
+    ei.NAME AS indexname,
+    ei.unit_id,
+    alit.alarm_level,
+    alit.limit_type,
+    bj.limiting_value,
+    bj.begin_time,
+    round(cast(bj.alarm_value as numeric ),2) as alarm_value,
+    ei.index_id,
+    mo.node_id
+    FROM
+    energy_index ei,
+    node_index ni,
+    model_node mo,
+    realtime_alarm bj ,
+    alarm_item alit
+    WHERE
+    ni.node_id IN (
+    SELECT node_id FROM model_node WHERE address LIKE (
+    SELECT address FROM model_node WHERE node_id = #{nodeId} )
+    <if test='eierarchyFlag=="ALL"'>
+      || '%'
+    </if>
+    )
+    AND ei.index_id = ni.index_id
+    AND mo.node_id = ni.node_id
+    AND bj.index_id = ei.index_id
+    AND alit.alarm_code = bj.alarm_code
+    AND alit.time_slot='LIVE'
+    AND ei.index_type=#{indexType}
+    <if test="indexName != null  and indexName != ''">and ei.name like concat('%', #{indexName},
+      '%')
+    </if>
+    <if test="limitType != null  and limitType != ''">and alit.limit_type=#{limitType}</if>
+    <if test="alarmLevel != null  and alarmLevel != ''">and alit.alarm_level=#{alarmLevel}</if>
+    order by alarm_level,mo.node_id,limit_type asc
+  </select>
+  <select id="getRealTimeAlarmByAlarmCode" resultMap="RealTimeAlarmResult">
+    select *
+    from realtime_alarm
+    where alarm_code = #{itemId}
+  </select>
+  <select id="getRealTimeAlarm" resultMap="RealTimeAlarmResult">
+    select *
+    from realtime_alarm ra
+  </select>
+  <select id="getAlarmByItemIdAndTimeCode" resultMap="RealTimeAlarmResult">
+    select *
+    from realtime_alarm
+    where item_id = #{itemId}
+      and time_code = #{timeCode}
+  </select>
+
+</mapper>
diff --git a/data-monitoring/src/main/resources/mybatis/device/DeviceFormulaMapper.xml b/data-monitoring/src/main/resources/mybatis/device/DeviceFormulaMapper.xml
new file mode 100644
index 0000000..7e19247
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/device/DeviceFormulaMapper.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.device.mapper.DeviceFormulaMapper">
+
+  <resultMap type="DeviceFormula" id="DeviceFormulaResult">
+    <result property="id" column="id"/>
+    <result property="deviceId" column="device_id"/>
+    <result property="stateId" column="state_id"/>
+    <result property="formulaText" column="formula_text"/>
+    <result property="calcText" column="calc_text"/>
+    <result property="isEnable" column="is_enable"/>
+  </resultMap>
+
+  <sql id="selectDeviceFormulaVo">
+    select id, device_id, state_id, formula_text, calc_text, is_enable
+    from device_formula
+  </sql>
+
+  <select id="selectDeviceFormulaList" parameterType="DeviceFormula"
+    resultMap="DeviceFormulaResult">
+    <include refid="selectDeviceFormulaVo"/>
+    <where>
+    </where>
+  </select>
+
+  <select id="selectDeviceFormulaById" parameterType="String" resultMap="DeviceFormulaResult">
+    <include refid="selectDeviceFormulaVo"/>
+    where id = #{id}
+  </select>
+
+  <insert id="insertDeviceFormula" parameterType="DeviceFormula">
+    insert into device_formula
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">id,</if>
+      <if test="deviceId != null  and deviceId != ''">device_id,</if>
+      <if test="stateId != null  and stateId != ''">state_id,</if>
+      <if test="formulaText != null  and formulaText != ''">formula_text,</if>
+      <if test="calcText != null  and calcText != ''">calc_text,</if>
+      <if test="isEnable != null  and isEnable != ''">is_enable,</if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">#{id},</if>
+      <if test="deviceId != null  and deviceId != ''">#{deviceId},</if>
+      <if test="stateId != null  and stateId != ''">#{stateId},</if>
+      <if test="formulaText != null  and formulaText != ''">#{formulaText},</if>
+      <if test="calcText != null  and calcText != ''">#{calcText},</if>
+      <if test="isEnable != null  and isEnable != ''">#{isEnable},</if>
+    </trim>
+  </insert>
+
+  <update id="updateDeviceFormula" parameterType="DeviceFormula">
+    update device_formula
+    <trim prefix="SET" suffixOverrides=",">
+      <if test="deviceId != null  and deviceId != ''">device_id = #{deviceId},</if>
+      <if test="stateId != null  and stateId != ''">state_id = #{stateId},</if>
+      <if test="formulaText != null  and formulaText != ''">formula_text = #{formulaText},</if>
+      <if test="calcText != null  and calcText != ''">calc_text = #{calcText},</if>
+      <if test="isEnable != null  and isEnable != ''">is_enable = #{isEnable},</if>
+    </trim>
+    where id = #{id}
+  </update>
+
+  <delete id="deleteDeviceFormulaById" parameterType="String">
+    delete
+    from device_formula
+    where id = #{id}
+  </delete>
+
+  <delete id="deleteDeviceFormulaByIds" parameterType="String">
+    delete from device_formula where id in
+    <foreach item="id" collection="array" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </delete>
+  <select id="getDeviceFormula" parameterType="String" resultMap="DeviceFormulaResult">
+    <include refid="selectDeviceFormulaVo"/>
+    where device_id = #{nodeId} and state_id = #{stateId}
+  </select>
+  <select id="getAllDeviceFormula" resultMap="DeviceFormulaResult">
+    select *
+    from device_formula
+    where is_enable = 'Y';
+  </select>
+
+  <update id="editDeviceFormulaIsEnable">
+    update device_formula SET is_enable=#{isEnable} where device_id= #{nodeId} and state_id in
+    <foreach item="id" collection="ids" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </update>
+</mapper>
\ No newline at end of file
diff --git a/data-monitoring/src/main/resources/mybatis/device/DeviceFormulaParamMapper.xml b/data-monitoring/src/main/resources/mybatis/device/DeviceFormulaParamMapper.xml
new file mode 100644
index 0000000..e659bca
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/device/DeviceFormulaParamMapper.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.device.mapper.DeviceFormulaParamMapper">
+    
+    <resultMap type="DeviceFormulaParam" id="DeviceFormulaParamResult">
+        <result property="id"    column="id"    />
+        <result property="devFormulaId"    column="dev_formula_id"    />
+        <result property="paramName"    column="param_name"    />
+        <result property="paramValue"    column="param_value"    />
+    </resultMap>
+
+    <sql id="selectDeviceFormulaParamVo">
+        select id, dev_formula_id, param_name, param_value from device_formula_param
+    </sql>
+
+    <select id="selectDeviceFormulaParamList" parameterType="DeviceFormulaParam" resultMap="DeviceFormulaParamResult">
+        <include refid="selectDeviceFormulaParamVo"/>
+        <where>  
+            <if test="paramName != null  and paramName != ''"> and param_name like concat('%', #{paramName}, '%')</if>
+            <if test="paramValue != null  and paramValue != ''"> and param_value like concat('%', #{paramValue}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectDeviceFormulaParamById" parameterType="String" resultMap="DeviceFormulaParamResult">
+        <include refid="selectDeviceFormulaParamVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertDeviceFormulaParam" parameterType="DeviceFormulaParam">
+        insert into device_formula_param
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="devFormulaId != null  and devFormulaId != ''">dev_formula_id,</if>
+            <if test="paramName != null  and paramName != ''">param_name,</if>
+            <if test="paramValue != null  and paramValue != ''">param_value,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="devFormulaId != null  and devFormulaId != ''">#{devFormulaId},</if>
+            <if test="paramName != null  and paramName != ''">#{paramName},</if>
+            <if test="paramValue != null  and paramValue != ''">#{paramValue},</if>
+         </trim>
+    </insert>
+
+    <update id="updateDeviceFormulaParam" parameterType="DeviceFormulaParam">
+        update device_formula_param
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="devFormulaId != null  and devFormulaId != ''">dev_formula_id = #{devFormulaId},</if>
+            <if test="paramName != null  and paramName != ''">param_name = #{paramName},</if>
+            <if test="paramValue != null  and paramValue != ''">param_value = #{paramValue},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDeviceFormulaParamById" parameterType="String">
+        delete from device_formula_param where id = #{id}
+    </delete>
+
+    <delete id="deleteDeviceFormulaParamByIds" parameterType="String">
+        delete from device_formula_param where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="getFormulaParam" resultMap="DeviceFormulaParamResult">
+        select *
+        from device_formula_param
+        where dev_formula_id = #{devFormulaId}
+  </select>
+
+    <insert id="saveDeviceFormulaParam">
+        delete
+        from device_formula_param
+        where dev_formula_id = #{devFormulaId};
+        <foreach collection="deviceFormulaParams" item="formulaParam" separator=";">
+            insert into device_formula_param (id, dev_formula_id, param_name, param_value) values
+            (#{formulaParam.id}, #{formulaParam.devFormulaId},
+            #{formulaParam.paramName},
+            #{formulaParam.paramValue})
+        </foreach>
+    </insert>
+</mapper>
\ No newline at end of file
diff --git a/data-monitoring/src/main/resources/mybatis/device/DeviceStatusHistoryMapper.xml b/data-monitoring/src/main/resources/mybatis/device/DeviceStatusHistoryMapper.xml
new file mode 100644
index 0000000..f308070
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/device/DeviceStatusHistoryMapper.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.device.mapper.DeviceStatusHistoryMapper">
+
+  <resultMap type="DeviceStatusHistory" id="DeviceStatusHistoryResult">
+    <result property="id" column="id"/>
+    <result property="deviceId" column="device_id"/>
+    <result property="statusId" column="status_id"/>
+    <result property="statusName" column="status_name"/>
+    <result property="statusCode" column="status_code"/>
+    <result property="beginTime" column="begin_time"/>
+    <result property="endTime" column="end_time"/>
+    <result property="devBeginTime" column="begin_time"/>
+    <result property="devEndTime" column="end_time"/>
+    <result property="duration" column="duration"/>
+  </resultMap>
+
+  <sql id="selectDeviceStatusHistoryVo">
+    select id,
+           device_id,
+           status_id,
+           status_name,
+           status_code,
+           begin_time,
+           end_time,
+           duration
+    from device_status_history
+  </sql>
+
+  <select id="selectDeviceStatusHistoryList" parameterType="DeviceStatusHistory"
+    resultMap="DeviceStatusHistoryResult">
+    <include refid="selectDeviceStatusHistoryVo"/>
+    <where>
+      <if test="statusName != null  and statusName != ''">and status_name like concat('%',
+        #{statusName}, '%')
+      </if>
+      <if test="statusCode != null  and statusCode != ''">and status_code like concat('%',
+        #{statusCode}, '%')
+      </if>
+      <if test="beginTime != null and beginTime != ''">and begin_time &gt;=
+        to_timestamp(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+      </if>
+      <if test="endTime != null and endTime != ''">and begin_time &lt;=
+        to_timestamp(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+      </if>
+      <if test="duration != null ">and duration like concat('%', #{duration}, '%')</if>
+    </where>
+  </select>
+
+  <select id="selectDeviceStatusHistoryById" parameterType="String"
+    resultMap="DeviceStatusHistoryResult">
+    <include refid="selectDeviceStatusHistoryVo"/>
+    where id = #{id}
+  </select>
+
+  <insert id="insertDeviceStatusHistory" parameterType="DeviceStatusHistory">
+    insert into device_status_history
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">id,</if>
+      <if test="deviceId != null  and deviceId != ''">device_id,</if>
+      <if test="statusId != null  and statusId != ''">status_id,</if>
+      <if test="statusName != null  and statusName != ''">status_name,</if>
+      <if test="statusCode != null  and statusCode != ''">status_code,</if>
+      <if test="beginTime != null ">begin_time,</if>
+      <if test="endTime != null ">end_time,</if>
+      <if test="duration != null ">duration,</if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">#{id},</if>
+      <if test="deviceId != null  and deviceId != ''">#{deviceId},</if>
+      <if test="statusId != null  and statusId != ''">#{statusId},</if>
+      <if test="statusName != null  and statusName != ''">#{statusName},</if>
+      <if test="statusCode != null  and statusCode != ''">#{statusCode},</if>
+      <if test="beginTime != null ">#{beginTime},</if>
+      <if test="endTime != null ">#{endTime},</if>
+      <if test="duration != null ">#{duration},</if>
+    </trim>
+  </insert>
+  <insert id="saveHistoryStatus">
+    delete from device_status_live where device_id = #{deviceId} and status_id = #{statusId};
+    insert into device_status_history
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">id,</if>
+      <if test="deviceId != null  and deviceId != ''">device_id,</if>
+      <if test="statusId != null  and statusId != ''">status_id,</if>
+      <if test="statusName != null  and statusName != ''">status_name,</if>
+      <if test="statusCode != null  and statusCode != ''">status_code,</if>
+      <if test="beginTime != null ">begin_time,</if>
+      <if test="endTime != null ">end_time,</if>
+      <if test="duration != null ">duration,</if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null  and id != ''">#{id},</if>
+      <if test="deviceId != null  and deviceId != ''">#{deviceId},</if>
+      <if test="statusId != null  and statusId != ''">#{statusId},</if>
+      <if test="statusName != null  and statusName != ''">#{statusName},</if>
+      <if test="statusCode != null  and statusCode != ''">#{statusCode},</if>
+      <if test="beginTime != null ">#{beginTime},</if>
+      <if test="endTime != null ">#{endTime},</if>
+      <if test="duration != null ">#{duration},</if>
+    </trim>
+  </insert>
+
+  <update id="updateDeviceStatusHistory" parameterType="DeviceStatusHistory">
+    update device_status_history
+    <trim prefix="SET" suffixOverrides=",">
+      <if test="deviceId != null  and deviceId != ''">device_id = #{deviceId},</if>
+      <if test="statusId != null  and statusId != ''">status_id = #{statusId},</if>
+      <if test="statusName != null  and statusName != ''">status_name = #{statusName},</if>
+      <if test="statusCode != null  and statusCode != ''">status_code = #{statusCode},</if>
+      <if test="beginTime != null ">begin_time = #{beginTime},</if>
+      <if test="endTime != null ">end_time = #{endTime},</if>
+      <if test="duration != null ">duration = #{duration},</if>
+    </trim>
+    where id = #{id}
+  </update>
+
+  <delete id="deleteDeviceStatusHistoryById" parameterType="String">
+    delete
+    from device_status_history
+    where id = #{id}
+  </delete>
+
+  <delete id="deleteDeviceStatusHistoryByIds" parameterType="String">
+    delete from device_status_history where id in
+    <foreach item="id" collection="array" open="(" separator="," close=")">
+      #{id}
+    </foreach>
+  </delete>
+
+  <select id="selectDeviceStatusHistoryListNew" parameterType="DeviceStatusHistory"
+    resultMap="DeviceStatusHistoryResult">
+    select
+    dsh.id,
+    dsh.device_id,
+    status_id,
+    status_name,
+    status_code,
+    begin_time,
+    end_time,
+    duration,
+    mo."name" as indexName
+    FROM
+    device_status_history dsh,
+    energy_index ei,
+    node_index ni,
+    model_node mo
+    <where>
+      ni.node_id IN ( SELECT node_id FROM model_node WHERE address LIKE ( SELECT address FROM
+      model_node WHERE node_id = #{deviceId})
+      <if test='eierarchyFlag=="ALL"'>
+        || '%'
+      </if>
+      )
+      AND ei.index_id = ni.index_id
+      AND mo.node_id = ni.node_id
+      AND dsh.device_id = mo.node_id
+      <if test="indexType != null  and indexType != ''">AND ei.index_type = #{indexType}</if>
+      <if test="statusName != null  and statusName != ''">and status_name like concat('%',
+        #{statusName}, '%')
+      </if>
+      <if test="statusCode != null  and statusCode != ''">and status_code like concat('%',
+        #{statusCode}, '%')
+      </if>
+      <if test="beginTime != null and beginTime != ''">and begin_time &gt;=
+        to_timestamp(#{beginTime},'yyyy-mm-dd hh24:mi:ss')
+      </if>
+      <if test="endTime != null and endTime != ''">and begin_time &lt;=
+        to_timestamp(#{endTime},'yyyy-mm-dd hh24:mi:ss')
+      </if>
+      <if test="duration != null ">and duration like concat('%', #{duration}, '%')</if>
+    </where>
+    order by begin_time asc
+  </select>
+</mapper>
\ No newline at end of file
diff --git a/data-monitoring/src/main/resources/mybatis/device/DeviceStatusLiveMapper.xml b/data-monitoring/src/main/resources/mybatis/device/DeviceStatusLiveMapper.xml
new file mode 100644
index 0000000..e16f6c8
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/device/DeviceStatusLiveMapper.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.device.mapper.DeviceStatusLiveMapper">
+    
+    <resultMap type="DeviceStatusLive" id="DeviceStatusLiveResult">
+        <result property="id"    column="id"    />
+        <result property="deviceId"    column="device_id"    />
+        <result property="statusId"    column="status_id"    />
+        <result property="statusName"    column="status_name"    />
+        <result property="statusCode"    column="status_code"    />
+        <result property="beginTime"    column="begin_time"    />
+    </resultMap>
+
+    <sql id="selectDeviceStatusLiveVo">
+        select id, device_id, status_id, status_name, status_code, begin_time from device_status_live
+    </sql>
+
+    <select id="selectDeviceStatusLiveList" parameterType="DeviceStatusLive" resultMap="DeviceStatusLiveResult">
+        <include refid="selectDeviceStatusLiveVo"/>
+        <where>  
+            <if test="statusName != null  and statusName != ''"> and status_name like concat('%', #{statusName}, '%')</if>
+            <if test="statusCode != null  and statusCode != ''"> and status_code like concat('%', #{statusCode}, '%')</if>
+            <if test="beginTime != null "> and begin_time like concat('%', #{beginTime}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectDeviceStatusLiveById" parameterType="String" resultMap="DeviceStatusLiveResult">
+        <include refid="selectDeviceStatusLiveVo"/>
+        where device_id = #{id}
+    </select>
+    <select id="getDeviceStatus" resultMap="DeviceStatusLiveResult">
+        <include refid="selectDeviceStatusLiveVo"/>
+        where device_id = #{deviceId} and status_id = #{statusId}
+    </select>
+
+    <insert id="insertDeviceStatusLive" parameterType="DeviceStatusLive">
+        insert into device_status_live
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="deviceId != null  and deviceId != ''">device_id,</if>
+            <if test="statusId != null  and statusId != ''">status_id,</if>
+            <if test="statusName != null  and statusName != ''">status_name,</if>
+            <if test="statusCode != null  and statusCode != ''">status_code,</if>
+            <if test="beginTime != null ">begin_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="deviceId != null  and deviceId != ''">#{deviceId},</if>
+            <if test="statusId != null  and statusId != ''">#{statusId},</if>
+            <if test="statusName != null  and statusName != ''">#{statusName},</if>
+            <if test="statusCode != null  and statusCode != ''">#{statusCode},</if>
+            <if test="beginTime != null ">#{beginTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateDeviceStatusLive" parameterType="DeviceStatusLive">
+        update device_status_live
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="deviceId != null  and deviceId != ''">device_id = #{deviceId},</if>
+            <if test="statusId != null  and statusId != ''">status_id = #{statusId},</if>
+            <if test="statusName != null  and statusName != ''">status_name = #{statusName},</if>
+            <if test="statusCode != null  and statusCode != ''">status_code = #{statusCode},</if>
+            <if test="beginTime != null ">begin_time = #{beginTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteDeviceStatusLiveById" parameterType="String">
+        delete from device_status_live where id = #{id}
+    </delete>
+
+    <delete id="deleteDeviceStatusLiveByIds" parameterType="String">
+        delete from device_status_live where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/data-monitoring/src/main/resources/mybatis/trend/SvgTrendMapper.xml b/data-monitoring/src/main/resources/mybatis/trend/SvgTrendMapper.xml
new file mode 100644
index 0000000..a0abc0f
--- /dev/null
+++ b/data-monitoring/src/main/resources/mybatis/trend/SvgTrendMapper.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.data.monitoring.trend.svg.mapper.SvgTrendMapper">
+    <resultMap type="EnergyIndex" id="EnergyIndexResult">
+        <result property="indexId" column="index_id"/>
+        <result property="name" column="name"/>
+        <result property="code" column="code"/>
+        <result property="indexType" column="index_type"/>
+        <result property="indexCategory" column="index_category"/>
+        <result property="remark" column="remark"/>
+        <result property="unitId" column="unit_id"/>
+        <result property="meterId" column="meter_id"/>
+        <result property="meterName" column="meter_name"/>
+    </resultMap>
+    <select id="selectSvgTrendList" parameterType="EnergyIndex" resultMap="EnergyIndexResult">
+        select ei.index_id, name, ei.code, index_type, ei.remark, ei.unit_id, index_category,meter_name
+        from
+        energy_index ei,
+        sys_svg_info svg,
+        meter_implement as me
+        <where>
+            ei.code = svg.tag
+            and ei.meter_id = me.id
+            <if test="name != null  and name != ''">and name like concat('%', #{name}, '%')</if>
+            <if test="code != null  and code != ''">and ei.code like concat('%', #{code}, '%')</if>
+            <if test="indexType != null">and index_type = #{indexType}</if>
+            <if test="nodeId != null  and nodeId != ''">and svg.node_id = #{nodeId}</if>
+            <if test="indexCategory != null  and indexCategory != ''">and index_category =
+                #{indexCategory}
+            </if>
+        </where>
+    </select>
+
+</mapper>
diff --git a/data-service/pom.xml b/data-service/pom.xml
new file mode 100644
index 0000000..b987a3b
--- /dev/null
+++ b/data-service/pom.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>data-service</artifactId>
+  <dependencies>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>basic</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>data-model</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+
+
+</project>
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/PeriodDataController.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/PeriodDataController.java
new file mode 100644
index 0000000..e03fde2
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/PeriodDataController.java
@@ -0,0 +1,31 @@
+package com.dingzhuo.energy.dataservice.controller;
+
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import java.util.List;
+import org.joda.time.DateTime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping("/dataService")
+public class PeriodDataController {
+
+  @Autowired
+  private PeriodDataService periodDataService;
+
+  @GetMapping
+  @ResponseBody
+  public AjaxResult test() {
+    DataItem item = periodDataService.getDataByIndex("b2f4b0b7-19e3-4dc2-9e4c-ce7a8ba1710e", "ddd");
+    return AjaxResult.success(item);
+  }
+
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/RealtimeDataController.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/RealtimeDataController.java
new file mode 100644
index 0000000..43b4019
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/controller/RealtimeDataController.java
@@ -0,0 +1,60 @@
+package com.dingzhuo.energy.dataservice.controller;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.domain.TagValueResult;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+@RequestMapping("/rtdb")
+public class RealtimeDataController extends BaseController {
+
+  @Autowired
+  private RealtimeDatabaseService realtimeDatabaseService;
+
+  @Autowired
+  private IEnergyIndexService energyIndexService;
+
+  @GetMapping("/retrieve/{tagCodes}")
+  @ResponseBody
+  public AjaxResult getLiveData(@PathVariable("tagCodes") String[] tagCodes) {
+    List<String> codes = new ArrayList<>(Arrays.asList(tagCodes));
+    List<TagValue> tagValues = realtimeDatabaseService.retrieve(codes);
+    List<EnergyIndex> energyIndices = energyIndexService.getEnergyIndexMeterByCodes(codes);
+    Map<String, EnergyIndex> mapValue = energyIndices.stream()
+        .collect(Collectors.toMap(EnergyIndex::getCode, m -> m));
+    List<TagValueResult> results = new ArrayList<>();
+    if (!tagValues.isEmpty()) {
+      tagValues.forEach(value -> {
+        TagValueResult result = new TagValueResult();
+        if (mapValue.containsKey(value.getTagCode())) {
+          EnergyIndex energyIndex = mapValue.get(value.getTagCode());
+          result.setTagName(energyIndex.getName());
+          result.setUnitId(energyIndex.getUnitId());
+          result.setMeteName(energyIndex.getMeterName());
+        }
+
+        result.setTagCode(value.getTagCode());
+        result.setValue(value.getValue());
+        result.setDataTime(value.getDataTime());
+        result.setQuality(value.getQuality());
+        results.add(result);
+      });
+    }
+    return AjaxResult.success(results);
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/InfluxDb.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/InfluxDb.java
new file mode 100644
index 0000000..b205142
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/InfluxDb.java
@@ -0,0 +1,201 @@
+package com.dingzhuo.energy.dataservice.data;
+
+import com.dingzhuo.energy.dataservice.data.influxdb.FastDB;
+import com.dingzhuo.energy.dataservice.data.influxdb.QueryType;
+import com.dingzhuo.energy.dataservice.data.influxdb.RtdbResult;
+import com.dingzhuo.energy.dataservice.domain.CollectionModes;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabase;
+import com.google.common.base.Function;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.joda.time.DateTime;
+
+import java.time.ZoneOffset;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author fanxinfu
+ */
+public class InfluxDb implements RealtimeDatabase {
+    private Logger logger = LogManager.getLogger(InfluxDb.class);
+
+    private FastDB fastDB;
+    private static final String DB_NAME = "daq";
+
+    /**
+     * 鍏抽棴杩炴帴
+     */
+    @Override
+    public void close() {
+        if (!Objects.isNull(fastDB)) {
+            fastDB.close();
+        }
+    }
+
+    /**
+     * 鏍规嵁鐐逛綅鍙疯幏鍙栧疄鏃舵暟鎹�
+     *
+     * @param tagCodes 鐐逛綅鍙峰垪琛�
+     * @return
+     */
+    @Override
+    public List<TagValue> retrieve(List<String> tagCodes) throws Exception {
+        List<RtdbResult> results = fastDB.snapShot(tagCodes);
+        return convertTagValue(results);
+    }
+
+    /**
+     * 鏍规嵁鐐逛綅鍙疯幏鍙栨煇涓�鏃跺埢鐨勫巻鍙叉暟鎹�
+     *
+     * @param tagCodes 鐐逛綅鍙烽泦鍚�
+     * @param dataTime 鍘嗗彶鏃跺埢
+     * @param timeCode 鍖哄垎鏃堕棿绫诲瀷鐨則ime code
+     * @return
+     */
+    @Override
+    public List<TagValue> retrieve(List<String> tagCodes, Date dataTime, String timeCode) throws Exception {
+        List<RtdbResult> results = fastDB.getDataByTime(tagCodes, dataTime, timeCode);
+        return convertTagValue(results);
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏂瑰紡鑾峰彇涓�娈垫椂闂村唴鐨勫巻鍙叉暟鎹�
+     *
+     * @param tagCodes       鐐逛綅鍙烽泦鍚�
+     * @param beginTime      寮�濮嬫椂闂�
+     * @param endTime        缁撴潫鏃堕棿
+     * @param retrievalModes 鏌ヨ鏂瑰紡锛堝惊鐜�佹嫙鍚堛�佸叏閮級
+     * @param pointCount     瑕佹煡璇㈢殑鏁版嵁涓暟
+     * @return
+     */
+    @Override
+    public List<TagValue> retrieve(List<String> tagCodes, Date beginTime, Date endTime, RetrievalModes retrievalModes, int pointCount) throws Exception {
+        QueryType queryType = null;
+        switch (retrievalModes) {
+            case BestFit:
+                queryType = QueryType.FIRST;
+                break;
+            default:
+                queryType = QueryType.FULL;
+                break;
+        }
+        List<RtdbResult> results = fastDB.getHistoryData(tagCodes, beginTime, endTime, queryType, pointCount);
+        return convertTagValue(results);
+    }
+
+    /**
+     * 姹囨�诲疄鏃舵暟鎹�
+     *
+     * @param tagCodes        鐐逛綅鍙烽泦鍚�
+     * @param beginTime       寮�濮嬫椂闂�
+     * @param endTime         缁撴潫鏃堕棿
+     * @param collectionModes 姹囨�绘柟寮忥紙鏈�澶у�笺�佹渶灏忓�笺�佸钩鍧囧�笺�佹眰鍜岀瓑锛�
+     * @return
+     */
+    @Override
+    public List<TagValue> statistics(List<String> tagCodes, Date beginTime, Date endTime, CollectionModes collectionModes) throws Exception {
+        DateTime begin = new DateTime(beginTime).withMillisOfSecond(0);
+        DateTime end = new DateTime(endTime).withMillisOfSecond(0);
+        QueryType queryType = null;
+        switch (collectionModes) {
+            case Sum:
+                queryType = QueryType.SUM;
+                break;
+            case Maximum:
+                queryType = QueryType.MAX;
+                break;
+            case Minimum:
+                queryType = QueryType.MIN;
+                break;
+            case Mean:
+                queryType = QueryType.MEAN;
+                break;
+            case Integral:
+                queryType = QueryType.INTEGRAL;
+                break;
+            default:
+                return new ArrayList<>();
+        }
+        List<RtdbResult> results = fastDB.statistics(tagCodes, begin.toDate(), end.toDate(), queryType);
+        return convertTagValue(results);
+    }
+
+    /**
+     * 鎻掑叆瀹炴椂鏁版嵁
+     *
+     * @param tagValues 瀹炴椂鏁版嵁闆嗗悎
+     * @return
+     */
+    @Override
+    public Boolean storeData(List<TagValue> tagValues) throws Exception {
+        List<RtdbResult> results = convertToRtdbResult(tagValues);
+        return fastDB.storeData(results);
+    }
+
+    /**
+     * 鎻掑叆鍘嗗彶鏁版嵁
+     *
+     * @param tagValues 鍘嗗彶鏁版嵁闆嗗悎
+     * @return
+     */
+    @Override
+    public Boolean insertData(List<TagValue> tagValues) throws Exception {
+        List<RtdbResult> results = convertToRtdbResult(tagValues);
+        return fastDB.insertData(results);
+    }
+
+    /**
+     * 鎵撳紑杩炴帴
+     *
+     * @param host     瀹炴椂鏁版嵁搴撳湴鍧�
+     * @param port     绔彛鍙�
+     * @param userName 鐧诲綍鐢ㄦ埛鍚�
+     * @param pwd      鐧诲綍瀵嗙爜
+     * @return 鏄惁杩炴帴鎴愬姛
+     */
+    @Override
+    public boolean open(String host, int port, String userName, String pwd) {
+        try {
+            fastDB = new FastDB(host, port, DB_NAME);
+        } catch (Throwable ex) {
+            ex.printStackTrace();
+        }
+        return true;
+    }
+
+
+    private List<TagValue> convertTagValue(List<RtdbResult> results) {
+        Function<RtdbResult, TagValue> convertFun = input -> {
+            TagValue tagValue = new TagValue();
+            tagValue.setDataTime(Date.from(input.getTime().atZone(ZoneOffset.ofHours(8)).toInstant()));
+            tagValue.setQuality(input.getQuality() > 0 ? Quality.GOOD : Quality.BAD);
+            tagValue.setTagCode(input.getTagCode());
+            tagValue.setValue(input.getValue());
+            if (tagValue.getQuality().equals(Quality.BAD)) {
+                logger.info(input.toString());
+                logger.info(tagValue.toString());
+            }
+            return tagValue;
+        };
+        return results.stream().map(convertFun).collect(Collectors.toList());
+    }
+
+    private List<RtdbResult> convertToRtdbResult(List<TagValue> results) {
+        Function<TagValue, RtdbResult> convertFun = input -> {
+            RtdbResult rtdbResult = new RtdbResult();
+            rtdbResult.setTime(input.getDataTime().toInstant());
+            rtdbResult.setQuality(input.getQuality() == Quality.GOOD ? 1 : 0);
+            rtdbResult.setTagCode(input.getTagCode());
+            rtdbResult.setValue(input.getValue());
+            return rtdbResult;
+        };
+        return results.stream().map(convertFun).collect(Collectors.toList());
+    }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/RealtimeDatabaseManager.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/RealtimeDatabaseManager.java
new file mode 100644
index 0000000..4204990
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/RealtimeDatabaseManager.java
@@ -0,0 +1,153 @@
+package com.dingzhuo.energy.dataservice.data;
+
+import com.dingzhuo.energy.framework.config.RtdbConfig;
+import com.dingzhuo.energy.dataservice.domain.CollectionModes;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabase;
+import org.apache.commons.lang.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author 鏅虹⒊鏈潵 瀹炴椂鏁版嵁搴撹闂鐞�.
+ */
+@Component
+public class RealtimeDatabaseManager {
+    private RealtimeDatabase connection;
+    private Logger logger = LogManager.getLogger(RealtimeDatabaseManager.class);
+
+    public RealtimeDatabaseManager(RtdbConfig rtdbConfig) {
+        connection = new InfluxDb();
+//    connection = new VirtualRtdb();
+        try {
+            connection.open(rtdbConfig.getHost(), rtdbConfig.getPort(), rtdbConfig.getUser(), rtdbConfig.getPassword());
+        } catch (Exception e) {
+            logger.error(e);
+        }
+    }
+
+    public TagValue retrieve(String tagCode) {
+        List<String> tagCodes = new ArrayList<>();
+        tagCodes.add(tagCode);
+        List<TagValue> tagValues = retrieve(tagCodes);
+        if (!tagValues.isEmpty()) {
+            return tagValues.get(0);
+        }
+
+        return null;
+    }
+
+    public List<TagValue> retrieve(List<String> tagCodes) {
+        List<TagValue> tagValues = new ArrayList<>();
+        try {
+            tagValues = connection.retrieve(tagCodes);
+        } catch (Exception e) {
+            logger.error(e);
+        }
+
+        return tagValues;
+    }
+
+    public TagValue retrieve(String tagCode, Date dataTime, String timeCode) {
+        List<String> tagCodes = new ArrayList<>();
+        tagCodes.add(tagCode);
+        List<TagValue> tagValues = retrieve(tagCodes, dataTime, timeCode);
+        if (!tagValues.isEmpty()) {
+            return tagValues.get(0);
+        }
+
+        return null;
+    }
+
+    public List<TagValue> retrieve(List<String> tagCodes, Date dataTime, String timeCode) {
+        List<TagValue> tagValues = new ArrayList<>();
+        try {
+            List<TagValue> tmp = connection.retrieve(tagCodes, dataTime, timeCode);
+            for (String tagCode : tagCodes) {
+                Optional<TagValue> tagValue = tmp.stream()
+                        .filter(f -> StringUtils.equalsIgnoreCase(f.getTagCode(), tagCode)).findAny();
+                TagValue value;
+                if (!tagValue.isPresent()) {
+                    value = new TagValue();
+                    value.setTagCode(tagCode);
+                    value.setDataTime(dataTime);
+                } else {
+                    value = tagValue.get();
+                }
+
+                tagValues.add(value);
+            }
+        } catch (Exception e1) {
+            logger.error(e1);
+        }
+
+        return tagValues;
+    }
+
+    public List<TagValue> retrieve(String tagCode, Date beginTime, Date endTime,
+                                   RetrievalModes retrievalModes, int pointCount) {
+        List<String> tagCodes = new ArrayList<>();
+        tagCodes.add(tagCode);
+        return retrieve(tagCodes, beginTime, endTime, retrievalModes, pointCount);
+    }
+
+    public List<TagValue> retrieve(List<String> tagCodes, Date beginTime, Date endTime,
+                                   RetrievalModes retrievalModes, int pointCount) {
+        List<TagValue> tagValues = new ArrayList<>();
+        try {
+            tagValues = connection.retrieve(tagCodes, beginTime, endTime, retrievalModes, pointCount);
+        } catch (Exception e1) {
+            logger.error(e1);
+        }
+
+        return tagValues;
+    }
+
+    public TagValue statistics(String tagCode, Date beginTime, Date endTime,
+                               CollectionModes collectionModes) {
+        List<String> tagCodes = new ArrayList<>();
+        tagCodes.add(tagCode);
+        List<TagValue> tagValues = statistics(tagCodes, beginTime, endTime, collectionModes);
+        if (!tagValues.isEmpty()) {
+            return tagValues.get(0);
+        }
+
+        return null;
+    }
+
+    public List<TagValue> statistics(List<String> tagCodes, Date beginTime, Date endTime,
+                                     CollectionModes collectionModes) {
+        List<TagValue> tagValues = new ArrayList<>();
+        try {
+            tagValues = connection.statistics(tagCodes, beginTime, endTime, collectionModes);
+        } catch (Exception e1) {
+            logger.error(e1);
+        }
+
+        return tagValues;
+    }
+
+    public void storeData(List<TagValue> tagValues) {
+        try {
+            connection.storeData(tagValues);
+        } catch (Exception e1) {
+            logger.error(e1);
+        }
+    }
+
+    public void insertData(List<TagValue> tagValues) {
+        try {
+            connection.insertData(tagValues);
+        } catch (Exception e1) {
+            logger.error(e1);
+        }
+    }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/VirtualRtdb.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/VirtualRtdb.java
new file mode 100644
index 0000000..88f9065
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/VirtualRtdb.java
@@ -0,0 +1,166 @@
+package com.dingzhuo.energy.dataservice.data;
+
+import com.dingzhuo.energy.dataservice.domain.CollectionModes;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabase;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import org.joda.time.DateTime;
+import org.joda.time.Seconds;
+
+public class VirtualRtdb implements RealtimeDatabase {
+
+  /**
+   * 鍏抽棴杩炴帴
+   */
+  @Override
+  public void close() {
+
+  }
+
+  /**
+   * 鏍规嵁鐐逛綅鍙疯幏鍙栧疄鏃舵暟鎹�
+   *
+   * @param tagCodes 鐐逛綅鍙峰垪琛�
+   * @return
+   */
+  @Override
+  public List<TagValue> retrieve(List<String> tagCodes) throws Exception {
+    List<TagValue> tagValues = new ArrayList<>();
+    Random random = new Random();
+    tagCodes.forEach(tagCode -> {
+      TagValue value = new TagValue();
+      value.setTagCode(tagCode);
+      value.setDataTime(DateTime.now().toDate());
+      value.setQuality(Quality.GOOD);
+      value.setValue(random.nextDouble() * 100);
+      tagValues.add(value);
+    });
+
+    return tagValues;
+  }
+
+  /**
+   * 鏍规嵁鐐逛綅鍙疯幏鍙栨煇涓�鏃跺埢鐨勫巻鍙叉暟鎹�
+   *
+   * @param tagCodes 鐐逛綅鍙烽泦鍚�
+   * @param dataTime 鍘嗗彶鏃跺埢
+   * @param timeCode 鍖哄垎鏃堕棿绫诲瀷鐨則ime code
+   * @return
+   */
+  @Override
+  public List<TagValue> retrieve(List<String> tagCodes, Date dataTime,String timeCode) throws Exception {
+    List<TagValue> tagValues = new ArrayList<>();
+    Random random = new Random();
+    tagCodes.forEach(tagCode -> {
+      TagValue value = new TagValue();
+      value.setTagCode(tagCode);
+      value.setDataTime(dataTime);
+      value.setQuality(Quality.GOOD);
+      value.setValue(random.nextDouble() * 100);
+      tagValues.add(value);
+    });
+
+    return tagValues;
+  }
+
+  /**
+   * 鏍规嵁鏌ヨ鏂瑰紡鑾峰彇涓�娈垫椂闂村唴鐨勫巻鍙叉暟鎹�
+   *
+   * @param tagCodes       鐐逛綅鍙烽泦鍚�
+   * @param beginTime      寮�濮嬫椂闂�
+   * @param endTime        缁撴潫鏃堕棿
+   * @param retrievalModes 鏌ヨ鏂瑰紡锛堝惊鐜�佹嫙鍚堛�佸叏閮級
+   * @param pointCount     瑕佹煡璇㈢殑鏁版嵁涓暟
+   * @return
+   */
+  @Override
+  public List<TagValue> retrieve(List<String> tagCodes, Date beginTime, Date endTime,
+      RetrievalModes retrievalModes, int pointCount) throws Exception {
+    List<TagValue> tagValues = new ArrayList<>();
+    Random random = new Random();
+    pointCount = retrievalModes == RetrievalModes.Full ? 200 : pointCount;
+    int finalPointCount = pointCount;
+    int span =
+        Seconds.secondsBetween(new DateTime(beginTime), new DateTime(endTime)).getSeconds();
+    int interval = span / finalPointCount;
+    tagCodes.forEach(tagCode -> {
+      for (int i = 1; i <= finalPointCount; i++) {
+        TagValue value = new TagValue();
+        value.setTagCode(tagCode);
+        value.setDataTime(new DateTime(beginTime).plusSeconds(interval * i).toDate());
+        value.setQuality(Quality.GOOD);
+        value.setValue(random.nextDouble() * 100);
+        tagValues.add(value);
+      }
+    });
+
+    return tagValues;
+  }
+
+  /**
+   * 姹囨�诲疄鏃舵暟鎹�
+   *
+   * @param tagCodes        鐐逛綅鍙烽泦鍚�
+   * @param beginTime       寮�濮嬫椂闂�
+   * @param endTime         缁撴潫鏃堕棿
+   * @param collectionModes 姹囨�绘柟寮忥紙鏈�澶у�笺�佹渶灏忓�笺�佸钩鍧囧�笺�佹眰鍜岀瓑锛�
+   * @return
+   */
+  @Override
+  public List<TagValue> statistics(List<String> tagCodes, Date beginTime, Date endTime,
+      CollectionModes collectionModes) throws Exception {
+    List<TagValue> tagValues = new ArrayList<>();
+    Random random = new Random();
+    tagCodes.forEach(tagCode -> {
+      TagValue value = new TagValue();
+      value.setTagCode(tagCode);
+      value.setDataTime(beginTime);
+      value.setQuality(Quality.GOOD);
+      value.setValue(random.nextDouble() * 1000);
+      tagValues.add(value);
+    });
+
+    return tagValues;
+  }
+
+  /**
+   * 鎻掑叆瀹炴椂鏁版嵁
+   *
+   * @param tagValues 瀹炴椂鏁版嵁闆嗗悎
+   * @return
+   */
+  @Override
+  public Boolean storeData(List<TagValue> tagValues) throws Exception {
+    return true;
+  }
+
+  /**
+   * 鎻掑叆鍘嗗彶鏁版嵁
+   *
+   * @param tagValues 鍘嗗彶鏁版嵁闆嗗悎
+   * @return
+   */
+  @Override
+  public Boolean insertData(List<TagValue> tagValues) throws Exception {
+    return true;
+  }
+
+  /**
+   * 鎵撳紑杩炴帴
+   *
+   * @param host     瀹炴椂鏁版嵁搴撳湴鍧�
+   * @param port     绔彛鍙�
+   * @param userName 鐧诲綍鐢ㄦ埛鍚�
+   * @param pwd      鐧诲綍瀵嗙爜
+   * @return 鏄惁杩炴帴鎴愬姛
+   */
+  @Override
+  public boolean open(String host, int port, String userName, String pwd) throws Exception {
+    return true;
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/DecodeInstant.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/DecodeInstant.java
new file mode 100644
index 0000000..95df866
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/DecodeInstant.java
@@ -0,0 +1,15 @@
+package com.dingzhuo.energy.dataservice.data.influxdb;
+
+import com.jsoniter.JsonIterator;
+import com.jsoniter.spi.Decoder;
+
+import java.io.IOException;
+import java.time.Instant;
+
+public class DecodeInstant implements Decoder {
+
+  @Override
+  public Object decode(JsonIterator jsonIterator) throws IOException {
+    return Instant.ofEpochMilli(jsonIterator.readLong());
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/FastDB.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/FastDB.java
new file mode 100644
index 0000000..eaf7c5e
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/FastDB.java
@@ -0,0 +1,340 @@
+package com.dingzhuo.energy.dataservice.data.influxdb;
+
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import okhttp3.OkHttpClient;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.influxdb.BatchOptions;
+import org.influxdb.InfluxDB;
+import org.influxdb.InfluxDBFactory;
+import org.influxdb.dto.BatchPoints;
+import org.influxdb.dto.Point;
+import org.influxdb.dto.Query;
+import org.influxdb.dto.QueryResult;
+import org.influxdb.impl.InfluxDBMapper;
+import org.joda.time.DateTime;
+import org.joda.time.Duration;
+
+public class FastDB {
+
+    private Logger logger = LogManager.getLogger(FastDB.class);
+    private InfluxDB influxDB;
+    private static final String TABLE_NAME = "daq";
+
+    private String dataBaseName;
+    private String host;
+    private int port;
+
+    public FastDB(String host, int port, String dataBaseName) {
+        this.dataBaseName = dataBaseName;
+        this.host = host;
+        this.port = port;
+        try {
+            this.open();
+        } catch (Exception e) {
+            logger.fatal(e);
+        }
+    }
+
+    private static InfluxDBMapper resultMapper;
+
+    /**
+     * 鎵撳紑杩炴帴
+     */
+    private void open() {
+        try {
+            OkHttpClient.Builder builder = new OkHttpClient.Builder()
+                    .connectTimeout(30, TimeUnit.SECONDS)
+                    .readTimeout(60, TimeUnit.SECONDS)
+                    .retryOnConnectionFailure(true);
+            influxDB = InfluxDBFactory.connect("http://" + this.host + ":" + this.port, builder);
+            influxDB
+                    .enableBatch(BatchOptions.DEFAULTS.jitterDuration(500).actions(2000).flushDuration(100));
+            influxDB.enableGzip();
+            influxDB.ping();
+            resultMapper = new InfluxDBMapper(influxDB);
+            logger.info("瀹炴椂搴撹繛鎺ユ垚鍔燂紒");
+        } catch (Exception ex) {
+            logger.fatal("瀹炴椂搴撹繛鎺ュけ璐ワ紒" + ex);
+        }
+    }
+
+    /**
+     * 鍏抽棴杩炴帴
+     */
+    public void close() {
+        influxDB.close();
+    }
+
+    /**
+     * 鏍规嵁鐐逛綅鍙疯幏鍙栧疄鏃舵暟鎹�
+     *
+     * @param tagCodes 鐐逛綅鍙峰垪琛�
+     * @returnS
+     */
+    public List<RtdbResult> snapShot(List<String> tagCodes) {
+        final String sql = "SELECT LAST(value) as value, quality FROM %s WHERE %s and " +
+                "time<=(now()) and time>=(now()-20m) GROUP BY code";
+        List<List<String>> newList = Lists.partition(tagCodes, 10);
+        List<ListenableFuture<QueryResult>> taskList = new ArrayList<>();
+        ListeningExecutorService service =
+                MoreExecutors.listeningDecorator(customerThreadPool());
+        for (List<String> tags : newList) {
+            ListenableFuture<QueryResult> futureTask = service.submit(() -> {
+                StringBuilder sb = new StringBuilder();
+                String codes = formatCode(tags);
+                sb.append(String.format(sql,
+                        TABLE_NAME, codes));
+                return builderResultValue(sb.toString());
+            });
+            taskList.add(futureTask);
+        }
+        List<RtdbResult> results = buildResult(taskList);
+        service.shutdown();
+        return results;
+    }
+
+    private ExecutorService customerThreadPool() {
+        ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
+                .setNameFormat("fast-db-thread-pool-%d").build();
+        return new ThreadPoolExecutor(10, 50,
+                30, TimeUnit.SECONDS,
+                new LinkedBlockingQueue<>(1024), namedThreadFactory,
+                new ThreadPoolExecutor.AbortPolicy());
+    }
+
+    /**
+     * 鏍规嵁鐐逛綅鍙疯幏鍙栨煇涓�鏃跺埢鐨勫巻鍙叉暟鎹�
+     *
+     * @param tagCodes 鐐逛綅鍙烽泦鍚�
+     * @param dataTime 鍘嗗彶鏃跺埢
+     * @param timeCode 鍖哄垎鏃堕棿绫诲瀷鐨則ime code
+     * @return List<RtdbResult>
+     */
+    public List<RtdbResult> getDataByTime(List<String> tagCodes, Date dataTime, String timeCode) {
+        DateTime begin = new DateTime(dataTime).plusDays(-1);;
+//        if (timeCode.startsWith("M")) {
+//            begin = new DateTime(dataTime).plusMonths(-1);
+//        } else if (timeCode.startsWith("Y")) {
+//            begin = new DateTime(dataTime).plusYears(-1);
+//        } else {
+//            begin = new DateTime(dataTime).plusDays(-1);
+//        }
+        DateTime end = new DateTime(dataTime);
+//        logger.error("寮�濮嬭绠楁暟鎹紝timeCode=" + timeCode + "寮�濮嬫椂闂�=" + begin.toString("yyyy-MM-dd HH:mm:ss") + "缁撴潫鏃堕棿=" + end.toString("yyyy-MM-dd HH:mm:ss"));
+        final String sql =
+                "SELECT LAST(value) as value, quality FROM %s WHERE %s AND time >=%dms AND " +
+                        "time<=%dms GROUP BY code";
+
+        List<List<String>> newList = Lists.partition(tagCodes, 10);
+        List<ListenableFuture<QueryResult>> taskList = new ArrayList<>();
+        ListeningExecutorService service =
+                MoreExecutors.listeningDecorator(customerThreadPool());
+        for (List<String> tags : newList) {
+            ListenableFuture<QueryResult> futureTask = service.submit(() -> {
+                StringBuilder sb = new StringBuilder();
+                String codes = formatCode(tags);
+                sb.append(String.format(sql,
+                        TABLE_NAME, codes, begin.toDate().getTime(), end.toDate().getTime() + 999));
+                return builderResultValue(sb.toString());
+            });
+            taskList.add(futureTask);
+        }
+        List<RtdbResult> results = buildResult(taskList);
+        service.shutdown();
+        return results;
+    }
+
+    /**
+     * 鏍规嵁鏌ヨ鏂瑰紡鑾峰彇涓�娈垫椂闂村唴鐨勫巻鍙叉暟鎹�
+     *
+     * @param tagCodes   鐐逛綅鍙烽泦鍚�
+     * @param beginTime  寮�濮嬫椂闂�
+     * @param endTime    缁撴潫鏃堕棿
+     * @param queryType  鏌ヨ鏂瑰紡锛堝惊鐜�佹嫙鍚堛�佸叏閮級
+     * @param pointCount 瑕佹煡璇㈢殑鏁版嵁涓暟
+     * @return
+     */
+    public List<RtdbResult> getHistoryData(List<String> tagCodes, Date beginTime, Date endTime,
+                                           QueryType queryType, int pointCount) {
+        DateTime begin = new DateTime(beginTime);
+        DateTime end = new DateTime(endTime);
+        long millis = new Duration(begin, end).getMillis();
+        List<List<String>> newList = Lists.partition(tagCodes, 10);
+        List<ListenableFuture<QueryResult>> taskList = new ArrayList<>();
+
+        ListeningExecutorService service =
+                MoreExecutors.listeningDecorator(customerThreadPool());
+
+        final String sqlFull =
+                "select value,quality FROM %s WHERE %s AND time >=%dms AND time <=%dms " +
+                        "GROUP BY code";
+        final String sql = "select %s(value) as value, quality FROM %s WHERE %s AND time >=%dms " +
+                "AND" +
+                " time <=%dms GROUP BY code,time(%dms) fill(previous)";
+        for (List<String> tags : newList) {
+            ListenableFuture<QueryResult> futureTask = service.submit(() -> {
+                StringBuilder sb = new StringBuilder();
+                String codes = formatCode(tags);
+                if (queryType != QueryType.FULL && pointCount > 0) {
+                    long interval = millis / pointCount;
+                    sb.append(String.format(sql, queryType.name(),
+                            TABLE_NAME, codes, begin.toDate().getTime(), end.toDate().getTime() + 999, interval));
+                } else {
+                    sb.append(String.format(sqlFull,
+                            TABLE_NAME, codes, begin.toDate().getTime(), end.toDate().getTime() + 999));
+                }
+
+                return builderResultValue(sb.toString());
+            });
+            taskList.add(futureTask);
+        }
+        List<RtdbResult> results = buildResult(taskList);
+        service.shutdown();
+        return results;
+    }
+
+    /**
+     * 姹囨�诲疄鏃舵暟鎹�
+     *
+     * @param tagCodes  鐐逛綅鍙烽泦鍚�
+     * @param beginTime 寮�濮嬫椂闂�
+     * @param endTime   缁撴潫鏃堕棿
+     * @param queryType 姹囨�绘柟寮忥紙鏈�澶у�笺�佹渶灏忓�笺�佸钩鍧囧�笺�佹眰鍜岀瓑锛�
+     * @return
+     */
+    public List<RtdbResult> statistics(List<String> tagCodes, Date beginTime, Date endTime,
+                                       QueryType queryType) throws ExecutionException, InterruptedException {
+        if (queryType == QueryType.FULL) {
+            return new ArrayList<>();
+        }
+        DateTime begin = new DateTime(beginTime);
+        DateTime end = new DateTime(endTime);
+        List<List<String>> newList = Lists.partition(tagCodes, 10);
+        List<ListenableFuture<QueryResult>> taskList = new ArrayList<>();
+        ListeningExecutorService service =
+                MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(50));
+
+        final String sql = "select %s(value) as value, quality FROM FROM %s WHERE %s AND time >=%dms " +
+                "AND" +
+                " time <=%dms GROUP BY code fill(previous)";
+        for (List<String> tags : newList) {
+            ListenableFuture<QueryResult> futureTask = service.submit(() -> {
+                StringBuilder sb = new StringBuilder();
+                String codes = formatCode(tags);
+                sb.append(String.format(sql, queryType.name(),
+                        TABLE_NAME, codes, begin.toDate().getTime(), end.toDate().getTime() + 999));
+                return builderResultValue(sb.toString());
+            });
+            taskList.add(futureTask);
+        }
+        List<RtdbResult> results = buildResult(taskList);
+        service.shutdown();
+        return results;
+    }
+
+    /**
+     * 鎻掑叆瀹炴椂鏁版嵁
+     *
+     * @param tagValues 瀹炴椂鏁版嵁闆嗗悎
+     * @return
+     */
+    public Boolean storeData(List<RtdbResult> tagValues) {
+        Instant now = Instant.now();
+        for (RtdbResult tagValue : tagValues) {
+            tagValue.setTime(now);
+        }
+        return saveData(tagValues);
+    }
+
+    /**
+     * 鎻掑叆鍘嗗彶鏁版嵁
+     *
+     * @param tagValues 鍘嗗彶鏁版嵁闆嗗悎
+     * @return
+     */
+    public Boolean insertData(List<RtdbResult> tagValues) {
+        return saveData(tagValues);
+    }
+
+
+    /**
+     * 鍒犻櫎娴嬬偣
+     *
+     * @param tagCode 鐐逛綅鍙�
+     * @return
+     */
+    public Boolean deleteTag(String tagCode) {
+        return false;
+    }
+
+    private Boolean saveData(List<RtdbResult> tagValues) {
+        BatchPoints.Builder builder = BatchPoints
+                .database(dataBaseName)
+                .retentionPolicy("autogen").precision(TimeUnit.SECONDS);
+        tagValues.forEach(tagValue -> {
+            Point point = Point
+                    .measurement(TABLE_NAME)
+                    .addField("value", tagValue.getValue())
+                    .addField("quality", tagValue.getQuality())
+                    .tag("code", tagValue.getTagCode())
+                    .time(tagValue.getTime().getEpochSecond(), TimeUnit.SECONDS).build();
+            builder.point(point);
+        });
+        influxDB.write(builder.build());
+        return true;
+    }
+
+    private QueryResult builderResultValue(String sql) {
+        try {
+//            logger.error("璁$畻鏁版嵁鐨凷QL鏄�" + sql);
+            Query query = new Query(sql, dataBaseName);
+            return influxDB.query(query);
+        } catch (Throwable throwable) {
+            return new QueryResult();
+        }
+    }
+
+    private List<RtdbResult> buildResult(List<ListenableFuture<QueryResult>> taskList) {
+        List<RtdbResult> results = new ArrayList<>();
+
+        try {
+            for (QueryResult queryResult : Futures.successfulAsList(taskList).get()) {
+                try {
+                    synchronized (this) {
+                        if (queryResult != null) {
+                            List<RtdbResult> rtdbResults = resultMapper.toPOJO(queryResult, RtdbResult.class);
+                            results.addAll(rtdbResults);
+                        }
+                    }
+                } catch (Throwable throwable) {
+                }
+            }
+        } catch (InterruptedException | ExecutionException e) {
+        }
+
+        return results;
+    }
+
+    private String formatCode(List<String> codeList) {
+        return "(code='" + String.join("' or code='", codeList) + "')";
+    }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/QueryType.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/QueryType.java
new file mode 100644
index 0000000..9a0e64c
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/QueryType.java
@@ -0,0 +1,45 @@
+package com.dingzhuo.energy.dataservice.data.influxdb;
+
+/**
+ * @author 鏅虹⒊鏈潵
+ * <p>
+ * 鑾峰彇瀹炴椂鏁版嵁鏂瑰紡.
+ */
+public enum QueryType {
+  /**
+   * 鍘熷
+   */
+  FULL,
+  /**
+   * 鎻掑��
+   */
+  MEAN,
+  /**
+   * 鏈�灏�
+   */
+  MIN,
+  /**
+   * 鏈�澶�
+   */
+  MAX,
+  /**
+   * 鏈�鏃�
+   */
+  FIRST,
+  /**
+   * 鏈�鍚�
+   */
+  LAST,
+  /**
+   * 涓綅鏁�
+   */
+  MEDIAN,
+  /**
+   * 姹傚拰
+   */
+  SUM,
+  /**
+   * 绉垎
+   */
+  INTEGRAL
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/RtdbResult.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/RtdbResult.java
new file mode 100644
index 0000000..902618c
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/data/influxdb/RtdbResult.java
@@ -0,0 +1,70 @@
+package com.dingzhuo.energy.dataservice.data.influxdb;
+
+import com.jsoniter.annotation.JsonProperty;
+import org.influxdb.annotation.Column;
+import org.influxdb.annotation.Measurement;
+
+import java.io.Serializable;
+import java.time.Instant;
+
+/**
+ * @author fanxinfu
+ */
+@Measurement(name = "daq")
+public class RtdbResult implements Serializable {
+  private static final long serialVersionUID = -6608775093489743678L;
+  @Column(name = "time")
+  @JsonProperty(value = "dataTime", decoder = DecodeInstant.class)
+  private Instant time;
+  @Column(name = "code", tag = true)
+  @JsonProperty("tagCode")
+  private String tagCode;
+  @Column(name = "value")
+  @JsonProperty("value")
+  private Double value;
+  @Column(name = "quality")
+  @JsonProperty("quality")
+  private int quality;
+
+  public Instant getTime() {
+    return time;
+  }
+
+  public void setTime(Instant time) {
+    this.time = time;
+  }
+
+  public String getTagCode() {
+    return tagCode;
+  }
+
+  public void setTagCode(String tagCode) {
+    this.tagCode = tagCode;
+  }
+
+  public Double getValue() {
+    return value;
+  }
+
+  public void setValue(Double value) {
+    this.value = value;
+  }
+
+  public int getQuality() {
+    return quality;
+  }
+
+  public void setQuality(int quality) {
+    this.quality = quality;
+  }
+
+  @Override
+  public String toString() {
+    return "RtdbResult{" +
+        "time=" + time +
+        ", tagCode='" + tagCode + '\'' +
+        ", value=" + value +
+        ", quality=" + quality +
+        '}';
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/CollectionModes.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/CollectionModes.java
new file mode 100644
index 0000000..3794e65
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/CollectionModes.java
@@ -0,0 +1,10 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+/**
+ * @author 鏅虹⒊鏈潵
+ *
+ *         瀹炴椂鏁版嵁缁熻绫诲瀷.
+ */
+public enum CollectionModes {
+  Minimum, Maximum, Integral, Mean, Sum
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/DataItem.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/DataItem.java
new file mode 100644
index 0000000..ce981ec
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/DataItem.java
@@ -0,0 +1,169 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiParam;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 鍛ㄦ湡鏁版嵁椤�.
+ */
+@ApiModel(value = "dataItem瀵硅薄")
+public class DataItem implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+
+  @ApiModelProperty(value = "鎸囨爣id")
+  private String indexId;
+  @ApiModelProperty(value = "鎸囨爣搴搃d")
+  private String indexStorageId;
+  @ApiModelProperty(value = "鎸囨爣code")
+  private String indexCode;
+  @ApiModelProperty(value = "鎸囨爣鍚嶇О")
+  private String indexName;
+  @ApiModelProperty(value = "寮�濮嬫椂闂�")
+  private Date beginTime;
+  @ApiModelProperty(value = "缁撴潫鏃堕棿")
+  private Date endTime;
+  @ApiModelProperty(value = "鏃ユ湡")
+  private Date dataTime;
+  @ApiModelProperty(value = "鏃堕棿绫诲瀷缂栫爜")
+  private String timeCode;
+  @ApiModelProperty(value = "鏃堕棿绫诲瀷")
+  private TimeType timeType;
+  @ApiModelProperty(value = "鍊�")
+  private Double value;
+  @ApiModelProperty(value = "璐ㄩ噺")
+  private Quality quality;
+  @ApiModelProperty(value = "")
+  private String unitId;
+  @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+  private Date createTime;
+  @ApiModelProperty(value = "鏇存柊鏃堕棿")
+  private Date updateTime;
+  @ApiModelProperty(value = "澶囨敞")
+  private String remark;
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexStorageId() {
+    return indexStorageId;
+  }
+
+  public void setIndexStorageId(String indexStorageId) {
+    this.indexStorageId = indexStorageId;
+  }
+
+  public String getIndexCode() {
+    return indexCode;
+  }
+
+  public void setIndexCode(String indexCode) {
+    this.indexCode = indexCode;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+
+  public Date getEndTime() {
+    return endTime;
+  }
+
+  public void setEndTime(Date endTime) {
+    this.endTime = endTime;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public Double getValue() {
+    return value;
+  }
+
+  public void setValue(Double value) {
+    this.value = value;
+  }
+
+  public Quality getQuality() {
+    return quality;
+  }
+
+  public void setQuality(Quality quality) {
+    this.quality = quality;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public Date getCreateTime() {
+    return createTime;
+  }
+
+  public void setCreateTime(Date createTime) {
+    this.createTime = createTime;
+  }
+
+  public Date getUpdateTime() {
+    return updateTime;
+  }
+
+  public void setUpdateTime(Date updateTime) {
+    this.updateTime = updateTime;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/Quality.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/Quality.java
new file mode 100644
index 0000000..3bb76c8
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/Quality.java
@@ -0,0 +1,12 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+public enum Quality {
+  /**
+   * 鏁版嵁姝e父
+   */
+  GOOD,
+  /**
+   * 鏁版嵁閿欒
+   */
+  BAD
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/RetrievalModes.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/RetrievalModes.java
new file mode 100644
index 0000000..2f30c6e
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/RetrievalModes.java
@@ -0,0 +1,10 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+/**
+ * @author 鏅虹⒊鏈潵
+ *
+ *     鑾峰彇瀹炴椂鏁版嵁鏂瑰紡.
+ */
+public enum RetrievalModes {
+  Full, BestFit
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticResult.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticResult.java
new file mode 100644
index 0000000..a20370d
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticResult.java
@@ -0,0 +1,190 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.springframework.util.StringUtils;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import java.util.Date;
+
+public class StatisticResult extends BaseEntity {
+  /**
+   * 鎸囨爣涓婚敭
+   */
+  @Excel(name = "鎸囨爣涓婚敭")
+  private String indexId;
+  /**
+   * 鎸囨爣缂栫爜
+   */
+  @Excel(name = "鎸囨爣缂栫爜")
+  private String indexCode;
+  /**
+   * 鎸囨爣鍚嶇О
+   */
+  @Excel(name = "鎸囨爣鍚嶇О")
+  private String indexName;
+  /**
+   * 鍗曚綅涓婚敭
+   */
+  @Excel(name = "鍗曚綅涓婚敭")
+  private String unitId;
+  /**
+   * 鏁版嵁鏃堕棿
+   */
+  @Excel(name = "鏁版嵁鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT)
+  private Date dataTime;
+  /**
+   * 鏈湡鍊�
+   */
+  @Excel(name = "鏈湡鍊�")
+  private double currentValue;
+  /**
+   * 涓婃湡鍊�
+   */
+  @Excel(name = "涓婃湡鍊�")
+  private double previousValue;
+  /**
+   * 鍚屾湡鍊�
+   */
+  @Excel(name = "鍚屾湡鍊�")
+  private double lastYearValue;
+  /**
+   * 鏈�澶у��
+   */
+  @Excel(name = "鏈�澶у��")
+  private double maxValue;
+  /**
+   * 鏈�灏忓��
+   */
+  @Excel(name = "鏈�灏忓��")
+  private double minValue;
+  /**
+   * 骞冲潎鍊�
+   */
+  @Excel(name = "骞冲潎鍊�")
+  private double avgValue;
+  //鏃堕棿
+  private String formatdate;
+
+  public String getFormatdate() {
+    return formatdate;
+  }
+
+  public void setFormatdate(String formatdate) {
+    this.formatdate = DateUtils.parseDateToStr(formatdate,this.dataTime);
+  }
+  public String getIndexCode() {
+    return indexCode;
+  }
+
+  public void setIndexCode(String indexCode) {
+    this.indexCode = indexCode;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public double getCurrentValue() {
+    return currentValue;
+  }
+
+  public void setCurrentValue(double currentValue) {
+    this.currentValue = currentValue;
+  }
+
+  public double getPreviousValue() {
+    return previousValue;
+  }
+
+  public void setPreviousValue(double previousValue) {
+    this.previousValue = previousValue;
+  }
+
+  public double getLastYearValue() {
+    return lastYearValue;
+  }
+
+  public void setLastYearValue(double lastYearValue) {
+    this.lastYearValue = lastYearValue;
+  }
+
+  public double getMaxValue() {
+    return maxValue;
+  }
+
+  public void setMaxValue(double maxValue) {
+    this.maxValue = maxValue;
+  }
+
+  /**
+   * 鍚屾瘮.
+   */
+  public double getYoy() {
+    if (lastYearValue != 0) {
+      return (currentValue - lastYearValue) / lastYearValue * 100;
+    }
+    return 0;
+  }
+
+  /**
+   * 鐜瘮.
+   * @return
+   */
+  public double getQoq() {
+    if (previousValue != 0) {
+      return (currentValue - previousValue) / previousValue * 100;
+    }
+    return 0;
+  }
+
+  public boolean isEmpty() {
+    return StringUtils.isEmpty(indexId);
+  }
+
+  public double getMinValue() {
+    return minValue;
+  }
+
+  public void setMinValue(double minValue) {
+    this.minValue = minValue;
+  }
+
+  public double getAvgValue() {
+    return avgValue;
+  }
+
+  public void setAvgValue(double avgValue) {
+    this.avgValue = avgValue;
+  }
+
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticType.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticType.java
new file mode 100644
index 0000000..6cf5ce1
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/StatisticType.java
@@ -0,0 +1,5 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+public enum StatisticType {
+  SUM, MAX, MIN, AVG
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValue.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValue.java
new file mode 100644
index 0000000..4e55ebf
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValue.java
@@ -0,0 +1,98 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+
+import java.util.Date;
+
+/**
+ * @author 鏅虹⒊鏈潵
+ *
+ * 娴嬬偣鏁版嵁瀹炰綋绫�.
+ */
+public class TagValue {
+
+  /**
+   * 娴嬬偣缂栫爜.
+   */
+  private String tagCode;
+
+  /**
+   * 娴嬬偣鏁版嵁鏃堕棿.
+   */
+  private Date dataTime;
+
+  /**
+   * 娴嬬偣鍊�.
+   */
+  private Double value;
+
+  /**
+   * 娴嬬偣鏁版嵁璐ㄩ噺.
+   */
+  private Quality quality;
+
+  /**
+   * 璇︾粏鐨勮川閲忕紪鐮�.
+   */
+  private Integer qualityDetail;
+
+  private String showDataTime;
+
+  public String getTagCode() {
+    return tagCode;
+  }
+
+  public void setTagCode(String tagCode) {
+    this.tagCode = tagCode;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public Double getValue() {
+    return value;
+  }
+
+  public void setValue(Double value) {
+    this.value = value;
+  }
+
+  public Quality getQuality() {
+    return quality;
+  }
+
+  public void setQuality(Quality quality) {
+    this.quality = quality;
+  }
+
+  public Integer getQualityDetail() {
+    return qualityDetail;
+  }
+
+  public void setQualityDetail(Integer qualityDetail) {
+    this.qualityDetail = qualityDetail;
+  }
+
+  public String getShowDataTime() {
+    return showDataTime;
+  }
+
+  public void setShowDataTime(String format) {
+    this.showDataTime = DateUtils.parseDateToStr(format,this.getDataTime());;
+  }
+  @Override
+  public String toString() {
+    return "TagValue{" +
+        "tagCode='" + tagCode + '\'' +
+        ", dataTime=" + dataTime +
+        ", value=" + value +
+        ", quality=" + quality +
+        ", qualityDetail=" + qualityDetail +
+        '}';
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValueResult.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValueResult.java
new file mode 100644
index 0000000..aa9f622
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/domain/TagValueResult.java
@@ -0,0 +1,89 @@
+package com.dingzhuo.energy.dataservice.domain;
+
+import java.util.Date;
+
+public class TagValueResult {
+
+  /**
+   * 娴嬬偣缂栫爜.
+   */
+  private String tagCode;
+
+  private String tagName;
+  private String unitId;
+
+  /**
+   * 娴嬬偣鏁版嵁鏃堕棿.
+   */
+  private Date dataTime;
+
+  /**
+   * 娴嬬偣鍊�.
+   */
+  private Double value;
+
+  /**
+   * 娴嬬偣鏁版嵁璐ㄩ噺.
+   */
+  private Quality quality;
+  /**
+   * 璁¢噺鍣ㄥ叿鍚嶇О
+   */
+  private String meteName;
+
+  public String getTagCode() {
+    return tagCode;
+  }
+
+  public void setTagCode(String tagCode) {
+    this.tagCode = tagCode;
+  }
+
+  public String getTagName() {
+    return tagName;
+  }
+
+  public void setTagName(String tagName) {
+    this.tagName = tagName;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public Double getValue() {
+    return value;
+  }
+
+  public void setValue(Double value) {
+    this.value = value;
+  }
+
+  public Quality getQuality() {
+    return quality;
+  }
+
+  public void setQuality(Quality quality) {
+    this.quality = quality;
+  }
+
+  public String getMeteName() {
+    return meteName;
+  }
+
+  public void setMeteName(String meteName) {
+    this.meteName = meteName;
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/mapper/PeriodDataMapper.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/mapper/PeriodDataMapper.java
new file mode 100644
index 0000000..4148c05
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/mapper/PeriodDataMapper.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.dataservice.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.*;
+import java.util.Map;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁鏌ヨ锛屾暟鎹闂帴鍙�.
+ */
+public interface PeriodDataMapper {
+
+  void save(@Param("dataItem") DataItem dataItem);
+
+  void insert(@Param("dataItem") DataItem dataItem);
+
+  void update(@Param("dataItem") DataItem dataItem);
+
+  DataItem getDataByIndex(@Param("indexId") String indexId,
+                          @Param("timeCode") String timeCode);
+
+  List<DataItem> getDatasByIndex(@Param("indexIds") List<String> indexIds,
+                                 @Param("timeCode") String timeCode);
+
+  List<DataItem> getPeriodDatasByIndex(@Param("indexIds") List<String> indexIds,
+                                       @Param("beginTime") Date beginTime,
+                                       @Param("endTime") Date endTime,
+                                       @Param("timeType") TimeType timeType);
+
+  Double dataStatisticsByIndex(@Param("indexId") String indexId,
+                               @Param("statisticType") StatisticType statisticType,
+                               @Param("timeType") TimeType timeType,
+                               @Param("beginTime") Date beginTime,
+                               @Param("endTime") Date endTime);
+
+  List<DataItem> dataStatisticsByIndexs(@Param("indexIds") List<String> indexIds,
+                                        @Param("statisticType") StatisticType
+                                            statisticType,
+                                        @Param("timeType") TimeType timeType,
+                                        @Param("beginTime") Date beginTime,
+                                        @Param("endTime") Date endTime);
+
+  List<DataItem> statistic(@Param("indexIds") List<String> indexIds,
+                           @Param("timeType") TimeType timeType,
+                           @Param("beginTime") Date beginTime,
+                           @Param("endTime") Date endTime);
+
+  List<DataItem> statisticByCode(@Param("indexCodes") List<String> indexCodes,
+                                 @Param("timeType") TimeType timeType,
+                                 @Param("beginTime") Date beginTime,
+                                 @Param("endTime") Date endTime);
+
+  List<StatisticResult> getStatisticDatasById(@Param("indexIds") List<String> indexIds,
+                                              @Param("timeType") TimeType timeType);
+
+  List<StatisticResult> getStatisticDatasByCode(@Param("indexCodes") List<String> indexCodes,
+                                                @Param("timeType") TimeType timeType);
+
+  List<DataItem> dataStatisticsByCodes(@Param("indexCodes") List<String> indexCodes,
+                                       @Param("statisticType") StatisticType statisticType,
+                                       @Param("timeType") TimeType timeType,
+                                       @Param("beginTime") Date beginTime,
+                                       @Param("endTime") Date endTime);
+
+  String hasExist(@Param("indexId") String indexId,
+                  @Param("timeCode") String timeCode);
+
+  void saveDataList(@Param("dataItemVlues") List<DataItem> datas);
+
+  List<DataItem> getPeriodDatasByIndexAndQuality(@Param("indexIds") List<String> indexIds,
+                                                 @Param("beginTime") Date beginTime,
+                                                 @Param("endTime") Date endTime,
+                                                 @Param("timeType") TimeType timeType,
+                                                 @Param("quality") Quality quality);
+
+  List<DataItem> dataStatisticsFilterByCodes(@Param("indexCodes") List<String> indexCodes,
+                                             @Param("statisticType") StatisticType statisticType,
+                                             @Param("timeType") TimeType timeType,
+                                             @Param("beginTime") Date beginTime,
+                                             @Param("endTime") Date endTime,
+                                             @Param("isFilter") boolean isFilter);
+
+  void delete(@Param("indexId") String indexId,
+              @Param("timeType") TimeType timeType,
+              @Param("beginTime") Date beginTime,
+              @Param("endTime") Date endTime);
+
+  DataItem getDataByIndexCode(String indexCode, String timeCode);
+
+  List<String> queryDataItemIsExist(@Param("queryMap") Map<String, List<String>> queryMap);
+
+  void insertDataList(List<DataItem> insertData);
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/PeriodDataService.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/PeriodDataService.java
new file mode 100644
index 0000000..ba99075
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/PeriodDataService.java
@@ -0,0 +1,305 @@
+package com.dingzhuo.energy.dataservice.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import com.dingzhuo.energy.dataservice.domain.StatisticResult;
+import com.dingzhuo.energy.dataservice.domain.StatisticType;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁鏌ヨ鎺ュ彛.
+ */
+public interface PeriodDataService {
+
+  /**
+   * 淇濆瓨鎸囨爣鏁版嵁.
+   *
+   * @param data 鎸囨爣鏁版嵁
+   */
+  void save(DataItem data);
+
+  /**
+   * 鎵归噺淇濆瓨鍛ㄦ湡鏁版嵁.
+   *
+   * @param datas 瑕佷繚瀛樼殑鏁版嵁闆嗗悎
+   */
+  void save(List<DataItem> datas);
+
+  /**
+   * 鎵归噺淇濆瓨鏁版嵁锛屼笉澶勭悊寮傚父
+   * 閲囩敤merge淇濆瓨鏁版嵁锛屽鏋滄壒閲忎繚瀛樺け璐ヨ窇鍑哄紓甯�
+   *
+   * @param dataItems
+   */
+  void savePeriodData(List<DataItem> dataItems);
+
+  /**
+   * 淇敼鎸囨爣鏁版嵁.
+   *
+   * @param data 鎸囨爣鏁版嵁
+   */
+  void update(DataItem data);
+
+  /**
+   * 鑾峰彇鎸囨爣鏁版嵁.
+   *
+   * @param indexId  璁$畻鎸囨爣
+   * @param timeCode 鏃堕棿缂栫爜
+   */
+  DataItem getDataByIndex(String indexId, String timeCode);
+
+  /**
+   * 鑾峰彇鎸囨爣鏌愪竴鏃跺埢鐨勬暟鎹�.
+   *
+   * @param indexId  璁$畻鎸囨爣
+   * @param dataTime 鏃堕棿
+   * @param timeType 鍛ㄦ湡绫诲瀷
+   */
+  DataItem getDataByIndex(String indexId, Date dataTime, TimeType timeType);
+
+  /**
+   * 鑾峰彇璁$畻鎸囨爣鏁版嵁.
+   *
+   * @param indexIds 璁$畻鎸囨爣
+   * @param timeCode 鏃堕棿缂栧彿
+   * @return 璁$畻鎸囨爣鏁版嵁
+   */
+  List<DataItem> getDatasByIndex(List<String> indexIds, String timeCode);
+
+  /**
+   * 鑾峰彇璁$畻鎸囨爣鏁版嵁.
+   *
+   * @param indexIds 璁$畻鎸囨爣闆嗗悎
+   * @param dataTime 鏃堕棿
+   * @param timeType 鍛ㄦ湡绫诲瀷
+   * @return 璁$畻鎸囨爣鏁版嵁
+   */
+  List<DataItem> getDatasByIndex(List<String> indexIds,
+                                 Date dataTime,
+                                 TimeType timeType);
+
+  /**
+   * 鑾峰彇鎸囨爣鏌愪竴鏃跺埢鐨勬暟鎹�.
+   *
+   * @param indexIds  璁$畻鎸囨爣瀛樺偍闆嗗悎
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @param timeType  鍛ㄦ湡绫诲瀷
+   */
+  List<DataItem> getDatasByIndex(List<String> indexIds,
+                                 Date beginTime,
+                                 Date endTime,
+                                 TimeType timeType);
+
+  /**
+   * 鑾峰彇鎸囨爣鏌愪竴鏃跺埢鐨勬暟鎹�.
+   *
+   * @param indexId   璁$畻鎸囨爣瀛樺偍闆嗗悎
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @param timeType  鍛ㄦ湡绫诲瀷
+   */
+  List<DataItem>  getDatasByIndex(String indexId,
+                  Date beginTime,
+                  Date endTime,
+                  TimeType timeType);
+
+  /**
+   * 鑾峰彇鎸囨爣鏌愪竴鏃跺埢鐨勬暟鎹�.
+   *
+   * @param indexIds  璁$畻鎸囨爣瀛樺偍闆嗗悎
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @param timeType  鍛ㄦ湡绫诲瀷
+   */
+  List<DataItem> getDatasByIndex(List<String> indexIds,
+                                 Date beginTime,
+                                 Date endTime,
+                                 TimeType timeType,
+                                 Quality quality);
+
+  /**
+   * 鑾峰彇缁熻鏁版嵁.
+   *
+   * @param indexId       璁$畻鎸囨爣
+   * @param statisticType 缁熻绫诲瀷
+   * @param timeType      鏃堕棿绫诲瀷
+   * @param beginTime     寮�濮嬫椂闂�
+   * @param endTime       缁撴潫鏃堕棿
+   */
+  double dataStatisticsByIndex(String indexId,
+                               StatisticType statisticType,
+                               TimeType timeType,
+                               Date beginTime,
+                               Date endTime);
+
+  /**
+   * 鑾峰彇缁熻鏁版嵁.
+   *
+   * @param indexIds      璁$畻鎸囨爣闆嗗悎
+   * @param statisticType 缁熻绫诲瀷
+   * @param timeType      鏃堕棿绫诲瀷
+   * @param beginTime     寮�濮嬫椂闂�
+   * @param endTime       缁撴潫鏃堕棿
+   */
+  List<DataItem> dataStatisticsByIndexs(List<String> indexIds,
+                                        StatisticType statisticType,
+                                        TimeType timeType,
+                                        Date beginTime,
+                                        Date endTime);
+
+
+  /**
+   * 鑾峰彇缁熻鏁版嵁.
+   *
+   * @param indexCode     璁$畻鎸囨爣
+   * @param statisticType 缁熻绫诲瀷
+   * @param timeType      鏃堕棿绫诲瀷
+   * @param beginTime     寮�濮嬫椂闂�
+   * @param endTime       缁撴潫鏃堕棿
+   */
+  double dataStatisticsByCode(String indexCode,
+                              StatisticType statisticType,
+                              TimeType timeType,
+                              Date beginTime,
+                              Date endTime);
+
+  /**
+   * 鑾峰彇缁熻鏁版嵁.
+   *
+   * @param indexCodes    璁$畻鎸囨爣闆嗗悎
+   * @param statisticType 缁熻绫诲瀷
+   * @param timeType      鏃堕棿绫诲瀷
+   * @param beginTime     寮�濮嬫椂闂�
+   * @param endTime       缁撴潫鏃堕棿
+   */
+  List<DataItem> dataStatisticsByCodes(List<String> indexCodes,
+                                       StatisticType statisticType,
+                                       TimeType timeType,
+                                       Date beginTime,
+                                       Date endTime);
+
+  /**
+   * 鑾峰彇缁熻鏁版嵁.
+   *
+   * @param indexCodes    璁$畻鎸囨爣闆嗗悎
+   * @param statisticType 缁熻绫诲瀷
+   * @param timeType      鏃堕棿绫诲瀷
+   * @param beginTime     寮�濮嬫椂闂�
+   * @param endTime       缁撴潫鏃堕棿
+   */
+  List<DataItem> dataStatisticsByCodes(List<String> indexCodes,
+                                       StatisticType statisticType,
+                                       TimeType timeType,
+                                       Date beginTime,
+                                       Date endTime,
+                                       boolean isFilter);
+
+  /**
+   * 缁熻鎸囨爣鏈湡鍊笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexId  鎸囨爣涓婚敭
+   * @param timeType 鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param dataTime 鏁版嵁鏃堕棿
+   * @return 缁熻缁撴瀯
+   */
+  StatisticResult statisticById(String indexId, TimeType timeType, Date dataTime);
+
+  /**
+   * 缁熻鎸囨爣鏈湡鍊笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexIds 鎸囨爣涓婚敭
+   * @param timeType 鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param dataTime 鏁版嵁鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  List<StatisticResult> statisticById(List<String> indexIds, TimeType timeType, Date dataTime);
+
+  /**
+   * 缁熻涓�娈垫椂闂村懆鏈熷唴鎸囨爣姣忎釜鏁版嵁鏃堕棿鐨勬湰鏈熷�笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexId   鎸囨爣涓婚敭
+   * @param timeType  鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  List<StatisticResult> statisticById(String indexId, TimeType timeType, Date beginTime, Date endTime);
+
+  /**
+   * 缁熻涓�娈垫椂闂村懆鏈熷唴鎸囨爣姣忎釜鏁版嵁鏃堕棿鐨勬湰鏈熷�笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexIds  鎸囨爣涓婚敭
+   * @param timeType  鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  List<StatisticResult> statisticById(List<String> indexIds, TimeType timeType, Date beginTime, Date endTime);
+
+
+  /**
+   * 缁熻涓�娈垫椂闂村懆鏈熷唴鎸囨爣姣忎釜鏁版嵁鏃堕棿鐨勬湰鏈熷�笺�佷笂鏈熷��
+   * 杩欓噷鏄笂鏈熸暟鍊肩暐鏈変笉鍚岋紝灏忔椂鐨勬槸鏄ㄥぉ鐨勶紝鏃ユ暟鎹槸涓婁釜鏈堢殑锛屾湀鏄幓骞寸殑
+   *
+   * @param indexIds  鎸囨爣涓婚敭
+   * @param timeType  鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  List<StatisticResult> statisticOtherCycle(List<String> indexIds, TimeType timeType, Date beginTime, Date endTime);
+
+  /**
+   * 缁熻鎸囨爣鏈湡鍊笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexCode 鎸囨爣涓婚敭
+   * @param timeType  鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param dataTime  鏁版嵁鏃堕棿
+   * @return 缁熻缁撴瀯
+   */
+  StatisticResult statisticByCode(String indexCode, TimeType timeType, Date dataTime);
+
+  /**
+   * 缁熻鎸囨爣鏈湡鍊笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexCodes 鎸囨爣涓婚敭
+   * @param timeType   鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param dataTime   鏁版嵁鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  List<StatisticResult> statisticByCode(List<String> indexCodes, TimeType timeType, Date dataTime);
+
+  /**
+   * 缁熻涓�娈垫椂闂村懆鏈熷唴鎸囨爣姣忎釜鏁版嵁鏃堕棿鐨勬湰鏈熷�笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexCode 鎸囨爣涓婚敭
+   * @param timeType  鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  List<StatisticResult> statisticByCode(String indexCode, TimeType timeType, Date beginTime, Date endTime);
+
+  /**
+   * 缁熻涓�娈垫椂闂村懆鏈熷唴鎸囨爣姣忎釜鏁版嵁鏃堕棿鐨勬湰鏈熷�笺�佷笂鏈熷�笺�佸悓鏈熷�笺�佹渶澶у�笺�佹渶灏忓�煎拰骞冲潎鍊�.
+   *
+   * @param indexCodes 鎸囨爣涓婚敭
+   * @param timeType   鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param beginTime  寮�濮嬫椂闂�
+   * @param endTime    缁撴潫鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  List<StatisticResult> statisticByCode(List<String> indexCodes, TimeType timeType, Date beginTime, Date endTime);
+
+  /**
+   * 鑾峰彇鎸囨爣鏁版嵁.
+   *
+   * @param indexCode 璁$畻鎸囨爣缂栫爜
+   * @param timeCode  鏃堕棿缂栫爜
+   */
+  DataItem getDataByIndexCode(String indexCode, String timeCode);
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabase.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabase.java
new file mode 100644
index 0000000..407e9de
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabase.java
@@ -0,0 +1,88 @@
+package com.dingzhuo.energy.dataservice.service;
+
+import com.dingzhuo.energy.dataservice.domain.CollectionModes;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+
+import java.util.Date;
+import java.util.List;
+
+public interface RealtimeDatabase {
+
+    long id = System.currentTimeMillis();
+
+    /**
+     * 鍏抽棴杩炴帴
+     */
+    void close();
+
+    /**
+     * 鏍规嵁鐐逛綅鍙疯幏鍙栧疄鏃舵暟鎹�
+     *
+     * @param tagCodes 鐐逛綅鍙峰垪琛�
+     * @return
+     */
+    List<TagValue> retrieve(List<String> tagCodes) throws Exception;
+
+    /**
+     * 鏍规嵁鐐逛綅鍙疯幏鍙栨煇涓�鏃跺埢鐨勫巻鍙叉暟鎹�
+     *
+     * @param tagCodes 鐐逛綅鍙烽泦鍚�
+     * @param dataTime 鍘嗗彶鏃跺埢
+     * @param timeCode 鍖哄垎鏃堕棿绫诲瀷鐨則imeCode
+     * @return
+     */
+    List<TagValue> retrieve(List<String> tagCodes, Date dataTime,String timeCode) throws Exception;
+
+    /**
+     * 鏍规嵁鏌ヨ鏂瑰紡鑾峰彇涓�娈垫椂闂村唴鐨勫巻鍙叉暟鎹�
+     *
+     * @param tagCodes       鐐逛綅鍙烽泦鍚�
+     * @param beginTime      寮�濮嬫椂闂�
+     * @param endTime        缁撴潫鏃堕棿
+     * @param retrievalModes 鏌ヨ鏂瑰紡锛堝惊鐜�佹嫙鍚堛�佸叏閮級
+     * @param pointCount     瑕佹煡璇㈢殑鏁版嵁涓暟
+     * @return
+     */
+    List<TagValue> retrieve(List<String> tagCodes, Date beginTime, Date endTime,
+                            RetrievalModes retrievalModes, int pointCount) throws Exception;
+
+    /**
+     * 姹囨�诲疄鏃舵暟鎹�
+     *
+     * @param tagCodes        鐐逛綅鍙烽泦鍚�
+     * @param beginTime       寮�濮嬫椂闂�
+     * @param endTime         缁撴潫鏃堕棿
+     * @param collectionModes 姹囨�绘柟寮忥紙鏈�澶у�笺�佹渶灏忓�笺�佸钩鍧囧�笺�佹眰鍜岀瓑锛�
+     * @return
+     */
+    List<TagValue> statistics(List<String> tagCodes, Date beginTime, Date endTime,
+                              CollectionModes collectionModes) throws Exception;
+
+    /**
+     * 鎻掑叆瀹炴椂鏁版嵁
+     *
+     * @param tagValues 瀹炴椂鏁版嵁闆嗗悎
+     * @return
+     */
+    Boolean storeData(List<TagValue> tagValues) throws Exception;
+
+    /**
+     * 鎻掑叆鍘嗗彶鏁版嵁
+     *
+     * @param tagValues 鍘嗗彶鏁版嵁闆嗗悎
+     * @return
+     */
+    Boolean insertData(List<TagValue> tagValues) throws Exception;
+
+    /**
+     * 鎵撳紑杩炴帴
+     *
+     * @param host     瀹炴椂鏁版嵁搴撳湴鍧�
+     * @param port     绔彛鍙�
+     * @param userName 鐧诲綍鐢ㄦ埛鍚�
+     * @param pwd      鐧诲綍瀵嗙爜
+     * @return 鏄惁杩炴帴鎴愬姛
+     */
+    boolean open(String host, int port, String userName, String pwd) throws Exception;
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabaseService.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabaseService.java
new file mode 100644
index 0000000..3a84125
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/RealtimeDatabaseService.java
@@ -0,0 +1,114 @@
+package com.dingzhuo.energy.dataservice.service;
+
+import com.dingzhuo.energy.dataservice.domain.CollectionModes;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author 鏅虹⒊鏈潵 瀹炴椂鏁版嵁搴撹闂帴鍙�.
+ */
+public interface RealtimeDatabaseService {
+
+    /**
+     * 鑾峰彇鍗曚釜娴嬬偣鐨勫疄鏃舵暟鎹�.
+     *
+     * @param tagCode 娴嬬偣缂栧彿
+     * @return 娴嬭瘯瀹炴椂鏁版嵁
+     */
+    TagValue retrieve(String tagCode);
+
+    /**
+     * 鑾峰彇鎵归噺娴嬬偣鐨勫疄鏃舵暟鎹�.
+     *
+     * @param tagCodes 娴嬬偣缂栫爜闆嗗悎
+     * @return 瀹炴椂鏁版嵁闆嗗悎
+     */
+    List<TagValue> retrieve(List<String> tagCodes);
+
+    /**
+     * 鑾峰彇娴嬬偣鐨勫巻鍙叉椂鍒诲��.
+     *
+     * @param tagCode  娴嬬偣缂栧彿
+     * @param dataTime 鍘嗗彶鏃跺埢
+     * @param timeCode 鏃堕棿绫诲瀷鐨凾IME CODE
+     * @return 娴嬬偣鍘嗗彶鏃跺埢鍊�
+     */
+    TagValue retrieve(String tagCode, Date dataTime, String timeCode);
+
+    /**
+     * 鑾峰彇鎵归噺娴嬬偣鐨勫巻鍙叉椂鍒诲��.
+     *
+     * @param tagCodes 娴嬬偣缂栧彿闆嗗悎
+     * @param dataTime 鍘嗗彶鏃跺埢
+     * @param timeCode 鏃堕棿绫诲瀷鐨凾IME CODE
+     * @return 娴嬭瘯鍘嗗彶鏃跺埢鏁版嵁闆嗗悎
+     */
+    List<TagValue> retrieve(List<String> tagCodes, Date dataTime, String timeCode);
+
+    /**
+     * 鑾峰彇涓�娈垫椂闂村唴娴嬬偣鐨勫巻鍙叉暟鎹�.
+     *
+     * @param tagCode        娴嬬偣缂栧彿
+     * @param beginTime      寮�濮嬫椂闂�
+     * @param endTime        缁撴潫鏃堕棿
+     * @param retrievalModes 鏌ヨ鏁版嵁鏂瑰紡
+     * @param pointCount     娴嬬偣寰楀埌鐨勬暟鎹釜鏁�
+     * @return 娴嬬偣鍘嗗彶鏁版嵁
+     */
+    List<TagValue> retrieve(String tagCode, Date beginTime, Date endTime,
+                            RetrievalModes retrievalModes, int pointCount);
+
+    /**
+     * 鑾峰彇涓�娈垫椂闂村唴鎵归噺娴嬬偣鐨勫巻鍙叉暟鎹�.
+     *
+     * @param tagCodes       娴嬬偣缂栧彿闆嗗悎
+     * @param beginTime      寮�濮嬫椂闂�
+     * @param endTime        缁撴潫鏃堕棿
+     * @param retrievalModes 鏌ヨ鏁版嵁鏂瑰紡
+     * @param pointCount     姣忎釜娴嬬偣寰楀埌鐨勬暟鎹釜鏁�
+     * @return 娴嬬偣鍘嗗彶鏁版嵁
+     */
+    List<TagValue> retrieve(List<String> tagCodes, Date beginTime, Date endTime,
+                            RetrievalModes retrievalModes, int pointCount);
+
+    /**
+     * 鑾峰彇娴嬬偣鍦ㄤ竴娈垫椂闂村唴鐨勭粺璁℃暟鎹�.
+     *
+     * @param tagCode         娴嬬偣缂栧彿
+     * @param beginTime       寮�濮嬫椂闂�
+     * @param endTime         缁撴潫鏃堕棿
+     * @param collectionModes 缁熻绫诲瀷
+     * @return 娴嬬偣缁熻缁撴灉
+     */
+    TagValue statistics(String tagCode, Date beginTime, Date endTime,
+                        CollectionModes collectionModes);
+
+    /**
+     * 鑾峰彇娴嬬偣鍦ㄤ竴娈垫椂闂村唴鐨勭粺璁℃暟鎹�.
+     *
+     * @param tagCodes        娴嬬偣缂栧彿闆嗗悎
+     * @param beginTime       寮�濮嬫椂闂�
+     * @param endTime         缁撴潫鏃堕棿
+     * @param collectionModes 缁熻绫诲瀷
+     * @return 娴嬬偣缁熻缁撴灉
+     */
+    List<TagValue> statistics(List<String> tagCodes, Date beginTime, Date endTime,
+                              CollectionModes collectionModes);
+
+    /**
+     * 瀛樺偍娴嬬偣鐨勫疄鏃舵暟鎹�.
+     *
+     * @param tagValues 娴嬬偣瀹炴椂鏁版嵁
+     */
+    void storeData(List<TagValue> tagValues);
+
+    /**
+     * 鎻掑叆娴嬬偣鍘嗗彶鏃跺埢鏁版嵁.
+     *
+     * @param tagValues 娴嬬偣鍘嗗彶鏃跺埢鏁版嵁
+     */
+    void insertData(List<TagValue> tagValues);
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/PeriodDataServiceImpl.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/PeriodDataServiceImpl.java
new file mode 100644
index 0000000..94968a3
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/PeriodDataServiceImpl.java
@@ -0,0 +1,614 @@
+package com.dingzhuo.energy.dataservice.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import com.dingzhuo.energy.dataservice.domain.StatisticResult;
+import com.dingzhuo.energy.dataservice.domain.StatisticType;
+import com.dingzhuo.energy.dataservice.mapper.PeriodDataMapper;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import java.util.stream.Collectors;
+import org.apache.commons.lang.StringUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * Created by chongru on 2016-1-22.
+ */
+@Service
+public class PeriodDataServiceImpl implements PeriodDataService {
+  private Logger logger = LogManager.getLogger(PeriodDataServiceImpl.class);
+  @Autowired
+  private PeriodDataMapper periodDataMapper;
+
+  @Autowired
+  private IEnergyIndexService energyIndexService;
+
+  @Override
+  public void save(DataItem data) {
+    String item = periodDataMapper.hasExist(data.getIndexId(), data.getTimeCode());
+    if (StringUtils.isEmpty(item)) {
+      periodDataMapper.insert(data);
+    } else {
+      update(data);
+    }
+  }
+
+  @Override
+  public void save(List<DataItem> datas) {
+    List<List<DataItem>> splitDatas = splitList(datas, 100);
+    if (splitDatas != null) {
+      splitDatas.parallelStream().forEach(dataPart -> {
+        try {
+          periodDataMapper.saveDataList(dataPart);
+        } catch (Exception ex) {
+          logger.error("鎵归噺淇濆瓨鏁版嵁澶辫触", ex);
+          dataPart.parallelStream().forEach(dataItem -> {
+            try {
+              periodDataMapper.save(dataItem);
+            } catch (Exception singleEx) {
+              logger.error("鍗曚釜鎸囨爣鏁版嵁淇濆瓨澶辫触锛併��" + dataItem + "銆�", singleEx);
+            }
+          });
+        }
+      });
+    }
+  }
+
+  @Override
+  public void savePeriodData(List<DataItem> dataItems) {
+    Map<String, List<String>> map = dataItems.stream()
+      .collect(Collectors.groupingBy(DataItem::getTimeCode,
+          Collectors.mapping(DataItem::getIndexId, Collectors.toList())));
+    List<String> keys = periodDataMapper.queryDataItemIsExist(map);
+    List<DataItem> insertData = dataItems.stream()
+        .filter(
+            item -> !keys.contains(String.format("%s:%s", item.getTimeCode(), item.getIndexId())))
+        .collect(Collectors.toList());
+    if (!insertData.isEmpty()) {
+      periodDataMapper.insertDataList(insertData);
+    }
+
+    List<DataItem> updateData = dataItems.stream()
+        .filter(
+            item -> keys.contains(String.format("%s:%s", item.getTimeCode(), item.getIndexId())))
+        .collect(Collectors.toList());
+    if (!updateData.isEmpty()) {
+      periodDataMapper.saveDataList(updateData);
+    }
+  }
+
+  @Override
+  public void update(DataItem data) {
+    periodDataMapper.update(data);
+  }
+
+  @Override
+  public DataItem getDataByIndex(String indexId, String timeCode) {
+    if (StringUtils.isEmpty(indexId)) {
+      return null;
+    }
+
+    return periodDataMapper.getDataByIndex(indexId, timeCode);
+  }
+
+  @Override
+  public DataItem getDataByIndex(String indexId, Date dataTime, TimeType timeType) {
+    if (StringUtils.isEmpty(indexId)) {
+      return null;
+    }
+
+    String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+    return getDataByIndex(indexId, timeCode);
+  }
+
+  @Override
+  public List<DataItem> getDatasByIndex(List<String> indexIds, String timeCode) {
+    if (indexIds != null && !indexIds.isEmpty()) {
+      return periodDataMapper.getDatasByIndex(indexIds, timeCode);
+    }
+
+    return Collections.emptyList();
+  }
+
+  @Override
+  public List<DataItem> getDatasByIndex(List<String> indexIds, Date dataTime, TimeType timeType) {
+    if (indexIds != null && !indexIds.isEmpty()) {
+      String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+      return periodDataMapper.getDatasByIndex(indexIds, timeCode);
+    }
+
+    return Collections.emptyList();
+  }
+
+  @Override
+  public List<DataItem> getDatasByIndex(List<String> indexIds, Date beginTime,
+                                        Date endTime, TimeType timeType) {
+    if (indexIds != null && !indexIds.isEmpty()) {
+      return periodDataMapper.getPeriodDatasByIndex(indexIds, beginTime, endTime, timeType);
+    }
+
+    return Collections.emptyList();
+  }
+
+  @Override
+  public List<DataItem> getDatasByIndex(String indexId,
+                                        Date beginTime,
+                                        Date endTime,
+                                        TimeType timeType) {
+    if (StringUtils.isEmpty(indexId)) {
+      return Collections.emptyList();
+    }
+
+    List<String> indexIds = new ArrayList<>();
+    indexIds.add(indexId);
+    return periodDataMapper.getPeriodDatasByIndex(indexIds, beginTime, endTime, timeType);
+  }
+
+  @Override
+  public List<DataItem> getDatasByIndex(List<String> indexIds, Date beginTime, Date endTime,
+                                        TimeType timeType, Quality quality) {
+    if (indexIds != null && !indexIds.isEmpty()) {
+      return periodDataMapper.getPeriodDatasByIndexAndQuality(indexIds,
+          beginTime,
+          endTime,
+          timeType,
+          quality);
+    }
+
+    return Collections.emptyList();
+  }
+
+  @Override
+  public double dataStatisticsByIndex(String indexId,
+                                      StatisticType statisticType,
+                                      TimeType timeType,
+                                      Date beginTime,
+                                      Date endTime) {
+    if (StringUtils.isEmpty(indexId)) {
+      return 0;
+    }
+
+    Double value = periodDataMapper.dataStatisticsByIndex(
+        indexId,
+        statisticType,
+        timeType,
+        beginTime,
+        endTime);
+
+    return value == null ? 0 : value;
+  }
+
+  @Override
+  public List<DataItem> dataStatisticsByIndexs(List<String> indexIds, StatisticType
+      statisticType, TimeType timeType, Date beginTime, Date endTime) {
+    if (indexIds == null || indexIds.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    return periodDataMapper.dataStatisticsByIndexs(
+        indexIds,
+        statisticType,
+        timeType,
+        beginTime,
+        endTime);
+  }
+
+  @Override
+  public double dataStatisticsByCode(String indexCode, StatisticType
+      statisticType, TimeType timeType, Date beginTime, Date endTime) {
+    if (StringUtils.isEmpty(indexCode)) {
+      return 0;
+    }
+
+    List<String> indexCodes = Collections.singletonList(indexCode);
+    List<DataItem> dataItems = dataStatisticsByCodes(
+        indexCodes,
+        statisticType,
+        timeType,
+        beginTime,
+        endTime);
+    if (!dataItems.isEmpty()) {
+      return dataItems.get(0).getValue();
+    }
+
+    return 0;
+  }
+
+  @Override
+  public List<DataItem> dataStatisticsByCodes(List<String> indexCodes,
+                                              StatisticType statisticType, TimeType timeType,
+                                              Date beginTime, Date endTime) {
+    if (indexCodes == null || indexCodes.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    return periodDataMapper.dataStatisticsByCodes(
+        indexCodes,
+        statisticType,
+        timeType,
+        beginTime,
+        endTime);
+  }
+
+  @Override
+  public List<DataItem> dataStatisticsByCodes(List<String> indexCodes,
+                                              StatisticType statisticType,
+                                              TimeType timeType,
+                                              Date beginTime, Date endTime,
+                                              boolean isFilter) {
+    if (indexCodes == null || indexCodes.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    return periodDataMapper.dataStatisticsFilterByCodes(
+        indexCodes,
+        statisticType,
+        timeType,
+        beginTime,
+        endTime,
+        isFilter);
+  }
+
+  @Override
+  public StatisticResult statisticById(String indexId, TimeType timeType, Date dataTime) {
+    if (StringUtils.isEmpty(indexId)) {
+      return null;
+    }
+
+    List<String> indexIds = Collections.singletonList(indexId);
+    List<StatisticResult> results = statisticById(indexIds, timeType, dataTime);
+    if (!results.isEmpty()) {
+      return results.get(0);
+    }
+
+    return new StatisticResult();
+  }
+
+  @Override
+  public List<StatisticResult> statisticById(List<String> indexIds, TimeType timeType, Date dataTime) {
+    if (indexIds == null || indexIds.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+    return statisticById(indexIds, timeType,
+        TimeManager.getBeginTime(timeCode), TimeManager.getEndTime(timeCode));
+  }
+
+  @Override
+  public List<StatisticResult> statisticById(String indexId, TimeType timeType,
+                                         Date beginTime, Date endTime) {
+    if (StringUtils.isEmpty(indexId)) {
+      return Collections.emptyList();
+    }
+
+    List<String> indexIds = Collections.singletonList(indexId);
+    return statisticById(indexIds, timeType, beginTime, endTime);
+  }
+
+  @Override
+  public List<StatisticResult> statisticById(List<String> indexIds, TimeType timeType,
+                                         Date beginTime, Date endTime) {
+    if (indexIds == null || indexIds.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    ReBuildTime reBuildTime = new ReBuildTime(timeType, beginTime, endTime).invoke();
+    DateTime begin = reBuildTime.getBegin();
+    DateTime end = reBuildTime.getEnd();
+
+    DateTime lastYearOfBeginTime = begin.plusYears(-1);
+    DateTime lastYearOfEndTime = end.plusYears(-1);
+    DateTime previousOfBeginTime = getTime(begin, timeType, -1, STATISTIC_QUERY_TYPE);
+    DateTime previousOfEndTime = getTime(end, timeType, -1, STATISTIC_QUERY_TYPE);
+
+    List<EnergyIndex> aggregateIndexList = energyIndexService.getEnergyIndexByIds(indexIds);
+    List<DataItem> currentValues = periodDataMapper.statistic(indexIds,
+        timeType,
+        begin.toDate(),
+        end.toDate());
+    List<DataItem> previousValues = periodDataMapper.statistic(indexIds,
+        timeType,
+        previousOfBeginTime.toDate(),
+        previousOfEndTime.toDate());
+    List<DataItem> lastYearValues = periodDataMapper.statistic(indexIds,
+        timeType,
+        lastYearOfBeginTime.toDate(),
+        lastYearOfEndTime.toDate());
+
+    List<StatisticResult> statisticResults =
+        periodDataMapper.getStatisticDatasById(indexIds, timeType);
+
+    return buildNewDatas(aggregateIndexList, timeType, currentValues, previousValues,
+        lastYearValues, statisticResults, begin, end, STATISTIC_QUERY_TYPE);
+  }
+
+  /**
+   * 缁熻涓�娈垫椂闂村懆鏈熷唴鎸囨爣姣忎釜鏁版嵁鏃堕棿鐨勬湰鏈熷�笺�佷笂鏈熷��
+   * 杩欓噷鏄笂鏈熸暟鍊肩暐鏈変笉鍚岋紝灏忔椂鐨勬槸鏄ㄥぉ鐨勶紝鏃ユ暟鎹槸涓婁釜鏈堢殑锛屾湀鏄幓骞寸殑
+   *
+   * @param indexIds  鎸囨爣涓婚敭
+   * @param timeType  鏃堕棿鍛ㄦ湡绫诲瀷
+   * @param beginTime 寮�濮嬫椂闂�
+   * @param endTime   缁撴潫鏃堕棿
+   * @return 缁熻缁撴灉
+   */
+  @Override
+  public List<StatisticResult> statisticOtherCycle(List<String> indexIds, TimeType timeType, Date beginTime, Date endTime) {
+    if (indexIds == null || indexIds.isEmpty()) {
+      return Collections.emptyList();
+    }
+    String type = "other";
+    ReBuildTime reBuildTime = new ReBuildTime(timeType, beginTime, endTime).invoke();
+    DateTime begin = reBuildTime.getBegin();
+    DateTime end = reBuildTime.getEnd();
+    DateTime previousOfBeginTime = getTime(begin, timeType, -1, type);
+    DateTime previousOfEndTime = getTime(end, timeType, -1, type);
+    List<EnergyIndex> aggregateIndexList = energyIndexService.getEnergyIndexByIds(indexIds);
+    List<DataItem> currentValues = periodDataMapper.statistic(indexIds,
+        timeType,
+        begin.toDate(),
+        end.toDate());
+    List<DataItem> previousValues = periodDataMapper.statistic(indexIds,
+        timeType,
+        previousOfBeginTime.toDate(),
+        previousOfEndTime.toDate());
+    return buildNewDatas(aggregateIndexList, timeType, currentValues, previousValues,
+        new ArrayList<>(), null, begin, end, type);
+  }
+
+  @Override
+  public StatisticResult statisticByCode(String indexCode,
+                                   TimeType timeType, Date dataTime) {
+    if (StringUtils.isEmpty(indexCode)) {
+      return null;
+    }
+
+    List<String> indexCodes = Collections.singletonList(indexCode);
+    List<StatisticResult> results = statisticByCode(indexCodes, timeType, dataTime);
+    if (!results.isEmpty()) {
+      return results.get(0);
+    }
+
+    return new StatisticResult();
+  }
+
+  @Override
+  public List<StatisticResult> statisticByCode(List<String> indexCodes,
+                                               TimeType timeType, Date dataTime) {
+    if (indexCodes == null || indexCodes.isEmpty()
+    ) {
+      return Collections.emptyList();
+    }
+
+    String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+    return statisticByCode(indexCodes, timeType,
+        TimeManager.getBeginTime(timeCode), TimeManager.getEndTime(timeCode));
+  }
+
+  @Override
+  public List<StatisticResult> statisticByCode(String indexCode, TimeType timeType,
+                                         Date beginTime, Date endTime) {
+    if (StringUtils.isEmpty(indexCode)) {
+      return Collections.emptyList();
+    }
+
+    List<String> indexCodes = Collections.singletonList(indexCode);
+    return statisticByCode(indexCodes, timeType, beginTime, endTime);
+  }
+
+  private final static String STATISTIC_QUERY_TYPE = "normal";
+
+  @Override
+  public List<StatisticResult> statisticByCode(List<String> indexCodes,
+                                         TimeType timeType, Date beginTime, Date endTime) {
+    if (indexCodes == null || indexCodes.isEmpty()) {
+      return Collections.emptyList();
+    }
+
+    ReBuildTime reBuildTime = new ReBuildTime(timeType, beginTime, endTime).invoke();
+    DateTime begin = reBuildTime.getBegin();
+    DateTime end = reBuildTime.getEnd();
+
+    List<EnergyIndex> aggregateIndexList =
+        energyIndexService.getEnergyIndexByCodes(indexCodes);
+    DateTime lastYearOfBeginTime = begin.plusYears(-1);
+    DateTime lastYearOfEndTime = end.plusYears(-1);
+    DateTime previousOfBeginTime = getTime(begin, timeType, -1, STATISTIC_QUERY_TYPE);
+    DateTime previousOfEndTime = getTime(end, timeType, -1, STATISTIC_QUERY_TYPE);
+
+    List<DataItem> currentValues = periodDataMapper.statisticByCode(
+        indexCodes,
+        timeType,
+        begin.toDate(),
+        end.toDate());
+    List<DataItem> previousValues = periodDataMapper.statisticByCode(
+        indexCodes,
+        timeType,
+        previousOfBeginTime.toDate(),
+        previousOfEndTime.toDate());
+    List<DataItem> lastYearValues = periodDataMapper.statisticByCode(
+        indexCodes,
+        timeType,
+        lastYearOfBeginTime.toDate(),
+        lastYearOfEndTime.toDate());
+
+    List<StatisticResult> statisticResults =
+        periodDataMapper.getStatisticDatasByCode(indexCodes, timeType);
+
+    return buildNewDatas(aggregateIndexList,
+        timeType,
+        currentValues,
+        previousValues,
+        lastYearValues,
+        statisticResults, begin, end, STATISTIC_QUERY_TYPE);
+  }
+
+  @Override
+  public DataItem getDataByIndexCode(String indexCode, String timeCode) {
+    return periodDataMapper.getDataByIndexCode(indexCode, timeCode);
+  }
+
+  private DataItem findValue(List<DataItem> items, String indexId, DateTime dataTime) {
+    Optional<DataItem> value = items.stream()
+        .filter(f -> StringUtils.equalsIgnoreCase(f.getIndexId(), indexId)
+            && dataTime.equals(new DateTime(f.getDataTime())))
+        .findAny();
+    return value.orElseGet(DataItem::new);
+
+  }
+
+  private DateTime getTime(DateTime time, TimeType timeType, int offset, String type) {
+    if (STATISTIC_QUERY_TYPE.equalsIgnoreCase(type)) {
+      if (timeType == TimeType.HOUR) {
+        return time.plusHours(offset);
+      } else if (timeType == TimeType.DAY) {
+        return time.plusDays(offset);
+      } else if (timeType == TimeType.MONTH) {
+        return time.plusMonths(offset);
+      } else if (timeType == TimeType.YEAR) {
+        return time.plusYears(offset);
+      }
+      return time;
+    } else {
+      switch (timeType) {
+        case HOUR:
+          return time.plusDays(offset);
+        case DAY:
+          return time.plusMonths(offset);
+        case MONTH:
+        case YEAR:
+          return time.plusYears(offset);
+        default:
+          return time;
+      }
+    }
+  }
+
+
+  private List<StatisticResult> buildNewDatas(List<EnergyIndex> indexList, TimeType timeType,
+                                              List<DataItem> currentValues,
+                                              List<DataItem> previousValues,
+                                              List<DataItem> lastYearValues,
+                                              List<StatisticResult> statisticResults,
+                                              DateTime beginTime,
+                                              DateTime endTime, String type) {
+    List<StatisticResult> results = new ArrayList<>();
+    indexList.forEach(index -> {
+      DateTime tmpTime = beginTime;
+      String indexId = index.getIndexId();
+      Optional<StatisticResult> statisticResult;
+      if (statisticResults == null) {
+        statisticResult = Optional.empty();
+      } else {
+        statisticResult = statisticResults.stream()
+            .filter(f -> StringUtils.equalsIgnoreCase(f.getIndexId(), indexId))
+            .findFirst();
+      }
+
+      while (tmpTime.isBefore(endTime)) {
+        StatisticResult result = new StatisticResult();
+        result.setIndexId(indexId);
+        result.setIndexCode(index.getCode());
+        result.setIndexName(index.getName());
+        result.setUnitId(index.getUnitId());
+
+        if (statisticResult.isPresent()) {
+          result.setMaxValue(statisticResult.get().getMaxValue());
+          result.setMinValue(statisticResult.get().getMinValue());
+          result.setAvgValue(statisticResult.get().getAvgValue());
+        }
+
+        result.setDataTime(tmpTime.toDate());
+        DataItem currentValue = findValue(currentValues, indexId, tmpTime);
+        result.setCurrentValue(currentValue.getValue() == null ? 0 : currentValue.getValue());
+
+        DateTime preTime = getTime(tmpTime, timeType, -1, type);
+        DataItem previousValue = findValue(previousValues, indexId, preTime);
+        result.setPreviousValue(previousValue.getValue() == null ? 0 : previousValue.getValue());
+
+        DateTime lastYearTime = tmpTime.plusYears(-1);
+        DataItem lastYearValue = findValue(lastYearValues, indexId, lastYearTime);
+        result.setLastYearValue(lastYearValue.getValue() == null ? 0 : lastYearValue.getValue());
+        results.add(result);
+        tmpTime = getTime(tmpTime, timeType, 1, STATISTIC_QUERY_TYPE);
+      }
+    });
+
+    return results;
+  }
+
+  public static <E> List<List<E>> splitList(List<E> targetList, Integer splitSize) {
+    if (targetList == null) {
+      return Collections.emptyList();
+    }
+
+    int size = targetList.size();
+    List<List<E>> resultList = new ArrayList<>();
+    if (size <= splitSize) {
+      resultList.add(targetList);
+    } else {
+      for (int i = 0; i < size; i += splitSize) {
+        //鐢ㄤ簬闄愬埗鏈�鍚庝竴閮ㄥ垎size灏忎簬splitSize鐨刲ist
+        int limit = i + splitSize;
+        if (limit > size) {
+          limit = size;
+        }
+        resultList.add(targetList.subList(i, limit));
+      }
+    }
+    return resultList;
+  }
+
+  private static class ReBuildTime {
+    private TimeType timeType;
+    private Date beginTime;
+    private Date endTime;
+    private DateTime begin;
+    private DateTime end;
+
+    public ReBuildTime(TimeType timeType, Date beginTime, Date endTime) {
+      this.timeType = timeType;
+      this.beginTime = beginTime;
+      this.endTime = endTime;
+    }
+
+    public DateTime getBegin() {
+      return begin;
+    }
+
+    public DateTime getEnd() {
+      return end;
+    }
+
+    public ReBuildTime invoke() {
+      begin = new DateTime(beginTime);
+      end = new DateTime(endTime);
+      DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:00:00");
+      if (timeType == TimeType.HOUR) {
+        formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:00:00");
+      } else if (timeType == TimeType.DAY) {
+        formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
+      } else if (timeType == TimeType.MONTH) {
+        formatter = DateTimeFormat.forPattern("yyyy-MM-01");
+      } else if (timeType == TimeType.YEAR) {
+        formatter = DateTimeFormat.forPattern("yyyy-01-01");
+      }
+
+      begin = formatter.parseDateTime(begin.toString(formatter));
+      end = formatter.parseDateTime(end.toString(formatter));
+      return this;
+    }
+  }
+}
diff --git a/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/RealtimeDatabaseServiceImpl.java b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/RealtimeDatabaseServiceImpl.java
new file mode 100644
index 0000000..b0fb578
--- /dev/null
+++ b/data-service/src/main/java/com/dingzhuo/energy/dataservice/service/impl/RealtimeDatabaseServiceImpl.java
@@ -0,0 +1,76 @@
+package com.dingzhuo.energy.dataservice.service.impl;
+
+import com.dingzhuo.energy.dataservice.data.RealtimeDatabaseManager;
+import com.dingzhuo.energy.dataservice.domain.CollectionModes;
+import com.dingzhuo.energy.dataservice.domain.RetrievalModes;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 瀹炴椂鏁版嵁搴撳彇鏁版湇鍔″疄鐜扮被.
+ */
+@Service
+public class RealtimeDatabaseServiceImpl implements RealtimeDatabaseService {
+    @Autowired
+    private RealtimeDatabaseManager realtimeDatabaseManager;
+
+    @Override
+    public TagValue retrieve(String tagCode) {
+        return realtimeDatabaseManager.retrieve(tagCode);
+    }
+
+    @Override
+    public List<TagValue> retrieve(List<String> tagCodes) {
+        return realtimeDatabaseManager.retrieve(tagCodes);
+    }
+
+    @Override
+    public TagValue retrieve(String tagCode, Date dataTime, String timeCode) {
+        return realtimeDatabaseManager.retrieve(tagCode, dataTime, timeCode);
+    }
+
+    @Override
+    public List<TagValue> retrieve(List<String> tagCodes, Date dataTime, String timeCode) {
+        return realtimeDatabaseManager.retrieve(tagCodes, dataTime, timeCode);
+    }
+
+    @Override
+    public List<TagValue> retrieve(String tagCode, Date beginTime, Date endTime,
+                                   RetrievalModes retrievalModes, int pointCount) {
+        return realtimeDatabaseManager.retrieve(tagCode, beginTime, endTime, retrievalModes, pointCount);
+    }
+
+    @Override
+    public List<TagValue> retrieve(List<String> tagCodes, Date beginTime, Date endTime,
+                                   RetrievalModes retrievalModes, int pointCount) {
+        return realtimeDatabaseManager.retrieve(tagCodes, beginTime, endTime, retrievalModes, pointCount);
+    }
+
+    @Override
+    public TagValue statistics(String tagCode, Date beginTime, Date endTime,
+                               CollectionModes collectionModes) {
+        return realtimeDatabaseManager.statistics(tagCode, beginTime, endTime, collectionModes);
+    }
+
+    @Override
+    public List<TagValue> statistics(List<String> tagCodes, Date beginTime, Date endTime,
+                                     CollectionModes collectionModes) {
+        return realtimeDatabaseManager.statistics(tagCodes, beginTime, endTime, collectionModes);
+    }
+
+    @Override
+    public void storeData(List<TagValue> tagValues) {
+        realtimeDatabaseManager.storeData(tagValues);
+    }
+
+    @Override
+    public void insertData(List<TagValue> tagValues) {
+        realtimeDatabaseManager.insertData(tagValues);
+    }
+
+}
diff --git a/data-service/src/main/resources/mybatis/dataService/PeriodDataMapper.xml b/data-service/src/main/resources/mybatis/dataService/PeriodDataMapper.xml
new file mode 100644
index 0000000..a7e2782
--- /dev/null
+++ b/data-service/src/main/resources/mybatis/dataService/PeriodDataMapper.xml
@@ -0,0 +1,444 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.dataservice.mapper.PeriodDataMapper">
+  <resultMap id="dataItemMap" type="com.dingzhuo.energy.dataservice.domain.DataItem">
+    <id column="index_id" property="indexId"/>
+    <id column="time_code" property="timeCode"/>
+    <id column="index_code" property="indexCode"/>
+    <id column="index_name" property="indexName"/>
+    <result column="begin_time" property="beginTime"/>
+    <result column="end_time" property="endTime"/>
+    <result column="data_time" property="dataTime"/>
+    <result column="value" property="value"/>
+    <result column="time_type" property="timeType"/>
+    <result column="quality" property="quality"/>
+    <result column="unit_id" property="unitId"/>
+    <result column="create_time" property="createTime"/>
+    <result column="update_time" property="updateTime"/>
+    <result column="remark" property="remark"/>
+  </resultMap>
+
+  <resultMap id="statisticResultMap" type="com.dingzhuo.energy.dataservice.domain.StatisticResult">
+    <id column="index_id" property="indexId"/>
+    <id column="index_code" property="indexCode"/>
+    <id column="index_name" property="indexName"/>
+    <result column="unit_id" property="unitId"/>
+    <result column="maxvalue" property="maxValue"/>
+    <result column="minvalue" property="minValue"/>
+    <result column="avgvalue" property="avgValue"/>
+  </resultMap>
+  <delete id="delete">
+    DELETE
+    FROM data_item
+    WHERE index_id = #{indexId}
+      AND time_type = #{timeType}
+      AND data_time &gt;= #{beginTime}
+      AND data_time &lt;= #{endTime}
+  </delete>
+
+  <sql id="itemHead">
+    SELECT di.index_id,
+           di.time_code,
+           di.time_type,
+           di.begin_time,
+           di.end_time,
+           di.data_time,
+           di.value,
+           di.quality,
+           di.create_time,
+           di.update_time,
+           ci.code AS "index_code",
+           ci.name AS "index_name"
+    FROM data_item di
+           LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+  </sql>
+
+  <select id="getDataByIndex" resultMap="dataItemMap">
+    <include refid="itemHead"/>
+    WHERE di.index_id = #{indexId}
+    AND di.time_code = #{timeCode}
+  </select>
+  <select id="hasExist" resultType="java.lang.String">
+    SELECT index_id
+    FROM data_item
+    WHERE index_id = #{indexId}
+      AND time_code = #{timeCode}
+  </select>
+  <select id="getDatasByIndex" resultMap="dataItemMap">
+    <include refid="itemHead"/>
+    where di.time_code = #{timeCode}
+    AND di.index_id in
+    <foreach item="indexId" index="index" collection="indexIds"
+      open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+  </select>
+  <select id="getPeriodDatasByIndex" resultMap="dataItemMap">
+    <include refid="itemHead"/>
+    WHERE di.index_id in
+    <foreach item="indexId" index="index" collection="indexIds"
+      open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+    AND di.time_type = #{timeType}
+    AND di.data_time &gt;= #{beginTime}
+    AND di.data_time &lt; #{endTime}
+  </select>
+  <select id="dataStatisticsByIndex" resultType="java.lang.Double">
+    SELECT
+    <if test="statisticType.name() == 'Sum'">
+      sum(value)
+    </if>
+    <if test="statisticType.name() == 'Max'">
+      max(value)
+    </if>
+    <if test="statisticType.name() == 'Min'">
+      min(value)
+    </if>
+    <if test="statisticType.name() == 'Average'">
+      avg(value)
+    </if>
+    FROM data_item
+    WHERE index_id = #{indexId}
+    AND time_type = #{timeType}
+    AND data_time &gt;= #{beginTime}
+    AND data_time &lt; #{endTime}
+  </select>
+
+  <select id="dataStatisticsByIndexs" resultMap="dataItemMap">
+    SELECT
+    <if test="statisticType.name() == 'Sum'">
+      sum(value)
+    </if>
+    <if test="statisticType.name() == 'Max'">
+      max(value)
+    </if>
+    <if test="statisticType.name() == 'Min'">
+      min(value)
+    </if>
+    <if test="statisticType.name() == 'Average'">
+      avg(value)
+    </if>
+    AS value,
+    i.code as index_code,
+    i.name as index_name,
+    i.unit_id,
+    d.index_id
+    FROM data_item d
+    LEFT JOIN energy_index i ON d.index_id = i.index_id
+    WHERE d.index_id in
+    <foreach item="indexId" index="index" collection="indexIds"
+      open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+    AND time_type = #{timeType}
+    AND data_time &gt;= #{beginTime}
+    AND data_time &lt; #{endTime}
+    GROUP BY d.index_id, i.code, i.unit_id, i.name
+  </select>
+
+  <select id="dataStatisticsByCodes" resultMap="dataItemMap">
+    SELECT
+    <if test="statisticType.name() == 'Sum'">
+      sum(value)
+    </if>
+    <if test="statisticType.name() == 'Max'">
+      max(value)
+    </if>
+    <if test="statisticType.name() == 'Min'">
+      min(value)
+    </if>
+    <if test="statisticType.name() == 'Average'">
+      avg(value)
+    </if>
+    AS value,
+    i.code as index_code,
+    i.name as index_name,
+    i.unit_id,
+    d.index_id
+    FROM data_item d
+    LEFT JOIN energy_index i ON d.index_id = i.index_id
+    WHERE
+    i.code IN
+    <foreach item="indexCode" index="index" collection="indexCodes"
+      open="(" separator="," close=")">
+      #{indexCode}
+    </foreach>
+    AND time_type = #{timeType}
+    AND data_time &gt;= #{beginTime}
+    AND data_time &lt; #{endTime}
+    GROUP BY d.index_id, i.code, i.unit_id, i.name
+  </select>
+
+  <select id="dataStatisticsFilterByCodes" resultMap="dataItemMap">
+    SELECT
+    <if test="statisticType.name() == 'Sum'">
+      sum(value)
+    </if>
+    <if test="statisticType.name() == 'Max'">
+      max(value)
+    </if>
+    <if test="statisticType.name() == 'Min'">
+      min(value)
+    </if>
+    <if test="statisticType.name() == 'Average'">
+      avg(value)
+    </if>
+    AS value,
+    i.code as index_code,
+    i.name as index_name,
+    i.unit_id,
+    d.index_id
+    FROM data_item d
+    LEFT JOIN energy_index i ON d.index_id = i.index_id
+    WHERE
+    i.code IN
+    <foreach item="indexCode" index="index" collection="indexCodes"
+      open="(" separator="," close=")">
+      #{indexCode}
+    </foreach>
+    AND time_type = #{timeType}
+    AND data_time &gt;= #{beginTime}
+    AND data_time &lt; #{endTime}
+    <if test="isFilter == true">
+      AND value > 0
+    </if>
+    GROUP BY d.index_id, i.code, i.unit_id, i.name
+  </select>
+
+  <select id="statistic" resultMap="dataItemMap">
+    SELECT
+    d.index_id,
+    time_code,
+    data_time,
+    i.code as index_code,
+    i.name as index_name,
+    i.unit_id,
+    VALUE
+    FROM
+    data_item d
+    LEFT JOIN energy_index i ON d.index_id = i.index_id
+    WHERE
+    d.index_id in
+    <foreach item="indexId" index="index" collection="indexIds"
+      open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+    AND data_time &gt;= #{beginTime}
+    AND data_time &lt; #{endTime}
+    AND time_type = #{timeType}
+    GROUP BY
+    d.index_id, time_code, data_time, value, i.code, i.unit_id, i.name
+  </select>
+
+  <select id="statisticByCode" resultMap="dataItemMap">
+    SELECT
+    d.index_id,
+    time_code,
+    data_time,
+    i.code as index_code,
+    i.name as index_name,
+    i.unit_id,
+    value
+    FROM
+    data_item d
+    LEFT JOIN energy_index i ON d.index_id = i.index_id
+    WHERE
+    i.code IN
+    <foreach item="indexCode" index="index" collection="indexCodes"
+      open="(" separator="," close=")">
+      #{indexCode}
+    </foreach>
+    AND data_time &gt;= #{beginTime}
+    AND data_time &lt;= #{endTime}
+    AND time_type = #{timeType}
+    GROUP BY
+    d.index_id, time_code, data_time, value, i.code, i.unit_id, i.name
+  </select>
+
+  <select id="getStatisticDatasById" resultMap="statisticResultMap">
+    SELECT
+    d.index_id,
+    i.code as index_code,
+    i.unit_id,
+    i.name as index_name,
+    MAX(value) as "maxvalue",
+    min(value) as minvalue,
+    avg(value) as avgvalue
+    FROM
+    data_item d
+    LEFT JOIN energy_index i ON d.index_id = i.index_id
+    WHERE
+    d.index_id in
+    <foreach item="indexId" index="index" collection="indexIds"
+      open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+    AND time_type = #{timeType}
+    GROUP BY
+    d.index_id, i.code, i.unit_id, i.name
+  </select>
+
+  <select id="getStatisticDatasByCode" resultMap="statisticResultMap">
+    SELECT
+    d.index_id,
+    i.code as index_code,
+    i.name as index_name,
+    i.unit_id,
+    MAX(value) as "maxvalue",
+    min(value) as minvalue,
+    avg(value) as avgvalue
+    FROM
+    data_item d
+    LEFT JOIN energy_index i ON d.index_id = i.index_id
+    WHERE
+    i.code IN
+    <foreach item="indexCode" index="index" collection="indexCodes"
+      open="(" separator="," close=")">
+      #{indexCode}
+    </foreach>
+    AND time_type = #{timeType}
+    GROUP BY
+    d.index_id, i.code, i.unit_id, i.name
+  </select>
+
+  <insert id="insert">
+    INSERT INTO data_item (index_id,
+                           time_code,
+                           time_type,
+                           begin_time,
+                           end_time,
+                           data_time,
+                           value,
+                           quality,
+                           create_time)
+    VALUES (#{dataItem.indexId},
+            #{dataItem.timeCode},
+            #{dataItem.timeType},
+            #{dataItem.beginTime},
+            #{dataItem.endTime},
+            #{dataItem.dataTime},
+            #{dataItem.value, jdbcType = DOUBLE},
+            #{dataItem.quality},
+            now())
+  </insert>
+
+  <insert id="save">
+    insert into data_item (index_id,
+                           time_code,
+                           time_type,
+                           begin_time,
+                           end_time,
+                           data_time,
+                           value,
+                           quality,
+                           create_time)
+    select #{dataItem.indexId},
+           #{dataItem.timeCode},
+           #{dataItem.timeType},
+           #{dataItem.beginTime},
+           #{dataItem.endTime},
+           #{dataItem.dataTime},
+           #{dataItem.value, jdbcType = DOUBLE},
+           #{dataItem.quality},
+           now()
+    on conflict
+      (index_id,time_code)
+    do update
+    set value = #{dataItem.value, jdbcType = DOUBLE},
+      quality = #{dataItem.quality},
+      update_time = now();
+
+  </insert>
+  <insert id="saveDataList" parameterType="java.util.List">
+    <foreach item="dataItem" collection="dataItemVlues">
+      <if test="dataItem != null">
+        insert into data_item (index_id,
+        time_code,
+        time_type,
+        begin_time,
+        end_time,
+        data_time,
+        value,
+        quality,
+        create_time)
+        select #{dataItem.indexId},
+        #{dataItem.timeCode},
+        #{dataItem.timeType},
+        #{dataItem.beginTime},
+        #{dataItem.endTime},
+        #{dataItem.dataTime},
+        #{dataItem.value, jdbcType = DOUBLE},
+        #{dataItem.quality},
+        now()
+        on conflict(index_id,time_code)
+        do update
+        set value= #{dataItem.value, jdbcType = DOUBLE},
+        quality = #{dataItem.quality},
+        update_time = now();
+      </if>
+    </foreach>
+  </insert>
+  <insert id="insertDataList">
+    insert into data_item (index_id, time_code,
+    time_type,
+    begin_time,
+    end_time,
+    data_time,
+    value,
+    quality,
+    create_time)
+    values
+    <foreach collection="list" item="dataItem" index="index" separator=",">
+      (#{dataItem.indexId},
+        #{dataItem.timeCode},
+        #{dataItem.timeType},
+        #{dataItem.beginTime},
+        #{dataItem.endTime},
+        #{dataItem.dataTime},
+        #{dataItem.value, jdbcType = DOUBLE},
+        #{dataItem.quality},
+        now())
+    </foreach>
+  </insert>
+
+  <update id="update">
+    UPDATE data_item
+    SET value       = #{dataItem.value, jdbcType = DOUBLE},
+        quality     = #{dataItem.quality},
+        update_time = now()
+    WHERE index_id = #{dataItem.indexId}
+      AND time_code = #{dataItem.timeCode}
+  </update>
+  <select id="getPeriodDatasByIndexAndQuality" resultMap="dataItemMap">
+    SELECT index_id, time_code, time_type, begin_time, end_time, data_time, `value`, quality,
+    create_time, update_time
+    FROM data_item
+    WHERE index_id in
+    <foreach item="indexId" index="index" collection="indexIds"
+      open="(" separator="," close=")">
+      #{indexId}
+    </foreach>
+    AND time_type = #{timeType}
+    AND data_time &gt;= #{beginTime}
+    AND data_time &lt; #{endTime}
+    AND quality = #{quality}
+  </select>
+  <select id="getDataByIndexCode" resultMap="dataItemMap">
+    <include refid="itemHead"/>
+    WHERE ci.code = #{indexCode}
+    AND di.time_code = #{timeCode}
+  </select>
+  <select id="queryDataItemIsExist" resultType="java.lang.String">
+    select concat(time_code, ':', index_id)
+    from data_item where
+    <foreach collection="queryMap.keys" index="index" item="key" separator="or">
+      (time_code = #{key} and index_id in
+      <foreach collection="queryMap[key]" item="id" separator="," open="(" close=")">
+        #{id}
+      </foreach>
+      )
+    </foreach>
+  </select>
+</mapper>
diff --git a/db/2022-03-17.sql b/db/2022-03-17.sql
new file mode 100644
index 0000000..c517891
--- /dev/null
+++ b/db/2022-03-17.sql
@@ -0,0 +1,7 @@
+--璁惧绠$悊澧炲姞閲嶇偣鑳借�楄澶囨爣璇�
+ALTER TABLE "public"."facility_archives"
+  ADD COLUMN "point_flag" varchar(2);
+
+COMMENT ON COLUMN "public"."facility_archives"."point_flag" IS '閲嶇偣鑳借�楄澶囨爣璇哬鏄疦鍚�';
+
+--瑕佺敤绯荤粺瀛楀吀琛� pointFlage
diff --git a/db/2022-04-15.sql b/db/2022-04-15.sql
new file mode 100644
index 0000000..1f4a7dc
--- /dev/null
+++ b/db/2022-04-15.sql
@@ -0,0 +1,57 @@
+--缃戝叧閰嶇疆淇℃伅琛�
+CREATE TABLE "gateway_setting" (
+  "id" varchar(36) NOT NULL,
+  "gateway_num" varchar(20),
+  "plant_area" varchar(50),
+  "address" varchar(255),
+  "create_by" varchar(64) COLLATE "pg_catalog"."default",
+  "create_time" timestamp(6),
+  "update_by" varchar(64) COLLATE "pg_catalog"."default",
+  "update_time" timestamp(6),
+  PRIMARY KEY ("id")
+)
+;
+
+COMMENT ON COLUMN "gateway_setting"."id" IS 'UUID涓婚敭';
+
+COMMENT ON COLUMN "gateway_setting"."gateway_num" IS '缃戝叧缂栧彿';
+
+COMMENT ON COLUMN "gateway_setting"."plant_area" IS '鍘傚尯';
+
+COMMENT ON COLUMN "gateway_setting"."address" IS '鍦板潃';
+
+COMMENT ON COLUMN "gateway_setting"."create_by" IS '鍒涘缓鑰�';
+
+COMMENT ON COLUMN "gateway_setting"."create_time" IS '鍒涘缓鏃堕棿';
+
+COMMENT ON COLUMN "gateway_setting"."update_by" IS '鏇存柊鑰�';
+
+COMMENT ON COLUMN "gateway_setting"."update_time" IS '鏇存柊鏃堕棿';
+
+COMMENT ON TABLE "gateway_setting" IS '缃戝叧閰嶇疆淇℃伅琛�';
+
+ALTER TABLE "gateway_setting"
+  ADD COLUMN "hbt_time" date;
+
+COMMENT ON COLUMN "gateway_setting"."hbt_time" IS '蹇冭烦鏃堕棿';
+
+--蹇冭烦鍖呮棩蹇楄〃 gateway_hbt_log
+CREATE TABLE gateway_hbt_log (
+  "id" varchar(36) NOT NULL,
+  "gateway_no" varchar(20),
+  "hbt_time" date,
+  "content" varchar(500),
+  PRIMARY KEY ("id")
+);
+
+COMMENT ON COLUMN gateway_hbt_log."id" IS '涓婚敭';
+
+COMMENT ON COLUMN gateway_hbt_log."gateway_no" IS '缃戝叧缂栧彿';
+
+COMMENT ON COLUMN gateway_hbt_log."hbt_time" IS '蹇冭烦鏃堕棿';
+
+COMMENT ON COLUMN gateway_hbt_log."content" IS '蹇冭烦鍖�';
+
+COMMENT ON TABLE gateway_hbt_log IS '缃戝叧蹇冭烦鏃ュ織琛�';
+
+
diff --git a/energy_management_server/.gitignore b/energy_management_server/.gitignore
new file mode 100644
index 0000000..fd446f4
--- /dev/null
+++ b/energy_management_server/.gitignore
@@ -0,0 +1,43 @@
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
\ No newline at end of file
diff --git a/energy_management_server/pom.xml b/energy_management_server/pom.xml
new file mode 100644
index 0000000..d6aeed8
--- /dev/null
+++ b/energy_management_server/pom.xml
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+
+  <artifactId>energy-management-server</artifactId>
+  <packaging>jar</packaging>
+  <description>浼佷笟鑳芥簮绠$悊绯荤粺</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>basic</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>data-service</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.dingzhuo</groupId>
+      <artifactId>data-monitoring</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.xmlgraphics</groupId>
+      <artifactId>batik-codec</artifactId>
+      <version>1.7</version>
+    </dependency>
+      <dependency>
+          <groupId>org.projectlombok</groupId>
+          <artifactId>lombok</artifactId>
+          <version>RELEASE</version>
+          <scope>compile</scope>
+      </dependency>
+      <dependency>
+          <groupId>cn.hutool</groupId>
+          <artifactId>hutool-core</artifactId>
+          <version>5.3.8</version>
+      </dependency>
+      <dependency>
+          <groupId>org.apache.httpcomponents</groupId>
+          <artifactId>httpclient</artifactId>
+          <version>4.5.13</version>
+      </dependency>
+      <dependency>
+        <groupId>org.springframework.integration</groupId>
+        <artifactId>spring-integration-mqtt</artifactId>
+      </dependency>
+  </dependencies>
+  <build>
+    <finalName>${project.artifactId}</finalName>
+    <plugins>
+<!--      绗笁鏂瑰寘鎵撹繘jar鏂囦欢涓�-->
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+        <version>2.0.5.RELEASE</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <includeSystemScope>true</includeSystemScope>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <addClasspath>true</addClasspath>
+              <classpathPrefix>lib/</classpathPrefix>
+              <mainClass>com.dingzhuo.energy.EnergyManagementApplication</mainClass>
+              <useUniqueVersions>false</useUniqueVersions>
+            </manifest>
+            <manifestEntries>
+              <Class-Path>lib/fel-0.10.jar</Class-Path>
+            </manifestEntries>
+          </archive>
+          <excludes>
+            <exclude>application-prod.yml</exclude>
+          </excludes>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy-lib</id>
+            <phase>package</phase>
+            <goals>
+              <goal>copy-dependencies</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${project.build.directory}/lib</outputDirectory>
+              <excludeTransitive>false</excludeTransitive>
+              <stripVersion>false</stripVersion>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.7</version>
+        <configuration>
+          <encoding>UTF-8</encoding>
+        </configuration>
+        <executions>
+          <execution>
+            <id>copy-resources</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${basedir}/target/config</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>src/main/resources</directory>
+                  <filtering>true</filtering>
+                  <includes>
+                    <include>application-prod.yml</include>
+                  </includes>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+</project>
diff --git a/energy_management_server/ry.sh b/energy_management_server/ry.sh
new file mode 100644
index 0000000..706036c
--- /dev/null
+++ b/energy_management_server/ry.sh
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+AppName=ruoyi.jar
+
+#JVM鍙傛暟
+JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms512M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
+APP_HOME=`pwd`
+LOG_PATH=$APP_HOME/logs/$AppName.log
+
+if [ "$1" = "" ];
+then
+    echo -e "\033[0;31m 鏈緭鍏ユ搷浣滃悕 \033[0m  \033[0;34m {start|stop|restart|status} \033[0m"
+    exit 1
+fi
+
+if [ "$AppName" = "" ];
+then
+    echo -e "\033[0;31m 鏈緭鍏ュ簲鐢ㄥ悕 \033[0m"
+    exit 1
+fi
+
+function start()
+{
+    PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
+
+	if [ x"$PID" != x"" ]; then
+	    echo "$AppName is running..."
+	else
+		nohup java -jar  $JVM_OPTS target/$AppName > /dev/null 2>&1 &
+		echo "Start $AppName success..."
+	fi
+}
+
+function stop()
+{
+    echo "Stop $AppName"
+	
+	PID=""
+	query(){
+		PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
+	}
+
+	query
+	if [ x"$PID" != x"" ]; then
+		kill -TERM $PID
+		echo "$AppName (pid:$PID) exiting..."
+		while [ x"$PID" != x"" ]
+		do
+			sleep 1
+			query
+		done
+		echo "$AppName exited."
+	else
+		echo "$AppName already stopped."
+	fi
+}
+
+function restart()
+{
+    stop
+    sleep 2
+    start
+}
+
+function status()
+{
+    PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
+    if [ $PID != 0 ];then
+        echo "$AppName is running..."
+    else
+        echo "$AppName is not running..."
+    fi
+}
+
+case $1 in
+    start)
+    start;;
+    stop)
+    stop;;
+    restart)
+    restart;;
+    status)
+    status;;
+    *)
+
+esac
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementApplication.java b/energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementApplication.java
new file mode 100644
index 0000000..714f3e8
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementApplication.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+
+/**
+ * 鍚姩绋嬪簭
+ *
+ * @author ruoyi
+ */
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+public class EnergyManagementApplication {
+  public static void main(String[] args) {
+    SpringApplication.run(EnergyManagementApplication.class, args);
+    System.out.println("骞冲彴鍚姩鎴愬姛 O(鈭鈭�)O~");
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementServletInitializer.java b/energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementServletInitializer.java
new file mode 100644
index 0000000..f6d8f73
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/EnergyManagementServletInitializer.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web瀹瑰櫒涓繘琛岄儴缃�
+ * 
+ * @author ruoyi
+ */
+public class EnergyManagementServletInitializer extends SpringBootServletInitializer
+{
+    @Override
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
+    {
+        return application.sources(EnergyManagementApplication.class);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/controller/EnergyBenchmarkingController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/controller/EnergyBenchmarkingController.java
new file mode 100644
index 0000000..428941a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/controller/EnergyBenchmarkingController.java
@@ -0,0 +1,103 @@
+package com.dingzhuo.energy.project.EnergyBenchmarking.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.EnergyBenchmarking.domain.EnergyBenchmarking;
+import com.dingzhuo.energy.project.EnergyBenchmarking.service.IEnergyBenchmarkingService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * energy_benchmarkingController
+ * 
+ * @author sys
+ * @date 2020-11-18
+ */
+@RestController
+@RequestMapping("/energyEenchmarking/energyEenchmarking")
+public class EnergyBenchmarkingController extends BaseController
+{
+    @Autowired
+    private IEnergyBenchmarkingService energyBenchmarkingService;
+
+    /**
+     * 鏌ヨenergy_benchmarking鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energyEenchmarking:energyEenchmarking:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(EnergyBenchmarking energyBenchmarking)
+    {
+        startPage();
+        List<EnergyBenchmarking> list = energyBenchmarkingService.selectEnergyBenchmarkingList(energyBenchmarking);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭energy_benchmarking鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energyEenchmarking:energyEenchmarking:export')")
+    @Log(title = "energy_benchmarking", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(EnergyBenchmarking energyBenchmarking)
+    {
+        List<EnergyBenchmarking> list = energyBenchmarkingService.selectEnergyBenchmarkingList(energyBenchmarking);
+        ExcelUtil<EnergyBenchmarking> util = new ExcelUtil<EnergyBenchmarking>(EnergyBenchmarking.class);
+        return util.exportExcel(list, "energyEenchmarking");
+    }
+
+    /**
+     * 鑾峰彇energy_benchmarking璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('energyEenchmarking:energyEenchmarking:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(energyBenchmarkingService.selectEnergyBenchmarkingById(id));
+    }
+
+    /**
+     * 鏂板energy_benchmarking
+     */
+    @PreAuthorize("@ss.hasPermi('energyEenchmarking:energyEenchmarking:add')")
+    @Log(title = "energy_benchmarking", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody EnergyBenchmarking energyBenchmarking)
+    {
+        return toAjax(energyBenchmarkingService.insertEnergyBenchmarking(energyBenchmarking));
+    }
+
+    /**
+     * 淇敼energy_benchmarking
+     */
+    @PreAuthorize("@ss.hasPermi('energyEenchmarking:energyEenchmarking:edit')")
+    @Log(title = "energy_benchmarking", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody EnergyBenchmarking energyBenchmarking)
+    {
+        return toAjax(energyBenchmarkingService.updateEnergyBenchmarking(energyBenchmarking));
+    }
+
+    /**
+     * 鍒犻櫎energy_benchmarking
+     */
+    @PreAuthorize("@ss.hasPermi('energyEenchmarking:energyEenchmarking:remove')")
+    @Log(title = "energy_benchmarking", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(energyBenchmarkingService.deleteEnergyBenchmarkingByIds(ids));
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/domain/EnergyBenchmarking.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/domain/EnergyBenchmarking.java
new file mode 100644
index 0000000..3460885
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/domain/EnergyBenchmarking.java
@@ -0,0 +1,146 @@
+package com.dingzhuo.energy.project.EnergyBenchmarking.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * energy_benchmarking瀵硅薄 energy_benchmarking
+ * 
+ * @author sys
+ * @date 2020-11-18
+ */
+public class EnergyBenchmarking extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private String id;
+
+    /** 鍗曚綅鍚嶇О */
+    @Excel(name = "鍗曚綅鍚嶇О")
+    private String name;
+
+    /** 鎸囨爣鍚嶇О */
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String codeId;
+
+    /** 鎸囨爣鍗曚綅 */
+    @Excel(name = "鎸囨爣鍗曚綅")
+    private String unit;
+
+    /** 鏍囨潌鑼冨洿 */
+    @Excel(name = "鏍囨潌鑼冨洿")
+    private String range;
+
+    /** 鏍囨潌绫诲瀷 */
+    @Excel(name = "鏍囨潌绫诲瀷")
+    private String type;
+
+    /** 鏍囨潌鍊� */
+    @Excel(name = "鏍囨潌鍊�")
+    private String value;
+    /** 鏍囨潌鍊� */
+    private String modelNode;
+    /** 鏈夋晥鏈� */
+    @Excel(name = "鏈夋晥鏈�", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date termValidity;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setCodeId(String codeId) 
+    {
+        this.codeId = codeId;
+    }
+
+    public String getCodeId() 
+    {
+        return codeId;
+    }
+    public void setUnit(String unit) 
+    {
+        this.unit = unit;
+    }
+
+    public String getUnit() 
+    {
+        return unit;
+    }
+    public void setRange(String range) 
+    {
+        this.range = range;
+    }
+
+    public String getRange() 
+    {
+        return range;
+    }
+    public void setType(String type) 
+    {
+        this.type = type;
+    }
+
+    public String getType() 
+    {
+        return type;
+    }
+    public void setValue(String value) 
+    {
+        this.value = value;
+    }
+
+    public String getValue() 
+    {
+        return value;
+    }
+    public void setTermValidity(Date termValidity) 
+    {
+        this.termValidity = termValidity;
+    }
+
+    public Date getTermValidity() 
+    {
+        return termValidity;
+    }
+
+    public String getModelNode() {
+        return modelNode;
+    }
+
+    public void setModelNode(String modelNode) {
+        this.modelNode = modelNode;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("codeId", getCodeId())
+            .append("unit", getUnit())
+            .append("range", getRange())
+            .append("type", getType())
+            .append("value", getValue())
+            .append("termValidity", getTermValidity())
+            .append("modelNode", getModelNode())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/mapper/EnergyBenchmarkingMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/mapper/EnergyBenchmarkingMapper.java
new file mode 100644
index 0000000..d6e42af
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/mapper/EnergyBenchmarkingMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.EnergyBenchmarking.mapper;
+
+import com.dingzhuo.energy.project.EnergyBenchmarking.domain.EnergyBenchmarking;
+import java.util.List;
+
+/**
+ * energy_benchmarkingMapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-11-18
+ */
+public interface EnergyBenchmarkingMapper 
+{
+    /**
+     * 鏌ヨenergy_benchmarking
+     * 
+     * @param id energy_benchmarkingID
+     * @return energy_benchmarking
+     */
+    public EnergyBenchmarking selectEnergyBenchmarkingById(String id);
+
+    /**
+     * 鏌ヨenergy_benchmarking鍒楄〃
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return energy_benchmarking闆嗗悎
+     */
+    public List<EnergyBenchmarking> selectEnergyBenchmarkingList(EnergyBenchmarking energyBenchmarking);
+
+    /**
+     * 鏂板energy_benchmarking
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return 缁撴灉
+     */
+    public int insertEnergyBenchmarking(EnergyBenchmarking energyBenchmarking);
+
+    /**
+     * 淇敼energy_benchmarking
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return 缁撴灉
+     */
+    public int updateEnergyBenchmarking(EnergyBenchmarking energyBenchmarking);
+
+    /**
+     * 鍒犻櫎energy_benchmarking
+     * 
+     * @param id energy_benchmarkingID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyBenchmarkingById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎energy_benchmarking
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyBenchmarkingByIds(String[] ids);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/IEnergyBenchmarkingService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/IEnergyBenchmarkingService.java
new file mode 100644
index 0000000..0d560ad
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/IEnergyBenchmarkingService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.EnergyBenchmarking.service;
+
+import com.dingzhuo.energy.project.EnergyBenchmarking.domain.EnergyBenchmarking;
+import java.util.List;
+
+/**
+ * energy_benchmarkingService鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-11-18
+ */
+public interface IEnergyBenchmarkingService 
+{
+    /**
+     * 鏌ヨenergy_benchmarking
+     * 
+     * @param id energy_benchmarkingID
+     * @return energy_benchmarking
+     */
+    public EnergyBenchmarking selectEnergyBenchmarkingById(String id);
+
+    /**
+     * 鏌ヨenergy_benchmarking鍒楄〃
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return energy_benchmarking闆嗗悎
+     */
+    public List<EnergyBenchmarking> selectEnergyBenchmarkingList(EnergyBenchmarking energyBenchmarking);
+
+    /**
+     * 鏂板energy_benchmarking
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return 缁撴灉
+     */
+    public int insertEnergyBenchmarking(EnergyBenchmarking energyBenchmarking);
+
+    /**
+     * 淇敼energy_benchmarking
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return 缁撴灉
+     */
+    public int updateEnergyBenchmarking(EnergyBenchmarking energyBenchmarking);
+
+    /**
+     * 鎵归噺鍒犻櫎energy_benchmarking
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑energy_benchmarkingID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyBenchmarkingByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎energy_benchmarking淇℃伅
+     * 
+     * @param id energy_benchmarkingID
+     * @return 缁撴灉
+     */
+    public int deleteEnergyBenchmarkingById(String id);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/impl/EnergyBenchmarkingServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/impl/EnergyBenchmarkingServiceImpl.java
new file mode 100644
index 0000000..39fa3b4
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/EnergyBenchmarking/service/impl/EnergyBenchmarkingServiceImpl.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.project.EnergyBenchmarking.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.EnergyBenchmarking.mapper.EnergyBenchmarkingMapper;
+import com.dingzhuo.energy.project.EnergyBenchmarking.domain.EnergyBenchmarking;
+import com.dingzhuo.energy.project.EnergyBenchmarking.service.IEnergyBenchmarkingService;
+
+/**
+ * energy_benchmarkingService涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-11-18
+ */
+@Service
+public class EnergyBenchmarkingServiceImpl implements IEnergyBenchmarkingService 
+{
+    @Autowired
+    private EnergyBenchmarkingMapper energyBenchmarkingMapper;
+
+    /**
+     * 鏌ヨenergy_benchmarking
+     * 
+     * @param id energy_benchmarkingID
+     * @return energy_benchmarking
+     */
+    @Override
+    public EnergyBenchmarking selectEnergyBenchmarkingById(String id)
+    {
+        return energyBenchmarkingMapper.selectEnergyBenchmarkingById(id);
+    }
+
+    /**
+     * 鏌ヨenergy_benchmarking鍒楄〃
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return energy_benchmarking
+     */
+    @Override
+    public List<EnergyBenchmarking> selectEnergyBenchmarkingList(EnergyBenchmarking energyBenchmarking)
+    {
+        return energyBenchmarkingMapper.selectEnergyBenchmarkingList(energyBenchmarking);
+    }
+
+    /**
+     * 鏂板energy_benchmarking
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertEnergyBenchmarking(EnergyBenchmarking energyBenchmarking)
+    {
+        return energyBenchmarkingMapper.insertEnergyBenchmarking(energyBenchmarking);
+    }
+
+    /**
+     * 淇敼energy_benchmarking
+     * 
+     * @param energyBenchmarking energy_benchmarking
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateEnergyBenchmarking(EnergyBenchmarking energyBenchmarking)
+    {
+        return energyBenchmarkingMapper.updateEnergyBenchmarking(energyBenchmarking);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎energy_benchmarking
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑energy_benchmarkingID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyBenchmarkingByIds(String[] ids)
+    {
+        return energyBenchmarkingMapper.deleteEnergyBenchmarkingByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎energy_benchmarking淇℃伅
+     * 
+     * @param id energy_benchmarkingID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteEnergyBenchmarkingById(String id)
+    {
+        return energyBenchmarkingMapper.deleteEnergyBenchmarkingById(id);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/HomePageIndexController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/HomePageIndexController.java
new file mode 100644
index 0000000..929e321
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/HomePageIndexController.java
@@ -0,0 +1,35 @@
+package com.dingzhuo.energy.project.basicSetup.controller;
+
+import com.dingzhuo.energy.framework.config.SystemConfig;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 棣栭〉閰嶇疆Controller
+ *
+ * @author sys
+ * @date 2021-04-09
+ */
+@RestController
+@RequestMapping("/HomePage")
+public class HomePageIndexController extends BaseController
+{
+
+    /**
+     * 鑾峰彇 棣栭〉 IFRAME鐨勫唴宓孶RL鍦板潃
+     * @return
+     */
+    @GetMapping(value = "/indexIframeUrl")
+    public AjaxResult indexIframeUrl(){
+        Map<String,String> map = new HashMap<>();
+        //浠庣郴缁熼厤缃枃浠朵腑鑾峰彇 閰嶇疆鐨�  url鍦板潃
+        map.put("INDEXIFRAMEURL", SystemConfig.getIndexUrl());
+        return AjaxResult.success(map);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysEquipmentfileController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysEquipmentfileController.java
new file mode 100644
index 0000000..4e6a9b8
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysEquipmentfileController.java
@@ -0,0 +1,105 @@
+package com.dingzhuo.energy.project.basicSetup.controller;
+
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import java.io.*;
+import java.net.MalformedURLException;
+import java.util.List;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.file.FileUploadUtils;
+import com.dingzhuo.energy.common.utils.file.FileUtils;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.dataservice.service.impl.RealtimeDatabaseServiceImpl;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysSvgInfo;
+import org.apache.commons.lang3.StringUtils;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.dom4j.io.XMLWriter;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ClassUtils;
+import org.springframework.web.bind.annotation.*;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.basicSetup.domain.SysEquipmentfile;
+import com.dingzhuo.energy.project.basicSetup.service.ISysEquipmentfileService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * 缁勬�佸浘Controller
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+@RestController
+@RequestMapping("/basicSetup/equipmentfile")
+public class SysEquipmentfileController extends BaseController {
+
+  private final ISysEquipmentfileService sysEquipmentfileService;
+
+  public SysEquipmentfileController(
+      ISysEquipmentfileService sysEquipmentfileService) {
+    this.sysEquipmentfileService = sysEquipmentfileService;
+  }
+
+  @PostMapping(value = "/upload")
+  @Log(title = "绯荤粺鍥�", businessType = BusinessType.IMPORT)
+  public AjaxResult upload(MultipartFile file) throws IOException {
+    if (!file.isEmpty()) {
+      String fileSuffix = FileUploadUtils.getExtension(file);
+      if (StringUtils.containsIgnoreCase(".svg,.jpg,.png,.gif", fileSuffix)) {
+        //鏂囦欢鏈�缁堜繚瀛樼殑缁濆璺緞
+        String filePath = FileUploadUtils.upload(RuoYiConfig.getConfigurePath(), file);
+        return AjaxResult.success(filePath);
+      }
+      return AjaxResult.error("鏂囦欢鏍煎紡閿欒");
+    }
+    return AjaxResult.error("绯荤粺鍥句笂浼犲け璐�");
+  }
+
+  /**
+   * 淇敼缁勬�佸浘
+   */
+  @Log(title = "绯荤粺鍥�", businessType = BusinessType.UPDATE)
+  @PutMapping
+  public AjaxResult edit(@RequestBody SysEquipmentfile sysEquipmentfile) {
+    try {
+      sysEquipmentfileService.saveEquipmentFile(sysEquipmentfile);
+      return AjaxResult.success();
+    } catch (Exception ex) {
+      return AjaxResult.error();
+    }
+  }
+
+  @PutMapping("/setting/{nodeId}")
+  public AjaxResult saveSetting(@PathVariable("nodeId") String nodeId,
+      @RequestBody List<SysSvgInfo> svgInfo) {
+    try {
+      svgInfo.forEach(info -> info.setId(UUID.fastUUID().toString()));
+      sysEquipmentfileService.saveSettingInfo(nodeId, svgInfo);
+      return AjaxResult.success("淇濆瓨鎴愬姛锛�");
+    } catch (Exception ex) {
+      return AjaxResult.error("淇濆瓨澶辫触锛�");
+    }
+  }
+
+  @GetMapping("/configure/{nodeId}")
+  public AjaxResult getConfigure(@PathVariable("nodeId") String nodeId) {
+    try {
+      SysEquipmentfile sysEquipmentfile = sysEquipmentfileService.getConfigure(nodeId);
+      return AjaxResult.success(sysEquipmentfile);
+    } catch (Exception ex) {
+      return AjaxResult.error("淇濆瓨澶辫触锛�");
+    }
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardCategoryController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardCategoryController.java
new file mode 100644
index 0000000..e213dce
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardCategoryController.java
@@ -0,0 +1,103 @@
+package com.dingzhuo.energy.project.basicSetup.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardCategory;
+import com.dingzhuo.energy.project.basicSetup.service.ISysStandardCategoryService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * categoryController
+ * 
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+@RestController
+@RequestMapping("/basicSetup/category")
+public class SysStandardCategoryController extends BaseController
+{
+    @Autowired
+    private ISysStandardCategoryService sysStandardCategoryService;
+
+    /**
+     * 鏌ヨcategory鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:category:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysStandardCategory sysStandardCategory)
+    {
+        startPage();
+        List<SysStandardCategory> list = sysStandardCategoryService.selectSysStandardCategoryList(sysStandardCategory);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭category鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:category:export')")
+    @Log(title = "category", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysStandardCategory sysStandardCategory)
+    {
+        List<SysStandardCategory> list = sysStandardCategoryService.selectSysStandardCategoryList(sysStandardCategory);
+        ExcelUtil<SysStandardCategory> util = new ExcelUtil<SysStandardCategory>(SysStandardCategory.class);
+        return util.exportExcel(list, "category");
+    }
+
+    /**
+     * 鑾峰彇category璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:category:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(sysStandardCategoryService.selectSysStandardCategoryById(id));
+    }
+
+    /**
+     * 鏂板category
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:category:add')")
+    @Log(title = "category", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysStandardCategory sysStandardCategory)
+    {
+        return toAjax(sysStandardCategoryService.insertSysStandardCategory(sysStandardCategory));
+    }
+
+    /**
+     * 淇敼category
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:category:edit')")
+    @Log(title = "category", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysStandardCategory sysStandardCategory)
+    {
+        return toAjax(sysStandardCategoryService.updateSysStandardCategory(sysStandardCategory));
+    }
+
+    /**
+     * 鍒犻櫎category
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:category:remove')")
+    @Log(title = "category", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(sysStandardCategoryService.deleteSysStandardCategoryByIds(ids));
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardParametersController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardParametersController.java
new file mode 100644
index 0000000..6ea70ef
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/controller/SysStandardParametersController.java
@@ -0,0 +1,174 @@
+package com.dingzhuo.energy.project.basicSetup.controller;
+
+import java.math.BigDecimal;
+import java.util.*;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.dataservice.service.RealtimeDatabaseService;
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardCategory;
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardParameters;
+import com.dingzhuo.energy.project.basicSetup.service.ISysStandardParametersService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * parametersController
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+@RestController
+@RequestMapping("/basicSetup/parameters")
+public class SysStandardParametersController extends BaseController {
+    @Autowired
+    private ISysStandardParametersService sysStandardParametersService;
+    @Autowired
+    private RealtimeDatabaseService realtimeDatabaseService;
+
+    /**
+     * 鏌ヨparameters鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:parameters:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(SysStandardParameters sysStandardParameters) {
+        startPage();
+        List<SysStandardParameters> list = sysStandardParametersService.selectSysStandardParametersList(sysStandardParameters);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭parameters鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:parameters:export')")
+    @Log(title = "parameters", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(SysStandardParameters sysStandardParameters) {
+        List<SysStandardParameters> list = sysStandardParametersService.selectSysStandardParametersList(sysStandardParameters);
+        ExcelUtil<SysStandardParameters> util = new ExcelUtil<SysStandardParameters>(SysStandardParameters.class);
+        return util.exportExcel(list, "parameters");
+    }
+
+    /**
+     * 鑾峰彇parameters璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:parameters:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id) {
+        return AjaxResult.success(sysStandardParametersService.selectSysStandardParametersById(id));
+    }
+
+    /**
+     * 鏂板parameters
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:parameters:add')")
+    @Log(title = "parameters", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody SysStandardParameters sysStandardParameters) {
+        int msg = sysStandardParametersService.insertSysStandardParameters(sysStandardParameters);
+        return toAjax(msg);
+    }
+
+    /**
+     * 淇敼parameters
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:parameters:edit')")
+    @Log(title = "parameters", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody SysStandardParameters sysStandardParameters) {
+        SysStandardParameters standardParameters =sysStandardParametersService.selectSysStandardParametersById(sysStandardParameters.getId());
+        int msg;
+        if(standardParameters==null){
+            msg = sysStandardParametersService.insertSysStandardParameters(sysStandardParameters);
+        }else{
+            msg=sysStandardParametersService.updateSysStandardParameters(sysStandardParameters);
+        }
+        return toAjax(msg);
+    }
+
+    /**
+     * 鍒犻櫎parameters
+     */
+    @PreAuthorize("@ss.hasPermi('basicSetup:parameters:remove')")
+    @Log(title = "parameters", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids) {
+        return toAjax(sysStandardParametersService.deleteSysStandardParametersByIds(ids));
+    }
+    @PreAuthorize("@ss.hasPermi('basicSetup:parameters:listSee')")
+    @GetMapping("/listSee/{id}")
+    public AjaxResult getListSee(@PathVariable("id") String id) {
+        try {
+            List tableList = new ArrayList();
+            List<String> tagCodes = new ArrayList<String>();
+            SysStandardParameters sysStandardParameters = sysStandardParametersService.getStandardParameters(id);
+            if (sysStandardParameters != null) {
+                JSONArray ar = JSONObject.parseArray(sysStandardParameters.getConfigInfo());
+                for(int i=0;i<ar.size();i++){
+                    JSONObject t =  ar.getJSONObject(i);
+                    List<Map> list = JSONObject.parseArray(t.get("tableRow").toString(), Map.class);
+                    for (Map item : list) {
+                        for (int j = 1; j < item.keySet().size(); j++) {
+                            tagCodes.add((String) item.get("colName"+j));
+                        }
+                    }
+                }
+                //tagCodes.add("DB01_A01");
+                List<TagValue> tagValueslist= realtimeDatabaseService.retrieve(tagCodes);
+                for(int i=0;i<ar.size();i++){
+                    JSONObject t =  ar.getJSONObject(i);
+                    Map tabMap = new HashMap();
+                    tabMap.put("tableName",t.get("tableName"));
+                    List<Map> listRow = JSONObject.parseArray(t.get("tableColumn").toString(), Map.class);
+                    tabMap.put("tablecolumn",listRow);
+                    List<Map> list = JSONObject.parseArray(t.get("tableRow").toString(), Map.class);//杩欓噷鐨勭浜屼釜鍙傛暟涔熷彲浠ョ敤瀵瑰簲鐨勮嚜瀹氫箟javaBean.class
+                    List rowList = new ArrayList();
+                    for (Map item : list) {
+                        Map row= new HashMap();
+                        for (int j = 0; j < item.values().size(); j++) {
+                            /*if(item.get("colName"+j).toString().indexOf())*/
+                            String code = "";
+                            String code1=item.get("colName"+j).toString();
+                            for (TagValue items:tagValueslist) {
+                                String code2=items.getTagCode();
+                                if(code2.equals(code1)){
+                                    code = String.valueOf((Double)new BigDecimal(items.getValue()).setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+                                }else{
+                                    code=item.get("colName"+j).toString();
+                                }
+                            }
+                            row.put("colName"+j,code);
+                        }
+                        rowList.add(row);
+                    }
+                    tabMap.put("tablerowdata",rowList);
+                    tableList.add(tabMap);
+                }
+            }
+
+
+            return AjaxResult.success(tableList);
+        } catch (Exception ex) {
+            logger.error(ex.getMessage());
+            return AjaxResult.error("鏌ヨ澶辫触锛�");
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysEquipmentfile.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysEquipmentfile.java
new file mode 100644
index 0000000..749fbb2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysEquipmentfile.java
@@ -0,0 +1,50 @@
+package com.dingzhuo.energy.project.basicSetup.domain;
+
+import java.util.List;
+
+/**
+ * 缁勬�佸浘瀵硅薄 sys_equipmentfile
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+public class SysEquipmentfile {
+
+  private String nodeId;
+  private String filePath;
+  private String svgType;
+  private List<SysSvgInfo> infoList;
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+  public String getFilePath() {
+    return filePath;
+  }
+
+  public void setFilePath(String filePath) {
+    this.filePath = filePath;
+  }
+
+  public List<SysSvgInfo> getInfoList() {
+    return infoList;
+  }
+
+  public void setInfoList(
+      List<SysSvgInfo> infoList) {
+    this.infoList = infoList;
+  }
+
+  public String getSvgType() {
+    return svgType;
+  }
+
+  public void setSvgType(String svgType) {
+    this.svgType = svgType;
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardCategory.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardCategory.java
new file mode 100644
index 0000000..48501ad
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardCategory.java
@@ -0,0 +1,153 @@
+package com.dingzhuo.energy.project.basicSetup.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * category瀵硅薄 sys_standard_category
+ * 
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public class SysStandardCategory extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+    private String tableName;
+    private String tableRow;
+    private String colName;
+    private String tableColumn;
+    private String name;
+    private String item;
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getTableRow() {
+        return tableRow;
+    }
+
+    public void setTableRow(String tableRow) {
+        this.tableRow = tableRow;
+    }
+
+    public String getColName() {
+        return colName;
+    }
+
+    public void setColName(String colName) {
+        this.colName = colName;
+    }
+
+    public String getTableColumn() {
+        return tableColumn;
+    }
+
+    public void setTableColumn(String tableColumn) {
+        this.tableColumn = tableColumn;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getItem() {
+        return item;
+    }
+
+    public void setItem(String item) {
+        this.item = item;
+    }
+    /* *//** $column.columnComment *//*
+    private String id;
+
+    *//** 鏍囧噯鍙傛暟绫诲埆鍚嶇О *//*
+    @Excel(name = "鏍囧噯鍙傛暟绫诲埆鍚嶇О")
+    private String categoryName;
+
+    *//** 鏍囧噯鍙傛暟绫诲埆缂栫爜 *//*
+    @Excel(name = "鏍囧噯鍙傛暟绫诲埆缂栫爜")
+    private String categoryCode;
+
+    *//** 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁 *//*
+    @Excel(name = "鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁")
+    private String dataType;
+
+    *//** 鏄惁鏄剧ず鎶ヨ *//*
+    @Excel(name = "鏄惁鏄剧ず鎶ヨ")
+    private String showAlarm;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setCategoryName(String categoryName) 
+    {
+        this.categoryName = categoryName;
+    }
+
+    public String getCategoryName() 
+    {
+        return categoryName;
+    }
+    public void setCategoryCode(String categoryCode) 
+    {
+        this.categoryCode = categoryCode;
+    }
+
+    public String getCategoryCode() 
+    {
+        return categoryCode;
+    }
+    public void setDataType(String dataType) 
+    {
+        this.dataType = dataType;
+    }
+
+    public String getDataType() 
+    {
+        return dataType;
+    }
+    public void setShowAlarm(String showAlarm) 
+    {
+        this.showAlarm = showAlarm;
+    }
+
+    public String getShowAlarm() 
+    {
+        return showAlarm;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("categoryName", getCategoryName())
+            .append("categoryCode", getCategoryCode())
+            .append("dataType", getDataType())
+            .append("showAlarm", getShowAlarm())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }*/
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardParameters.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardParameters.java
new file mode 100644
index 0000000..16880b6
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysStandardParameters.java
@@ -0,0 +1,124 @@
+package com.dingzhuo.energy.project.basicSetup.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+/**
+ * parameters瀵硅薄 sys_standard_parameters
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public class SysStandardParameters extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private String id;
+
+    /** 鏍囧噯鍙傛暟绫诲埆鍚嶇О */
+    @Excel(name = "鏍囧噯鍙傛暟绫诲埆鍚嶇О")
+    private String name;
+
+    /** 璁捐鍐呭 */
+    @Excel(name = "璁捐鍐呭")
+    private String configInfo;
+
+    /** 鏍囧噯鍙傛暟绫诲埆缂栫爜 */
+    @Excel(name = "鏍囧噯鍙傛暟绫诲埆缂栫爜")
+    private String code;
+
+    /** 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁 */
+    @Excel(name = "鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁")
+    private String dataType;
+
+    /** 鏄惁鏄剧ず鎶ヨ */
+    @Excel(name = "鏄惁鏄剧ず鎶ヨ")
+    private String showAlarm;
+
+    @Excel(name = "鏍囧噯鍙傛暟绫诲埆Id")
+    private String categoryId;
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+    public void setConfigInfo(String configInfo)
+    {
+        this.configInfo = configInfo;
+    }
+
+    public String getConfigInfo()
+    {
+        return configInfo;
+    }
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    public String getCode()
+    {
+        return code;
+    }
+    public void setDataType(String dataType)
+    {
+        this.dataType = dataType;
+    }
+
+    public String getDataType()
+    {
+        return dataType;
+    }
+    public void setShowAlarm(String showAlarm)
+    {
+        this.showAlarm = showAlarm;
+    }
+
+    public String getShowAlarm()
+    {
+        return showAlarm;
+    }
+
+    public String getCategoryId()
+    {
+        return categoryId;
+    }
+
+    public void setCategoryId(String categoryId)
+    {
+        this.categoryId = categoryId;
+    }
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("name", getName())
+                .append("configInfo", getConfigInfo())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .append("remark", getRemark())
+                .append("code", getCode())
+                .append("dataType", getDataType())
+                .append("showAlarm", getShowAlarm())
+                .append("categoryId",  getCategoryId())
+                .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysSvgInfo.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysSvgInfo.java
new file mode 100644
index 0000000..dad0278
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/domain/SysSvgInfo.java
@@ -0,0 +1,32 @@
+package com.dingzhuo.energy.project.basicSetup.domain;
+
+public class SysSvgInfo {
+
+  private String id;
+  private String param;
+  private String tag;
+
+  public String getParam() {
+    return param;
+  }
+
+  public void setParam(String param) {
+    this.param = param;
+  }
+
+  public String getTag() {
+    return tag;
+  }
+
+  public void setTag(String tag) {
+    this.tag = tag;
+  }
+
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysEquipmentfileMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysEquipmentfileMapper.java
new file mode 100644
index 0000000..4fa6805
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysEquipmentfileMapper.java
@@ -0,0 +1,24 @@
+package com.dingzhuo.energy.project.basicSetup.mapper;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysEquipmentfile;
+import com.dingzhuo.energy.project.basicSetup.domain.SysSvgInfo;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 缁勬�佸浘Mapper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+public interface SysEquipmentfileMapper {
+
+  void saveEquipmentFile(SysEquipmentfile sysEquipmentfile);
+
+  void saveSettingInfo(@Param("nodeId") String nodeId, @Param("svgInfo") List<SysSvgInfo> svgInfo);
+
+  SysEquipmentfile getConfigure(String nodeId);
+
+  List<SysSvgInfo> getConfigureTag(String nodeId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardCategoryMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardCategoryMapper.java
new file mode 100644
index 0000000..4618ac8
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardCategoryMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.basicSetup.mapper;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardCategory;
+import java.util.List;
+
+/**
+ * categoryMapper鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public interface SysStandardCategoryMapper 
+{
+    /**
+     * 鏌ヨcategory
+     * 
+     * @param id categoryID
+     * @return category
+     */
+    public SysStandardCategory selectSysStandardCategoryById(String id);
+
+    /**
+     * 鏌ヨcategory鍒楄〃
+     * 
+     * @param sysStandardCategory category
+     * @return category闆嗗悎
+     */
+    public List<SysStandardCategory> selectSysStandardCategoryList(SysStandardCategory sysStandardCategory);
+
+    /**
+     * 鏂板category
+     * 
+     * @param sysStandardCategory category
+     * @return 缁撴灉
+     */
+    public int insertSysStandardCategory(SysStandardCategory sysStandardCategory);
+
+    /**
+     * 淇敼category
+     * 
+     * @param sysStandardCategory category
+     * @return 缁撴灉
+     */
+    public int updateSysStandardCategory(SysStandardCategory sysStandardCategory);
+
+    /**
+     * 鍒犻櫎category
+     * 
+     * @param id categoryID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardCategoryById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎category
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardCategoryByIds(String[] ids);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardParametersMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardParametersMapper.java
new file mode 100644
index 0000000..c81268e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/mapper/SysStandardParametersMapper.java
@@ -0,0 +1,63 @@
+package com.dingzhuo.energy.project.basicSetup.mapper;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardParameters;
+import java.util.List;
+
+/**
+ * parametersMapper鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public interface SysStandardParametersMapper
+{
+    /**
+     * 鏌ヨparameters
+     *
+     * @param id parametersID
+     * @return parameters
+     */
+    public SysStandardParameters selectSysStandardParametersById(String id);
+    /*public List<SysStandardParameters> getStandardParameters();*/
+    public SysStandardParameters getStandardParameters(String id);
+    /**
+     * 鏌ヨparameters鍒楄〃
+     *
+     * @param sysStandardParameters parameters
+     * @return parameters闆嗗悎
+     */
+    public List<SysStandardParameters> selectSysStandardParametersList(SysStandardParameters sysStandardParameters);
+
+    /**
+     * 鏂板parameters
+     *
+     * @param sysStandardParameters parameters
+     * @return 缁撴灉
+     */
+    public int insertSysStandardParameters(SysStandardParameters sysStandardParameters);
+
+    /**
+     * 淇敼parameters
+     *
+     * @param sysStandardParameters parameters
+     * @return 缁撴灉
+     */
+    public int updateSysStandardParameters(SysStandardParameters sysStandardParameters);
+
+    /**
+     * 鍒犻櫎parameters
+     *
+     * @param id parametersID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardParametersById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎parameters
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardParametersByIds(String[] ids);
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysEquipmentfileService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysEquipmentfileService.java
new file mode 100644
index 0000000..11a80ad
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysEquipmentfileService.java
@@ -0,0 +1,33 @@
+package com.dingzhuo.energy.project.basicSetup.service;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysEquipmentfile;
+import com.dingzhuo.energy.project.basicSetup.domain.SysSvgInfo;
+
+import java.util.List;
+
+/**
+ * 缁勬�佸浘Service鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+public interface ISysEquipmentfileService {
+
+  void saveEquipmentFile(SysEquipmentfile sysEquipmentfile);
+
+  void saveSettingInfo(String nodeId, List<SysSvgInfo> svgInfo);
+
+  /**
+   * 鑾峰彇缁勬�佸浘閰嶇疆淇℃伅
+   * @param nodeId 妯″瀷鑺傜偣 id
+   * @return
+   */
+  SysEquipmentfile getConfigure(String nodeId);
+
+  /**
+   * 鑾峰彇缁勬�佸浘閰嶇疆鐨勭偣浣嶅彿
+   * @param nodeId 妯″瀷鑺傜偣 id
+   * @return
+   */
+  List<SysSvgInfo> getConfigureTag(String nodeId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardCategoryService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardCategoryService.java
new file mode 100644
index 0000000..4dae6a6
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardCategoryService.java
@@ -0,0 +1,62 @@
+package com.dingzhuo.energy.project.basicSetup.service;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardCategory;
+
+import java.util.List;
+
+/**
+ * categoryService鎺ュ彛
+ * 
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public interface ISysStandardCategoryService 
+{
+    /**
+     * 鏌ヨcategory
+     * 
+     * @param id categoryID
+     * @return category
+     */
+    public SysStandardCategory selectSysStandardCategoryById(String id);
+
+    /**
+     * 鏌ヨcategory鍒楄〃
+     * 
+     * @param sysStandardCategory category
+     * @return category闆嗗悎
+     */
+    public List<SysStandardCategory> selectSysStandardCategoryList(SysStandardCategory sysStandardCategory);
+
+    /**
+     * 鏂板category
+     * 
+     * @param sysStandardCategory category
+     * @return 缁撴灉
+     */
+    public int insertSysStandardCategory(SysStandardCategory sysStandardCategory);
+
+    /**
+     * 淇敼category
+     * 
+     * @param sysStandardCategory category
+     * @return 缁撴灉
+     */
+    public int updateSysStandardCategory(SysStandardCategory sysStandardCategory);
+
+    /**
+     * 鎵归噺鍒犻櫎category
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑categoryID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardCategoryByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎category淇℃伅
+     * 
+     * @param id categoryID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardCategoryById(String id);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardParametersService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardParametersService.java
new file mode 100644
index 0000000..e678e6d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/ISysStandardParametersService.java
@@ -0,0 +1,63 @@
+package com.dingzhuo.energy.project.basicSetup.service;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardParameters;
+import java.util.List;
+
+/**
+ * parametersService鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+public interface ISysStandardParametersService
+{
+    /**
+     * 鏌ヨparameters
+     *
+     * @param id parametersID
+     * @return parameters
+     */
+    public SysStandardParameters selectSysStandardParametersById(String id);
+    /*public List<SysStandardParameters> getStandardParameters();*/
+    public SysStandardParameters getStandardParameters(String id);
+    /**
+     * 鏌ヨparameters鍒楄〃
+     *
+     * @param sysStandardParameters parameters
+     * @return parameters闆嗗悎
+     */
+    public List<SysStandardParameters> selectSysStandardParametersList(SysStandardParameters sysStandardParameters);
+
+    /**
+     * 鏂板parameters
+     *
+     * @param sysStandardParameters parameters
+     * @return 缁撴灉
+     */
+    public int insertSysStandardParameters(SysStandardParameters sysStandardParameters);
+
+    /**
+     * 淇敼parameters
+     *
+     * @param sysStandardParameters parameters
+     * @return 缁撴灉
+     */
+    public int updateSysStandardParameters(SysStandardParameters sysStandardParameters);
+
+    /**
+     * 鎵归噺鍒犻櫎parameters
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑parametersID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardParametersByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎parameters淇℃伅
+     *
+     * @param id parametersID
+     * @return 缁撴灉
+     */
+    public int deleteSysStandardParametersById(String id);
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysEquipmentfileServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysEquipmentfileServiceImpl.java
new file mode 100644
index 0000000..85a6387
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysEquipmentfileServiceImpl.java
@@ -0,0 +1,64 @@
+package com.dingzhuo.energy.project.basicSetup.service.impl;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.dingzhuo.energy.project.basicSetup.domain.SysSvgInfo;
+import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
+import org.apache.batik.util.XMLResourceDescriptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.basicSetup.mapper.SysEquipmentfileMapper;
+import com.dingzhuo.energy.project.basicSetup.domain.SysEquipmentfile;
+import com.dingzhuo.energy.project.basicSetup.service.ISysEquipmentfileService;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+/**
+ * 缁勬�佸浘Service涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-02-24
+ */
+@Service
+public class SysEquipmentfileServiceImpl implements ISysEquipmentfileService {
+
+  @Autowired
+  private SysEquipmentfileMapper equipmentfileMapper;
+
+  @Override
+  public void saveEquipmentFile(SysEquipmentfile sysEquipmentfile) {
+    equipmentfileMapper.saveEquipmentFile(sysEquipmentfile);
+  }
+
+  @Override
+  public void saveSettingInfo(String nodeId, List<SysSvgInfo> svgInfo) {
+    equipmentfileMapper.saveSettingInfo(nodeId, svgInfo);
+  }
+
+  @Override
+  public SysEquipmentfile getConfigure(String nodeId) {
+    SysEquipmentfile sysEquipmentfile = equipmentfileMapper.getConfigure(nodeId);
+    List<SysSvgInfo> infos = getConfigureTag(nodeId);
+    if (sysEquipmentfile != null) {
+      sysEquipmentfile.setInfoList(infos);
+    }
+
+    return sysEquipmentfile;
+  }
+
+  @Override
+  public List<SysSvgInfo> getConfigureTag(String nodeId) {
+    return equipmentfileMapper.getConfigureTag(nodeId);
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardCategoryServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardCategoryServiceImpl.java
new file mode 100644
index 0000000..d2ecbca
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardCategoryServiceImpl.java
@@ -0,0 +1,102 @@
+package com.dingzhuo.energy.project.basicSetup.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.basicSetup.mapper.SysStandardCategoryMapper;
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardCategory;
+import com.dingzhuo.energy.project.basicSetup.service.ISysStandardCategoryService;
+
+/**
+ * categoryService涓氬姟灞傚鐞�
+ * 
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+@Service
+public class SysStandardCategoryServiceImpl implements ISysStandardCategoryService 
+{
+    @Autowired
+    private SysStandardCategoryMapper sysStandardCategoryMapper;
+
+    /**
+     * 鏌ヨcategory
+     * 
+     * @param id categoryID
+     * @return category
+     */
+    @Override
+    public SysStandardCategory selectSysStandardCategoryById(String id)
+    {
+        return sysStandardCategoryMapper.selectSysStandardCategoryById(id);
+    }
+
+    /**
+     * 鏌ヨcategory鍒楄〃
+     * 
+     * @param sysStandardCategory category
+     * @return category
+     */
+    @Override
+    public List<SysStandardCategory> selectSysStandardCategoryList(SysStandardCategory sysStandardCategory)
+    {
+        return sysStandardCategoryMapper.selectSysStandardCategoryList(sysStandardCategory);
+    }
+
+    /**
+     * 鏂板category
+     * 
+     * @param sysStandardCategory category
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysStandardCategory(SysStandardCategory sysStandardCategory)
+    {
+        //sysStandardCategory.setId(UUID.randomUUID().toString());
+        sysStandardCategory.setCreateBy(SecurityUtils.getUsername());
+        sysStandardCategory.setCreateTime(DateUtils.getNowDate());
+        return sysStandardCategoryMapper.insertSysStandardCategory(sysStandardCategory);
+    }
+
+    /**
+     * 淇敼category
+     * 
+     * @param sysStandardCategory category
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysStandardCategory(SysStandardCategory sysStandardCategory)
+    {
+        sysStandardCategory.setUpdateBy(SecurityUtils.getUsername());
+        sysStandardCategory.setUpdateTime(DateUtils.getNowDate());
+        return sysStandardCategoryMapper.updateSysStandardCategory(sysStandardCategory);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎category
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑categoryID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysStandardCategoryByIds(String[] ids)
+    {
+        return sysStandardCategoryMapper.deleteSysStandardCategoryByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎category淇℃伅
+     * 
+     * @param id categoryID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysStandardCategoryById(String id)
+    {
+        return sysStandardCategoryMapper.deleteSysStandardCategoryById(id);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardParametersServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardParametersServiceImpl.java
new file mode 100644
index 0000000..07faa1c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/basicSetup/service/impl/SysStandardParametersServiceImpl.java
@@ -0,0 +1,106 @@
+package com.dingzhuo.energy.project.basicSetup.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.basicSetup.mapper.SysStandardParametersMapper;
+import com.dingzhuo.energy.project.basicSetup.domain.SysStandardParameters;
+import com.dingzhuo.energy.project.basicSetup.service.ISysStandardParametersService;
+
+/**
+ * parametersService涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-12
+ */
+@Service
+public class SysStandardParametersServiceImpl implements ISysStandardParametersService
+{
+    @Autowired
+    private SysStandardParametersMapper sysStandardParametersMapper;
+
+    /**
+     * 鏌ヨparameters
+     *
+     * @param id parametersID
+     * @return parameters
+     */
+    @Override
+    public SysStandardParameters selectSysStandardParametersById(String id)
+    {
+        return sysStandardParametersMapper.selectSysStandardParametersById(id);
+    }
+   /* public List<SysStandardParameters> getStandardParameters(){
+        return sysStandardParametersMapper.getStandardParameters();
+    }*/
+   public SysStandardParameters getStandardParameters(String id){
+       return sysStandardParametersMapper.getStandardParameters(id);
+   }
+    /**
+     * 鏌ヨparameters鍒楄〃
+     *
+     * @param sysStandardParameters parameters
+     * @return parameters
+     */
+    @Override
+    public List<SysStandardParameters> selectSysStandardParametersList(SysStandardParameters sysStandardParameters)
+    {
+        return sysStandardParametersMapper.selectSysStandardParametersList(sysStandardParameters);
+    }
+
+    /**
+     * 鏂板parameters
+     *
+     * @param sysStandardParameters parameters
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertSysStandardParameters(SysStandardParameters sysStandardParameters) {
+        /*sysStandardParameters.setId(UUID.randomUUID().toString())*/;
+        sysStandardParameters.setCreateBy(SecurityUtils.getUsername());
+        sysStandardParameters.setCreateTime(DateUtils.getNowDate());
+        return sysStandardParametersMapper.insertSysStandardParameters(sysStandardParameters);
+    }
+
+    /**
+     * 淇敼parameters
+     *
+     * @param sysStandardParameters parameters
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateSysStandardParameters(SysStandardParameters sysStandardParameters){
+        sysStandardParameters.setUpdateBy(SecurityUtils.getUsername());
+        sysStandardParameters.setUpdateTime(DateUtils.getNowDate());
+        return sysStandardParametersMapper.updateSysStandardParameters(sysStandardParameters);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎parameters
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑parametersID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysStandardParametersByIds(String[] ids)
+    {
+        return sysStandardParametersMapper.deleteSysStandardParametersByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎parameters淇℃伅
+     *
+     * @param id parametersID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteSysStandardParametersById(String id)
+    {
+        return sysStandardParametersMapper.deleteSysStandardParametersById(id);
+    }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/BenchmarkingManagementController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/BenchmarkingManagementController.java
new file mode 100644
index 0000000..d5adaad
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/BenchmarkingManagementController.java
@@ -0,0 +1,149 @@
+package com.dingzhuo.energy.project.benchmarking.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+import com.dingzhuo.energy.project.benchmarking.service.IBenchmarkingManagementService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+
+/**
+ * 鏍囨潌绠$悊Controller
+ * 
+ * @author sys
+ * @date 2020-12-21
+ */
+@RestController
+@RequestMapping("/benchmarking/BenchmarkingManagement")
+public class BenchmarkingManagementController extends BaseController
+{
+    @Autowired
+    private IBenchmarkingManagementService benchmarkingManagementService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    /**
+     * 鏌ヨ鏍囨潌绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('benchmarking:BenchmarkingManagement:list')")
+    @GetMapping("/list")
+    public AjaxResult list(BenchmarkingManagement benchmarkingManagement)
+    {
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(benchmarkingManagement.getIndexId());
+        List<String> indexCode = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<BenchmarkingManagement> list;
+        list = benchmarkingManagementService.selectBenchmarkingManagementList(indexCode,benchmarkingManagement.getDateTime(), benchmarkingManagement.getTimeType());
+        if(list.size()==0){
+            list = benchmarkingManagementService.selectBenchmarkingList(indexCode,benchmarkingManagement);
+        }
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 瀵煎嚭鏍囨潌绠$悊鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('benchmarking:BenchmarkingManagement:export')")
+    @Log(title = "鏍囨潌绠$悊", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(BenchmarkingManagement benchmarkingManagement)
+    {
+        String timeCode = TimeManager.getTimeCode(benchmarkingManagement.getDateTime(), benchmarkingManagement.getTimeType());
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(benchmarkingManagement.getIndexId());
+        List<String> indexCode = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<BenchmarkingManagement> list = benchmarkingManagementService.selectBenchmarkingManagementList(indexCode,benchmarkingManagement.getDateTime(), benchmarkingManagement.getTimeType());
+        ExcelUtil<BenchmarkingManagement> util = new ExcelUtil<BenchmarkingManagement>(BenchmarkingManagement.class);
+        return util.exportExcel(list, "BenchmarkingManagement");
+    }
+
+    /**
+     * 鑾峰彇銆愯濉啓鍔熻兘鍚嶇О銆戣缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('system:management:query')")
+    @GetMapping(value = "/{indexId}")
+    public AjaxResult getInfo(@PathVariable("indexId") String indexId)
+    {
+        return AjaxResult.success(benchmarkingManagementService.selectBenchmarkingManagementById(indexId));
+    }
+    /**
+     * 鏂板鏍囨潌绠$悊
+     */
+    @PreAuthorize("@ss.hasPermi('benchmarking:BenchmarkingManagement:add')")
+    @Log(title = "鏍囨潌绠$悊", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody List<BenchmarkingManagement> listMap) {
+        List<BenchmarkingManagement> benchmarking = new ArrayList<>();
+        listMap.forEach(data -> {
+            String timeCode = TimeManager.getTimeCode(data.getDateTime(), data.getTimeType());
+            BenchmarkingManagement dataItem = new BenchmarkingManagement();
+            dataItem.setTimeCode(timeCode);
+            dataItem.setIndexId(data.getIndexId());
+            dataItem.setValue(data.getValue());
+            dataItem.setDateTime(data.getDateTime());
+            dataItem.setTimeType(data.getTimeType());
+            dataItem.setActualValue(data.getActualValue());
+            dataItem.setBenchmarkingRange(data.getBenchmarkingRange());
+            dataItem.setBenchmarkingType(data.getBenchmarkingType());
+            benchmarking.add(dataItem);
+        });
+        try {
+            this.benchmarkingManagementService.save(benchmarking);
+            return AjaxResult.success("淇濆瓨鎴愬姛锛�");
+        }catch (Exception ex) {
+            logger.error("淇濆瓨澶辫触锛�" + ex.getMessage());
+            return AjaxResult.success(ex.getMessage());
+        }
+        //return toAjax(benchmarkingManagementService.insertBenchmarkingManagement(benchmarkingManagement));
+    }
+
+    /**
+     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    /*@PreAuthorize("@ss.hasPermi('system:management:add')")
+    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody BenchmarkingManagement benchmarkingManagement)
+    {
+        return toAjax(benchmarkingManagementService.insertBenchmarkingManagement(benchmarkingManagement));
+    }*/
+
+    /**
+     * 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    @PreAuthorize("@ss.hasPermi('system:management:edit')")
+    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody BenchmarkingManagement benchmarkingManagement)
+    {
+        return toAjax(benchmarkingManagementService.updateBenchmarkingManagement(benchmarkingManagement));
+    }
+
+    /**
+     * 鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    @PreAuthorize("@ss.hasPermi('system:management:remove')")
+    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{indexIds}")
+    public AjaxResult remove(@PathVariable String[] indexIds)
+    {
+        return toAjax(benchmarkingManagementService.deleteBenchmarkingManagementByIds(indexIds));
+    }
+
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/PhaseBenchmarkingController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/PhaseBenchmarkingController.java
new file mode 100644
index 0000000..25848cc
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/controller/PhaseBenchmarkingController.java
@@ -0,0 +1,52 @@
+package com.dingzhuo.energy.project.benchmarking.controller;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.project.benchmarking.service.IPhaseBenchmarkingService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 瀵规爣Controller
+ * 
+ * @author sys
+ * @date 2020-12-22
+ */
+@RestController
+@RequestMapping("/benchmarking/phaseBenchmarking")
+public class PhaseBenchmarkingController extends BaseController
+{
+    @Autowired
+    private IPhaseBenchmarkingService phaseBenchmarkingService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    /**
+     * 鏌ヨ闃舵瀵规爣鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('benchmarking:phaseBenchmarking:list')")
+    @GetMapping("/list")
+    public AjaxResult list(BenchmarkingManagement phaseBenchmarking)
+    {
+        List<BenchmarkingManagement> list = phaseBenchmarkingService.selectPhaseBenchmarkingList(phaseBenchmarking.getIndexId(),phaseBenchmarking.getBeginTime(),phaseBenchmarking.getEndTime(), phaseBenchmarking.getTimeType());
+        return AjaxResult.success(list);
+    }
+    /*瀹炴椂瀵规爣*/
+    @PreAuthorize("@ss.hasPermi('benchmarking:phaseBenchmarking:realTimeListrealTime')")
+    @GetMapping("/realTimeListrealTime")
+    public AjaxResult realTimeListrealTime(BenchmarkingManagement phaseBenchmarking)
+    {
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(phaseBenchmarking.getIndexId());
+        List<String> indexCode = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<BenchmarkingManagement> list = phaseBenchmarkingService.selectRealTimeListrealTime(indexCode,phaseBenchmarking.getDateTime(), phaseBenchmarking.getTimeType());
+        return AjaxResult.success(list);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/BenchmarkingManagement.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/BenchmarkingManagement.java
new file mode 100644
index 0000000..c8b57c4
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/BenchmarkingManagement.java
@@ -0,0 +1,200 @@
+package com.dingzhuo.energy.project.benchmarking.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 鏍囨潌绠$悊瀵硅薄 benchmarking_management
+ * 
+ * @author sys
+ * @date 2020-12-21
+ */
+public class BenchmarkingManagement implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    @Excel(name = "鎸囨爣ID")
+    private String indexId;
+    @Excel(name = "鎸囨爣code")
+    private String indexCode;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    @Excel(name = "鎸囨爣鍗曚綅")
+    private String unitId;
+
+    /** $column.columnComment */
+    @Excel(name = "鏃ユ湡绫诲瀷")
+    private TimeType timeType;
+
+    /** $column.columnComment */
+    @Excel(name = "鏃ユ湡")
+    private Date dateTime;
+
+    /** $column.columnComment */
+    @Excel(name = "鏍囨潌鍊�")
+    private String value;
+    @Excel(name = "瀹為檯鍊�")
+    private String actualValue;
+    /** $column.columnComment */
+    @Excel(name = "${comment}")
+    private String timeCode;
+    @Excel(name = "鏍囨潌鑼冨洿")
+    private String  benchmarkingRange;
+    @Excel(name = "鏍囨潌绫诲瀷")
+    private String  benchmarkingType;
+    private Date beginTime;
+    private Date endTime;
+    private Date createTime;
+    private Date updateTime;
+    public String getIndexId()
+    {
+        return indexId;
+    }
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getIndexCode() {
+        return indexCode;
+    }
+
+    public void setIndexCode(String indexCode) {
+        this.indexCode = indexCode;
+    }
+
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+
+    public void setTimeType(TimeType timeType)
+    {
+        this.timeType = timeType;
+    }
+
+    public TimeType getTimeType()
+    {
+        return timeType;
+    }
+    public void setDateTime(Date dateTime) 
+    {
+        this.dateTime = dateTime;
+    }
+
+    public Date getDateTime() 
+    {
+        return dateTime;
+    }
+    public void setValue(String value) 
+    {
+        this.value = value;
+    }
+
+    public String getValue() 
+    {
+        return value;
+    }
+
+    public String getActualValue() {
+        return actualValue;
+    }
+
+    public void setActualValue(String actualValue) {
+        this.actualValue = actualValue;
+    }
+
+    public void setTimeCode(String timeCode)
+    {
+        this.timeCode = timeCode;
+    }
+
+    public String getTimeCode() 
+    {
+        return timeCode;
+    }
+
+    public String getBenchmarkingRange() {
+        return benchmarkingRange;
+    }
+
+    public void setBenchmarkingRange(String benchmarkingRange) {
+        this.benchmarkingRange = benchmarkingRange;
+    }
+
+    public String getBenchmarkingType() {
+        return benchmarkingType;
+    }
+
+    public void setBenchmarkingType(String benchmarkingType) {
+        this.benchmarkingType = benchmarkingType;
+    }
+
+
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("indexId", getIndexId())
+            .append("indexName", getIndexName())
+            .append("unitId", getUnitId())
+            .append("timeType", getTimeType())
+            .append("dateTime", getDateTime())
+            .append("value", getValue())
+            .append("actualValue", getActualValue())
+            .append("timeCode", getTimeCode())
+            .append("benchmarkingRange", getBenchmarkingRange())
+            .append("benchmarkingType", getBenchmarkingType())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/PhaseBenchmarking.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/PhaseBenchmarking.java
new file mode 100644
index 0000000..4e0f362
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/domain/PhaseBenchmarking.java
@@ -0,0 +1,97 @@
+package com.dingzhuo.energy.project.benchmarking.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 瀵规爣瀵硅薄 phase_benchmarking
+ * 
+ * @author sys
+ * @date 2020-12-22
+ */
+public class PhaseBenchmarking extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String indexId;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String timeCode;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String timeType;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String value;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Date dataTime;
+
+    public void setIndexId(String indexId) 
+    {
+        this.indexId = indexId;
+    }
+
+    public String getIndexId() 
+    {
+        return indexId;
+    }
+    public void setTimeCode(String timeCode) 
+    {
+        this.timeCode = timeCode;
+    }
+
+    public String getTimeCode() 
+    {
+        return timeCode;
+    }
+    public void setTimeType(String timeType) 
+    {
+        this.timeType = timeType;
+    }
+
+    public String getTimeType() 
+    {
+        return timeType;
+    }
+    public void setValue(String value) 
+    {
+        this.value = value;
+    }
+
+    public String getValue() 
+    {
+        return value;
+    }
+    public void setDataTime(Date dataTime) 
+    {
+        this.dataTime = dataTime;
+    }
+
+    public Date getDataTime() 
+    {
+        return dataTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("indexId", getIndexId())
+            .append("timeCode", getTimeCode())
+            .append("timeType", getTimeType())
+            .append("value", getValue())
+            .append("dataTime", getDataTime())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/BenchmarkingManagementMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/BenchmarkingManagementMapper.java
new file mode 100644
index 0000000..dad8c42
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/BenchmarkingManagementMapper.java
@@ -0,0 +1,65 @@
+package com.dingzhuo.energy.project.benchmarking.mapper;
+
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 鏍囨潌绠$悊Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-21
+ */
+public interface BenchmarkingManagementMapper 
+{
+    /**
+     * 鏌ヨ鏍囨潌绠$悊
+     * 
+     * @param indexId 鏍囨潌绠$悊ID
+     * @return 鏍囨潌绠$悊
+     */
+    public BenchmarkingManagement selectBenchmarkingManagementById(String indexId);
+
+    /**
+     * 鏌ヨ鏍囨潌绠$悊鍒楄〃
+     * 
+     * @param
+     * @return 鏍囨潌绠$悊闆嗗悎
+     */
+    public List<BenchmarkingManagement> selectBenchmarkingManagementList(@Param("indexIds") List<String> indexIds,@Param("timeCode") String timeCode);
+    public List<BenchmarkingManagement> selectBenchmarkingList(@Param("indexIds") List<String> indexIds, BenchmarkingManagement benchmarkingManagement);
+    /**
+     * 鏂板鏍囨潌绠$悊
+     * 
+     * @param benchmarkingManagement 鏍囨潌绠$悊
+     * @return 缁撴灉
+     */
+    public int insertBenchmarkingManagement(BenchmarkingManagement benchmarkingManagement);
+
+    /**
+     * 淇敼鏍囨潌绠$悊
+     * 
+     * @param benchmarkingManagement 鏍囨潌绠$悊
+     * @return 缁撴灉
+     */
+    public int updateBenchmarkingManagement(BenchmarkingManagement benchmarkingManagement);
+
+    /**
+     * 鍒犻櫎鏍囨潌绠$悊
+     * 
+     * @param indexId 鏍囨潌绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteBenchmarkingManagementById(String indexId);
+
+    /**
+     * 鎵归噺鍒犻櫎鏍囨潌绠$悊
+     * 
+     * @param indexIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteBenchmarkingManagementByIds(String[] indexIds);
+
+    void save(@Param("benchmarkingManagement") BenchmarkingManagement benchmarkingManagement);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/PhaseBenchmarkingMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/PhaseBenchmarkingMapper.java
new file mode 100644
index 0000000..05c1979
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/mapper/PhaseBenchmarkingMapper.java
@@ -0,0 +1,28 @@
+package com.dingzhuo.energy.project.benchmarking.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 瀵规爣Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-22
+ */
+public interface PhaseBenchmarkingMapper 
+{
+    /**
+     * 鏌ヨ瀵规爣鍒楄〃
+     * 
+     * @param
+     * @return 瀵规爣闆嗗悎
+     */
+    public List<BenchmarkingManagement> selectPhaseBenchmarkingList(@Param("indexId") String indexIds,@Param("beginTime") Date beginTime,
+                                                                    @Param("endTime") Date endTime,@Param("timeType") TimeType timeType);
+    public List<BenchmarkingManagement> selectRealTimeListrealTime(@Param("indexIds") List<String> indexIds, @Param("timeCode") String timeCode);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IBenchmarkingManagementService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IBenchmarkingManagementService.java
new file mode 100644
index 0000000..15ab2db
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IBenchmarkingManagementService.java
@@ -0,0 +1,64 @@
+package com.dingzhuo.energy.project.benchmarking.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鏍囨潌绠$悊Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-21
+ */
+public interface IBenchmarkingManagementService 
+{
+    /**
+     * 鏌ヨ鏍囨潌绠$悊
+     * 
+     * @param indexId 鏍囨潌绠$悊ID
+     * @return 鏍囨潌绠$悊
+     */
+    public BenchmarkingManagement selectBenchmarkingManagementById(String indexId);
+
+    /**
+     * 鏌ヨ鏍囨潌绠$悊鍒楄〃
+     * 
+     * @param
+     * @return 鏍囨潌绠$悊闆嗗悎
+     */
+    public List<BenchmarkingManagement> selectBenchmarkingManagementList(List<String> indexIds, Date dateTime,TimeType timeType);
+    public List<BenchmarkingManagement> selectBenchmarkingList(List<String> indexIds,BenchmarkingManagement benchmarkingManagement);
+    /**
+     * 鏂板鏍囨潌绠$悊
+     * 
+     * @param benchmarkingManagement 鏍囨潌绠$悊
+     * @return 缁撴灉
+     */
+    public int insertBenchmarkingManagement(BenchmarkingManagement benchmarkingManagement);
+    public void save(List<BenchmarkingManagement> datas);
+    /**
+     * 淇敼鏍囨潌绠$悊
+     * 
+     * @param benchmarkingManagement 鏍囨潌绠$悊
+     * @return 缁撴灉
+     */
+    public int updateBenchmarkingManagement(BenchmarkingManagement benchmarkingManagement);
+
+    /**
+     * 鎵归噺鍒犻櫎鏍囨潌绠$悊
+     * 
+     * @param indexIds 闇�瑕佸垹闄ょ殑鏍囨潌绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteBenchmarkingManagementByIds(String[] indexIds);
+
+    /**
+     * 鍒犻櫎鏍囨潌绠$悊淇℃伅
+     * 
+     * @param indexId 鏍囨潌绠$悊ID
+     * @return 缁撴灉
+     */
+    public int deleteBenchmarkingManagementById(String indexId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IPhaseBenchmarkingService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IPhaseBenchmarkingService.java
new file mode 100644
index 0000000..6d63375
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/IPhaseBenchmarkingService.java
@@ -0,0 +1,28 @@
+package com.dingzhuo.energy.project.benchmarking.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 瀵规爣Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-22
+ */
+public interface IPhaseBenchmarkingService 
+{
+
+    /**
+     * 鏌ヨ瀵规爣鍒楄〃
+     * 
+     * @param
+     * @return 瀵规爣闆嗗悎
+     */
+    public List<BenchmarkingManagement> selectPhaseBenchmarkingList(String indexId, Date beginTime,Date endTime, TimeType timeType);
+    public List<BenchmarkingManagement> selectRealTimeListrealTime(List<String> indexIds, Date dateTime, TimeType timeType);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/BenchmarkingManagementServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/BenchmarkingManagementServiceImpl.java
new file mode 100644
index 0000000..a667f0e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/BenchmarkingManagementServiceImpl.java
@@ -0,0 +1,151 @@
+package com.dingzhuo.energy.project.benchmarking.service.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.benchmarking.mapper.BenchmarkingManagementMapper;
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+import com.dingzhuo.energy.project.benchmarking.service.IBenchmarkingManagementService;
+
+/**
+ * 鏍囨潌绠$悊Service涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-12-21
+ */
+@Service
+public class BenchmarkingManagementServiceImpl implements IBenchmarkingManagementService 
+{
+    private Logger logger = LogManager.getLogger(BenchmarkingManagementServiceImpl.class);
+    @Autowired
+    private BenchmarkingManagementMapper benchmarkingManagementMapper;
+
+    /**
+     * 鏌ヨ鏍囨潌绠$悊
+     * 
+     * @param indexId 鏍囨潌绠$悊ID
+     * @return 鏍囨潌绠$悊
+     */
+    @Override
+    public BenchmarkingManagement selectBenchmarkingManagementById(String indexId)
+    {
+        return benchmarkingManagementMapper.selectBenchmarkingManagementById(indexId);
+    }
+    @Override
+    public List<BenchmarkingManagement> selectBenchmarkingList(List<String> indexIds,BenchmarkingManagement benchmarkingManagement)
+    {
+        if (indexIds.size() !=0) {
+            return benchmarkingManagementMapper.selectBenchmarkingList(indexIds,benchmarkingManagement);
+        }
+        return Collections.emptyList();
+    }
+    /**
+     * 鏌ヨ鏍囨潌绠$悊鍒楄〃
+     * 
+     * @param
+     * @return 鏍囨潌绠$悊
+     */
+    @Override
+    public List<BenchmarkingManagement> selectBenchmarkingManagementList(List<String> indexIds, Date dateTime, TimeType timeType)
+    {
+        if (indexIds.size() !=0) {
+            String timeCode = TimeManager.getTimeCode(dateTime, timeType);
+            return  benchmarkingManagementMapper.selectBenchmarkingManagementList(indexIds,timeCode);
+        }
+        return Collections.emptyList();
+    }
+
+    /**
+     * 鏂板鏍囨潌绠$悊
+     * 
+     * @param benchmarkingManagement 鏍囨潌绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertBenchmarkingManagement(BenchmarkingManagement benchmarkingManagement)
+    {
+        benchmarkingManagement.setCreateTime(DateUtils.getNowDate());
+        return benchmarkingManagementMapper.insertBenchmarkingManagement(benchmarkingManagement);
+    }
+
+    @Override
+    public void save(List<BenchmarkingManagement> datas) {
+        List<List<BenchmarkingManagement>> splitDatas = splitList(datas, 100);
+        if (splitDatas != null) {
+            splitDatas.parallelStream().forEach(dataPart -> {
+                dataPart.parallelStream().forEach(dataItem -> {
+                    try {
+                        benchmarkingManagementMapper.save(dataItem);
+                    } catch (Exception singleEx) {
+                        logger.error("鍗曚釜鎸囨爣鏁版嵁淇濆瓨澶辫触锛併��" + dataItem + "銆�", singleEx);
+                    }
+                });
+            });
+        }
+    }
+    /**
+     * 淇敼鏍囨潌绠$悊
+     * 
+     * @param benchmarkingManagement 鏍囨潌绠$悊
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateBenchmarkingManagement(BenchmarkingManagement benchmarkingManagement)
+    {
+        benchmarkingManagement.setUpdateTime(DateUtils.getNowDate());
+        return benchmarkingManagementMapper.updateBenchmarkingManagement(benchmarkingManagement);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鏍囨潌绠$悊
+     * 
+     * @param indexIds 闇�瑕佸垹闄ょ殑鏍囨潌绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBenchmarkingManagementByIds(String[] indexIds)
+    {
+        return benchmarkingManagementMapper.deleteBenchmarkingManagementByIds(indexIds);
+    }
+
+    /**
+     * 鍒犻櫎鏍囨潌绠$悊淇℃伅
+     * 
+     * @param indexId 鏍囨潌绠$悊ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteBenchmarkingManagementById(String indexId)
+    {
+        return benchmarkingManagementMapper.deleteBenchmarkingManagementById(indexId);
+    }
+    public static <E> List<List<E>> splitList(List<E> targetList, Integer splitSize) {
+        if (targetList == null) {
+            return Collections.emptyList();
+        }
+
+        int size = targetList.size();
+        List<List<E>> resultList = new ArrayList<>();
+        if (size <= splitSize) {
+            resultList.add(targetList);
+        } else {
+            for (int i = 0; i < size; i += splitSize) {
+                //鐢ㄤ簬闄愬埗鏈�鍚庝竴閮ㄥ垎size灏忎簬splitSize鐨刲ist
+                int limit = i + splitSize;
+                if (limit > size) {
+                    limit = size;
+                }
+                resultList.add(targetList.subList(i, limit));
+            }
+        }
+        return resultList;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/PhaseBenchmarkingServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/PhaseBenchmarkingServiceImpl.java
new file mode 100644
index 0000000..b81c761
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/benchmarking/service/impl/PhaseBenchmarkingServiceImpl.java
@@ -0,0 +1,49 @@
+package com.dingzhuo.energy.project.benchmarking.service.impl;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.benchmarking.mapper.PhaseBenchmarkingMapper;
+import com.dingzhuo.energy.project.benchmarking.service.IPhaseBenchmarkingService;
+
+/**
+ * 瀵规爣Service涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-12-22
+ */
+@Service
+public class PhaseBenchmarkingServiceImpl implements IPhaseBenchmarkingService 
+{
+    @Autowired
+    private PhaseBenchmarkingMapper phaseBenchmarkingMapper;
+
+    /**
+     * 鏌ヨ瀵规爣鍒楄〃
+     * 
+     * @param
+     * @return 瀵规爣
+     */
+    @Override
+    public List<BenchmarkingManagement> selectPhaseBenchmarkingList(String indexId,Date beginTime, Date endTime, TimeType timeType)
+    {
+        return phaseBenchmarkingMapper.selectPhaseBenchmarkingList(indexId,beginTime,endTime,timeType);
+    }
+    @Override
+    public List<BenchmarkingManagement> selectRealTimeListrealTime(List<String> indexIds, Date dateTime, TimeType timeType)
+    {
+        if (indexIds.size() !=0) {
+            String timeCode = TimeManager.getTimeCode(dateTime, timeType);
+            return phaseBenchmarkingMapper.selectRealTimeListrealTime(indexIds,timeCode);
+        }
+        return Collections.emptyList();
+
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/CommonConst.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/CommonConst.java
new file mode 100644
index 0000000..ea4a93d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/CommonConst.java
@@ -0,0 +1,145 @@
+package com.dingzhuo.energy.project.common;
+
+/**
+ * @Description: 甯搁噺灏佽
+ * @author: yxw
+ * @date: 2022骞�02鏈�02鏃� 11:37
+ */
+public class CommonConst {
+    /**
+     * 甯搁噺瀛楃涓� - 绌哄瓧绗︿覆
+     */
+    public static final String EMPTY = "";
+    /**
+     * 鍙屽噺鍙�
+     */
+    public static final String DOUBLE_MINUS_SIGN = "--";
+    /**
+     * 鐧惧垎姣�
+     */
+    public static final String PERCENTAGE = "%";
+    /**
+     * 娓╁害
+     */
+    public static final String UNIT_TEMPERATURE = "掳";
+    /**
+     * 瀛楃涓叉暟瀛� 0
+     */
+    public static final String STR_NUMBER_0 = "0";
+    /**
+     * 瀛楃涓叉暟瀛� 1
+     */
+    public static final String STR_NUMBER_1 = "1";
+    /**
+     * 瀛楃涓叉暟瀛� 2
+     */
+    public static final String STR_NUMBER_2 = "2";
+    /**
+     * 瀛楃涓叉暟瀛� 3
+     */
+    public static final String STR_NUMBER_3 = "3";
+    /**
+     * 瀛楃涓叉暟瀛� 4
+     */
+    public static final String STR_NUMBER_4 = "4";
+    /**
+     * 瀛楃涓叉暟瀛� 5
+     */
+    public static final String STR_NUMBER_5 = "5";
+    /**
+     * 瀛楃涓叉暟瀛� 6
+     */
+    public static final String STR_NUMBER_6 = "6";
+    /**
+     * 瀛楃涓叉暟瀛� 7
+     */
+    public static final String STR_NUMBER_7 = "7";
+    /**
+     * 瀛楃涓叉暟瀛� 8
+     */
+    public static final String STR_NUMBER_8 = "8";
+    /**
+     * 瀛楃涓叉暟瀛� 9
+     */
+    public static final String STR_NUMBER_9 = "9";
+    /**
+     * 瀛楃涓叉暟瀛� 10
+     */
+    public static final String STR_NUMBER_10 = "10";
+    /**
+     * 瀛楃涓叉暟瀛� 11
+     */
+    public static final String STR_NUMBER_11 = "11";
+    /**
+     * 瀛楃涓叉暟瀛� 12
+     */
+    public static final String STR_NUMBER_12 = "12";
+    /**
+     * 澶у啓瀛楁瘝 M
+     */
+    public static final String WORD_M = "M";
+    /**
+     * 澶у啓瀛楁瘝 Y
+     */
+    public static final String WORD_Y = "Y";
+    /**
+     * 澶у啓瀛楁瘝 D
+     */
+    public static final String WORD_D = "D";
+    /**
+     * 鏁板瓧 0
+     */
+    public static final int DIGIT_0 = 0;
+    /**
+     * 鏁板瓧 1
+     */
+    public static final int DIGIT_1 = 1;
+    /**
+     * 鏁板瓧 2
+     */
+    public static final int DIGIT_2 = 2;
+    /**
+     * 鏁板瓧 3
+     */
+    public static final int DIGIT_3 = 3;
+    /**
+     * 鏁板瓧 4
+     */
+    public static final int DIGIT_4 = 4;
+    /**
+     * 鏁板瓧 100
+     */
+    public static final int DIGIT_100 = 100;
+    /**
+     * 鏁板瓧 1000
+     */
+    public static final int DIGIT_1000 = 1000;
+    /**
+     * 鏁板瓧 -1
+     */
+    public static final int DIGIT_MINUS_1 = -1;
+    /**
+     * 鏁板瓧 -3
+     */
+    public static final int DIGIT_MINUS_3 = -3;
+    /**
+     * 璁$畻鐐硅瘑鍒鍒� 绱Н閲�
+     */
+    public static final String COMMON_STR_CALC_POINT_RULE_LJL = "_LJL";
+    /**
+     * 璁$畻鐐硅瘑鍒鍒� 缁煎悎鑳借��
+     */
+    public static final String COMMON_STR_CALC_POINT_RULE_ZHNH = "_ZHNH";
+    /**
+     * 璁$畻鐐硅瘑鍒鍒� 鑳芥簮浠锋牸
+     */
+    public static final String COMMON_STR_CALC_POINT_RULE_NYJG = "_NYJG";
+    /**
+     * 鏃堕棿绫诲瀷瀛楃涓� - 澶�
+     */
+    public static final String TIME_TYPE_DAY = "DAY";
+    /**
+     * 閲嶇畻鎺ュ彛鍦板潃
+     */
+    public static final String RE_CALC_INTERFACE_ADDRESS = "http://127.0.0.1:8999/computing/recalc";
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DateTimeUtil.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DateTimeUtil.java
new file mode 100644
index 0000000..1593d17
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DateTimeUtil.java
@@ -0,0 +1,399 @@
+package com.dingzhuo.energy.project.common;
+
+import cn.hutool.core.date.DateTime;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+/**
+ * @Description: 鏃堕棿宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�02鏈�02鏃� 12:23
+ */
+public class DateTimeUtil {
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡
+     */
+    public static final String COMMON_PATTERN = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 骞翠唤
+     */
+    public static final String COMMON_PATTERN_YEAR = "yyyy";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+     */
+    public static final String COMMON_PATTERN_MONTH = "yyyyMM";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 鏈堜唤
+     */
+    public static final String COMMON_PATTERN_TO_MONTH = "yyyy-MM";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+     */
+    public static final String COMMON_PATTERN_DAY = "yyyyMMdd";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 澶�
+     */
+    public static final String COMMON_PATTERN_TO_DAY = "yyyy-MM-dd";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 澶╂煇涓�澶�,
+     */
+    public static final String COMMON_PATTERN_DAY_OF_MONTH = "dd";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+     */
+    public static final String COMMON_PATTERN_HOUR = "yyyyMMddHH";
+    /**
+     * 鏃ユ湡甯哥敤鏍煎紡 - 灏忔椂
+     */
+    public static final String COMMON_PATTERN_TO_HOUR = "yyyy-MM-dd HH";
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿,鏃堕棿鏍煎紡锛歽yyy-MM-dd HH:mm:ss
+     *
+     * @return
+     */
+    public static String getNowDateTime() {
+        return getNowDateTime(COMMON_PATTERN);
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿
+     *
+     * @param pattern 鏃堕棿鏍煎紡
+     * @return
+     */
+    public static String getNowDateTime(String pattern) {
+        //璁剧疆鏃ユ湡鏍煎紡
+        SimpleDateFormat df = new SimpleDateFormat(pattern);
+        String dateTime = df.format(new Date());
+        return dateTime;
+    }
+
+    /**
+     * 鑾峰彇浠婂勾鐨勫勾浠藉��
+     *
+     * @return
+     */
+    public static String getNowYear() {
+        return getNowDateTime(COMMON_PATTERN_YEAR);
+    }
+
+    /**
+     * 鑾峰彇浠婂勾鐨勬湀浠藉��
+     *
+     * @return
+     */
+    public static String getNowMonth() {
+        return getNowDateTime(COMMON_PATTERN_MONTH);
+    }
+
+    /**
+     * 瀛楃涓茶浆鎴愭椂闂寸被鍨�,榛樿鏍煎紡锛歽yyy-MM-dd HH:mm:ss
+     *
+     * @param dateTimeStr
+     * @return
+     */
+    public static Date toDateTime(String dateTimeStr) {
+        DateTime dt = null;
+        try {
+            dt = DateTime.of(dateTimeStr, COMMON_PATTERN);
+        } catch (Exception e) {
+
+        }
+        return dt;
+    }
+
+    /**
+     * 瀛楃涓茶浆鎴愭椂闂寸被鍨�
+     *
+     * @param dateTimeStr
+     * @return
+     */
+    public static Date toDateTime(String dateTimeStr, String pattern) {
+        DateTime dt = null;
+        try {
+            dt = DateTime.of(dateTimeStr, pattern);
+        } catch (Exception e) {
+
+        }
+        return dt;
+    }
+
+    /**
+     * 瀛楃涓茶浆鎴愮壒瀹氭牸寮忕殑鏃堕棿瀛楃涓茬被鍨�
+     *
+     * @param dateTimeStr   鏃堕棿瀛楃涓�
+     * @param sourcePattern 瀛楃涓叉椂闂存牸寮�
+     * @param toPattern     瑕佽浆鎴愪粈涔堟牸寮忕殑鏃堕棿
+     * @return
+     */
+    public static String toDateTimeStr(String dateTimeStr, String sourcePattern, String toPattern) {
+        String str = CommonConst.EMPTY;
+        try {
+            DateTime dt = DateTime.of(dateTimeStr, sourcePattern);
+            str = getDateTime(dt, toPattern);
+        } catch (Exception e) {
+
+        }
+        return str;
+    }
+
+    /**
+     * 鏃堕棿杞垚鎸囧畾鏍煎紡鐨勫瓧绗︿覆
+     *
+     * @param pattern 鏃堕棿鏍煎紡
+     * @return
+     */
+    public static String getDateTime(Date dt, String pattern) {
+        if (dt == null) {
+            return CommonConst.EMPTY;
+        }
+        //璁剧疆鏃ユ湡鏍煎紡
+        SimpleDateFormat df = new SimpleDateFormat(pattern);
+        return df.format(dt);
+    }
+
+    /**
+     * 鏍规嵁瀛楃涓蹭互鍙婃椂闂寸被鍨嬭幏鍙栨椂闂村��
+     *
+     * @param dateTime
+     * @param timeType
+     * @return
+     */
+    public static String getDateTimeStrWithTimeType(Date dateTime, String timeType) {
+        String str = CommonConst.EMPTY;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                str = getDateTime(dateTime, COMMON_PATTERN_TO_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                str = getDateTime(dateTime, COMMON_PATTERN_TO_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                str = getDateTime(dateTime, COMMON_PATTERN_TO_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                str = getDateTime(dateTime, COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return str;
+    }
+
+    /**
+     * 鏍规嵁瀛楃涓蹭互鍙婃椂闂存牸寮忚幏鍙栨椂闂村��
+     *
+     * @param dateTimeStr
+     * @param timeType
+     * @return
+     */
+    public static Date getDateTimeWithTimeType(String dateTimeStr, String timeType) {
+        Date dt = null;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                dt = toDateTime(dateTimeStr, COMMON_PATTERN_TO_HOUR);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                dt = toDateTime(dateTimeStr, COMMON_PATTERN_TO_DAY);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                dt = toDateTime(dateTimeStr, COMMON_PATTERN_TO_MONTH);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                dt = toDateTime(dateTimeStr, COMMON_PATTERN_YEAR);
+                break;
+            default:
+                break;
+        }
+        return dt;
+    }
+
+    /**
+     * 鏍规嵁瀛楃涓蹭互鍙婃椂闂存牸绫诲瀷鑾峰彇鏃堕棿鍊�
+     *
+     * @param dateTime
+     * @param timeType
+     * @return
+     */
+    public static Date getEndTimeWithTimeType(Date dateTime, String timeType) {
+        Date dt = null;
+        switch (timeType) {
+            case TimeTypeConst.TIME_TYPE_HOUR:
+                dt = addSeconds(addHours(dateTime, CommonConst.DIGIT_1), CommonConst.DIGIT_MINUS_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_DAY:
+                dt = addSeconds(addDays(dateTime, CommonConst.DIGIT_1), CommonConst.DIGIT_MINUS_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_MONTH:
+                dt = addSeconds(addMonths(dateTime, CommonConst.DIGIT_1), CommonConst.DIGIT_MINUS_1);
+                break;
+            case TimeTypeConst.TIME_TYPE_YEAR:
+                dt = addSeconds(addYears(dateTime, CommonConst.DIGIT_1), CommonConst.DIGIT_MINUS_1);
+                break;
+            default:
+                break;
+        }
+        return dt;
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鏃堕棿鎵�灞炴湀浠界殑鏈�鍚庝竴澶�
+     *
+     * @return
+     */
+    public static int getDateTimeLastDay(Date dt) {
+        String month = getMonth(dt);
+        String firstDate = month + "01";
+        Date nextMonthFirstDate = addMonths(toDateTime(firstDate, COMMON_PATTERN_DAY), CommonConst.DIGIT_1);
+        Date currentMonthLastDate = addDays(nextMonthFirstDate, CommonConst.DIGIT_MINUS_1);
+        int day = IntegerUtil.toInt(getDateTime(currentMonthLastDate, COMMON_PATTERN_DAY_OF_MONTH));
+        return day;
+    }
+
+    /**
+     * 鑾峰彇骞翠唤鍊�
+     *
+     * @return
+     */
+    public static String getYear(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_YEAR);
+    }
+
+    /**
+     * 鑾峰彇鏈堜唤鍊� 202202
+     *
+     * @return
+     */
+    public static String getMonth(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_MONTH);
+    }
+
+    /**
+     * 鑾峰彇澶�
+     *
+     * @return
+     */
+    public static String getDay(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_DAY);
+    }
+
+    /**
+     * 鑾峰彇灏忔椂
+     *
+     * @return
+     */
+    public static String getHour(Date dt) {
+        return getDateTime(dt, COMMON_PATTERN_HOUR);
+    }
+
+    /**
+     * 杞垚瀛楃涓茬被鍨嬪��
+     *
+     * @return
+     */
+    public static String toString(Date dt) {
+        if (dt == null) {
+            return CommonConst.EMPTY;
+        }
+        return getDateTime(dt, COMMON_PATTERN);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫勾鏁�
+     *
+     * @param dateTime
+     * @param years
+     * @return
+     */
+    public static Date addYears(Date dateTime, int years) {
+        return calcDate(dateTime, years, Calendar.YEAR);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勬湀鏁�
+     *
+     * @param dateTime
+     * @param months
+     * @return
+     */
+    public static Date addMonths(Date dateTime, int months) {
+        return calcDate(dateTime, months, Calendar.MONTH);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫ぉ鏁�
+     *
+     * @param dateTime
+     * @param days
+     * @return
+     */
+    public static Date addDays(Date dateTime, int days) {
+        return calcDate(dateTime, days, Calendar.DATE);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫皬鏃舵暟
+     *
+     * @param dateTime
+     * @param hours
+     * @return
+     */
+    public static Date addHours(Date dateTime, int hours) {
+        return calcDate(dateTime, hours, Calendar.HOUR);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勫垎閽熸暟
+     *
+     * @param dateTime
+     * @param minutes
+     * @return
+     */
+    public static Date addMinutes(Date dateTime, int minutes) {
+        return calcDate(dateTime, minutes, Calendar.MINUTE);
+    }
+
+    /**
+     * 鏃堕棿澧炲姞瀵瑰簲鐨勭鏁�
+     *
+     * @param dateTime
+     * @param seconds
+     * @return
+     */
+    public static Date addSeconds(Date dateTime, int seconds) {
+        return calcDate(dateTime, seconds, Calendar.SECOND);
+    }
+
+    /**
+     * 璁$畻鏃ユ湡閫氱敤鏂规硶
+     *
+     * @param dateTime
+     * @param value
+     * @param calendarType 璁$畻绫诲瀷锛欳alendar.YEAR锛孋alendar.MONTH,Calendar.DAY
+     * @return
+     */
+    public static Date calcDate(Date dateTime, int value, int calendarType) {
+        Date dt = null;
+        try {
+            if (dateTime == null) {
+                return dt;
+            }
+            Calendar calendar = new GregorianCalendar();
+            calendar.setTime(dateTime);
+            //鎶婃棩鏈熷線鍚庡鍔犱竴骞达紝鏁存暟寰�鍚庢帹锛岃礋鏁板線鍓嶇Щ
+            calendar.add(calendarType, value);
+            // 鑾峰彇鐩稿姞鎴栬�呯浉鍑忎箣鍚庣殑鏃堕棿鍊�
+            Date tempDt = calendar.getTime();
+            // 鎶婃椂闂磋浆鎴愭墍闇�瑕佺殑鏍煎紡
+            String temp = getDateTime(tempDt, COMMON_PATTERN);
+            dt = toDateTime(temp);
+        } catch (Exception e) {
+
+        }
+        return dt;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DoubleUtil.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DoubleUtil.java
new file mode 100644
index 0000000..65caa6e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/DoubleUtil.java
@@ -0,0 +1,82 @@
+package com.dingzhuo.energy.project.common;
+
+/**
+ * @Description: 鏁板瓧宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�02鏈�07鏃� 15:03
+ */
+public class DoubleUtil {
+    public static double toDouble(String str) {
+        double d = 0;
+        try {
+            d = Double.parseDouble(str);
+        } catch (Exception e) {
+            d = 0;
+        }
+        return d;
+    }
+
+    /**
+     * long 杞垚 double绫诲瀷
+     *
+     * @param l
+     * @return
+     */
+    public static double toDouble(long l) {
+        return toDouble(l + "");
+    }
+
+    /**
+     * int 杞垚 double绫诲瀷
+     *
+     * @param i
+     * @return
+     */
+    public static double toDouble(int i) {
+        return toDouble(i + "");
+    }
+
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负鎸囧畾浣嶆暟鐨勫皬鏁板瓧绗︿覆
+     *
+     * @param value
+     * @return
+     */
+    public static String formatDoubleToStr(double value, int format) {
+        String str = String.format("%." + format + "f", value).toString();
+        return str;
+    }
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负鎸囧畾浣嶆暟鐨勫皬鏁板瓧绗︿覆,榛樿鏍煎紡鍖栦负2浣嶅皬鏁�
+     *
+     * @param value
+     * @return
+     */
+    public static String formatDoubleToStr(double value) {
+        return formatDoubleToStr(value, 2);
+    }
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负鎸囧畾浣嶆暟鐨勫皬鏁�
+     *
+     * @param value
+     * @param format
+     * @return
+     */
+    public static double formatDouble(double value, int format) {
+        String str = formatDoubleToStr(value, format);
+        return toDouble(str);
+    }
+
+    /**
+     * 鏍煎紡鍖栧皬鏁颁负2浣嶆暟鐨勫皬鏁�
+     *
+     * @param value
+     * @return
+     */
+    public static double formatDouble(double value) {
+        return formatDouble(value, 2);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpClientUtil.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpClientUtil.java
new file mode 100644
index 0000000..4c77ccc
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpClientUtil.java
@@ -0,0 +1,44 @@
+package com.dingzhuo.energy.project.common;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+/**
+ * @Description: http璇锋眰宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�03鏈�18鏃� 17:39
+ */
+public class HttpClientUtil {
+    public static String doGet(String url, String param, String authorization) {
+        String charset = "UTF-8";
+        String body = "";
+        try {
+            // 鍙傝�冭祫鏂欙細https://blog.csdn.net/weixin_44146379/article/details/109809386
+            //鍒涘缓httpclient瀵硅薄
+            CloseableHttpClient client = HttpClients.createDefault();
+            HttpGetWithEntity httpGetWithEntity = new HttpGetWithEntity(url);
+            HttpEntity httpEntity = new StringEntity(param, ContentType.APPLICATION_JSON);
+            httpGetWithEntity.setEntity(httpEntity);
+            httpGetWithEntity.setHeader("Authorization", authorization);
+            //鎵ц璇锋眰鎿嶄綔锛屽苟鎷垮埌缁撴灉锛堝悓姝ラ樆濉烇級
+            CloseableHttpResponse response = client.execute(httpGetWithEntity);
+            //鑾峰彇缁撴灉瀹炰綋
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                //鎸夋寚瀹氱紪鐮佽浆鎹㈢粨鏋滃疄浣撲负String绫诲瀷
+                body = EntityUtils.toString(entity, charset);
+            }
+            //閲婃斁閾炬帴
+            response.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return body;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpGetWithEntity.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpGetWithEntity.java
new file mode 100644
index 0000000..22cfa54
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/HttpGetWithEntity.java
@@ -0,0 +1,34 @@
+package com.dingzhuo.energy.project.common;
+
+import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
+
+import java.net.URI;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�03鏈�18鏃� 18:23
+ */
+public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase {
+    public final static String METHOD_NAME = "GET";
+
+    public HttpGetWithEntity() {
+        super();
+    }
+
+    public HttpGetWithEntity(final URI uri) {
+        super();
+        setURI(uri);
+    }
+
+    public HttpGetWithEntity(final String uri) {
+        super();
+        setURI(URI.create(uri));
+    }
+
+    @Override
+    public String getMethod() {
+        // TODO Auto-generated method stub
+        return METHOD_NAME;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/IntegerUtil.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/IntegerUtil.java
new file mode 100644
index 0000000..3d15fae
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/IntegerUtil.java
@@ -0,0 +1,24 @@
+package com.dingzhuo.energy.project.common;
+
+/**
+ * @Description: 鏁存暟鐩稿叧宸ュ叿绫�
+ * @author: yxw
+ * @date: 2022骞�03鏈�10鏃� 17:31
+ */
+public class IntegerUtil {
+    /**
+     * 瀛楃涓茶浆鎴恑nt绫诲瀷
+     *
+     * @param str
+     * @return
+     */
+    public static int toInt(String str) {
+        int d = 0;
+        try {
+            d = Integer.parseInt(str);
+        } catch (Exception e) {
+            d = 0;
+        }
+        return d;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/StringUtil.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/StringUtil.java
new file mode 100644
index 0000000..0fa2913
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/StringUtil.java
@@ -0,0 +1,69 @@
+package com.dingzhuo.energy.project.common;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * @Description: 瀛楃涓插伐鍏风被
+ * @author: yxw
+ * @date: 2022骞�02鏈�02鏃� 12:27
+ */
+public class StringUtil {
+    /**
+     * 鍒ゆ柇瀛楃涓叉槸鍚︿负绌哄瓧绗︿覆鎴栬�匩ull
+     *
+     * @param str 闇�瑕佸垽鏂殑瀛楃涓�
+     * @return
+     */
+    public static boolean isEmptyOrNull(String str) {
+        if (str == null || CommonConst.EMPTY.equals(str)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 瀛楃涓插鏋滀负绌哄瓧绗︿覆鎴栬�匩ull杩斿洖绌哄瓧绗︿覆锛屽惁鍒欒繑鍥炲瓧绗︿覆鏈韩鐨勫��
+     *
+     * @param str
+     * @return
+     */
+    public static String ifEmptyOrNullReturnValue(String str) {
+        if (isEmptyOrNull(str)) {
+            return CommonConst.EMPTY;
+        }
+        return str;
+    }
+
+    /**
+     * 瀵硅薄杞垚json瀛楃涓�
+     *
+     * @param obj
+     * @return
+     */
+    public static String toJson(Object obj) {
+        return JSONObject.toJSONString(obj);
+    }
+
+    /**
+     * 瀵硅薄杞垚JSONObject
+     *
+     * @param obj
+     * @return
+     */
+    public static JSONObject toJsonObject(Object obj) {
+        return JSONObject.parseObject(toJson(obj));
+    }
+
+    /**
+     * 棣栧瓧姣嶅ぇ鍐�
+     *
+     * @param str
+     * @return
+     */
+    public static String captureWord(String str) {
+        str = str.toLowerCase();
+        char[] cs = str.toCharArray();
+        cs[0] -= 32;
+        return String.valueOf(cs);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/TimeTypeConst.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/TimeTypeConst.java
new file mode 100644
index 0000000..89fd787
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/common/TimeTypeConst.java
@@ -0,0 +1,25 @@
+package com.dingzhuo.energy.project.common;
+
+/**
+ * @Description: 鍛ㄦ湡绫诲瀷
+ * @author: yxw
+ * @date: 2022骞�03鏈�17鏃� 12:33
+ */
+public class TimeTypeConst {
+    /**
+     * 鍛ㄦ湡绫诲瀷 - 灏忔椂
+     */
+    public static final String TIME_TYPE_HOUR="HOUR";
+    /**
+     * 鍛ㄦ湡绫诲瀷 - 鏃�
+     */
+    public static final String TIME_TYPE_DAY="DAY";
+    /**
+     * 鍛ㄦ湡绫诲瀷 - 鏈�
+     */
+    public static final String TIME_TYPE_MONTH="MONTH";
+    /**
+     * 鍛ㄦ湡绫诲瀷 - 骞�
+     */
+    public static final String TIME_TYPE_YEAR="YEAR";
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/comprehensiveStatisticsController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/comprehensiveStatisticsController.java
new file mode 100644
index 0000000..0884b3a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/comprehensiveStatisticsController.java
@@ -0,0 +1,172 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.controller;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensiveStatistics;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.IComprehensiveStatisticsService;
+import com.dingzhuo.energy.project.keyEquipment.service.IdailyKeyEquipmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/statisticalData/comprehensiveStatistics")
+public class comprehensiveStatisticsController extends BaseController {
+
+    @Autowired
+    private PeriodDataService periodDataService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IComprehensiveStatisticsService IComprehensiveStatisticsService;
+
+    @Autowired
+    private IdailyKeyEquipmentService dailykeyEquipment;
+
+    @GetMapping("/getList")
+    public AjaxResult getList(comprehensiveStatistics dataItem) {
+        try {
+            /*List<EnergyIndex> list = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+            List<String> indexCode = list.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());*/
+            List<comprehensiveStatistics> list =IComprehensiveStatisticsService.getEnergyByIndex(dataItem.getIndexType());
+            List<String> indexCode = list.stream().map(comprehensiveStatistics::getIndexId).collect(Collectors.toList());
+            List<comprehensiveStatistics> resultList = IComprehensiveStatisticsService.getDatasByIndex(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+            Map<String, List<comprehensiveStatistics>> groupBy = resultList.stream().collect(Collectors.groupingBy(comprehensiveStatistics::getName));
+            List<Map> energyHeadList = new ArrayList<Map>();
+            groupBy.forEach((IndexName,value)->{
+                Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+                tableColumn.put("name",IndexName);
+                for(comprehensiveStatistics result:value){
+                    if(result.getIndexCode().contains("electric")){
+                        tableColumn.put("electric",result.getValue());
+                    }else if(result.getIndexCode().contains("water")){
+                        tableColumn.put("water",result.getValue());
+                    }else if(result.getIndexCode().contains("coal")){
+                        tableColumn.put("coal",result.getValue());
+                    }else if(result.getIndexCode().contains("steam")){
+                        tableColumn.put("steam",result.getValue());
+                    }
+                }
+                energyHeadList.add(tableColumn);
+            });
+            return AjaxResult.success(energyHeadList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+    @GetMapping("/energyList")
+    public AjaxResult getEnergyList(comprehensiveStatistics dataItem) {
+        try {
+            List<EnergyIndex> list = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+            List<String> indexCode = list.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            List<comprehensiveStatistics> resultList = IComprehensiveStatisticsService.getDatasIndex(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+            Map<String, List<comprehensiveStatistics>> groupBy = resultList.stream().collect(Collectors.groupingBy(comprehensiveStatistics::getFacilityName));
+            List<Map> energyHeadList = new ArrayList<Map>();
+            groupBy.forEach((IndexName,value)->{
+                Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+                tableColumn.put("name",IndexName);
+                tableColumn.put("value",value);
+                energyHeadList.add(tableColumn);
+            });
+            return AjaxResult.success(energyHeadList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+    @GetMapping("/energyDevice")
+    public AjaxResult energyDevice(comprehensiveStatistics dataItem) {
+        try {
+            List<EnergyIndex> list = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+            List<String> indexCode = list.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            List<comprehensiveStatistics> resultList = IComprehensiveStatisticsService.getDatasIndex(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+            return AjaxResult.success(resultList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+    @GetMapping("/getDeviceList")
+    public AjaxResult getDeviceList(comprehensiveStatistics dataItem) {
+        try {
+            List<EnergyIndex> list = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+            List<String> indexCode = list.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            List<comprehensiveStatistics> resultList = IComprehensiveStatisticsService.getDatasIndex(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+            List<Map> energyHeadList = new ArrayList<Map>();
+            if(dataItem.getIndexType().equals("1")){
+                resultList.forEach(value->{
+                    if(!value.getIndexCode().contains("scale")){
+                        Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+                        tableColumn.put("value",value.getValue());
+                        tableColumn.put("facilityName",value.getFacilityName());
+                        energyHeadList.add(tableColumn);
+                    }
+                });
+            }else{
+                resultList.forEach(value->{
+                    if(value.getIndexCode().contains("scale")){
+                        Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+                        tableColumn.put("facilityName",value.getFacilityName());
+                        tableColumn.put("value",value.getValue());
+                        energyHeadList.add(tableColumn);
+                    }
+                });
+            }
+            return AjaxResult.success(energyHeadList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+    @GetMapping("/getFacilityArchives")
+    public AjaxResult getFacilityArchives() {
+        try {
+            List<FacilityArchives> list=IComprehensiveStatisticsService.getFacilityArchives();
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鏍囬鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鏍囬鍑洪敊!");
+        }
+    }
+
+    /**
+     * 閲嶇偣鑳借�楄澶�
+     * @return
+     */
+    @GetMapping("/getPointFacility")
+    public AjaxResult getPointFacility() {
+        try {
+            List<FacilityArchives> list=dailykeyEquipment.getPointFacility();
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇璁惧鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鏍囬鍑洪敊!");
+        }
+    }
+
+    @GetMapping("/export")
+    public AjaxResult export(comprehensiveStatistics dataItem) {
+        List<comprehensiveStatistics> list =IComprehensiveStatisticsService.getEnergyByIndex(dataItem.getIndexType());
+        List<String> indexCode = list.stream().map(comprehensiveStatistics::getIndexId).collect(Collectors.toList());
+        List<comprehensiveStatistics> resultList = IComprehensiveStatisticsService.getDatasByList(indexCode, dataItem.getBeginTime(),dataItem.getEndTime(),dataItem.getTimeType());
+        ExcelUtil<comprehensiveStatistics> util = new ExcelUtil<comprehensiveStatistics>(comprehensiveStatistics.class);
+        return util.exportExcel(resultList, "set");
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/dailycomprehensiveController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/dailycomprehensiveController.java
new file mode 100644
index 0000000..a31cf59
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/dailycomprehensiveController.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.controller;
+
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.dailyComprehensive;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.IdailyComprehensive;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/comprehensive/dailyComprehensive")
+@Api(value = "缁煎悎鎸囨爣鍒嗘瀽锛堟棩锛塩ontroller",tags = {"缁煎悎鎸囨爣鍒嗘瀽"})
+public class dailycomprehensiveController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IdailyComprehensive dailyComprehensive;
+
+    /*鍏ㄥ巶鑳借�楃粺璁�*/
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堟棩锛夊垪琛�")
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success("鏆傛棤鏁版嵁");
+            }
+            List<dailyComprehensive> dataList = new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa = df.format(dataItem.getDataTime());
+            String bb = "";
+            int i = 0;
+            dataItem.setBeginTime(dataItem.getDataTime());
+            String endTime=aa+" 24:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i < 24) {
+                if(i>9){
+                    bb = aa + " " + i + ":00:00";
+                } else {
+                    bb = aa + " 0" + i + ":00:00";
+                }
+                dailyComprehensive report = new dailyComprehensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value" + i);
+                dataList.add(report);
+                i++;
+            }
+            List<dailyComprehensive> list = dailyComprehensive.getdailyComprehensiveList(modelNode.getNodeId(),
+                    dataList, dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType(), dataItem.getIndexStorageId());
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    /**
+     * 鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+     */
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽鍥捐〃锛堟棩锛夋暟鎹�")
+    @GetMapping("/listChart")
+    public AjaxResult listChart(DataItem dataItem) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        dataItem.setBeginTime(dataItem.getDataTime());
+        String endTime=aa+" 24:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        List<dailyComprehensive> list = dailyComprehensive.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/monthlycomprehensiveController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/monthlycomprehensiveController.java
new file mode 100644
index 0000000..f44bd22
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/monthlycomprehensiveController.java
@@ -0,0 +1,207 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.monthlyComprehensive;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.ImonthlyComprehensive;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/comprehensive/monthlyComprehensive")
+@Api(value = "缁煎悎鎸囨爣鍒嗘瀽锛堟湀锛塩ontroller",tags = {"缁煎悎鎸囨爣鍒嗘瀽"})
+public class monthlycomprehensiveController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private ImonthlyComprehensive monthlyComprehensive;
+
+    /*鍏ㄥ巶鑳借�楃粺璁�*/
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堟湀锛夊垪琛�")
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+
+            Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+            List<monthlyComprehensive> dataList=new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            String beginTime=aa+"-01 00:00:00";
+            dataItem.setBeginTime(sf.parse(beginTime));
+            String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i <= Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2))) {
+                if (i > 9) {
+                    bb = aa + "-" + i + " 00:00:00";
+                } else {
+                    bb = aa + "-0" + i + " 00:00:00";
+                }
+                monthlyComprehensive report = new monthlyComprehensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value" + i);
+                dataList.add(report);
+                tableColumn.put("value" + i, String.valueOf(i) + "鏃�");
+                i++;
+            }
+
+            monthlyComprehensive reportList = new monthlyComprehensive();
+            List<Map> table = new ArrayList<>();
+            table.add(tableColumn);
+            reportList.setTablehead(table);
+
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success(reportList);
+            }
+            List<monthlyComprehensive> list = monthlyComprehensive.getMonthlyComprehensiveList(modelNode.getNodeId(),
+                    dataList, dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType(), dataItem.getIndexStorageId());
+            int count = Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2));
+            list.forEach(monthlyReport -> monthlyReport.setCount(count));
+            reportList.setTabledata(list);
+
+            return AjaxResult.success(reportList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+/**/
+    /**
+     * 鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+     */
+    @GetMapping("/listChart")
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽鍥捐〃锛堟湀锛夋暟鎹�")
+    public AjaxResult listChart(DataItem dataItem) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String beginTime=aa+"-01 00:00:00";
+        dataItem.setBeginTime(sf.parse(beginTime));
+        String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        List<monthlyComprehensive> list = monthlyComprehensive.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+    public static String getLastDayOfMonth(String yearMonth) {
+        int year = Integer.parseInt(yearMonth.split("-")[0]);  //骞�
+        int month = Integer.parseInt(yearMonth.split("-")[1]); //鏈�
+        Calendar cal = Calendar.getInstance();
+        // 璁剧疆骞翠唤
+        cal.set(Calendar.YEAR, year);
+        // 璁剧疆鏈堜唤
+        // cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.MONTH, month); //璁剧疆褰撳墠鏈堢殑涓婁竴涓湀
+        // 鑾峰彇鏌愭湀鏈�澶уぉ鏁�
+        //int lastDay = cal.getActualMaximum(Calendar.DATE);
+        int lastDay = cal.getMinimum(Calendar.DATE); //鑾峰彇鏈堜唤涓殑鏈�灏忓�硷紝鍗崇涓�澶�
+        // 璁剧疆鏃ュ巻涓湀浠界殑鏈�澶уぉ鏁�
+        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //涓婃湀鐨勭涓�澶╁噺鍘�1灏辨槸褰撴湀鐨勬渶鍚庝竴澶�
+        // 鏍煎紡鍖栨棩鏈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(cal.getTime());
+    }
+    /*缁煎悎鏈堟姤琛ㄥ鍑�*/
+    @Log(title = "缁煎悎鏈堟姤琛ㄥ鍑�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation(value = "缁煎悎鏈堟姤琛ㄥ鍑�")
+    public AjaxResult export(DataItem dataItem) {
+        try {
+
+            Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+            List<monthlyComprehensive> dataList=new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            String beginTime=aa+"-01 00:00:00";
+            dataItem.setBeginTime(sf.parse(beginTime));
+            String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i <= Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2))) {
+                if (i > 9) {
+                    bb = aa + "-" + i + " 00:00:00";
+                } else {
+                    bb = aa + "-0" + i + " 00:00:00";
+                }
+                monthlyComprehensive report = new monthlyComprehensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value" + i);
+                dataList.add(report);
+                tableColumn.put("value" + i, i + "鏃�");
+                i++;
+            }
+
+            monthlyComprehensive reportList = new monthlyComprehensive();
+            List<Map> table = new ArrayList<>();
+            table.add(tableColumn);
+            reportList.setTablehead(table);
+
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success(reportList);
+            }
+            List<monthlyComprehensive> list = monthlyComprehensive.getMonthlyComprehensiveList(modelNode.getNodeId(), dataList,
+                    dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType(), dataItem.getIndexStorageId());
+            int count = Integer.parseInt(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length() - 2));
+            list.forEach(monthlyReport -> monthlyReport.setCount(count));
+            if (CollectionUtils.isNotEmpty(list)) {
+                list.forEach(this::valueRep);
+            }
+            ExcelUtil<monthlyComprehensive> util = new ExcelUtil<>(monthlyComprehensive.class);
+            return util.exportExcel(list, "缁煎悎鎸囨爣鍒嗘瀽鏈�");
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+    public void valueRep(Object dr){
+        Field[] fields = dr.getClass().getDeclaredFields();
+        for(Field field:fields){
+            field.setAccessible(true);
+            Object obj = field.getType();
+            if(field.getType().getName().equals("java.lang.Double")){
+                String name = field.getName();
+                try {
+                    if(ObjectUtils.isEmpty(field.get(dr)))
+                    {
+                        field.set(dr,0.00);
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/processEnergyConsumptionController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/processEnergyConsumptionController.java
new file mode 100644
index 0000000..6e4cb77
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/processEnergyConsumptionController.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.controller;
+
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.processEnergyConsumptionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * 宸ュ簭鑳借�楃粺璁�
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/statisticalData/processEnergyConsumption")
+public class processEnergyConsumptionController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private processEnergyConsumptionService processEnergyConsumptionService;
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/yearComprehensiveController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/yearComprehensiveController.java
new file mode 100644
index 0000000..d13f2a5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/controller/yearComprehensiveController.java
@@ -0,0 +1,154 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.yearComperhensive;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.IyearComprehensive;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/comprehensive/yearComprehensive")
+@Api(value = "缁煎悎鎸囨爣鍒嗘瀽锛堝勾锛塩ontroller",tags = {"缁煎悎鎸囨爣鍒嗘瀽"})
+public class yearComprehensiveController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IyearComprehensive yearComprehensive;
+
+    /*鍏ㄥ巶鑳借�楃粺璁�*/
+    @GetMapping("/list")
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽锛堝勾锛夊垪琛�")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success("鏆傛棤鏁版嵁");
+            }
+            List<yearComperhensive> dataList = new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getBeginTime());
+            String bb="";
+            int i = 1;
+            while (i <= 12) {
+                if(i>9){
+                    bb=aa+"-"+i+"-01 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+"-01 00:00:00";
+                }
+                yearComperhensive report=new yearComperhensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+            List<yearComperhensive> list = yearComprehensive.getYearComprehensiveList(modelNode.getNodeId(),
+                    dataList,dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    /**
+     * 鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+     */
+    @GetMapping("/listChart")
+    @ApiOperation(value = "鑾峰彇缁煎悎鎸囨爣鍒嗘瀽鍥捐〃锛堝勾锛夋暟鎹�")
+    public AjaxResult listChart(DataItem dataItem){
+        List<yearComperhensive> list = yearComprehensive.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 瀵煎嚭宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳藉垪琛�
+     */
+    @Log(title = "缁煎悎鎶ヨ〃", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    @ApiOperation(value = "缁煎悎骞存姤琛ㄥ鍑�")
+    public AjaxResult export(DataItem dataItem) {
+        try {
+            ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+            if (ObjectUtils.isEmpty(modelNode)) {
+                return AjaxResult.success("鏆傛棤鏁版嵁");
+            }
+            List<yearComperhensive> dataList = new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa = df.format(dataItem.getBeginTime());
+            String bb = "";
+            int i = 1;
+            while (i <= 12) {
+                if(i>9){
+                    bb=aa+"-"+i+"-01 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+"-01 00:00:00";
+                }
+                yearComperhensive report=new yearComperhensive();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+            List<yearComperhensive> list = yearComprehensive.getYearComprehensiveList(modelNode.getNodeId(),
+                    dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            if(CollectionUtils.isNotEmpty(list)){
+                list.forEach(this::valueRep);
+            }
+            ExcelUtil<yearComperhensive> util = new ExcelUtil<>(yearComperhensive.class);
+            return util.exportExcel(list, "缁煎悎鎸囨爣鍒嗘瀽骞�");
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    public void valueRep(Object dr){
+        Field[] fields = dr.getClass().getDeclaredFields();
+        for(Field field:fields){
+            field.setAccessible(true);
+            Object obj = field.getType();
+            if(field.getType().getName().equals("java.lang.Double")){
+                String name = field.getName();
+                try {
+                    if(ObjectUtils.isEmpty(field.get(dr)))
+                    {
+                        field.set(dr,0.00);
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensive.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensive.java
new file mode 100644
index 0000000..12e9283
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensive.java
@@ -0,0 +1,385 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public  class comprehensive implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+  private String indexId;
+  @Excel(name = "鎸囨爣鍚嶇О")
+  private String indexName;
+  private String value;
+  private Date dataTime;
+  private String timeType;
+  @Excel(name = "1")
+  private Double value1;
+  @Excel(name = "2")
+  private Double value2;
+  @Excel(name = "3")
+  private Double value3;
+  @Excel(name = "4")
+  private Double value4;
+  @Excel(name = "5")
+  private Double value5;
+  @Excel(name = "6")
+  private Double value6;
+  @Excel(name = "7")
+  private Double value7;
+  @Excel(name = "8")
+  private Double value8;
+  @Excel(name = "9")
+  private Double value9;
+  @Excel(name = "10")
+  private Double value10;
+  @Excel(name = "11")
+  private Double value11;
+  @Excel(name = "12")
+  private Double value12;
+  @Excel(name = "13")
+  private Double value13;
+  @Excel(name = "14")
+  private Double value14;
+  @Excel(name = "15")
+  private Double value15;
+  @Excel(name = "16")
+  private Double value16;
+  @Excel(name = "17")
+  private Double value17;
+  @Excel(name = "18")
+  private Double value18;
+  @Excel(name = "19")
+  private Double value19;
+  @Excel(name = "20")
+  private Double value20;
+  @Excel(name = "21")
+  private Double value21;
+  @Excel(name = "22")
+  private Double value22;
+  @Excel(name = "23")
+  private Double value23;
+  @Excel(name = "24")
+  private Double value24;
+  @Excel(name = "25")
+  private Double value25;
+  @Excel(name = "16")
+  private Double value26;
+  @Excel(name = "27")
+  private Double value27;
+  @Excel(name = "28")
+  private Double value28;
+  @Excel(name = "29")
+  private Double value29;
+  @Excel(name = "30")
+  private Double value30;
+  @Excel(name = "31")
+  private Double value31;
+  private List<Map> tablehead =new ArrayList<>();
+  private List<comprehensive> tabledata =new ArrayList<>();
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+  public String getValue() {
+    return value;
+  }
+
+  public void setValue(String value) {
+    this.value = value;
+  }
+
+  public String getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(String timeType) {
+    this.timeType = timeType;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public Double getValue1() {
+    return value1;
+  }
+
+  public void setValue1(Double value1) {
+    this.value1 = value1;
+  }
+
+  public Double getValue2() {
+    return value2;
+  }
+
+  public void setValue2(Double value2) {
+    this.value2 = value2;
+  }
+
+  public Double getValue3() {
+    return value3;
+  }
+
+  public void setValue3(Double value3) {
+    this.value3 = value3;
+  }
+
+  public Double getValue4() {
+    return value4;
+  }
+
+  public void setValue4(Double value4) {
+    this.value4 = value4;
+  }
+
+  public Double getValue5() {
+    return value5;
+  }
+
+  public void setValue5(Double value5) {
+    this.value5 = value5;
+  }
+
+  public Double getValue6() {
+    return value6;
+  }
+
+  public void setValue6(Double value6) {
+    this.value6 = value6;
+  }
+
+  public Double getValue7() {
+    return value7;
+  }
+
+  public void setValue7(Double value7) {
+    this.value7 = value7;
+  }
+
+  public Double getValue8() {
+    return value8;
+  }
+
+  public void setValue8(Double value8) {
+    this.value8 = value8;
+  }
+
+  public Double getValue9() {
+    return value9;
+  }
+
+  public void setValue9(Double value9) {
+    this.value9 = value9;
+  }
+
+  public Double getValue10() {
+    return value10;
+  }
+
+  public void setValue10(Double value10) {
+    this.value10 = value10;
+  }
+
+  public Double getValue11() {
+    return value11;
+  }
+
+  public void setValue11(Double value11) {
+    this.value11 = value11;
+  }
+
+  public Double getValue12() {
+    return value12;
+  }
+
+  public void setValue12(Double value12) {
+    this.value12 = value12;
+  }
+
+  public Double getValue13() {
+    return value13;
+  }
+
+  public void setValue13(Double value13) {
+    this.value13 = value13;
+  }
+
+  public Double getValue14() {
+    return value14;
+  }
+
+  public void setValue14(Double value14) {
+    this.value14 = value14;
+  }
+
+  public Double getValue15() {
+    return value15;
+  }
+
+  public void setValue15(Double value15) {
+    this.value15 = value15;
+  }
+
+  public Double getValue16() {
+    return value16;
+  }
+
+  public void setValue16(Double value16) {
+    this.value16 = value16;
+  }
+
+  public Double getValue17() {
+    return value17;
+  }
+
+  public void setValue17(Double value17) {
+    this.value17 = value17;
+  }
+
+  public Double getValue18() {
+    return value18;
+  }
+
+  public void setValue18(Double value18) {
+    this.value18 = value18;
+  }
+
+  public Double getValue19() {
+    return value19;
+  }
+
+  public void setValue19(Double value19) {
+    this.value19 = value19;
+  }
+
+  public Double getValue20() {
+    return value20;
+  }
+
+  public void setValue20(Double value20) {
+    this.value20 = value20;
+  }
+
+  public Double getValue21() {
+    return value21;
+  }
+
+  public void setValue21(Double value21) {
+    this.value21 = value21;
+  }
+
+  public Double getValue22() {
+    return value22;
+  }
+
+  public void setValue22(Double value22) {
+    this.value22 = value22;
+  }
+
+  public Double getValue23() {
+    return value23;
+  }
+
+  public void setValue23(Double value23) {
+    this.value23 = value23;
+  }
+
+  public Double getValue24() {
+    return value24;
+  }
+
+  public void setValue24(Double value24) {
+    this.value24 = value24;
+  }
+
+  public Double getValue25() {
+    return value25;
+  }
+
+  public void setValue25(Double value25) {
+    this.value25 = value25;
+  }
+
+  public Double getValue26() {
+    return value26;
+  }
+
+  public void setValue26(Double value26) {
+    this.value26 = value26;
+  }
+
+  public Double getValue27() {
+    return value27;
+  }
+
+  public void setValue27(Double value27) {
+    this.value27 = value27;
+  }
+
+  public Double getValue28() {
+    return value28;
+  }
+
+  public void setValue28(Double value28) {
+    this.value28 = value28;
+  }
+
+  public Double getValue29() {
+    return value29;
+  }
+
+  public void setValue29(Double value29) {
+    this.value29 = value29;
+  }
+
+  public Double getValue30() {
+    return value30;
+  }
+
+  public void setValue30(Double value30) {
+    this.value30 = value30;
+  }
+
+  public Double getValue31() {
+    return value31;
+  }
+
+  public void setValue31(Double value31) {
+    this.value31 = value31;
+  }
+
+  public List<Map> getTablehead() {
+    return tablehead;
+  }
+
+  public void setTablehead(List<Map> tablehead) {
+    this.tablehead = tablehead;
+  }
+  public List<comprehensive> getTabledata() {
+    return tabledata;
+  }
+
+  public void setTabledata(List<comprehensive> tabledata) {
+    this.tabledata = tabledata;
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensiveStatistics.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensiveStatistics.java
new file mode 100644
index 0000000..cf47e19
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/comprehensiveStatistics.java
@@ -0,0 +1,185 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public  class comprehensiveStatistics implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+
+  private String indexId;
+  private String indexStorageId;
+  @Excel(name = "鎸囨爣Id")
+  private String indexCode;
+  private String indexName;
+  private Date beginTime;
+  private Date endTime;
+  private Date dataTime;
+  private String timeCode;
+  private TimeType timeType;
+  @Excel(name = "鑳借�楅噺")
+  private Double value;
+  private Quality quality;
+  private String unitId;
+  private Date createTime;
+  private Date updateTime;
+  private String remark;
+  @Excel(name = "鍚嶇О")
+  private String name;
+  private String indexType;
+  private String facilityName;
+  private String valueScale;
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexStorageId() {
+    return indexStorageId;
+  }
+
+  public void setIndexStorageId(String indexStorageId) {
+    this.indexStorageId = indexStorageId;
+  }
+
+  public String getIndexCode() {
+    return indexCode;
+  }
+
+  public void setIndexCode(String indexCode) {
+    this.indexCode = indexCode;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+
+  public Date getEndTime() {
+    return endTime;
+  }
+
+  public void setEndTime(Date endTime) {
+    this.endTime = endTime;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public Double getValue() {
+    return value;
+  }
+
+  public void setValue(Double value) {
+    this.value = value;
+  }
+
+  public Quality getQuality() {
+    return quality;
+  }
+
+  public void setQuality(Quality quality) {
+    this.quality = quality;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public Date getCreateTime() {
+    return createTime;
+  }
+
+  public void setCreateTime(Date createTime) {
+    this.createTime = createTime;
+  }
+
+  public Date getUpdateTime() {
+    return updateTime;
+  }
+
+  public void setUpdateTime(Date updateTime) {
+    this.updateTime = updateTime;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+
+  public String getIndexType() {
+    return indexType;
+  }
+  public void setIndexType(String indexType) {
+    this.indexType = indexType;
+  }
+
+  public String getFacilityName() {
+    return facilityName;
+  }
+
+  public void setFacilityName(String facilityName) {
+    this.facilityName = facilityName;
+  }
+
+  public String getValueScale() {
+    return valueScale;
+  }
+
+  public void setValueScale(String valueScale) {
+    this.valueScale = valueScale;
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/dailyComprehensive.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/dailyComprehensive.java
new file mode 100644
index 0000000..730a1f7
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/dailyComprehensive.java
@@ -0,0 +1,79 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Data
+public class dailyComprehensive implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String timeCode;
+    private String unitId;
+    @Excel(name = "0鏃�")
+    private String value0;
+    @Excel(name = "1鏃�")
+    private String value1;
+    @Excel(name = "2鏃�")
+    private String value2;
+    @Excel(name = "3鏃�")
+    private String value3;
+    @Excel(name = "4鏃�")
+    private String value4;
+    @Excel(name = "5鏃�")
+    private String value5;
+    @Excel(name = "6鏃�")
+    private String value6;
+    @Excel(name = "7鏃�")
+    private String value7;
+    @Excel(name = "8鏃�")
+    private String value8;
+    @Excel(name = "9鏃�")
+    private String value9;
+    @Excel(name = "10鏃�")
+    private String value10;
+    @Excel(name = "11鏃�")
+    private String value11;
+    @Excel(name = "12鏃�")
+    private String value12;
+    @Excel(name = "13鏃�")
+    private String value13;
+    @Excel(name = "14鏃�")
+    private String value14;
+    @Excel(name = "15鏃�")
+    private String value15;
+    @Excel(name = "16鏃�")
+    private String value16;
+    @Excel(name = "17鏃�")
+    private String value17;
+    @Excel(name = "18鏃�")
+    private String value18;
+    @Excel(name = "19鏃�")
+    private String value19;
+    @Excel(name = "20鏃�")
+    private String value20;
+    @Excel(name = "21鏃�")
+    private String value21;
+    @Excel(name = "22鏃�")
+    private String value22;
+    @Excel(name = "23鏃�")
+    private String value23;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<dailyComprehensive> tabledata =new ArrayList<>();
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/monthlyComprehensive.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/monthlyComprehensive.java
new file mode 100644
index 0000000..878eda6
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/monthlyComprehensive.java
@@ -0,0 +1,415 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-12-31
+ */
+public class monthlyComprehensive implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String unitId;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    @Excel(name = "24鏃�")
+    private Double value24;
+    @Excel(name = "25鏃�")
+    private Double value25;
+    @Excel(name = "26鏃�")
+    private Double value26;
+    @Excel(name = "27鏃�")
+    private Double value27;
+    @Excel(name = "28鏃�")
+    private Double value28;
+    @Excel(name = "29鏃�")
+    private Double value29;
+    @Excel(name = "30鏃�")
+    private Double value30;
+    @Excel(name = "31鏃�")
+    private Double value31;
+    private String timeCode;
+    private Integer count;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<monthlyComprehensive> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue24() {
+        return value24;
+    }
+
+    public void setValue24(Double value24) {
+        this.value24 = value24;
+    }
+
+    public Double getValue25() {
+        return value25;
+    }
+
+    public void setValue25(Double value25) {
+        this.value25 = value25;
+    }
+
+    public Double getValue26() {
+        return value26;
+    }
+
+    public void setValue26(Double value26) {
+        this.value26 = value26;
+    }
+
+    public Double getValue27() {
+        return value27;
+    }
+
+    public void setValue27(Double value27) {
+        this.value27 = value27;
+    }
+
+    public Double getValue28() {
+        return value28;
+    }
+
+    public void setValue28(Double value28) {
+        this.value28 = value28;
+    }
+
+    public Double getValue29() {
+        return value29;
+    }
+
+    public void setValue29(Double value29) {
+        this.value29 = value29;
+    }
+
+    public Double getValue30() {
+        return value30;
+    }
+
+    public void setValue30(Double value30) {
+        this.value30 = value30;
+    }
+
+    public Double getValue31() {
+        return value31;
+    }
+
+    public void setValue31(Double value31) {
+        this.value31 = value31;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<monthlyComprehensive> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<monthlyComprehensive> tabledata) {
+        this.tabledata = tabledata;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/yearComperhensive.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/yearComperhensive.java
new file mode 100644
index 0000000..e59e451
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/domain/yearComperhensive.java
@@ -0,0 +1,215 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class yearComperhensive implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String unitId;
+    @Excel(name = "1鏈�")
+    private Double value1;
+    @Excel(name = "2鏈�")
+    private Double value2;
+    @Excel(name = "3鏈�")
+    private Double value3;
+    @Excel(name = "4鏈�")
+    private Double value4;
+    @Excel(name = "5鏈�")
+    private Double value5;
+    @Excel(name = "6鏈�")
+    private Double value6;
+    @Excel(name = "7鏈�")
+    private Double value7;
+    @Excel(name = "8鏈�")
+    private Double value8;
+    @Excel(name = "9鏈�")
+    private Double value9;
+    @Excel(name = "10鏈�")
+    private Double value10;
+    @Excel(name = "11鏈�")
+    private Double value11;
+    @Excel(name = "12鏈�")
+    private Double value12;
+    private String timeCode;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<dailyReport> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<dailyReport> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<dailyReport> tabledata) {
+        this.tabledata = tabledata;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/comprehensiveStatisticsMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/comprehensiveStatisticsMapper.java
new file mode 100644
index 0000000..65e06f6
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/comprehensiveStatisticsMapper.java
@@ -0,0 +1,20 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.mapper;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensiveStatistics;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+public interface comprehensiveStatisticsMapper {
+    List<FacilityArchives> getFacilityArchives();
+    List<comprehensiveStatistics> getDatasByList(@Param("indexIds") List<String> indexIds, @Param("beginTime") Date beginTime,
+                                                 @Param("endTime") Date endTime,
+                                                 @Param("timeType") TimeType timeType);
+    List<comprehensiveStatistics> getDatasByIndex(@Param("indexIds") List<String> indexIds, @Param("timeCode") String timeCode);
+    List<comprehensiveStatistics> getDatasIndex(@Param("indexIds") List<String> indexIds,@Param("timeCode") String timeCode);
+    List<comprehensiveStatistics> getEnergyByIndex(@Param("indexType") String indexType);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/dailyComprehensiveMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/dailyComprehensiveMapper.java
new file mode 100644
index 0000000..222b696
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/dailyComprehensiveMapper.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.dailyComprehensive;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏃�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface dailyComprehensiveMapper {
+    public List<dailyComprehensive> getdailyComprehensiveList(@Param("nodeId") String nodeId,
+                                                              @Param("dataList") List<dailyComprehensive> dataList,
+                                                              @Param("beginTime") Date beginTime,
+                                                              @Param("endTime") Date endTime,
+                                                              @Param("timeType") TimeType timeType,
+                                                              @Param("indexStorageId") String indexStorageId);
+
+    List<dailyComprehensive> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId")  String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/monthlyComprehensiveMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/monthlyComprehensiveMapper.java
new file mode 100644
index 0000000..af3dc6f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/monthlyComprehensiveMapper.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.monthlyComprehensive;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏈�
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface monthlyComprehensiveMapper {
+    public List<monthlyComprehensive> getMonthlyComprehensiveList(@Param("nodeId") String nodeId,
+                                                                  @Param("dataList") List<monthlyComprehensive> dataList,
+                                                                  @Param("beginTime") Date beginTime,
+                                                                  @Param("endTime") Date endTime,
+                                                                  @Param("timeType") TimeType timeType,
+                                                                  @Param("indexStorageId") String indexStorageId);
+
+    List<monthlyComprehensive> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/processEnergyConsumptionMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/processEnergyConsumptionMapper.java
new file mode 100644
index 0000000..6e62b4a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/processEnergyConsumptionMapper.java
@@ -0,0 +1,6 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.mapper;
+
+
+public interface processEnergyConsumptionMapper {
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/yearComprehensiveMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/yearComprehensiveMapper.java
new file mode 100644
index 0000000..0b32bb1
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/mapper/yearComprehensiveMapper.java
@@ -0,0 +1,29 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.yearComperhensive;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 骞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface yearComprehensiveMapper {
+    public List<yearComperhensive> getYearComprehensiveList(@Param("nodeId") String nodeId,
+                                                               @Param("dataList") List<yearComperhensive> dataList,
+                                                               @Param("beginTime") Date beginTime,
+                                                               @Param("endTime") Date endTime,
+                                                               @Param("timeType") TimeType timeType,
+                                                               @Param("indexStorageId") String indexStorageId);
+    List<yearComperhensive> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IComprehensiveStatisticsService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IComprehensiveStatisticsService.java
new file mode 100644
index 0000000..9a4a869
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IComprehensiveStatisticsService.java
@@ -0,0 +1,22 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensiveStatistics;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-07
+ */
+public interface IComprehensiveStatisticsService {
+    List<FacilityArchives> getFacilityArchives();
+    List<comprehensiveStatistics> getDatasByList(List<String> indexIds,Date beginTime, Date endTime,TimeType timeType);
+    List<comprehensiveStatistics> getDatasByIndex(List<String> indexIds,Date beginTime, TimeType timeType);
+    List<comprehensiveStatistics>  getDatasIndex(List<String> indexIds,Date dataTime, TimeType timeType);
+    List<comprehensiveStatistics> getEnergyByIndex(String indexType);
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IdailyComprehensive.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IdailyComprehensive.java
new file mode 100644
index 0000000..c31e68e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IdailyComprehensive.java
@@ -0,0 +1,17 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.dailyComprehensive;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏃�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IdailyComprehensive {
+    public List<dailyComprehensive> getdailyComprehensiveList(String nodeId, List<dailyComprehensive> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    List<dailyComprehensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/ImonthlyComprehensive.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/ImonthlyComprehensive.java
new file mode 100644
index 0000000..8c62402
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/ImonthlyComprehensive.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.monthlyComprehensive;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏈�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface ImonthlyComprehensive {
+    public List<monthlyComprehensive> getMonthlyComprehensiveList(String nodeId, List<monthlyComprehensive> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    List<monthlyComprehensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IyearComprehensive.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IyearComprehensive.java
new file mode 100644
index 0000000..c7c416d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/IyearComprehensive.java
@@ -0,0 +1,19 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.yearComperhensive;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 骞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IyearComprehensive {
+    public List<yearComperhensive> getYearComprehensiveList(String nodeId, List<yearComperhensive> dataList,
+                                                            Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    List<yearComperhensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/comprehensiveStatisticsImp.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/comprehensiveStatisticsImp.java
new file mode 100644
index 0000000..a6049c6
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/comprehensiveStatisticsImp.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service.impl;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensiveStatistics;
+import com.dingzhuo.energy.project.comprehensiveStatistics.mapper.comprehensiveStatisticsMapper;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.IComprehensiveStatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-07
+ */
+@Service
+public  class comprehensiveStatisticsImp implements IComprehensiveStatisticsService{
+    @Autowired
+    private comprehensiveStatisticsMapper statisticsMapperpper;
+    @Override
+    public List<FacilityArchives> getFacilityArchives() {
+        return statisticsMapperpper.getFacilityArchives();
+    }
+
+    @Override
+    public List<comprehensiveStatistics> getDatasByList(List<String> indexIds, Date beginTime, Date endTime,TimeType timeType) {
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return statisticsMapperpper.getDatasByList(indexIds, beginTime,endTime,timeType);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<comprehensiveStatistics> getDatasByIndex(List<String> indexIds, Date dataTime, TimeType timeType) {
+        if (indexIds != null && !indexIds.isEmpty()) {
+            String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+            return statisticsMapperpper.getDatasByIndex(indexIds, timeCode);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<comprehensiveStatistics> getDatasIndex(List<String> indexIds, Date dataTime, TimeType timeType) {
+        if (indexIds != null && !indexIds.isEmpty()) {
+            String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+            return statisticsMapperpper.getDatasIndex(indexIds, timeCode);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<comprehensiveStatistics> getEnergyByIndex(String indexType) {
+            return statisticsMapperpper.getEnergyByIndex(indexType);
+
+    }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/dailyComprehensiveServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/dailyComprehensiveServiceImpl.java
new file mode 100644
index 0000000..34dec9d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/dailyComprehensiveServiceImpl.java
@@ -0,0 +1,41 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.dailyComprehensive;
+import com.dingzhuo.energy.project.comprehensiveStatistics.mapper.dailyComprehensiveMapper;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.IdailyComprehensive;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class dailyComprehensiveServiceImpl implements IdailyComprehensive {
+    @Autowired
+    private dailyComprehensiveMapper dailyMapper;
+
+    public List<dailyComprehensive> getdailyComprehensiveList(String nodeId, List<dailyComprehensive> dataList,
+                                                              Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+
+        if (StringUtils.isNotEmpty(nodeId)) {
+            return dailyMapper.getdailyComprehensiveList(nodeId, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<dailyComprehensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return dailyMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/monthlyComprehensiveServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/monthlyComprehensiveServiceImpl.java
new file mode 100644
index 0000000..48e87ee
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/monthlyComprehensiveServiceImpl.java
@@ -0,0 +1,41 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.monthlyComprehensive;
+import com.dingzhuo.energy.project.comprehensiveStatistics.mapper.monthlyComprehensiveMapper;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.ImonthlyComprehensive;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class monthlyComprehensiveServiceImpl implements ImonthlyComprehensive {
+    @Autowired
+    private monthlyComprehensiveMapper monthMapper;
+
+    public List<monthlyComprehensive> getMonthlyComprehensiveList(String nodeId, List<monthlyComprehensive> dataList,
+                                                                  Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (StringUtils.isNotEmpty(nodeId)) {
+            return monthMapper.getMonthlyComprehensiveList(nodeId, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<monthlyComprehensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return monthMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/processEnergyConsumptionImp.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/processEnergyConsumptionImp.java
new file mode 100644
index 0000000..63ac936
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/processEnergyConsumptionImp.java
@@ -0,0 +1,31 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service.impl;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensive;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensiveStatistics;
+import com.dingzhuo.energy.project.comprehensiveStatistics.mapper.comprehensiveStatisticsMapper;
+import com.dingzhuo.energy.project.comprehensiveStatistics.mapper.processEnergyConsumptionMapper;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.IComprehensiveStatisticsService;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.processEnergyConsumptionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-07
+ */
+@Service
+public  class processEnergyConsumptionImp implements processEnergyConsumptionService {
+    @Autowired
+    private processEnergyConsumptionMapper processEnergyConsumption;
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/yearComprehensiveServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/yearComprehensiveServiceImpl.java
new file mode 100644
index 0000000..657614b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/impl/yearComprehensiveServiceImpl.java
@@ -0,0 +1,68 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.common.CommonConst;
+import com.dingzhuo.energy.project.common.DateTimeUtil;
+import com.dingzhuo.energy.project.comprehensiveStatistics.domain.yearComperhensive;
+import com.dingzhuo.energy.project.comprehensiveStatistics.mapper.yearComprehensiveMapper;
+import com.dingzhuo.energy.project.comprehensiveStatistics.service.IyearComprehensive;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class yearComprehensiveServiceImpl implements IyearComprehensive {
+    @Autowired
+    private yearComprehensiveMapper yearMapper;
+
+    @Override
+    public List<yearComperhensive> getYearComprehensiveList(String nodeId, List<yearComperhensive> dataList,
+                                                            Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (StringUtils.isNotEmpty(nodeId)) {
+            return yearMapper.getYearComprehensiveList(nodeId, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<yearComperhensive> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        List<yearComperhensive> dataList = new ArrayList<>();
+        if (StringUtils.isNotEmpty(indexId)) {
+            List<yearComperhensive> listChart = yearMapper.getListChart(indexId, beginTime, endTime, timeType, indexStorageId);
+            if (CollectionUtils.isNotEmpty(listChart)) {
+                Date date = new Date();
+                yearComperhensive first = listChart.get(CommonConst.DIGIT_0);
+                Map<String, yearComperhensive> listChartMap = yearMapper.getListChart(indexId, beginTime, endTime, timeType, indexStorageId)
+                        .stream().collect(Collectors.toMap(yearComperhensive::getTimeCode, prot -> prot));
+                while (beginTime.before(date)) {
+                    yearComperhensive yearComperhensive = new yearComperhensive();
+                    String format = CommonConst.WORD_M + DateUtil.format(beginTime, DateTimeUtil.COMMON_PATTERN_MONTH);
+                    yearComperhensive item = listChartMap.get(format);
+                    if (ObjectUtils.isNotEmpty(item)) {
+                        yearComperhensive = item;
+                    } else {
+                        yearComperhensive.setTimeCode(format);
+                        yearComperhensive.setIndexId(indexId);
+                        yearComperhensive.setTimeType(timeType.name());
+                        yearComperhensive.setUnitId(first.getUnitId());
+                        yearComperhensive.setIndexName(first.getIndexName());
+                    }
+                    dataList.add(yearComperhensive);
+                    beginTime = DateUtil.offsetMonth(beginTime, CommonConst.DIGIT_1);
+                }
+            }
+        }
+        return dataList;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/processEnergyConsumptionService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/processEnergyConsumptionService.java
new file mode 100644
index 0000000..8f274e9
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/comprehensiveStatistics/service/processEnergyConsumptionService.java
@@ -0,0 +1,11 @@
+package com.dingzhuo.energy.project.comprehensiveStatistics.service;
+
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-07
+ */
+public interface processEnergyConsumptionService {
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/ConglomeratePushTask.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/ConglomeratePushTask.java
new file mode 100644
index 0000000..009e88e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/ConglomeratePushTask.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.project.conglomeratepush;
+
+import com.dingzhuo.energy.project.conglomeratepush.service.IConglomeratePushLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 闆嗗洟鎶曢�掍换鍔�
+ * @author zhw
+ */
+@Configuration      //1.涓昏鐢ㄤ簬鏍囪閰嶇疆绫伙紝鍏煎Component鐨勬晥鏋溿��
+@EnableScheduling   // 2.寮�鍚畾鏃朵换鍔�
+public class ConglomeratePushTask {
+
+    private IConglomeratePushLogService pushLogService;
+    @Autowired
+    public ConglomeratePushTask(IConglomeratePushLogService pushLogService) {
+        this.pushLogService = pushLogService;
+    }
+
+    /**
+     * 娣诲姞瀹氭椂浠诲姟
+     */
+//    @Scheduled(cron = "0/5 * * * * ?")
+    private void configureTasks() {
+        System.err.println("鎵ц闈欐�佸畾鏃朵换鍔℃椂闂�: " + LocalDateTime.now());
+        //璇诲彇瑕佹姇閫掔殑鏁版嵁瀵硅薄
+        List<Object> pushDataList = new ArrayList<>();
+        //缁勭粐鎶曢�掓姤鏂�
+        StringBuffer pushMessageBf = new StringBuffer();
+
+//        pushLogService.sendConglomerate(pushMessageBf.toString(),1);
+        //娴嬭瘯鏃ュ織淇濆瓨
+        pushLogService.test();
+
+
+    }
+
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/HttpUtil.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/HttpUtil.java
new file mode 100644
index 0000000..d8c5f1f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/HttpUtil.java
@@ -0,0 +1,66 @@
+package com.dingzhuo.energy.project.conglomeratepush;
+
+import okhttp3.*;
+
+import java.io.IOException;
+import java.util.Map;
+
+/**
+ *OkHttpClient 鍙戦��
+ *
+ * @author zhw
+ * @since 2022-03-09
+ */
+public class HttpUtil {
+
+
+    /**
+     * post璇锋眰
+     * @param params
+     * @param url
+     * @return
+     */
+    public static Response post(Map<String,String> params, String url){
+
+        OkHttpClient client = new OkHttpClient();
+		FormBody.Builder builder = new FormBody.Builder();
+
+        for (Map.Entry<String, String> entry : params.entrySet()) {
+			builder.add(entry.getKey(),entry.getValue());
+        }
+        RequestBody formBody = builder.build();
+
+        Request request = new Request.Builder()
+                .url(url)
+                .post(formBody)
+                .build();
+
+        try {
+            Response response = client.newCall(request).execute();
+            return response;
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     *get璇锋眰
+     * @param url
+     * @return
+     */
+	public static Response get(String url){
+		OkHttpClient client = new OkHttpClient();
+		Request request = new Request.Builder()
+			.url(url)
+			.build();
+		try {
+			Response response = client.newCall(request).execute();
+			return response;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/domain/ConglomeratePushLog.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/domain/ConglomeratePushLog.java
new file mode 100644
index 0000000..82ad130
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/domain/ConglomeratePushLog.java
@@ -0,0 +1,106 @@
+
+package com.dingzhuo.energy.project.conglomeratepush.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 闆嗗洟鏁版嵁鎺ㄩ�佸疄浣撶被
+ *
+ * @author zhw
+ * @since 2022-03-09
+ */
+public class ConglomeratePushLog implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+
+	/**
+	 * 涓婚敭
+	 */
+		private String id;
+
+		/**
+		* 鎺ㄩ�佺姸鎬侊紙Y銆丯锛�
+		*/
+		private String pushStatus;
+		/**
+		* 鎺ㄩ�佹椂闂�
+		*/
+		private Date pushTime;
+		/**
+		* 鎺ㄩ�佸唴瀹癸紙json涓诧級
+		*/
+		private String pushContent;
+		/**
+		* 鎺ㄩ�佹鏁�
+		*/
+		private Long pushCount;
+
+		/**
+		* 鍙戦�佽繑鍥炰俊鎭�(sendRes)
+		*/
+		private String pushResult;
+
+		/**
+		 * 寮傚父淇℃伅璁板綍
+		 */
+		private String errorInfo;
+
+
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	public String getPushStatus() {
+		return pushStatus;
+	}
+
+	public void setPushStatus(String pushStatus) {
+		this.pushStatus = pushStatus;
+	}
+
+	public Date getPushTime() {
+		return pushTime;
+	}
+
+	public void setPushTime(Date pushTime) {
+		this.pushTime = pushTime;
+	}
+
+	public String getPushContent() {
+		return pushContent;
+	}
+
+	public void setPushContent(String pushContent) {
+		this.pushContent = pushContent;
+	}
+
+	public Long getPushCount() {
+		return pushCount;
+	}
+
+	public void setPushCount(Long pushCount) {
+		this.pushCount = pushCount;
+	}
+
+	public String getPushResult() {
+		return pushResult;
+	}
+
+	public void setPushResult(String pushResult) {
+		this.pushResult = pushResult;
+	}
+
+	public String getErrorInfo() {
+		return errorInfo;
+	}
+
+	public void setErrorInfo(String errorInfo) {
+		this.errorInfo = errorInfo;
+	}
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mapper/ConglomeratePushLogMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mapper/ConglomeratePushLogMapper.java
new file mode 100644
index 0000000..f464532
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mapper/ConglomeratePushLogMapper.java
@@ -0,0 +1,17 @@
+
+package com.dingzhuo.energy.project.conglomeratepush.mapper;
+
+
+import com.dingzhuo.energy.project.conglomeratepush.domain.ConglomeratePushLog;
+
+/**
+ * 闆嗗洟淇℃伅鎺ㄩ�佽〃 Mapper 鎺ュ彛
+ *
+ * @author zhw
+ * @since 2022-03-09
+ */
+public interface ConglomeratePushLogMapper{
+
+  int  saveLog(ConglomeratePushLog conglomeratePushLog);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/InitCallback.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/InitCallback.java
new file mode 100644
index 0000000..b73342e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/InitCallback.java
@@ -0,0 +1,88 @@
+package com.dingzhuo.energy.project.conglomeratepush.mqtt;
+
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.project.gateway.domain.GatewayHbtLog;
+import com.dingzhuo.energy.project.gateway.domain.GatewaySetting;
+import com.dingzhuo.energy.project.gateway.service.IGatewayHbtLogService;
+import com.dingzhuo.energy.project.gateway.service.IGatewaySettingService;
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.Iterator;
+
+/**
+ * MQTT鍥炶皟鍑芥暟
+ *MqttClientCallback 鍥炶皟鍑芥暟绫讳腑鍙兘涓嶈兘鐢� @Autowired 娉ㄥ叆鐨勶紝 瑙e喅鍔炴硶  SpringContextHolder 绫诲紩鍏�
+ * @author zhw
+ * @since 2022/04/05
+ */
+@Slf4j
+@Component
+public class InitCallback implements MqttCallback {
+
+  @Autowired
+  private IGatewayHbtLogService gatewayHbtLogService;
+
+  @Autowired
+  private IGatewaySettingService gatewaySettingService;
+
+  /**
+   * MQTT 鏂紑杩炴帴浼氭墽琛屾鏂规硶
+   */
+  @Override
+  public void connectionLost(Throwable cause)
+  {
+    log.error(cause.getMessage(), cause);
+  }
+
+  /**
+   * publish鍙戝竷鎴愬姛鍚庝細鎵ц鍒拌繖閲�
+   */
+  @Override
+  public void deliveryComplete(IMqttDeliveryToken token) {
+    //鍙戝竷瀹屾垚鍚� 璁板綍鏃ュ織淇℃伅 骞舵柇寮�杩炴帴
+  }
+
+  /**
+   * subscribe璁㈤槄鍚庡緱鍒扮殑娑堟伅浼氭墽琛屽埌杩欓噷
+   */
+  @Override
+  public void messageArrived(String topic, MqttMessage message) {
+    String result = new String(message.getPayload(), StandardCharsets.UTF_8);
+     try {
+//      JSONObject jsonObject = JSON.parseObject(result);
+//       Date hbtTime =  jsonObject.getDate("ts");
+//       Iterator<String> keys =  jsonObject.getJSONObject("d").keySet().iterator();
+//       if(keys.hasNext())
+//       {
+//         String key = keys.next();
+//         //鏇存柊瀹炴椂鐘舵��
+//         GatewaySetting gatewaySetting = new GatewaySetting();
+//         gatewaySetting.setGatewayNum(key);
+//         gatewaySetting.setHbtTime(hbtTime);
+//         gatewaySettingService.updateGatewaySettingByNum(gatewaySetting);
+//
+//         //璁板綍鏃ュ織琛�
+//         GatewayHbtLog gatewayHbtLog = new GatewayHbtLog();
+//         gatewayHbtLog.setId(UUID.fastUUID().toString());
+//         gatewayHbtLog.setGatewayNo(key);
+//         gatewayHbtLog.setHbtTime(hbtTime);
+//         gatewayHbtLog.setContent(result);
+//         gatewayHbtLogService.insertGatewayHbtLog(gatewayHbtLog);
+//       }
+
+    } catch (JSONException e) {
+      log.error("JSON Format Parsing Exception : {}", result);
+    }
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTConnect.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTConnect.java
new file mode 100644
index 0000000..c5c05c1
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTConnect.java
@@ -0,0 +1,136 @@
+package com.dingzhuo.energy.project.conglomeratepush.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.*;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * MQTT宸ュ叿绫绘搷浣�
+ *
+ * @author zhw
+ * @since 2022/04/05
+ */
+@Slf4j
+@Component
+public class MQTTConnect {
+
+  @Value("${mqtt.host}")
+  private String HOST;
+  private final String clientId = "ClientHBT" + (int) (Math.random() * 100000000);
+  private MqttClient mqttClient;
+
+  /**
+   * 瀹㈡埛绔痗onnect杩炴帴mqtt鏈嶅姟鍣�
+   *
+   * @param username 鐢ㄦ埛鍚�
+   * @param password 瀵嗙爜
+   * @param mqttCallback 鍥炶皟鍑芥暟
+   **/
+  public void setMqttClient(String username, String password, MqttCallback mqttCallback)
+      throws MqttException {
+    System.out.println("MQTT鏈嶅姟鍣ㄨ繛鎺ュ紑濮�...........");
+    MqttConnectOptions options = mqttConnectOptions(username, password);
+    mqttClient.setCallback(mqttCallback);
+    mqttClient.connect(options);
+  }
+
+  /**
+   * MQTT杩炴帴鍙傛暟璁剧疆
+   */
+  private MqttConnectOptions mqttConnectOptions(String userName, String passWord)
+      throws MqttException {
+    mqttClient = new MqttClient(HOST, clientId, new MemoryPersistence());
+    MqttConnectOptions options = new MqttConnectOptions();
+    options.setUserName(userName);
+    options.setPassword(passWord.toCharArray());
+    options.setConnectionTimeout(10);///榛樿锛�30
+    options.setAutomaticReconnect(true);//榛樿锛歠alse
+    options.setCleanSession(false);//榛樿锛歵rue
+    //options.setKeepAliveInterval(20);//榛樿锛�60
+    return options;
+  }
+
+  /**
+   * 鍏抽棴MQTT杩炴帴
+   */
+  public void close() throws MqttException {
+    try {
+      if(mqttClient!=null){
+        if(mqttClient.isConnected()){
+          mqttClient.unsubscribe(clientId);
+        }
+        mqttClient.disconnect();
+        mqttClient.close();
+      }
+
+    }catch (Exception e){
+      e.printStackTrace();
+    }
+
+  }
+
+  /**
+   * 鍚戞煇涓富棰樺彂甯冩秷鎭� 榛樿qos锛�1
+   */
+  public void pub(String topic, String msg) throws MqttException {
+    MqttMessage mqttMessage = new MqttMessage();
+    //mqttMessage.setQos(2);
+    mqttMessage.setPayload(msg.getBytes());
+    MqttTopic mqttTopic = mqttClient.getTopic(topic);
+    MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
+    token.waitForCompletion();
+  }
+
+  /**
+   * 鍚戞煇涓富棰樺彂甯冩秷鎭�
+   *
+   * @param topic: 鍙戝竷鐨勪富棰�
+   * @param msg: 鍙戝竷鐨勬秷鎭�
+   * @param qos: 娑堟伅璐ㄩ噺    Qos锛�0銆�1銆�2
+   */
+  public void pub(String topic, String msg, int qos) throws MqttException {
+    MqttMessage mqttMessage = new MqttMessage();
+    mqttMessage.setQos(qos);
+    mqttMessage.setPayload(msg.getBytes());
+    MqttTopic mqttTopic = mqttClient.getTopic(topic);
+    MqttDeliveryToken token = mqttTopic.publish(mqttMessage);
+    token.waitForCompletion();
+  }
+
+  /**
+   * 璁㈤槄鏌愪竴涓富棰� 锛屾鏂规硶榛樿鐨勭殑Qos绛夌骇涓猴細1
+   *
+   * @param topic 涓婚
+   */
+  public void sub(String topic) throws MqttException {
+    mqttClient.subscribe(topic);
+  }
+
+  /**
+   * 璁㈤槄鏌愪竴涓富棰橈紝鍙惡甯os
+   *
+   * @param topic 鎵�瑕佽闃呯殑涓婚
+   * @param qos 娑堟伅璐ㄩ噺锛�0銆�1銆�2
+   */
+  public void sub(String topic, int qos) throws MqttException {
+    mqttClient.subscribe(topic, qos);
+  }
+
+  public static void main(String[] args) throws MqttException {
+    //娴嬭瘯杩炴帴鍙婁富鍔ㄨ闃呬俊鎭� 杈撳嚭 閫氳繃
+    //瑕佸仛鎺ㄩ�� 鐩存帴鍦ㄨ鍒掍换鍔′腑杩炴帴鎺ㄩ�佸嵆鍙紝鍋氬叏灞�conn瀵硅薄锛岀劧鍚� 姣忔璁″垝浠诲姟杞鍙戦�佸墠鍒ゆ柇
+    //瀵硅薄鏄惁瀛樺湪涓� 娌℃湁鍏抽棴 瑕佽繘琛屽鐞�
+//    MQTTConnect mqttConnect = new MQTTConnect();
+//    String msg = "Mr.Qu" + (int) (Math.random() * 100000000);
+//    mqttConnect.setMqttClient("dingzhuo", "dingzhuo@2022", new InitCallback());
+//    mqttConnect.sub("iot-2/evt/waconn/#",0);
+//    try {
+//      Thread.sleep(5000);
+//    } catch (InterruptedException e) {
+//      e.printStackTrace();
+//    }
+//    mqttConnect.close();
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTListener.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTListener.java
new file mode 100644
index 0000000..0ae5a1b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/mqtt/MQTTListener.java
@@ -0,0 +1,51 @@
+package com.dingzhuo.energy.project.conglomeratepush.mqtt;
+
+import lombok.extern.slf4j.Slf4j;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.stereotype.Component;
+
+/**
+ * 椤圭洰鍚姩 鐩戝惉涓婚 涓诲姩璁㈤槄鐢� 涓嶈闃呭彲 涓嶅惎鐢� 娉ㄩ噴鎺塁omponent
+ *
+ * @author zhw
+ * @since 2022/04/05
+ */
+@Slf4j
+@Component //涓嶈璺熼殢绯荤粺鍚姩璁㈤槄灏卞厛灞忚斀锛岄渶瑕佸啀鎵撳紑
+public class MQTTListener implements ApplicationListener<ContextRefreshedEvent> {
+
+  @Value("${mqtt.username}")
+  private String username;
+  @Value("${mqtt.password}")
+  private String password;
+  @Value("${mqtt.subhbt}")
+  private String subhbt;
+  @Value("${mqtt.subhbtqos}")
+  private int subhbtqos;
+  private final MQTTConnect server;
+  private final InitCallback initCallback;
+
+  @Autowired
+  public MQTTListener(MQTTConnect server, InitCallback initCallback) {
+//    System.out.println("MQTT server 璺熼殢鍚姩鐩戝惉鍒濆鍖�");
+    this.server = server;
+    this.initCallback = initCallback;
+  }
+
+  @Override
+  public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
+//    System.out.println("MQTT server 鍚姩璁㈤槄");
+//    try {
+//      server.setMqttClient(username, password, initCallback);
+//      server.sub(subhbt,subhbtqos);
+//    } catch (MqttException e) {
+//      log.error(e.getMessage(), e);
+//    }
+  }
+}
+
+
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/IConglomeratePushLogService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/IConglomeratePushLogService.java
new file mode 100644
index 0000000..389e21b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/IConglomeratePushLogService.java
@@ -0,0 +1,16 @@
+package com.dingzhuo.energy.project.conglomeratepush.service;
+
+/**
+ * 鎺ュ彛
+ * @author zhw
+ */
+public interface IConglomeratePushLogService {
+    /**
+     * 鍙戦�侀泦鍥㈠鎺ヤ俊鎭�
+     * @param jsonData
+     * @param pushCount
+     */
+    void sendConglomerate(String jsonData,long pushCount);
+
+    public void test();
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/impl/ConglomeratePushLogServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/impl/ConglomeratePushLogServiceImpl.java
new file mode 100644
index 0000000..d610f37
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/conglomeratepush/service/impl/ConglomeratePushLogServiceImpl.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.project.conglomeratepush.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.project.conglomeratepush.HttpUtil;
+import com.dingzhuo.energy.project.conglomeratepush.domain.ConglomeratePushLog;
+import com.dingzhuo.energy.project.conglomeratepush.mapper.ConglomeratePushLogMapper;
+import com.dingzhuo.energy.project.conglomeratepush.service.IConglomeratePushLogService;
+import okhttp3.Response;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author zhw
+ */
+@Service
+public class ConglomeratePushLogServiceImpl  implements IConglomeratePushLogService {
+
+    @Autowired
+    private ConglomeratePushLogMapper conglomeratePushLogMapper;
+
+    @Override
+    public void test(){
+        ConglomeratePushLog conglomeratePushLog = new ConglomeratePushLog();
+        conglomeratePushLog.setId(UUID.fastUUID().toString());
+        conglomeratePushLog.setPushContent("abcd");
+        conglomeratePushLog.setPushResult("111");
+        conglomeratePushLog.setPushStatus("abssscd");
+        conglomeratePushLog.setPushCount(1L);
+        conglomeratePushLog.setPushTime(new Date());
+        //淇濆瓨鍙戦�佷俊鎭�
+        conglomeratePushLogMapper.saveLog(conglomeratePushLog);
+    }
+
+    @Override
+    public void sendConglomerate(String jsonData,long pushCount){
+        ConglomeratePushLog conglomeratePushLog = new ConglomeratePushLog();
+        conglomeratePushLog.setId(UUID.fastUUID().toString());
+        //璁板綍鍙戦�佷俊鎭殑瀵硅薄
+        JSONObject sendResJson=null;
+        String exeRes="N";
+        try{
+            //瑕佸彂閫佺殑鏁版嵁瀵硅薄
+            jsonData = "";
+            sendResJson = send(jsonData);
+            //涓嶈鎴愬姛銆佸け璐� 閮借褰曞埌鎺ㄩ�� 淇℃伅鍙戦�佽〃涓�
+            String success = sendResJson.getString("success");
+            //鎴愬姛
+            if(StringUtils.isNotBlank(success) && StringUtils.equals(success, "true")){
+                exeRes="Y";
+            }
+        }catch (Exception e){
+            //璁板綍浠ヤ笅Log 鎹曡幏寮傚父涓嶈鎶涘嚭
+            conglomeratePushLog.setErrorInfo(e.getMessage());
+        }finally {
+            //璁板綍瑕佸彂閫佺殑鍐呭
+            conglomeratePushLog.setPushContent(jsonData);
+            conglomeratePushLog.setPushResult(ObjectUtils.isNotEmpty(sendResJson)?sendResJson.toJSONString():"");
+            conglomeratePushLog.setPushStatus(exeRes);
+            conglomeratePushLog.setPushCount(pushCount);
+            conglomeratePushLog.setPushTime(new Date());
+            //淇濆瓨鍙戦�佷俊鎭�
+            conglomeratePushLogMapper.saveLog(conglomeratePushLog);
+
+        }
+    }
+
+    private JSONObject send(String jsonData){
+        try{
+            Map<String,String> params = new HashMap<String, String>();
+            params.put("appKey", "");
+            params.put("call", "");
+            params.put("timestamp", String.valueOf(System.currentTimeMillis()));
+            params.put("data", jsonData);//
+            Response response = HttpUtil.post(params,"url");
+            String res = response.body().string();
+            return JSONObject.parseObject(res);
+        }catch (Exception e)
+        {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("success", false);
+            jsonObject.put("result", false);
+            jsonObject.put("error", e.getMessage());
+            return jsonObject;
+        }
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/controller/DataItemController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/controller/DataItemController.java
new file mode 100644
index 0000000..dc7b06e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/controller/DataItemController.java
@@ -0,0 +1,144 @@
+package com.dingzhuo.energy.project.dataEntry.controller;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.project.common.CommonConst;
+import com.dingzhuo.energy.project.common.DateTimeUtil;
+import com.dingzhuo.energy.project.common.StringUtil;
+import com.dingzhuo.energy.project.common.TimeTypeConst;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.EnergyConsumeInput;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.SaveEnergyConsumeInputEntity;
+import com.dingzhuo.energy.project.energyConsumeInput.service.IEnergyConsumeInputService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.dataEntry.service.*;
+import com.dingzhuo.energy.project.dataEntry.domain.*;
+
+/**
+ * 闃舵鏁版嵁褰曞叆
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+@RestController
+@Api(value = "闃舵褰曞叆",tags = {"闃舵褰曞叆"})
+@RequestMapping("/dataEntry/stagseDataEntry")
+public class DataItemController extends BaseController {
+    @Autowired
+    private IDataItemService dataItemService;
+    @Autowired
+    private PeriodDataService periodDataService;
+    @Autowired
+    private IEnergyConsumeInputService energyConsumeInputService;
+
+    /**
+     * 闃舵鏁版嵁褰曞叆鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('dataEntry:stagseDataEntry:list')")
+    @Log(title = "闃舵鏁版嵁褰曞叆鏌ヨ", businessType = BusinessType.UPDATE)
+    @GetMapping("/list")
+    @ApiOperation(value = "闃舵鏁版嵁褰曞叆鍒楄〃")
+    public TableDataInfo list(stagseDataEntry stagseDataEntry) {
+        stagseDataEntry.setDataTime(DateTimeUtil.getDateTimeWithTimeType(stagseDataEntry.getDataTimeStr(), stagseDataEntry.getTimeType().toString()));
+        String timeCode = TimeManager.getTimeCode(stagseDataEntry.getDataTime(), stagseDataEntry.getTimeType());
+        stagseDataEntry.setBeginTime(TimeManager.getBeginTime(timeCode));
+        stagseDataEntry.setEndTime(TimeManager.getEndTime(timeCode));
+        List<EnergyConsumeInput> list = energyConsumeInputService.selectEnergyConsumeInputList(stagseDataEntry.getNodeId(), timeCode, stagseDataEntry.getTimeType().toString());
+        for (EnergyConsumeInput input : list) {
+            input.setDataTimeStr(DateTimeUtil.getDateTimeStrWithTimeType(input.getDataTime(), stagseDataEntry.getTimeType().toString()));
+            if (StringUtil.isEmptyOrNull(input.getDataTimeStr())) {
+                input.setDataTimeStr(DateTimeUtil.getDateTimeStrWithTimeType(stagseDataEntry.getDataTime(), stagseDataEntry.getTimeType().toString()));
+            }
+            input.setCreateTimeStr(DateTimeUtil.toString(input.getCreateTime()));
+            input.setTimeType(stagseDataEntry.getTimeType());
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 闃舵鏁版嵁褰曞叆鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('dataEntry:stagseDataEntry:edit')")
+    @Log(title = "闃舵鏁版嵁褰曞叆淇敼", businessType = BusinessType.UPDATE)
+    @GetMapping("/edit")
+    @ApiOperation(value = "闃舵鏁版嵁褰曞叆淇敼")
+    public TableDataInfo edit(stagseDataEntry stagseDataEntry) {
+        List<stagseDataEntry> list = dataItemService.getSettingEdit(stagseDataEntry);
+        list.forEach(s -> {
+            if (s.getDataTime() == null) {
+                s.setDataTime(stagseDataEntry.getDataTime());
+            }
+        });
+        return getDataTable(list);
+    }
+
+    /**
+     * 鏂板闃舵鏁版嵁
+     */
+    @PreAuthorize("@ss.hasPermi('dataEntry:stagseDataEntry:add')")
+    @PostMapping
+    @ApiOperation(value = "鏂板闃舵鏁版嵁")
+    public AjaxResult add(@RequestHeader("Authorization") String authorization, @RequestBody List<EnergyConsumeInput> listMap) {
+        if (listMap != null && !listMap.isEmpty()) {
+            EnergyConsumeInput temp = listMap.stream().findFirst().orElse(null);
+
+            List<String> indexIds = listMap.stream().map(EnergyConsumeInput::getIndexId).collect(Collectors.toList());
+            Date dataTime = DateTimeUtil.getDateTimeWithTimeType(temp.getDataTimeStr(), temp.getTimeType().toString());
+            String timeCode = TimeManager.getTimeCode(dataTime, temp.getTimeType());
+            int res = energyConsumeInputService.deleteEnergyConsumeInputByIds(indexIds, timeCode);
+
+            List<SaveEnergyConsumeInputEntity> dataItemList = new ArrayList<>();
+            Date endTime = DateTimeUtil.getEndTimeWithTimeType(dataTime, temp.getTimeType().toString());
+            String userName = SecurityUtils.getUsername();
+            for (EnergyConsumeInput input : listMap) {
+                if (input.getValue() != null) {
+                    SaveEnergyConsumeInputEntity data = new SaveEnergyConsumeInputEntity();
+                    data.setValue(input.getValue());
+                    data.setCreateTime(DateUtils.getNowDate());
+                    data.setIndexId(input.getIndexId());
+                    data.setIndexCode(input.getCode());
+                    data.setTimeType(temp.getTimeType().toString());
+                    data.setTimeCode(timeCode);
+                    data.setDataTime(dataTime);
+                    data.setBeginTime(dataTime);
+                    data.setEndTime(endTime);
+                    data.setCreateBy(userName);
+                    dataItemList.add(data);
+                }
+            }
+            int saveRes = energyConsumeInputService.saveEnergyConsumeInputList(dataItemList);
+            if (saveRes > 0) {
+                boolean mark = energyConsumeInputService.reCalcIndexIdByIds(indexIds, temp.getTimeType().toString(), authorization, dataTime);
+            }
+        }
+        return AjaxResult.success();
+    }
+
+    /**
+     * 闃舵鏁版嵁褰曞叆鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('dataEntry:stagseDataEntry:listEdit')")
+    @Log(title = "闃舵鏁版嵁褰曞叆鏌ヨ", businessType = BusinessType.UPDATE)
+    @GetMapping("/listEdit")
+    @ApiOperation(value = "闃舵鏁版嵁褰曞叆鏌ヨ")
+    public AjaxResult c(stagseDataEntry stagseDataEntry) {
+        List<String> indexCode = Arrays.asList(stagseDataEntry.getIndexCode().split(","));
+        List<stagseDataEntry> list = dataItemService.stagseDataEntry(stagseDataEntry.getNodeId(), indexCode, stagseDataEntry.getTimeType(), stagseDataEntry.getBeginTime(), stagseDataEntry.getEndTime(), stagseDataEntry.getCalcType());
+        return AjaxResult.success(list);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/dataEntry.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/dataEntry.java
new file mode 100644
index 0000000..c4a7966
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/dataEntry.java
@@ -0,0 +1,111 @@
+package com.dingzhuo.energy.project.dataEntry.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * stagseDataEntry瀵硅薄 data_item
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class dataEntry extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    @Excel(name = "鎸囨爣id")
+    private String indexId;
+
+    @Excel(name = "鎸囨爣code")
+    private String timeCode;
+
+    @Excel(name = "鍊�")
+    private String value;
+
+    @Excel(name = "寮�濮嬫椂闂�")
+    private Date beginTime;
+
+    @Excel(name = "缁撴潫鏃堕棿")
+    private Date endTime;
+
+    private String quality;
+
+    @Excel(name = "鏃堕棿绫诲瀷")
+    private String timeType;
+
+    @Excel(name = "鏁版嵁鏃堕棿")
+    private Date dataTime;
+
+    public void setIndexId(String indexId) 
+    {
+        this.indexId = indexId;
+    }
+
+    public String getIndexId() 
+    {
+        return indexId;
+    }
+    public void setTimeCode(String timeCode) 
+    {
+        this.timeCode = timeCode;
+    }
+
+    public String getTimeCode() 
+    {
+        return timeCode;
+    }
+    public void setBeginTime(Date beginTime) 
+    {
+        this.beginTime = beginTime;
+    }
+
+    public String getValue() {return value;}
+
+    public void setValue(String value) {this.value = value;}
+
+    public void setQuality(String quality)
+    {
+        this.quality = quality;
+    }
+
+    public String getQuality() 
+    {
+        return quality;
+    }
+    public void setTimeType(String timeType) 
+    {
+        this.timeType = timeType;
+    }
+
+    public String getTimeType() 
+    {
+        return timeType;
+    }
+    public void setDataTime(Date dataTime) 
+    {
+        this.dataTime = dataTime;
+    }
+
+    public Date getDataTime() 
+    {
+        return dataTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .append("indexId", getIndexId())
+            .append("timeCode", getTimeCode())
+            .append("beginTime", getBeginTime())
+            .append("endTime", getEndTime())
+            .append("quality", getQuality())
+            .append("timeType", getTimeType())
+            .append("value", getValue())
+            .append("dataTime", getDataTime())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/stagseDataEntry.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/stagseDataEntry.java
new file mode 100644
index 0000000..895a3e2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/domain/stagseDataEntry.java
@@ -0,0 +1,53 @@
+package com.dingzhuo.energy.project.dataEntry.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * stagseDataEntry瀵硅薄 data_item
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+@Data
+@ApiModel(value = "闃舵褰曞叆瀹炰綋")
+public class stagseDataEntry  implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "鑺傜偣id")
+    private String nodeId;
+    @ApiModelProperty(value = "鏃堕棿绫诲瀷")
+    private TimeType timeType;
+    @ApiModelProperty(value = "鎸囨爣id")
+    private String indexId;
+    @ApiModelProperty(value = "鎸囨爣缂栫爜")
+    private String indexCode;
+    @ApiModelProperty(value = "璁$畻鏂瑰紡")
+    private String calcType;
+    @ApiModelProperty(value = "缂栫爜")
+    private String code;
+    @ApiModelProperty(value = "鍚嶇О")
+    private String name;
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unitId;
+    @ApiModelProperty(value = "鍊�")
+    private Double value;
+    @ApiModelProperty(value = "鏃堕棿缂栫爜")
+    private String timeCode;
+    @ApiModelProperty(value = "鏃ユ湡")
+    private Date dataTime;
+    @ApiModelProperty(value = "鏃ユ湡瀛楃涓�")
+    private String dataTimeStr;
+    @ApiModelProperty(value = "寮�濮嬫椂闂�")
+    private Date beginTime;
+    @ApiModelProperty(value = "缁撴潫鏃堕棿")
+    private Date endTime;
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/mapper/DataItemMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/mapper/DataItemMapper.java
new file mode 100644
index 0000000..a8fdf99
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/mapper/DataItemMapper.java
@@ -0,0 +1,55 @@
+package com.dingzhuo.energy.project.dataEntry.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.dataEntry.domain.stagseDataEntry;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface DataItemMapper {
+    /**
+     * 闃舵鏁版嵁褰曞叆
+     *
+     * @param stagseDataEntry
+     * @return 缁撴灉
+     */
+    public List<stagseDataEntry> getSettingIndex(stagseDataEntry stagseDataEntry);
+
+    public List<stagseDataEntry> getSettingEdit(stagseDataEntry stagseDataEntry);
+
+    List<stagseDataEntry> stagseDataByCode(@Param("nodeId") String nodeId,
+                                           @Param("indexCodes") List<String> indexCodes,
+                                           @Param("timeType") TimeType timeType,
+                                           @Param("beginTime") Date beginTime,
+                                           @Param("endTime") Date endTime,
+                                           @Param("calcType") String calcType);
+
+    /**
+     * 鏍规嵁indexId涓庢椂闂磋寖鍥存煡璇㈠皬鏃剁殑dataitem淇℃伅
+     *
+     * @param beginTime 寮�濮嬫椂闂�
+     * @param endTime   鎴鏃堕棿
+     * @param timeType  鏃堕棿绫诲瀷
+     * @param indexIds  鐐逛綅闆嗗悎
+     * @return
+     */
+    List<DataItem> getDataItemHourInforByIndexIds(@Param("beginTime") Date beginTime, @Param("endTime") Date endTime,
+                                                  @Param("timeType") String timeType, @Param("indexIds") List<String> indexIds);
+
+    /**
+     * 鏍规嵁indexId涓庢椂闂寸紪鐮佹煡璇㈢偣浣嶅�煎悎璁�
+     *
+     * @param timeCode 鏃堕棿缂栫爜
+     * @param indexIds 鐐逛綅id闆嗗悎
+     * @return
+     */
+    List<DataItem> getDataItemInforByIndexIds(@Param("timeCode") String timeCode, @Param("indexIds") List<String> indexIds);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/IDataItemService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/IDataItemService.java
new file mode 100644
index 0000000..af4a887
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/IDataItemService.java
@@ -0,0 +1,59 @@
+package com.dingzhuo.energy.project.dataEntry.service;
+
+import cn.hutool.core.date.DateTime;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.dataEntry.domain.stagseDataEntry;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IDataItemService {
+    /**
+     * 鏌ヨ闇�瑕佹墜鍔ㄥ綍鍏ョ殑闃舵鏁版嵁
+     * 
+     * @param stagseDataEntry
+     * @return stagseDataEntry闆嗗悎
+     */
+    public List<stagseDataEntry> getSettingIndex(stagseDataEntry stagseDataEntry);
+
+    /**
+     * 鏌ヨ淇敼鎵嬪姩褰曞叆鐨勯樁娈垫暟鎹�
+     *
+     * @param stagseDataEntry
+     * @return stagseDataEntry闆嗗悎
+     */
+    public List<stagseDataEntry> getSettingEdit(stagseDataEntry stagseDataEntry);
+
+    public List<stagseDataEntry> stagseDataEntry(String nodeId, List<String> indexCodes,
+                                                 TimeType timeType,
+                                                 Date beginTime,
+                                                 Date endTime,
+                                                 String calcType);
+
+    /**
+     * 鏍规嵁indexId涓庢椂闂磋寖鍥存煡璇㈠皬鏃剁殑dataitem淇℃伅
+     *
+     * @param beginTime 寮�濮嬫椂闂�
+     * @param endTime   鎴鏃堕棿
+     * @param timeType  鏃堕棿绫诲瀷
+     * @param indexIds  鐐逛綅闆嗗悎
+     * @return
+     */
+    List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds);
+
+    /**
+     * 鏍规嵁indexId涓庢椂闂寸紪鐮佹煡璇㈢偣浣嶅�煎悎璁�
+     *
+     * @param timeCode 鏃堕棿缂栫爜
+     * @param indexIds 鐐逛綅id闆嗗悎
+     * @return
+     */
+    List<DataItem> getDataItemInforByIndexIds(String timeCode, List<String> indexIds);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/impl/DataItemServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/impl/DataItemServiceImpl.java
new file mode 100644
index 0000000..ddb4ab8
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/dataEntry/service/impl/DataItemServiceImpl.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.project.dataEntry.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.dataEntry.domain.stagseDataEntry;
+import com.dingzhuo.energy.project.dataEntry.mapper.DataItemMapper;
+import com.dingzhuo.energy.project.dataEntry.service.IDataItemService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * stagseDataEntryService涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class DataItemServiceImpl implements IDataItemService {
+    @Autowired
+    private DataItemMapper dataItemMapper;
+    /**
+     * 鏌ヨ闇�瑕佹墜鍔ㄥ綍鍏ョ殑闃舵鏁版嵁
+     *
+     * @param stagseDataEntry
+     * @return 缁撴灉
+     */
+    @Override
+    public List<stagseDataEntry> getSettingIndex(stagseDataEntry stagseDataEntry) {
+        return dataItemMapper.getSettingIndex(stagseDataEntry);
+    }
+
+    /**
+     * 鏌ヨ淇敼鎵嬪姩褰曞叆鐨勯樁娈垫暟鎹�
+     *
+     * @param stagseDataEntry
+     * @return 缁撴灉
+     */
+    @Override
+    public List<stagseDataEntry> getSettingEdit(stagseDataEntry stagseDataEntry) {
+        return dataItemMapper.getSettingEdit(stagseDataEntry);
+    }
+
+    @Override
+    public List<stagseDataEntry> stagseDataEntry(String nodeId, List<String> indexCodes, TimeType timeType, Date beginTime, Date endTime, String calcType) {
+        return dataItemMapper.stagseDataByCode(nodeId, indexCodes, timeType, beginTime, endTime, calcType);
+    }
+
+    /**
+     * 鏍规嵁indexId涓庢椂闂磋寖鍥存煡璇㈠皬鏃剁殑dataitem淇℃伅
+     *
+     * @param beginTime 寮�濮嬫椂闂�
+     * @param endTime   鎴鏃堕棿
+     * @param timeType  鏃堕棿绫诲瀷
+     * @param indexIds  鐐逛綅闆嗗悎
+     * @return
+     */
+    @Override
+    public List<DataItem> getDataItemHourInforByIndexIds(Date beginTime, Date endTime, String timeType, List<String> indexIds) {
+        return dataItemMapper.getDataItemHourInforByIndexIds(beginTime, endTime, timeType, indexIds);
+    }
+
+    /**
+     * 鏍规嵁indexId涓庢椂闂寸紪鐮佹煡璇㈢偣浣嶅�煎悎璁�
+     *
+     * @param timeCode 鏃堕棿缂栫爜
+     * @param indexIds 鐐逛綅id闆嗗悎
+     * @return
+     */
+    @Override
+    public List<DataItem> getDataItemInforByIndexIds(String timeCode, List<String> indexIds) {
+        return dataItemMapper.getDataItemInforByIndexIds(timeCode, indexIds);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/ElectricityPriceController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/ElectricityPriceController.java
new file mode 100644
index 0000000..802baa8
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/ElectricityPriceController.java
@@ -0,0 +1,137 @@
+package com.dingzhuo.energy.project.electricity.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.service.IElectricityPriceService;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.service.ISysDictDataService;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/electricityPrice/electricity")
+public class ElectricityPriceController extends BaseController
+{
+    @Autowired
+    private IElectricityPriceService electricityPriceService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:dictList')")
+    @GetMapping("/dictList")
+    public TableDataInfo dictList(SysDictData dictData)
+    {
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        return getDataTable(list);
+    }
+    /**
+     * 鏌ヨelectricityPrice鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(ElectricityPrice electricityPrice){
+        startPage();
+        List<ElectricityPrice> Datelist = electricityPriceService.selectList(electricityPrice);
+        if(Datelist.size()>0){
+            electricityPrice.setEffectiveDate(Datelist.get(0).getEffectiveDate());
+        }
+        List<ElectricityPrice> list = electricityPriceService.selectElectricityPriceList(electricityPrice);
+        return getDataTable(list);
+    }
+    /**
+     * 鏌ヨ鍘嗗彶鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:listHistory')")
+    @GetMapping("/listHistory")
+    public TableDataInfo listHistory(ElectricityPrice electricityPrice){
+        startPage();
+        List<ElectricityPrice> list = electricityPriceService.listHistory(electricityPrice);
+        return getDataTable(list);
+    }
+    /**
+     * 鏌ヨ鐢熸晥鏃ユ湡鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:listDate')")
+    @GetMapping("/listDate")
+    public TableDataInfo listDate(ElectricityPrice electricityPrice) {
+        List<ElectricityPrice> list = electricityPriceService.selectList(electricityPrice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭electricityPrice鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:export')")
+    @Log(title = "electricityPrice", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(ElectricityPrice electricityPrice)
+    {
+        List<ElectricityPrice> list = electricityPriceService.selectElectricityPriceList(electricityPrice);
+        ExcelUtil<ElectricityPrice> util = new ExcelUtil<ElectricityPrice>(ElectricityPrice.class);
+        return util.exportExcel(list, "electricity");
+    }
+
+    /**
+     * 鑾峰彇electricityPrice璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(electricityPriceService.selectElectricityPriceById(id));
+    }
+
+    /**
+     * 鏂板electricityPrice
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:add')")
+    @Log(title = "electricityPrice", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ElectricityPrice electricityPrice){
+        return toAjax(electricityPriceService.insertElectricityPrice(electricityPrice));
+    }
+
+    /**
+     * 淇敼electricityPrice
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:edit')")
+    @Log(title = "electricityPrice", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ElectricityPrice electricityPrice)
+    {
+        return toAjax(electricityPriceService.updateElectricityPrice(electricityPrice));
+    }
+
+    /**
+     * 鍒犻櫎electricityPrice
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:electricity:remove')")
+    @Log(title = "electricityPrice", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(electricityPriceService.deleteElectricityPriceByIds(ids));
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/TimePeriodPriceController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/TimePeriodPriceController.java
new file mode 100644
index 0000000..fac3afc
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/TimePeriodPriceController.java
@@ -0,0 +1,128 @@
+package com.dingzhuo.energy.project.electricity.controller;
+
+import java.util.List;
+
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import com.dingzhuo.energy.project.electricity.service.ITimePeriodPriceService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * electricityPriceController
+ * 
+ * @author sys
+ * @date 2020-02-19
+ */
+@RestController
+@RequestMapping("/electricityPrice/price")
+public class TimePeriodPriceController extends BaseController
+{
+    @Autowired
+    private ITimePeriodPriceService timePeriodPriceService;
+
+    /**
+     * 鏌ヨelectricityPrice鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TimePeriodPrice timePeriodPrice)
+    {
+        startPage();
+        List<TimePeriodPrice> list= timePeriodPriceService.selectTimePeriodPriceList(timePeriodPrice);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭electricityPrice鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:export')")
+    @Log(title = "electricityPrice", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(TimePeriodPrice timePeriodPrice)
+    {
+        List<TimePeriodPrice> list = timePeriodPriceService.selectTimePeriodPriceList(timePeriodPrice);
+        ExcelUtil<TimePeriodPrice> util = new ExcelUtil<TimePeriodPrice>(TimePeriodPrice.class);
+        return util.exportExcel(list, "price");
+    }
+
+    /**
+     * 鑾峰彇electricityPrice璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(timePeriodPriceService.selectTimePeriodPriceById(id));
+    }
+
+    /**
+     * 鏂板electricityPrice
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:add')")
+    @Log(title = "electricityPrice", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TimePeriodPrice timePeriodPrice) {
+        int msg=timePeriodPriceService.insertTimePeriodPrice(timePeriodPrice);
+        /*if(msg>0){
+            timePeriodPriceService.editPeriodPrice(timePeriodPrice);
+        }*/
+        return toAjax(msg);
+    }
+
+    /**
+     * 淇敼electricityPrice
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:edit')")
+    @Log(title = "electricityPrice", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TimePeriodPrice timePeriodPrice)
+    {
+        return toAjax(timePeriodPriceService.updateTimePeriodPrice(timePeriodPrice));
+    }
+
+    /**
+     * 鍒犻櫎electricityPrice
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:remove')")
+    @Log(title = "electricityPrice", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(timePeriodPriceService.deleteTimePeriodPriceByIds(ids));
+    }
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:dictType')")
+    @GetMapping("/dictType")
+    public AjaxResult EdictType(TimePeriodPrice timePeriodPrice){
+        List<TimePeriodPrice> list=timePeriodPriceService.selectDictType(timePeriodPrice);
+        return AjaxResult.success(list);
+    }
+    @PreAuthorize("@ss.hasPermi('electricityPrice:price:dictTypeList')")
+    @GetMapping("/dictTypeList")
+    public AjaxResult dictTypeList(TimePeriodPrice timePeriodPrice){
+        List<TimePeriodPrice> list=timePeriodPriceService.selectDictType(timePeriodPrice);
+        if (!list.isEmpty()) {
+            return AjaxResult.success(list);
+        }else{
+            List<TimePeriodPrice> TimePeriodPriceList=timePeriodPriceService.dictTypeList(timePeriodPrice);
+            return AjaxResult.success(TimePeriodPriceList);
+        }
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/statisticsController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/statisticsController.java
new file mode 100644
index 0000000..662497c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/controller/statisticsController.java
@@ -0,0 +1,137 @@
+package com.dingzhuo.energy.project.electricity.controller;
+
+import com.dingzhuo.energy.common.utils.Arith;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.electricity.domain.*;
+import com.dingzhuo.energy.project.electricity.service.IstatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/electricityPrice/statistics")
+public class statisticsController extends BaseController {
+    @Autowired
+    private IstatisticsService statisticsService;
+
+    @Autowired
+    private PeriodDataService periodDataService;
+    @GetMapping("/getStatisticsList")
+    public AjaxResult getStatisticsList(statistics statistics) {
+        List<EnergyIndex> list = statisticsService.getStatisticsList(statistics);//鏌ヨ鎸囨爣list
+        List<String> indexIds= list.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<electricityDataItem> result = statisticsService.getPeriodDatasByIndex(indexIds, statistics.getBeginTime(),statistics.getEndTime(),statistics.getTimeType());//宄板钩璋锋寚鏍囪绠楁暟鎹�
+        List<TimePeriodPrice> priceList = statisticsService.getElectricityPriceList(statistics);//宄板钩璋蜂环鏍�
+        electricitTable tableData =new electricitTable();//琛ㄦ牸
+        if(result.size()>0){
+            Map<String, List<electricityDataItem>> groupBy = result.stream().collect(Collectors.groupingBy(electricityDataItem::getFormatdate));//鏍规嵁鏃堕棿杩涜鍒嗙粍
+            List<electricity> energyHeadList = new ArrayList<>();//琛ㄥご
+            List<Map> tableDataMaps = new ArrayList<Map>();//琛ㄦ牸鏁版嵁
+            List<Map> table = new ArrayList<Map>();
+            //鎷兼帴琛ㄥご
+            /*groupBy.forEach((indexName,value)->{*/
+                electricity energyHead = new electricity();
+                energyHead.setLable(statistics.getNodeName());//涓�绾ф爣棰�
+                AtomicInteger colcount= new AtomicInteger(2);//琛ㄦ牸鍒楃殑鏁伴噺
+                priceList.forEach((item)->{
+                    Map map =new HashMap<>();//琛ㄦ暟鎹�
+                    electricity energyChildNode1 = new electricity();
+                    energyChildNode1.setLable(item.getElectricityName());//浜岀骇鏍囬
+                    energyChildNode1.setValue("鐢ㄩ噺");//涓夌骇鏍囬
+                    energyChildNode1.setPrice("璐圭敤");//涓夌骇鏍囬
+                    energyChildNode1.setValueProp("col"+colcount);
+                    map.put("鐢ㄩ噺","col"+colcount);
+                    colcount.getAndIncrement();
+                    energyChildNode1.setPriceProp("col"+colcount);
+                    map.put("璐圭敤","col"+colcount);
+                    map.put("col"+colcount,item.getPrices());
+                    map.put("code",item.getTimePeriod());
+                    colcount.getAndIncrement();
+                    energyHead.addChildNode(energyChildNode1);
+                    table.add(map);
+                });
+                energyHeadList.add(energyHead);
+            /*});*/
+            tableData.setTablehead(energyHeadList);
+            //琛ㄦ牸鏁版嵁
+           groupBy.forEach((indexName,value)->{
+               Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+                value.forEach((data)->{
+                    tableColumn.put("name",indexName);
+                    table.forEach((item)->{
+                        String bb =item.get("code").toString().substring(0, 2);
+                        String b =data.getIndexCode().substring(0, 2);
+                        if(bb.equals("F_") && b.equals("F_")){
+                            Double outlay=new BigDecimal(data.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            Double usage=new BigDecimal(item.get(item.get("璐圭敤")).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            tableColumn.put(item.get("鐢ㄩ噺"),outlay);
+                            tableColumn.put(item.get("璐圭敤"),Arith.mul(outlay, usage));
+                        }
+                        if(bb.equals("P_") && b.equals("P_")){
+                            Double outlay=new BigDecimal(data.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            Double usage=new BigDecimal(item.get(item.get("璐圭敤")).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            tableColumn.put(item.get("鐢ㄩ噺"),outlay);
+                            tableColumn.put(item.get("璐圭敤"),Arith.mul(outlay, usage));
+                        }
+                        if(bb.equals("G_") && b.equals("G_")){
+                            Double outlay=new BigDecimal(data.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            Double usage=new BigDecimal(item.get(item.get("璐圭敤")).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            tableColumn.put(item.get("鐢ㄩ噺"),outlay);
+                            tableColumn.put(item.get("璐圭敤"),Arith.mul(outlay, usage));
+                        }
+                        if(bb.equals("J_") && b.equals("J_")){
+                            Double outlay=new BigDecimal(data.getValue()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            Double usage=new BigDecimal(item.get(item.get("璐圭敤")).toString()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+                            tableColumn.put(item.get("鐢ㄩ噺"),outlay);
+                            tableColumn.put(item.get("璐圭敤"),Arith.mul(outlay, usage));
+                        }
+                    });
+                });
+               tableDataMaps.add(tableColumn);
+            });
+            tableData.setTabledataMap(tableDataMaps);
+        }
+        return AjaxResult.success(tableData);
+    }
+
+    @GetMapping("/getDataStatistics")
+    public AjaxResult getDataStatistics(statistics statistics) {
+        List<EnergyIndex> list = statisticsService.getStatisticsList(statistics);//鏌ヨ鎸囨爣list
+        List<String> indexIds= list.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        //List<electricityDataItem> result = statisticsService.getDatasByIndex(indexIds, statistics.getTimeType());//鏌ヨ宄板钩璋锋寚鏍囨暟鎹�
+        List<electricityDataItem> result = statisticsService.getDatasByIndex(indexIds, statistics.getBeginTime(),statistics.getEndTime(),statistics.getTimeType());//宄板钩璋锋寚鏍囪绠楁暟鎹�
+        List<TimePeriodPrice> priceList = statisticsService.getElectricityPriceList(statistics);//宄板钩璋蜂环鏍�
+        electricitTable tableData =new electricitTable();
+        List<Map> tableDataMaps = new ArrayList<Map>();
+        //宄板钩璋峰崰姣�
+        priceList.forEach(item->{
+            String bb =item.getTimePeriod().substring(0, 2);
+            result.forEach(data->{
+                String dataItem =data.getIndexCode().substring(0, 2);
+                Map map =new HashMap<>();
+                if(bb.equals(dataItem)){
+                    map.put("value", Arith.mul(data.getValue(), item.getPrices()));
+                    map.put("name",data.getIndexName());
+                }
+                tableDataMaps.add(map) ;
+            });
+        });
+        tableData.setTabledataMap(tableDataMaps);
+        return AjaxResult.success(tableData);
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/ElectricityPrice.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/ElectricityPrice.java
new file mode 100644
index 0000000..c2d9bf4
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/ElectricityPrice.java
@@ -0,0 +1,139 @@
+package com.dingzhuo.energy.project.electricity.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+/**
+ * electricityPrice瀵硅薄 electricity_price
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public class ElectricityPrice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鐢熸晥鏃ユ湡 */
+    @Excel(name = "鐢熸晥鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date effectiveDate;
+
+    /** 鍗曚环 */
+    @Excel(name = "鍗曚环")
+    private String priceId;
+
+    /** 鏃舵寮�濮嬫椂闂� */
+    @Excel(name = "鏃舵寮�濮嬫椂闂�")
+    private String beginDate;
+
+    /** 鏃舵缁撴潫鏃堕棿 */
+    @Excel(name = "鏃舵缁撴潫鏃堕棿")
+    private String endDate;
+
+    /** 鏃舵鍚嶇О */
+    @Excel(name = "鏃舵鍚嶇О")
+    private String effectiveName;
+    /** 鍗曚环 */
+    @Excel(name = "鍗曚环")
+    private String price;
+    private String electricityName;
+
+    @Excel(name = "鍗曚环")
+    private Double prices;
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setEffectiveDate(Date effectiveDate)
+    {
+        this.effectiveDate = effectiveDate;
+    }
+
+    public Date getEffectiveDate()
+    {
+        return effectiveDate;
+    }
+    public void setPriceId(String priceId)
+    {
+        this.priceId = priceId;
+    }
+
+    public String getPriceId()
+    {
+        return priceId;
+    }
+    public void setBeginDate(String beginDate)
+    {
+        this.beginDate = beginDate;
+    }
+
+    public String getBeginDate()
+    {
+        return beginDate;
+    }
+    public void setEndDate(String endDate)
+    {
+        this.endDate = endDate;
+    }
+
+    public String getEndDate()
+    {
+        return endDate;
+    }
+    public void setEffectiveName(String effectiveName)
+    {
+        this.effectiveName = effectiveName;
+    }
+
+    public String getEffectiveName()
+    {
+        return effectiveName;
+    }
+    public void setPrice(String price)
+    {
+        this.price = price;
+    }
+
+    public String getPrice()
+    {
+        return price;
+    }
+
+    public Double getPrices() {
+        return prices;
+    }
+
+    public void setPrices(Double prices) {
+        this.prices = prices;
+    }
+
+    public String getElectricityName() {
+        return electricityName;
+    }
+
+    public void setElectricityName(String electricityName) {
+        this.electricityName = electricityName;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("effectiveDate", getEffectiveDate())
+                .append("priceId", getPriceId())
+                .append("beginDate", getBeginDate())
+                .append("endDate", getEndDate())
+                .append("effectiveName", getEffectiveName())
+                .append("price", getPrice())
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/TimePeriodPrice.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/TimePeriodPrice.java
new file mode 100644
index 0000000..38c26a1
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/TimePeriodPrice.java
@@ -0,0 +1,123 @@
+package com.dingzhuo.energy.project.electricity.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * electricity瀵硅薄 time_period_price
+ * 
+ * @author sys
+ * @date 2020-02-19
+ */
+public class TimePeriodPrice extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 鐢熸晥鏃ユ湡 */
+    private Date effectiveDate;
+
+    /** 鏃舵 */
+    @Excel(name = "鏃舵")
+    private String timePeriod;
+
+    /** 鍗曚环 */
+    @Excel(name = "鍗曚环")
+    private String price;
+    private Double prices;
+    private String electricityName;
+    private String dictType;//瀛楀吀绫诲瀷
+    private String dictValue;//瀛楀吀鍊�
+    private String dictLabel;//瀛楀吀鍚嶇О
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setEffectiveDate(Date effectiveDate) 
+    {
+        this.effectiveDate = effectiveDate;
+    }
+
+    public Date getEffectiveDate() 
+    {
+        return effectiveDate;
+    }
+    public void setTimePeriod(String timePeriod) 
+    {
+        this.timePeriod = timePeriod;
+    }
+
+    public String getTimePeriod() 
+    {
+        return timePeriod;
+    }
+    public void setPrice(String price)
+    {
+        this.price = price;
+    }
+
+    public String getPrice()
+    {
+        return price;
+    }
+
+    public Double getPrices() {
+        return prices;
+    }
+
+    public void setPrices(Double prices) {
+        this.prices = prices;
+    }
+
+    public String getDictType() {
+        return dictType;
+    }
+    public void setDictType(String dictType) {
+        this.dictType = dictType;
+    }
+    public String getDictValue() {
+        return dictValue;
+    }
+    public void setDictValue(String dictValue) {
+        this.dictValue = dictValue;
+    }
+    public String getDictLabel() {
+        return dictLabel;
+    }
+    public void setDictLabel(String dictLabel) {
+        this.dictLabel = dictLabel;
+    }
+
+    public String getElectricityName() {
+        return electricityName;
+    }
+
+    public void setElectricityName(String electricityName) {
+        this.electricityName = electricityName;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("effectiveDate", getEffectiveDate())
+            .append("timePeriod", getTimePeriod())
+            .append("price", getPrice())
+            .append("dictType", getDictType())
+            .append("dictValue", getDictValue())
+            .append("dictLabel", getDictLabel())
+            .append("electricityName", getElectricityName())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricitTable.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricitTable.java
new file mode 100644
index 0000000..b97e675
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricitTable.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.project.electricity.domain;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+
+public class electricitTable implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+  private List<electricity> tablehead =new ArrayList<>();
+  private List<Map> tabledataMap = new ArrayList<Map>();
+  public List<Map> getTabledataMap() {
+    return tabledataMap;
+  }
+  public void setTabledataMap(List<Map> tabledataMap) {
+    this.tabledataMap = tabledataMap;
+  }
+  public List<electricity> getTablehead() {
+    return tablehead;
+  }
+  public void setTablehead(List<electricity> tablehead) {
+    this.tablehead = tablehead;
+  }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricity.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricity.java
new file mode 100644
index 0000000..7f52236
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricity.java
@@ -0,0 +1,125 @@
+package com.dingzhuo.energy.project.electricity.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.project.energyStatistics.domain.EnergyConsumption;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * electricityPrice瀵硅薄 electricity_price
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public class electricity implements Serializable {
+    private static final long serialVersionUID = -2777479013884125925L;
+    private String lable;
+    private String prop;
+    private String maxValue;
+    private String minValue;
+    private String dataTime;
+    private  String value;
+    private  String price;
+    private String valueProp;
+    private String priceProp;
+    private String name;
+    private List<electricity> childNodes =new ArrayList<>();
+
+    public List<electricity> getChildNodes() {
+        return childNodes;
+    }
+
+    public void setChildNodes(List<electricity> childNodes) {
+        this.childNodes = childNodes;
+    }
+
+    public void addChildNode(electricity childNode){
+        this.childNodes.add(childNode);
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getLable() {
+        return lable;
+    }
+
+    public void setLable(String lable) {
+        this.lable = lable;
+    }
+
+    public String getProp() {
+        return prop;
+    }
+
+    public void setProp(String prop) {
+        this.prop = prop;
+    }
+
+    public String getMaxValue() {
+        return maxValue;
+    }
+
+    public void setMaxValue(String maxValue) {
+        this.maxValue = maxValue;
+    }
+
+    public String getMinValue() {
+        return minValue;
+    }
+
+    public void setMinValue(String minValue) {
+        this.minValue = minValue;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getPrice() {
+        return price;
+    }
+
+    public void setPrice(String price) {
+        this.price = price;
+    }
+
+    public String getValueProp() {
+        return valueProp;
+    }
+
+    public void setValueProp(String valueProp) {
+        this.valueProp = valueProp;
+    }
+
+    public String getPriceProp() {
+        return priceProp;
+    }
+
+    public void setPriceProp(String priceProp) {
+        this.priceProp = priceProp;
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricityDataItem.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricityDataItem.java
new file mode 100644
index 0000000..dc8b00c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/electricityDataItem.java
@@ -0,0 +1,161 @@
+package com.dingzhuo.energy.project.electricity.domain;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 鍛ㄦ湡鏁版嵁椤�.
+ */
+public class electricityDataItem implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+
+  private String indexId;
+  private String indexStorageId;
+  private String indexCode;
+  private String indexName;
+  private Date beginTime;
+  private Date endTime;
+  private Date dataTime;
+  private String timeCode;
+  private TimeType timeType;
+  private Double value;
+  private Quality quality;
+  private String unitId;
+  private Date createTime;
+  private Date updateTime;
+  private String remark;
+  //鏃堕棿鏍煎紡鍖�
+  private String formatdate;
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public String getFormatdate() {
+    return formatdate;
+  }
+
+  public void setFormatdate(String formatdate) {
+    this.formatdate = formatdate;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexStorageId() {
+    return indexStorageId;
+  }
+
+  public void setIndexStorageId(String indexStorageId) {
+    this.indexStorageId = indexStorageId;
+  }
+
+  public String getIndexCode() {
+    return indexCode;
+  }
+
+  public void setIndexCode(String indexCode) {
+    this.indexCode = indexCode;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+
+  public Date getEndTime() {
+    return endTime;
+  }
+
+  public void setEndTime(Date endTime) {
+    this.endTime = endTime;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public Double getValue() {
+    return value;
+  }
+
+  public void setValue(Double value) {
+    this.value = value;
+  }
+
+  public Quality getQuality() {
+    return quality;
+  }
+
+  public void setQuality(Quality quality) {
+    this.quality = quality;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+
+  public Date getCreateTime() {
+    return createTime;
+  }
+
+  public void setCreateTime(Date createTime) {
+    this.createTime = createTime;
+  }
+
+  public Date getUpdateTime() {
+    return updateTime;
+  }
+
+  public void setUpdateTime(Date updateTime) {
+    this.updateTime = updateTime;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/statistics.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/statistics.java
new file mode 100644
index 0000000..6f880c2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/domain/statistics.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.project.electricity.domain;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import java.util.Date;
+
+/**
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public class statistics{
+    private static final long serialVersionUID = 1L;
+    private String nodeId;
+    private String nodeName;
+    private String eierarchyFlag;
+    private TimeType TimeType;
+    private String dictType;
+    private Date beginTime;
+    private Date endTime;
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    public void setNodeName(String nodeName) {
+        this.nodeName = nodeName;
+    }
+
+    public String getEierarchyFlag() {
+        return eierarchyFlag;
+    }
+
+    public void setEierarchyFlag(String eierarchyFlag) {
+        this.eierarchyFlag = eierarchyFlag;
+    }
+
+    public TimeType getTimeType() {
+        return TimeType;
+    }
+
+    public void setTimeType(TimeType timeType) {
+        TimeType = timeType;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getDictType() {
+        return dictType;
+    }
+
+    public void setDictType(String dictType) {
+        this.dictType = dictType;
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/ElectricityPriceMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/ElectricityPriceMapper.java
new file mode 100644
index 0000000..179b2f2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/ElectricityPriceMapper.java
@@ -0,0 +1,67 @@
+package com.dingzhuo.energy.project.electricity.mapper;
+
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import java.util.List;
+
+/**
+ * electricityPriceMapper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public interface ElectricityPriceMapper
+{
+    /**
+     * 鏌ヨelectricityPrice
+     *
+     * @param id electricityPriceID
+     * @return electricityPrice
+     */
+    public ElectricityPrice selectElectricityPriceById(String id);
+
+    /**
+     * 鏌ヨelectricityPrice鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice闆嗗悎
+     */
+    public List<ElectricityPrice> selectElectricityPriceList(ElectricityPrice electricityPrice);
+    /**
+     * 鏌ヨ鐢熸晥鏃ユ湡鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice闆嗗悎
+     */
+    public List<ElectricityPrice> selectList(ElectricityPrice electricityPrice);
+    /**
+     * 鏂板electricityPrice
+     *
+     * @param electricityPrice electricityPrice
+     * @return 缁撴灉
+     */
+    public int insertElectricityPrice(ElectricityPrice electricityPrice);
+
+    /**
+     * 淇敼electricityPrice
+     *
+     * @param electricityPrice electricityPrice
+     * @return 缁撴灉
+     */
+    public int updateElectricityPrice(ElectricityPrice electricityPrice);
+
+    /**
+     * 鍒犻櫎electricityPrice
+     *
+     * @param id electricityPriceID
+     * @return 缁撴灉
+     */
+    public int deleteElectricityPriceById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎electricityPrice
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteElectricityPriceByIds(String[] ids);
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/TimePeriodPriceMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/TimePeriodPriceMapper.java
new file mode 100644
index 0000000..65e7919
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/TimePeriodPriceMapper.java
@@ -0,0 +1,65 @@
+package com.dingzhuo.energy.project.electricity.mapper;
+
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import java.util.List;
+
+/**
+ * electricityMapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-02-19
+ */
+public interface TimePeriodPriceMapper 
+{
+    /**
+     * 鏌ヨelectricity
+     * 
+     * @param id electricityID
+     * @return electricity
+     */
+    public TimePeriodPrice selectTimePeriodPriceById(String id);
+
+    /**
+     * 鏌ヨelectricity鍒楄〃
+     * 
+     * @param timePeriodPrice electricity
+     * @return electricity闆嗗悎
+     */
+    public List<TimePeriodPrice> selectTimePeriodPriceList(TimePeriodPrice timePeriodPrice);
+
+    /**
+     * 鏂板electricity
+     * 
+     * @param timePeriodPrice electricity
+     * @return 缁撴灉
+     */
+    public int insertTimePeriodPrice(TimePeriodPrice timePeriodPrice);
+
+    /**
+     * 淇敼electricity
+     * 
+     * @param timePeriodPrice electricity
+     * @return 缁撴灉
+     */
+    public int updateTimePeriodPrice(TimePeriodPrice timePeriodPrice);
+
+    /**
+     * 鍒犻櫎electricity
+     * 
+     * @param id electricityID
+     * @return 缁撴灉
+     */
+    public int deleteTimePeriodPriceById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎electricity
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteTimePeriodPriceByIds(String[] ids);
+
+    public List<TimePeriodPrice>selectDictType(TimePeriodPrice timePeriodPrice);
+    public List<TimePeriodPrice> dictTypeList(TimePeriodPrice timePeriodPrice);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/statisticsMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/statisticsMapper.java
new file mode 100644
index 0000000..d538b3c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/mapper/statisticsMapper.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.project.electricity.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import com.dingzhuo.energy.project.electricity.domain.electricityDataItem;
+import com.dingzhuo.energy.project.electricity.domain.statistics;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * electricityPriceMapper鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public interface statisticsMapper {
+    List<EnergyIndex> getStatisticsList(statistics statistics);
+    List<TimePeriodPrice> getElectricityPriceList(statistics statistics);
+    public List<electricityDataItem> getDatasByIndex(@Param("indexIds")List<String> indexIds, @Param("beginTime") Date beginTime, @Param("endTime") Date endTime,@Param("timeType")TimeType timeType);
+
+    List<electricityDataItem> getPeriodDatasByIndex(@Param("indexIds") List<String> indexIds,
+                                                    @Param("beginTime") Date beginTime,
+                                                    @Param("endTime") Date endTime,
+                                                    @Param("timeType") TimeType timeType);
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IElectricityPriceService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IElectricityPriceService.java
new file mode 100644
index 0000000..fe67e9e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IElectricityPriceService.java
@@ -0,0 +1,75 @@
+package com.dingzhuo.energy.project.electricity.service;
+
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import java.util.List;
+
+/**
+ * electricityPriceService鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public interface IElectricityPriceService
+{
+    /**
+     * 鏌ヨelectricityPrice
+     *
+     * @param id electricityPriceID
+     * @return electricityPrice
+     */
+    public ElectricityPrice selectElectricityPriceById(String id);
+
+    /**
+     * 鏌ヨelectricityPrice鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice闆嗗悎
+     */
+    public List<ElectricityPrice> selectElectricityPriceList(ElectricityPrice electricityPrice);
+    /**
+     * 鏌ヨ鐢熸晥鏃ユ湡鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice闆嗗悎
+     */
+    public List<ElectricityPrice> selectList(ElectricityPrice electricityPrice);
+    /**
+     * 鏌ヨ鍘嗗彶鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice闆嗗悎
+     */
+    public List<ElectricityPrice> listHistory(ElectricityPrice electricityPrice);
+    /**
+     * 鏂板electricityPrice
+     *
+     * @param electricityPrice electricityPrice
+     * @return 缁撴灉
+     */
+    public int insertElectricityPrice(ElectricityPrice electricityPrice);
+
+    /**
+     * 淇敼electricityPrice
+     *
+     * @param electricityPrice electricityPrice
+     * @return 缁撴灉
+     */
+    public int updateElectricityPrice(ElectricityPrice electricityPrice);
+
+    /**
+     * 鎵归噺鍒犻櫎electricityPrice
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑electricityPriceID
+     * @return 缁撴灉
+     */
+    public int deleteElectricityPriceByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎electricityPrice淇℃伅
+     *
+     * @param id electricityPriceID
+     * @return 缁撴灉
+     */
+    public int deleteElectricityPriceById(String id);
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/ITimePeriodPriceService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/ITimePeriodPriceService.java
new file mode 100644
index 0000000..c5dc1d9
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/ITimePeriodPriceService.java
@@ -0,0 +1,65 @@
+package com.dingzhuo.energy.project.electricity.service;
+
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import java.util.List;
+
+/**
+ * electricityService鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-02-19
+ */
+public interface ITimePeriodPriceService 
+{
+    /**
+     * 鏌ヨelectricity
+     * 
+     * @param id electricityID
+     * @return electricity
+     */
+    public TimePeriodPrice selectTimePeriodPriceById(String id);
+
+    /**
+     * 鏌ヨelectricity鍒楄〃
+     * 
+     * @param timePeriodPrice electricity
+     * @return electricity闆嗗悎
+     */
+    public List<TimePeriodPrice> selectTimePeriodPriceList(TimePeriodPrice timePeriodPrice);
+
+    /**
+     * 鏂板electricity
+     * 
+     * @param timePeriodPrice electricity
+     * @return 缁撴灉
+     */
+    public int insertTimePeriodPrice(TimePeriodPrice timePeriodPrice);
+    /**
+     * 淇敼electricity
+     * 
+     * @param timePeriodPrice electricity
+     * @return 缁撴灉
+     */
+    public int updateTimePeriodPrice(TimePeriodPrice timePeriodPrice);
+
+    /**
+     * 鎵归噺鍒犻櫎electricity
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑electricityID
+     * @return 缁撴灉
+     */
+    public int deleteTimePeriodPriceByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎electricity淇℃伅
+     * 
+     * @param id electricityID
+     * @return 缁撴灉
+     */
+    public int deleteTimePeriodPriceById(String id);
+
+    public List<TimePeriodPrice> selectDictType(TimePeriodPrice timePeriodPrice);
+
+    public List<TimePeriodPrice> dictTypeList(TimePeriodPrice timePeriodPrice);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IstatisticsService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IstatisticsService.java
new file mode 100644
index 0000000..a959021
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/IstatisticsService.java
@@ -0,0 +1,37 @@
+package com.dingzhuo.energy.project.electricity.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import com.dingzhuo.energy.project.electricity.domain.electricityDataItem;
+import com.dingzhuo.energy.project.electricity.domain.statistics;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 宄板钩璋锋帴鍙�
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+public interface IstatisticsService {
+    List<EnergyIndex> getStatisticsList(statistics statistics);
+    List<TimePeriodPrice> getElectricityPriceList(statistics statistics);
+    List<electricityDataItem> getDatasByIndex(List<String> indexIds, Date beginTime,Date endTime,TimeType timeType);
+    /**
+     * 鑾峰彇鎸囨爣鏌愪竴鏃跺埢鐨勬暟鎹�.
+     *
+     * @param indexIds  璁$畻鎸囨爣瀛樺偍闆嗗悎
+     * @param beginTime 寮�濮嬫椂闂�
+     * @param endTime   缁撴潫鏃堕棿
+     * @param timeType  鍛ㄦ湡绫诲瀷
+     */
+    List<electricityDataItem> getPeriodDatasByIndex(List<String> indexIds,
+                                              Date beginTime,
+                                              Date endTime,
+                                              TimeType timeType);
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/ElectricityPriceServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/ElectricityPriceServiceImpl.java
new file mode 100644
index 0000000..d59dd3f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/ElectricityPriceServiceImpl.java
@@ -0,0 +1,129 @@
+package com.dingzhuo.energy.project.electricity.service.impl;
+
+import java.text.SimpleDateFormat;
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import com.dingzhuo.energy.project.electricity.mapper.TimePeriodPriceMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.electricity.mapper.ElectricityPriceMapper;
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.service.IElectricityPriceService;
+
+/**
+ * electricityPriceService涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-02-17
+ */
+@Service
+public class ElectricityPriceServiceImpl implements IElectricityPriceService
+{
+    @Autowired
+    private ElectricityPriceMapper electricityPriceMapper;
+
+    @Autowired
+    private TimePeriodPriceMapper timePeriodPriceMapper;
+    /**
+     * 鏌ヨelectricityPrice
+     *
+     * @param priceId electricityPriceID
+     * @return electricityPrice
+     */
+    @Override
+    public ElectricityPrice selectElectricityPriceById(String priceId)
+    {
+        return electricityPriceMapper.selectElectricityPriceById(priceId);
+    }
+
+    /**
+     * 鏌ヨelectricityPrice鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice
+     */
+    @Override
+    public List<ElectricityPrice> selectElectricityPriceList(ElectricityPrice electricityPrice){
+        List<ElectricityPrice> listdate=electricityPriceMapper.selectList(electricityPrice);
+        if(listdate.size()>0){
+            electricityPrice.setEffectiveDate(listdate.get(0).getEffectiveDate());
+        }
+        List<ElectricityPrice> list=electricityPriceMapper.selectElectricityPriceList(electricityPrice);
+        return list;
+    }
+    /**
+     * 鏌ヨ鐢熸晥鏃ユ湡鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice
+     */
+    @Override
+    public List<ElectricityPrice> selectList(ElectricityPrice electricityPrice)
+    {
+        return electricityPriceMapper.selectList(electricityPrice);
+    }
+    /**
+     * 鏂板electricityPrice
+     *
+     * @param electricityPrice electricityPrice
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertElectricityPrice(ElectricityPrice electricityPrice){
+        electricityPrice.setId(UUID.randomUUID().toString());
+        TimePeriodPrice timePeriodPrice =new TimePeriodPrice();
+        timePeriodPrice.setEffectiveDate(electricityPrice.getEffectiveDate());
+        timePeriodPrice.setTimePeriod(electricityPrice.getEffectiveName());
+        List<TimePeriodPrice> priceList = timePeriodPriceMapper.selectTimePeriodPriceList(timePeriodPrice);
+        electricityPrice.setPriceId(priceList.get(0).getId());
+        return electricityPriceMapper.insertElectricityPrice(electricityPrice);
+    }
+
+    /**
+     * 淇敼electricityPrice
+     *
+     * @param electricityPrice electricityPrice
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateElectricityPrice(ElectricityPrice electricityPrice)
+    {
+        return electricityPriceMapper.updateElectricityPrice(electricityPrice);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎electricityPrice
+     *
+     * @param priceIds 闇�瑕佸垹闄ょ殑electricityPriceID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteElectricityPriceByIds(String[] priceIds)
+    {
+        return electricityPriceMapper.deleteElectricityPriceByIds(priceIds);
+    }
+
+    /**
+     * 鍒犻櫎electricityPrice淇℃伅
+     *
+     * @param priceId electricityPriceID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteElectricityPriceById(String priceId)
+    {
+        return electricityPriceMapper.deleteElectricityPriceById(priceId);
+    }
+
+    /**
+     * 鏌ヨ鍘嗗彶鍒楄〃
+     *
+     * @param electricityPrice electricityPrice
+     * @return electricityPrice闆嗗悎
+     */
+    public List<ElectricityPrice> listHistory(ElectricityPrice electricityPrice){
+        return electricityPriceMapper.selectElectricityPriceList(electricityPrice);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/TimePeriodPriceServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/TimePeriodPriceServiceImpl.java
new file mode 100644
index 0000000..66d5cb7
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/TimePeriodPriceServiceImpl.java
@@ -0,0 +1,129 @@
+package com.dingzhuo.energy.project.electricity.service.impl;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.mapper.ElectricityPriceMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.electricity.mapper.TimePeriodPriceMapper;
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import com.dingzhuo.energy.project.electricity.service.ITimePeriodPriceService;
+
+/**
+ * electricityService涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-02-19
+ */
+@Service
+public class TimePeriodPriceServiceImpl implements ITimePeriodPriceService 
+{
+    @Autowired
+    private TimePeriodPriceMapper timePeriodPriceMapper;
+
+    /**
+     * 鏌ヨelectricity
+     * 
+     * @param id electricityID
+     * @return electricity
+     */
+    @Override
+    public TimePeriodPrice selectTimePeriodPriceById(String id)
+    {
+        return timePeriodPriceMapper.selectTimePeriodPriceById(id);
+    }
+
+    /**
+     * 鏌ヨelectricity鍒楄〃
+     * 
+     * @param timePeriodPrice electricity
+     * @return electricity
+     */
+    @Override
+    public List<TimePeriodPrice> selectTimePeriodPriceList(TimePeriodPrice timePeriodPrice)
+    {
+        return timePeriodPriceMapper.selectTimePeriodPriceList(timePeriodPrice);
+    }
+
+    /**
+     * 鏂板electricity
+     * 
+     * @param timePeriodPrice electricity
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertTimePeriodPrice(TimePeriodPrice timePeriodPrice)
+    {
+        String[] s_array=timePeriodPrice.getPrice().split(",");
+        String[] TimePeriod=timePeriodPrice.getDictValue().split(",");
+        int msg=0;
+        for (int i=0;i<TimePeriod.length;i++) {
+            timePeriodPrice.setId(UUID.randomUUID().toString());
+            timePeriodPrice.setTimePeriod(TimePeriod[i]);
+            timePeriodPrice.setPrice(s_array[i]);
+           msg= timePeriodPriceMapper.insertTimePeriodPrice(timePeriodPrice);
+        }
+        return msg;
+    }
+    /**
+     * 淇敼electricity
+     * 
+     * @param timePeriodPrice electricity
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateTimePeriodPrice(TimePeriodPrice timePeriodPrice){
+        String[] s_array=timePeriodPrice.getPrice().split(",");
+        String[] TimePeriod=timePeriodPrice.getDictValue().split(",");
+        String[] ids=timePeriodPrice.getId().split(",");
+        int msg=0;
+        for (int i=0;i<ids.length;i++) {
+            timePeriodPrice.setId(ids[i]);
+            timePeriodPrice.setTimePeriod(TimePeriod[i]);
+            timePeriodPrice.setPrice(s_array[i]);
+            msg= timePeriodPriceMapper.updateTimePeriodPrice(timePeriodPrice);
+        }
+        return msg;
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎electricity
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑electricityID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTimePeriodPriceByIds(String[] ids)
+    {
+        return timePeriodPriceMapper.deleteTimePeriodPriceByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎electricity淇℃伅
+     * 
+     * @param id electricityID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteTimePeriodPriceById(String id)
+    {
+        return timePeriodPriceMapper.deleteTimePeriodPriceById(id);
+    }
+
+    /**
+     * 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
+     *
+     * @param timePeriodPrice timePeriodPrice
+     * @return electricityPrice
+     */
+    @Override
+    public List<TimePeriodPrice> selectDictType(TimePeriodPrice timePeriodPrice)
+    {
+        return timePeriodPriceMapper.selectDictType(timePeriodPrice);
+    }
+    public List<TimePeriodPrice> dictTypeList(TimePeriodPrice timePeriodPrice){
+        return timePeriodPriceMapper.dictTypeList(timePeriodPrice);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/statisticsServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/statisticsServiceImpl.java
new file mode 100644
index 0000000..6133611
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/electricity/service/impl/statisticsServiceImpl.java
@@ -0,0 +1,78 @@
+package com.dingzhuo.energy.project.electricity.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.service.impl.PeriodDataServiceImpl;
+import com.dingzhuo.energy.project.electricity.domain.ElectricityPrice;
+import com.dingzhuo.energy.project.electricity.domain.TimePeriodPrice;
+import com.dingzhuo.energy.project.electricity.domain.electricityDataItem;
+import com.dingzhuo.energy.project.electricity.domain.statistics;
+import com.dingzhuo.energy.project.electricity.mapper.statisticsMapper;
+import com.dingzhuo.energy.project.electricity.service.IstatisticsService;
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * electricityPriceService涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-02-17
+ */
+@Service
+public class statisticsServiceImpl implements IstatisticsService
+{
+    @Autowired
+    private statisticsMapper statisticsMapper;
+    @Override
+    public List<EnergyIndex> getStatisticsList(statistics statistics){
+        return statisticsMapper.getStatisticsList(statistics);
+    }
+    public List<TimePeriodPrice> getElectricityPriceList(statistics statistics){
+        return  statisticsMapper.getElectricityPriceList(statistics);
+    }
+
+    @Override
+    public List<electricityDataItem> getDatasByIndex(List<String> indexIds, Date beginTime,
+                                                     Date endTime, TimeType timeType) {
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return statisticsMapper.getDatasByIndex(indexIds,beginTime, endTime,timeType);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<electricityDataItem> getPeriodDatasByIndex(List<String> indexIds, Date beginTime,
+                                                     Date endTime, TimeType timeType) {
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return statisticsMapper.getPeriodDatasByIndex(indexIds, beginTime, endTime, timeType);
+        }
+
+        return Collections.emptyList();
+    }
+    private static class ReBuildTime {
+        private Date endTime;
+        private DateTime end;
+
+        public ReBuildTime(Date endTime) {
+            this.endTime = endTime;
+        }
+        public DateTime getEnd() {
+            return end;
+        }
+
+        public statisticsServiceImpl.ReBuildTime invoke() {
+            end = new DateTime(endTime);
+            DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:00:00");
+            formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
+            end = formatter.parseDateTime(end.toString(formatter));
+            return this;
+        }
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/controller/energyBalanceController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/controller/energyBalanceController.java
new file mode 100644
index 0000000..c064925
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/controller/energyBalanceController.java
@@ -0,0 +1,124 @@
+package com.dingzhuo.energy.project.energyBalance.controller;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+import com.dingzhuo.energy.project.energyBalance.service.IEnergyBalanceService;
+import com.dingzhuo.energy.project.energyBalance.service.IEnergyPicService;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 瀵规爣Controller
+ * 
+ * @author sys
+ * @date 2020-12-22
+ */
+@RestController
+@RequestMapping("/balance/energyBalance")
+public class energyBalanceController extends BaseController
+{
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private PeriodDataService periodDataService;
+    @Autowired
+    private IEnergyPicService energyPicService;
+    @Autowired
+    private IEnergyBalanceService balanceService;
+    /**
+     * 鑳芥簮骞宠 鍒嗘瀽
+     */
+    @PreAuthorize("@ss.hasPermi('balance:energyBalance:list')")
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem)
+    {
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+        List<String> indexCode = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<DataItem> list = balanceService.getBalanceList(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+        return AjaxResult.success(list);
+    }
+    @PreAuthorize("@ss.hasPermi('balance:energyBalance:tableList')")
+    @GetMapping("/tableList")
+    public AjaxResult tableList(DataItem dataItem)
+    {
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+        List<String> indexCode = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<DataItem> list = periodDataService.getDatasByIndex(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+        List<Map> energyHeadList = new ArrayList<Map>();
+        Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+        list.forEach(result->{
+            if(result.getIndexCode().lastIndexOf("_CC")==result.getIndexCode().length()-3){
+                tableColumn.put("value_CC",result.getValue());
+            }else if(result.getIndexCode().lastIndexOf("_XH")==result.getIndexCode().length()-3){
+                tableColumn.put("value_XH",result.getValue());
+            }else if(result.getIndexCode().lastIndexOf("_WG")==result.getIndexCode().length()-3){
+                tableColumn.put("value_WG",result.getValue());
+            }else if(result.getIndexCode().lastIndexOf("_SH")==result.getIndexCode().length()-3){
+                tableColumn.put("value_SH",result.getValue());
+            }
+        });
+        energyHeadList.add(tableColumn);
+        return AjaxResult.success(energyHeadList);
+    }
+    /**
+     * 鑳芥簮鎹熷け鍒嗘瀽
+     */
+    @PreAuthorize("@ss.hasPermi('balance:energyBalance:lossAnalysisList')")
+    @GetMapping("/lossAnalysisList")
+    public AjaxResult lossAnalysisList(DataItem dataItem)
+    {
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+        List<String> indexCode = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<DataItem> list = periodDataService.getDatasByIndex(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+        return AjaxResult.success(list);
+    }
+    @PreAuthorize("@ss.hasPermi('balance:energyBalance:lossTableList')")
+    @GetMapping("/lossTableList")
+    public AjaxResult lossTableList(DataItem dataItem)
+    {
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+        List<String> indexCode = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<DataItem> list = periodDataService.getDatasByIndex(indexCode, dataItem.getDataTime(), dataItem.getTimeType());
+        List<Map> energyHeadList = new ArrayList<Map>();
+        Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+        list.forEach(result->{
+            if(result.getIndexCode().lastIndexOf("_CC")==result.getIndexCode().length()-3){
+                tableColumn.put("value_CC",result.getValue());
+            }else if(result.getIndexCode().lastIndexOf("_XH")==result.getIndexCode().length()-3){
+                tableColumn.put("value_XH",result.getValue());
+            }else if(result.getIndexCode().lastIndexOf("_WG")==result.getIndexCode().length()-3){
+                tableColumn.put("value_WG",result.getValue());
+            }else if(result.getIndexCode().lastIndexOf("_SH")==result.getIndexCode().length()-3){
+                tableColumn.put("value_SH",result.getValue());
+            }else if(result.getIndexCode().lastIndexOf("_total")==result.getIndexCode().length()-6){
+                tableColumn.put("value_total",result.getValue());
+            }
+        });
+        energyHeadList.add(tableColumn);
+        return AjaxResult.success(energyHeadList);
+    }
+    /**
+     * 鏌ヨ  鑳芥祦鍒嗘瀽   鍔熻兘鎶ヨ〃  鍒楄〃
+     */
+    @GetMapping("/listEnergyPicIndex")
+    public TableDataInfo list(EnergyPic energyPic){
+        List<EnergyPic> list = energyPicService.selectEnergyPicList(energyPic);
+        return getDataTable(list);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/domain/EnergyPic.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/domain/EnergyPic.java
new file mode 100644
index 0000000..9ea4128
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/domain/EnergyPic.java
@@ -0,0 +1,453 @@
+package com.dingzhuo.energy.project.energyBalance.domain;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 鑳芥祦鍒嗘瀽  EnergyPic
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public class EnergyPic extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 閰嶇疆涓婚敭 */
+    private String index_id;
+
+    /** 鎸囨爣鍚嶅瓧*/
+    private String name;
+
+    /** 鎸囨爣鐨刢ode*/
+    private String code;
+
+    /** 鎸囨爣鍒嗙被鎺掑簭鍦板潃 */
+    private String address;
+    /**鏌ヨ鏃ユ湡**/
+    private String dataTime;
+    /**閫夋嫨灏忔椂**/
+    private String selectHour;
+    /**妯″瀷鐨勫悕瀛�**/
+    private String modename;
+    /**妯″瀷鐨刬d**/
+    private String nodeid;
+    /**鏌ヨ鐨剆ql涓撶敤鐗规畩澶勭悊鐨� 鏃ユ湡鏉′欢 鍙拡瀵�  鑳芥祦鍒嗘瀽浣跨敤**/
+    private String sqlWhereDataTime;
+
+    private String 	a1;
+    private String 	a2;
+    private String 	a3;
+    private String 	a4;
+    private String 	a5;
+    private String 	a6;
+    private String 	a7;
+    private String 	a8;
+    private String 	a9;
+    private String 	a10;
+    private String 	a11;
+    private String 	a12;
+    private String 	a13;
+    private String 	a14;
+    private String 	a15;
+    private String 	a16;
+    private String 	a17;
+    private String 	a18;
+    private String 	a19;
+    private String 	a20;
+    private String 	a21;
+    private String 	a22;
+    private String 	a23;
+    private String 	a24;
+    private String 	a25;
+    private String 	a26;
+    private String 	a27;
+    private String 	a28;
+    private String 	a29;
+    private String 	a30;
+    private String 	a31;
+    private String 	a32;
+    private String 	a33;
+    private String 	a34;
+    private String 	a35;
+    private String 	a36;
+
+    public String getIndex_id() {
+        return index_id;
+    }
+
+    public void setIndex_id(String index_id) {
+        this.index_id = index_id;
+    }
+
+    public String getA1() {
+        return getNlfxVal(getNlfxVal(this.a1));
+    }
+
+    public void setA1(String a1) {
+        this.a1 = a1;
+    }
+
+    public String getA2() {
+        return getNlfxVal(this.a2);
+    }
+
+    public void setA2(String a2) {
+        this.a2 = a2;
+    }
+
+    public String getA3() {
+        return getNlfxVal(this.a3);
+    }
+
+    public void setA3(String a3) {
+        this.a3 = a3;
+    }
+
+    public String getA4() {
+        return getNlfxVal(this.a4);
+    }
+
+    public void setA4(String a4) {
+        this.a4 = a4;
+    }
+
+    public String getA5() {
+        return getNlfxVal(this.a5);
+    }
+
+    public void setA5(String a5) {
+        this.a5 = a5;
+    }
+
+    public String getA6() {
+        return getNlfxVal(this.a6);
+    }
+
+    public void setA6(String a6) {
+        this.a6 = a6;
+    }
+
+    public String getA7() {
+        return getNlfxVal(this.a7);
+    }
+
+    public void setA7(String a7) {
+        this.a7 = a7;
+    }
+
+    public String getA8() {
+        return getNlfxVal(this.a8);
+    }
+
+    public void setA8(String a8) {
+        this.a8 = a8;
+    }
+
+    public String getA9() {
+        return getNlfxVal(this.a9);
+    }
+
+    public void setA9(String a9) {
+        this.a9 = a9;
+    }
+
+    public String getA10() {
+        return getNlfxVal(this.a10);
+    }
+
+    public void setA10(String a10) {
+        this.a10 = a10;
+    }
+
+    public String getA11() {
+        return getNlfxVal(this.a11);
+    }
+
+    public void setA11(String a11) {
+        this.a11 = a11;
+    }
+
+    public String getA12() {
+        return getNlfxVal(this.a12);
+    }
+
+    public void setA12(String a12) {
+        this.a12 = a12;
+    }
+
+    public String getA13() {
+        return getNlfxVal(this.a13);
+    }
+
+    public void setA13(String a13) {
+        this.a13 = a13;
+    }
+
+    public String getA14() {
+        return getNlfxVal(this.a14);
+    }
+
+    public void setA14(String a14) {
+        this.a14 = a14;
+    }
+
+    public String getA15() {
+        return getNlfxVal(this.a15);
+    }
+
+    public void setA15(String a15) {
+        this.a15 = a15;
+    }
+
+    public String getA16() {
+        return getNlfxVal(this.a16);
+    }
+
+    public void setA16(String a16) {
+        this.a16 = a16;
+    }
+
+    public String getA17() {
+        return getNlfxVal(this.a17);
+    }
+
+    public void setA17(String a17) {
+        this.a17 = a17;
+    }
+
+    public String getA18() {
+        return getNlfxVal(this.a18);
+    }
+
+    public void setA18(String a18) {
+        this.a18 = a18;
+    }
+
+    public String getA19() {
+        return getNlfxVal(this.a19);
+    }
+
+    public void setA19(String a19) {
+        this.a19 = a19;
+    }
+
+    public String getA20() {
+        return getNlfxVal(this.a20);
+    }
+
+    public void setA20(String a20) {
+        this.a20 = a20;
+    }
+
+    public String getA21() {
+        return getNlfxVal(this.a21);
+    }
+
+    public void setA21(String a21) {
+        this.a21 = a21;
+    }
+
+    public String getA22() {
+        return getNlfxVal(this.a22);
+    }
+
+    public void setA22(String a22) {
+        this.a22 = a22;
+    }
+
+    public String getA23() {
+        return getNlfxVal(this.a23);
+    }
+
+    public void setA23(String a23) {
+        this.a23 = a23;
+    }
+
+    public String getA24() {
+        return getNlfxVal(this.a24);
+    }
+
+    public void setA24(String a24) {
+        this.a24 = a24;
+    }
+
+    public String getA25() {
+        return getNlfxVal(this.a25);
+    }
+
+    public void setA25(String a25) {
+        this.a25 = a25;
+    }
+
+    public String getA26() {
+        return getNlfxVal(this.a26);
+    }
+
+    public void setA26(String a26) {
+        this.a26 = a26;
+    }
+
+    public String getA27() {
+        return getNlfxVal(this.a27);
+    }
+
+    public void setA27(String a27) {
+        this.a27 = a27;
+    }
+
+    public String getA28() {
+        return getNlfxVal(this.a28);
+    }
+
+    public void setA28(String a28) {
+        this.a28 = a28;
+    }
+
+    public String getA29() {
+        return getNlfxVal(this.a29);
+    }
+
+    public void setA29(String a29) {
+        this.a29 = a29;
+    }
+
+    public String getA30() {
+        return getNlfxVal(this.a30);
+    }
+
+    public void setA30(String a30) {
+        this.a30 = a30;
+    }
+
+    public String getA31() {
+        return getNlfxVal(this.a31);
+    }
+
+    public void setA31(String a31) {
+        this.a31 = a31;
+    }
+
+    public String getA32() {
+        return getNlfxVal(this.a32);
+    }
+
+    public void setA32(String a32) {
+        this.a32 = a32;
+    }
+
+    public String getA33() {
+        return getNlfxVal(this.a33);
+    }
+
+    public void setA33(String a33) {
+        this.a33 = a33;
+    }
+
+    public String getA34() {
+        return getNlfxVal(this.a34);
+    }
+
+    public void setA34(String a34) {
+        this.a34 = a34;
+    }
+
+    public String getA35() {
+        return getNlfxVal(this.a35);
+    }
+
+    public void setA35(String a35) {
+        this.a35 = a35;
+    }
+
+    public String getA36() {
+        return getNlfxVal(this.a36);
+    }
+
+    public void setA36(String a36) {
+        this.a36 = a36;
+    }
+
+
+    public String getSelectHour() {
+        return selectHour;
+    }
+
+    public void setSelectHour(String selectHour) {
+        this.selectHour = selectHour;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getModename() {
+        return modename;
+    }
+
+    public void setModename(String modename) {
+        this.modename = modename;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public String getNodeid() {
+        return nodeid;
+    }
+
+    public void setNodeid(String nodeid) {
+        this.nodeid = nodeid;
+    }
+
+    public String getSqlWhereDataTime() {
+        return this.dataTime+" "+this.selectHour;
+    }
+
+    public void setSqlWhereDataTime(String sqlWhereDataTime) {
+        this.sqlWhereDataTime = sqlWhereDataTime;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("index_id", getIndex_id())
+                .toString();
+    }
+
+    private String getNlfxVal(String val)
+    {
+        String tVal = (val==null || val.length()==0)?"--":val;
+        if(tVal.indexOf(".")>-1)
+        {
+            tVal = String.format("%.2f", Double.parseDouble(tVal));
+        }
+        return tVal;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/EnergyPicMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/EnergyPicMapper.java
new file mode 100644
index 0000000..9c4e5dd
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/EnergyPicMapper.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.energy.project.energyBalance.mapper;
+
+
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+
+import java.util.List;
+
+/**
+ * 鑳芥祦鍒嗘瀽  Mapper鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public interface EnergyPicMapper
+{
+    /**
+     * 鏌ヨ  鑳芥祦鍒嗘瀽  鎸囨爣鏁版嵁鍒楄〃
+     *
+     * @param energyPic 宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁
+     * @return 鑳芥祦鍒嗘瀽    鍔熻兘闆嗗悎
+     */
+    public List<EnergyPic> selectEnergyPicList(EnergyPic energyPic);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/energybalanceMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/energybalanceMapper.java
new file mode 100644
index 0000000..36c3cf9
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/mapper/energybalanceMapper.java
@@ -0,0 +1,24 @@
+package com.dingzhuo.energy.project.energyBalance.mapper;
+
+
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 鑳芥祦鍒嗘瀽  Mapper鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public interface energybalanceMapper
+{
+    /**
+     * 鏌ヨ  鑳芥簮骞宠 鍒嗘瀽
+     *
+     */
+    public List<DataItem> getBalanceList(@Param("indexIds") List<String> indexIds,
+                                   @Param("timeCode") String timeCode);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyBalanceService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyBalanceService.java
new file mode 100644
index 0000000..77654ad
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyBalanceService.java
@@ -0,0 +1,25 @@
+package com.dingzhuo.energy.project.energyBalance.service;
+
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鑳藉憳骞宠 Service鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public interface IEnergyBalanceService
+{
+
+    /**
+     * 鏌ヨ鑳芥簮骞宠 
+     *
+     */
+    public List<DataItem> getBalanceList(List<String> indexIds,Date dataTime,TimeType timeType);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyPicService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyPicService.java
new file mode 100644
index 0000000..dde5f5b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/IEnergyPicService.java
@@ -0,0 +1,24 @@
+package com.dingzhuo.energy.project.energyBalance.service;
+
+
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+
+import java.util.List;
+
+/**
+ * 鑳芥祦鍒嗘瀽Service鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public interface IEnergyPicService
+{
+
+    /**
+     * 鏌ヨ鑳芥祦鍒嗘瀽鎶ヨ〃鐨勬寚鏍囨暟鎹垪琛�
+     *
+     * @param energyPic 鑳芥祦鍒嗘瀽鎶ヨ〃鐨勬寚鏍囨暟鎹�
+     * @return 鑳芥祦鍒嗘瀽闆嗗悎
+     */
+    public List<EnergyPic> selectEnergyPicList(EnergyPic energyPic);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/EnergyPicServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/EnergyPicServiceImpl.java
new file mode 100644
index 0000000..b13474d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/EnergyPicServiceImpl.java
@@ -0,0 +1,86 @@
+package com.dingzhuo.energy.project.energyBalance.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+import com.dingzhuo.energy.project.energyBalance.mapper.EnergyPicMapper;
+import com.dingzhuo.energy.project.energyBalance.service.IEnergyPicService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳絊ervice涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+@Service
+public class EnergyPicServiceImpl implements IEnergyPicService
+{
+    @Autowired
+    private EnergyPicMapper energyPicMapper;
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁鍒楄〃
+     *
+     * @param energyPic 宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳介泦鍚�
+     */
+    public List<EnergyPic> selectEnergyPicList(EnergyPic energyPic){
+
+        //鏌ヨ鏁版嵁
+        List<EnergyPic> queryEnergyPiclRes = energyPicMapper.selectEnergyPicList(energyPic);
+        //杩斿洖淇℃伅
+        List<EnergyPic> resList = new ArrayList<>();
+        //鎸� 妯″瀷鐨刟ddress鍋氫釜鍒嗙粍 鍏跺疄 鎸� 鎸囨爣鎵�鍦ㄦā鍨嬪悕瀛楀垎缁勪篃鍙互
+        Map<String, List<EnergyPic>> addRessMap = queryEnergyPiclRes.stream().collect(Collectors.groupingBy(EnergyPic::getAddress, Collectors.toList()));
+        //閬嶅巻鍒嗙粍锛屽洜涓轰竴涓ā鍨嬩笅灏卞浐瀹氬洓涓寚鏍� 浜у嚭銆佹秷鑰椼�佸渚涖�佹崯鑰� 锛屽皢浠栦滑妯捣鏉ュ仛鎴愪竴涓� bean
+        addRessMap.forEach((k,v)->{
+            EnergyPic tPic = new EnergyPic();
+            for(EnergyPic codePic:v)
+            {
+                String code = codePic.getCode();
+                tPic.setModename(codePic.getModename());
+                if(code.lastIndexOf("_CC")==code.length()-3)//鏍规嵁鎸囨爣鐨勭紪鐮佸垽瀹� 鏄偅绉� 鍊硷紙浜у嚭銆佹秷鑰楃瓑绛夛級锛屽簳灞傛病鏈夊睘鎬ф敮鎸侊紝鍏堢敤杩欎釜
+                {
+                    tPic.setA1(codePic.getA1());
+                }
+                if(code.lastIndexOf("_XH")==code.length()-3)
+                {
+                    tPic.setA2(codePic.getA1());
+                }
+                if(code.lastIndexOf("_WG")==code.length()-3)
+                {
+                    tPic.setA3(codePic.getA1());
+                }
+                if(code.lastIndexOf("_SH")==code.length()-3)
+                {
+                    tPic.setA4(codePic.getA1());
+                }
+            }
+            resList.add(tPic);
+        });
+        return resList;
+    }
+
+    private String calculationCpdh(String nyxhl,String cpcl)
+    {
+        try{
+            if(nyxhl.equals("--")||cpcl.equals("--"))
+            {
+                return "--";
+            }else{
+                double fz = Double.parseDouble(nyxhl);
+                double fm = Double.parseDouble(cpcl);
+                return String.format("%.2f", fz/fm);
+            }
+        }catch (Exception e)
+        {
+            e.printStackTrace();
+            return "--";
+        }
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/energyBalanceServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/energyBalanceServiceImpl.java
new file mode 100644
index 0000000..f631eeb
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyBalance/service/impl/energyBalanceServiceImpl.java
@@ -0,0 +1,36 @@
+package com.dingzhuo.energy.project.energyBalance.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.energyBalance.mapper.energybalanceMapper;
+import com.dingzhuo.energy.project.energyBalance.service.IEnergyBalanceService;
+import com.dingzhuo.energy.project.energyBalance.service.IEnergyPicService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳絊ervice涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+@Service
+public class energyBalanceServiceImpl implements IEnergyBalanceService
+{
+    @Autowired
+    private energybalanceMapper energybalanceMapper;
+
+    @Override
+    public List<DataItem> getBalanceList(List<String> indexIds, Date dataTime, TimeType timeType) {
+        if (indexIds != null && !indexIds.isEmpty()) {
+            String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+            return energybalanceMapper.getBalanceList(indexIds, timeCode);
+        }
+
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/EnergyMonthConsumeInputController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/EnergyMonthConsumeInputController.java
new file mode 100644
index 0000000..cbd9569
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/EnergyMonthConsumeInputController.java
@@ -0,0 +1,106 @@
+package com.dingzhuo.energy.project.energyConsumeInput.controller;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.common.*;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.*;
+import com.dingzhuo.energy.project.energyConsumeInput.service.IEnergyConsumeInputService;
+import com.jsoniter.annotation.JsonObject;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 瀵规爣Controller
+ *
+ * @author sys
+ * @date 2020-12-22
+ */
+@RestController
+@RequestMapping("/energyAssistInput/energyMonthConsumeInput")
+@Api(value = "鏈堟暟鎹綍鍏�",tags = {"鏈堟暟鎹綍鍏�"})
+public class EnergyMonthConsumeInputController extends BaseController {
+    @Autowired
+    private IEnergyConsumeInputService energyConsumeInputService;
+
+    /**
+     * 鏌ヨ  鏈堝害鑳借�楁墜鍔ㄥ綍鍏ュ�� 鍒楄〃
+     */
+    @GetMapping("/listEnergyConsumeInputIndex")
+    @ApiOperation(value = "鏈堟暟鎹綍鍏ュ垪琛�")
+    public TableDataInfo list(String nodeId, String date, String timeType) {
+        String tempDate = date;
+        date = DateTimeUtil.toDateTimeStr(date, DateTimeUtil.COMMON_PATTERN_TO_MONTH, DateTimeUtil.COMMON_PATTERN_MONTH);
+        String timeCode = CommonConst.WORD_M + date;
+        List<EnergyConsumeInput> list = energyConsumeInputService.selectEnergyConsumeInputList(nodeId, timeCode, timeType);
+        for (EnergyConsumeInput input : list) {
+            input.setDataTimeStr(DateTimeUtil.getDateTime(input.getDataTime(), DateTimeUtil.COMMON_PATTERN_TO_MONTH));
+            if (StringUtil.isEmptyOrNull(input.getDataTimeStr())) {
+                input.setDataTimeStr(tempDate);
+            }
+            input.setCreateTimeStr(DateTimeUtil.toString(input.getCreateTime()));
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+     *
+     * @return
+     */
+    @PostMapping("/saveEnergyConsumeInput")
+    @ApiOperation(value = "鏈堟暟鎹綍鍏ヤ繚瀛�")
+    public TableDataInfo save(@RequestHeader("Authorization") String authorization, @RequestBody SaveEnergyConsumeInputModel model) {
+        if (model != null && !model.getModels().isEmpty()) {
+            EnergyConsumeInput temp = model.getModels().stream().findFirst().orElse(null);
+            String timeCode = CommonConst.EMPTY;
+            Date dataTime = null;
+            if (temp != null) {
+                String dt = temp.getDataTimeStr();
+                dataTime = DateTimeUtil.toDateTime(dt, DateTimeUtil.COMMON_PATTERN_TO_MONTH);
+                timeCode = CommonConst.WORD_M + DateTimeUtil.getMonth(dataTime);
+            }
+            List<String> indexIds = model.getModels().stream().map(EnergyConsumeInput::getIndexId).collect(Collectors.toList());
+
+            int res = energyConsumeInputService.deleteEnergyConsumeInputByIds(indexIds, timeCode);
+
+            List<SaveEnergyConsumeInputEntity> dataItemList = new ArrayList<>();
+            Date endTime = DateTimeUtil.addSeconds(DateTimeUtil.addMonths(dataTime, CommonConst.DIGIT_1), CommonConst.DIGIT_MINUS_1);
+            String userName = SecurityUtils.getUsername();
+            for (EnergyConsumeInput input : model.getModels()) {
+                if (input.getValue() != null) {
+                    SaveEnergyConsumeInputEntity data = new SaveEnergyConsumeInputEntity();
+                    data.setValue(input.getValue());
+                    data.setCreateTime(DateUtils.getNowDate());
+                    data.setIndexId(input.getIndexId());
+                    data.setIndexCode(input.getCode());
+                    data.setTimeType(TimeTypeConst.TIME_TYPE_MONTH);
+                    data.setTimeCode(timeCode);
+                    data.setDataTime(dataTime);
+                    data.setBeginTime(dataTime);
+                    data.setEndTime(endTime);
+                    data.setCreateBy(userName);
+                    dataItemList.add(data);
+                }
+            }
+            int saveRes = energyConsumeInputService.saveEnergyConsumeInputList(dataItemList);
+            if (saveRes > 0) {
+                boolean mark = energyConsumeInputService.reCalcIndexIdByIds(indexIds, TimeTypeConst.TIME_TYPE_MONTH, authorization, dataTime);
+            }
+        }
+        List<String> res = new ArrayList<>();
+        return getDataTable(res);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyDayConsumeInputController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyDayConsumeInputController.java
new file mode 100644
index 0000000..ae86f91
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyDayConsumeInputController.java
@@ -0,0 +1,102 @@
+package com.dingzhuo.energy.project.energyConsumeInput.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.common.*;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.*;
+import com.dingzhuo.energy.project.energyConsumeInput.service.IEnergyConsumeInputService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 瀵规爣Controller
+ *
+ * @author sys
+ * @date 2020-12-22
+ */
+@RestController
+@RequestMapping("/energyAssistInput/energyDayConsumeInput")
+@Api(value = "鏃ユ暟鎹綍鍏�",tags = {"鏃ユ暟鎹綍鍏�"})
+public class energyDayConsumeInputController extends BaseController {
+    @Autowired
+    private IEnergyConsumeInputService energyConsumeInputService;
+
+    /**
+     * 鏌ヨ  鏃ュ害鑳借�楁墜鍔ㄥ綍鍏ュ�� 鍒楄〃
+     */
+    @GetMapping("/listEnergyConsumeInputIndex")
+    @ApiOperation(value = "鏃ユ暟鎹綍鍏ュ垪琛�")
+    public TableDataInfo list(String nodeId, String date, String timeType) {
+        String tempDate = date;
+        date = DateTimeUtil.toDateTimeStr(date, DateTimeUtil.COMMON_PATTERN_TO_DAY, DateTimeUtil.COMMON_PATTERN_DAY);
+        String timeCode = CommonConst.WORD_D + date;
+        List<EnergyConsumeInput> list = energyConsumeInputService.selectEnergyConsumeInputList(nodeId, timeCode, timeType);
+        for (EnergyConsumeInput input : list) {
+            input.setDataTimeStr(DateTimeUtil.getDateTime(input.getDataTime(), DateTimeUtil.COMMON_PATTERN_TO_DAY));
+            if (StringUtil.isEmptyOrNull(input.getDataTimeStr())) {
+                input.setDataTimeStr(tempDate);
+            }
+            input.setCreateTimeStr(DateTimeUtil.toString(input.getCreateTime()));
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+     *
+     * @return
+     */
+    @PostMapping("/saveEnergyConsumeInput")
+    @ApiOperation(value = "鏃ユ暟鎹綍鍏ヤ繚瀛�")
+    public TableDataInfo save(@RequestHeader("Authorization") String authorization, @RequestBody SaveEnergyConsumeInputModel model) {
+        if (model != null && !model.getModels().isEmpty()) {
+            EnergyConsumeInput temp = model.getModels().stream().findFirst().orElse(null);
+            String timeCode = CommonConst.EMPTY;
+            Date dataTime = null;
+            if (temp != null) {
+                String dt = temp.getDataTimeStr();
+                dataTime = DateTimeUtil.toDateTime(dt, DateTimeUtil.COMMON_PATTERN_TO_DAY);
+                timeCode = CommonConst.WORD_D + DateTimeUtil.getDay(dataTime);
+            }
+            List<String> indexIds = model.getModels().stream().map(EnergyConsumeInput::getIndexId).collect(Collectors.toList());
+
+            int res = energyConsumeInputService.deleteEnergyConsumeInputByIds(indexIds, timeCode);
+
+            List<SaveEnergyConsumeInputEntity> dataItemList = new ArrayList<>();
+            Date endTime = DateTimeUtil.addSeconds(DateTimeUtil.addDays(dataTime, CommonConst.DIGIT_1), CommonConst.DIGIT_MINUS_1);
+            String userName = SecurityUtils.getUsername();
+            for (EnergyConsumeInput input : model.getModels()) {
+                if (input.getValue() != null) {
+                    SaveEnergyConsumeInputEntity data = new SaveEnergyConsumeInputEntity();
+                    data.setValue(input.getValue());
+                    data.setCreateTime(DateUtils.getNowDate());
+                    data.setIndexId(input.getIndexId());
+                    data.setIndexCode(input.getCode());
+                    data.setTimeType(TimeTypeConst.TIME_TYPE_DAY);
+                    data.setTimeCode(timeCode);
+                    data.setDataTime(dataTime);
+                    data.setBeginTime(dataTime);
+                    data.setEndTime(endTime);
+                    data.setCreateBy(userName);
+                    dataItemList.add(data);
+                }
+            }
+            int saveRes = energyConsumeInputService.saveEnergyConsumeInputList(dataItemList);
+            if (saveRes > 0) {
+                boolean mark = energyConsumeInputService.reCalcIndexIdByIds(indexIds, TimeTypeConst.TIME_TYPE_DAY, authorization, dataTime);
+            }
+        }
+        List<String> res = new ArrayList<>();
+        return getDataTable(res);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyYearConsumeInputController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyYearConsumeInputController.java
new file mode 100644
index 0000000..c8191f5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/controller/energyYearConsumeInputController.java
@@ -0,0 +1,102 @@
+package com.dingzhuo.energy.project.energyConsumeInput.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.common.*;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.*;
+import com.dingzhuo.energy.project.energyConsumeInput.service.IEnergyConsumeInputService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 瀵规爣Controller
+ *
+ * @author sys
+ * @date 2020-12-22
+ */
+@RestController
+@RequestMapping("/energyAssistInput/energyYearConsumeInput")
+@Api(value = "骞存暟鎹綍鍏�",tags = {"骞存暟鎹綍鍏�"})
+public class energyYearConsumeInputController extends BaseController {
+    @Autowired
+    private IEnergyConsumeInputService energyConsumeInputService;
+
+    /**
+     * 鏌ヨ  骞村害鑳借�楁墜鍔ㄥ綍鍏ュ�� 鍒楄〃
+     */
+    @GetMapping("/listEnergyConsumeInputIndex")
+    @ApiOperation(value = "骞存暟鎹綍鍏ュ垪琛�")
+    public TableDataInfo list(String nodeId, String date, String timeType) {
+        String tempDate = date;
+        date = DateTimeUtil.toDateTimeStr(date, DateTimeUtil.COMMON_PATTERN_YEAR, DateTimeUtil.COMMON_PATTERN_YEAR);
+        String timeCode = CommonConst.WORD_Y + date;
+        List<EnergyConsumeInput> list = energyConsumeInputService.selectEnergyConsumeInputList(nodeId, timeCode, timeType);
+        for (EnergyConsumeInput input : list) {
+            input.setDataTimeStr(DateTimeUtil.getDateTime(input.getDataTime(), DateTimeUtil.COMMON_PATTERN_YEAR));
+            if (StringUtil.isEmptyOrNull(input.getDataTimeStr())) {
+                input.setDataTimeStr(tempDate);
+            }
+            input.setCreateTimeStr(DateTimeUtil.toString(input.getCreateTime()));
+        }
+        return getDataTable(list);
+    }
+
+    /**
+     * 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+     *
+     * @return
+     */
+    @PostMapping("/saveEnergyConsumeInput")
+    @ApiOperation(value = "骞存暟鎹綍鍏ヤ繚瀛�")
+    public TableDataInfo save(@RequestHeader("Authorization") String authorization, @RequestBody SaveEnergyConsumeInputModel model) {
+        if (model != null && !model.getModels().isEmpty()) {
+            EnergyConsumeInput temp = model.getModels().stream().findFirst().orElse(null);
+            String timeCode = CommonConst.EMPTY;
+            Date dataTime = null;
+            if (temp != null) {
+                String dt = temp.getDataTimeStr();
+                dataTime = DateTimeUtil.toDateTime(dt, DateTimeUtil.COMMON_PATTERN_YEAR);
+                timeCode = CommonConst.WORD_Y + DateTimeUtil.getYear(dataTime);
+            }
+            List<String> indexIds = model.getModels().stream().map(EnergyConsumeInput::getIndexId).collect(Collectors.toList());
+
+            int res = energyConsumeInputService.deleteEnergyConsumeInputByIds(indexIds, timeCode);
+
+            List<SaveEnergyConsumeInputEntity> dataItemList = new ArrayList<>();
+            Date endTime = DateTimeUtil.addSeconds(DateTimeUtil.addYears(dataTime, CommonConst.DIGIT_1), CommonConst.DIGIT_MINUS_1);
+            String userName = SecurityUtils.getUsername();
+            for (EnergyConsumeInput input : model.getModels()) {
+                if (input.getValue() != null) {
+                    SaveEnergyConsumeInputEntity data = new SaveEnergyConsumeInputEntity();
+                    data.setValue(input.getValue());
+                    data.setCreateTime(DateUtils.getNowDate());
+                    data.setIndexId(input.getIndexId());
+                    data.setIndexCode(input.getCode());
+                    data.setTimeType(TimeTypeConst.TIME_TYPE_YEAR);
+                    data.setTimeCode(timeCode);
+                    data.setDataTime(dataTime);
+                    data.setBeginTime(dataTime);
+                    data.setEndTime(endTime);
+                    data.setCreateBy(userName);
+                    dataItemList.add(data);
+                }
+            }
+            int saveRes = energyConsumeInputService.saveEnergyConsumeInputList(dataItemList);
+            if (saveRes > 0) {
+                boolean mark = energyConsumeInputService.reCalcIndexIdByIds(indexIds, TimeTypeConst.TIME_TYPE_YEAR, authorization, dataTime);
+            }
+        }
+        List<String> res = new ArrayList<>();
+        return getDataTable(res);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/EnergyConsumeInput.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/EnergyConsumeInput.java
new file mode 100644
index 0000000..6aaaede
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/EnergyConsumeInput.java
@@ -0,0 +1,80 @@
+package com.dingzhuo.energy.project.energyConsumeInput.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description: 鑳借�楁墜鍔ㄥ綍鍏ュ垪琛ㄥ疄浣�
+ * @author: yxw
+ * @date: 2022骞�03鏈�16鏃� 18:05
+ */
+@Data
+@ApiModel(value = "闃舵褰曞叆")
+public class EnergyConsumeInput {
+    /** 鎸囨爣id */
+    @ApiModelProperty(value = "鎸囨爣id")
+    private String indexId;
+
+    /**
+     * 鏃堕棿绫诲瀷
+     */
+    @ApiModelProperty(value = "鏃堕棿绫诲瀷")
+    private TimeType timeType;
+
+    /** 鎸囨爣鍚嶅瓧*/
+    @ApiModelProperty(value = "鎸囨爣鍚嶅瓧")
+    private String name;
+
+    /** 鎸囨爣鐨刢ode*/
+    @ApiModelProperty(value = "鎸囨爣鐨刢ode")
+    private String code;
+    /**
+     * 鍗曚綅
+     */
+    @ApiModelProperty(value = "鍗曚綅")
+    private String unit;
+    /**
+     * 涓庢暟鎹簱瀛楁瀵瑰簲
+     */
+    @ApiModelProperty(value = "涓庢暟鎹簱瀛楁瀵瑰簲")
+    private Date dataTime;
+    /**
+     * 椤甸潰鏄剧ず鏃堕棿瀛楁
+     */
+    @ApiModelProperty(value = "椤甸潰鏄剧ず鏃堕棿瀛楁")
+    private String dataTimeStr;
+    /**
+     * 褰曞叆鍊�
+     */
+    @ApiModelProperty(value = "褰曞叆鍊�")
+    private Double value;
+    /**
+     * 褰曞叆鏃堕棿 涓庢暟鎹簱瀛楁瀵瑰簲
+     */
+    @ApiModelProperty(value = "褰曞叆鏃堕棿")
+    private Date createTime;
+    /**
+     * 褰曞叆鏃堕棿 椤甸潰鏄剧ず瀛楁
+     */
+    @ApiModelProperty(value = "褰曞叆鏃堕棿-椤甸潰")
+    private String createTimeStr;
+    /**
+     * 鍒涘缓浜�
+     */
+    @ApiModelProperty(value = "鍒涘缓浜�")
+    private String createBy;
+    /**
+     * 鎸囨爣绫诲瀷鍚嶇О
+     */
+    @ApiModelProperty(value = "鎸囨爣绫诲瀷鍚嶇О")
+    private String categoryName;
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    @ApiModelProperty(value = "鑳芥簮绫诲瀷鍚嶇О")
+    private String energyName;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcParamsModel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcParamsModel.java
new file mode 100644
index 0000000..746bae5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcParamsModel.java
@@ -0,0 +1,24 @@
+package com.dingzhuo.energy.project.energyConsumeInput.domain;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description: 璁$畻寮曟搸閲嶇畻鎺ュ彛浼犻�掑疄浣�
+ * @author: yxw
+ * @date: 2022骞�03鏈�18鏃� 18:07
+ */
+@Data
+public class ReCalcParamsModel {
+    /** 鎸囨爣id */
+    private String indexId;
+    /**
+     * 鏃堕棿绫诲瀷
+     */
+    private String timeType;
+    /**
+     * 涓庢暟鎹簱瀛楁瀵瑰簲
+     */
+    private String dataTime;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcRespModel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcRespModel.java
new file mode 100644
index 0000000..8dbd102
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/ReCalcRespModel.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.project.energyConsumeInput.domain;
+
+import lombok.Data;
+
+/**
+ * @Description: 璁$畻寮曟搸閲嶇畻鎺ュ彛杩斿洖缁撴灉
+ * @author: yxw
+ * @date: 2022骞�03鏈�18鏃� 18:07
+ */
+@Data
+public class ReCalcRespModel {
+    /** 杩斿洖淇℃伅 */
+    private String msg;
+    /**
+     * 鎺ュ彛璇锋眰缁撴灉
+     */
+    private int code;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputEntity.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputEntity.java
new file mode 100644
index 0000000..9133fc3
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputEntity.java
@@ -0,0 +1,32 @@
+package com.dingzhuo.energy.project.energyConsumeInput.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.Quality;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @Description: 淇濆瓨鑳借�楁墜鍔ㄥ綍鍏ユ暟鎹�
+ * @author: yxw
+ * @date: 2022骞�03鏈�17鏃� 12:05
+ */
+@Data
+public class SaveEnergyConsumeInputEntity {
+
+    private String indexId;
+    private String indexCode;
+    private Date beginTime;
+    private Date endTime;
+    private Date dataTime;
+    private String timeCode;
+    private String timeType;
+    private Double value;
+    private Quality quality;
+    private Date createTime;
+    private Date updateTime;
+    /**
+     * 鍒涘缓浜�
+     */
+    private String createBy;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputModel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputModel.java
new file mode 100644
index 0000000..00ed0ca
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/domain/SaveEnergyConsumeInputModel.java
@@ -0,0 +1,20 @@
+package com.dingzhuo.energy.project.energyConsumeInput.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Description: TODO
+ * @author: yxw
+ * @date: 2022骞�03鏈�17鏃� 11:13
+ */
+@Data
+@ApiModel(value = "闃舵褰曞叆model")
+public class SaveEnergyConsumeInputModel {
+
+    @ApiModelProperty(value = "褰曞叆鏁版嵁鍒楄〃")
+    private List<EnergyConsumeInput> models;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/mapper/EnergyConsumeInputMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/mapper/EnergyConsumeInputMapper.java
new file mode 100644
index 0000000..3422daf
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/mapper/EnergyConsumeInputMapper.java
@@ -0,0 +1,52 @@
+package com.dingzhuo.energy.project.energyConsumeInput.mapper;
+
+
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.EnergyConsumeInput;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.SaveEnergyConsumeInputEntity;
+
+import java.util.List;
+
+/**
+ * 鑳芥祦鍒嗘瀽  Mapper鎺ュ彛
+ *
+ * @author yxw
+ * @date 2020-12-26
+ */
+public interface EnergyConsumeInputMapper {
+
+    /**
+     * 鏌ヨ  鑳借�楁墜鍔ㄥ綍鍏� 鏁版嵁鍒楄〃
+     *
+     * @param nodeId
+     * @param timeCode
+     * @param timeType
+     * @return
+     */
+    List<EnergyConsumeInput> selectEnergyConsumeInputList(String nodeId, String timeCode, String timeType);
+
+    /**
+     * 鏍规嵁鏃ユ湡鍜屾寚鏍噄d鍒犻櫎鏁版嵁
+     *
+     * @param indexIds 鎸囨爣id鍒楄〃
+     * @param timeCode 鏈堜唤鍊�
+     * @return
+     */
+    int deleteEnergyConsumeInputByIds(List<String> indexIds, String timeCode);
+
+    /**
+     * 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ユ暟鎹�
+     *
+     * @param models
+     * @return
+     */
+    int saveEnergyConsumeInputList(List<SaveEnergyConsumeInputEntity> models);
+
+    /**
+     * 鏌ヨ瑕侀噸绠楃殑indexId鍒楄〃
+     *
+     * @param indexIds
+     * @return
+     */
+    List<EnergyConsumeInput> queryReCalcIndexIdByIds(List<String> indexIds);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/IEnergyConsumeInputService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/IEnergyConsumeInputService.java
new file mode 100644
index 0000000..33894c8
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/IEnergyConsumeInputService.java
@@ -0,0 +1,51 @@
+package com.dingzhuo.energy.project.energyConsumeInput.service;
+
+
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.EnergyConsumeInput;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.SaveEnergyConsumeInputEntity;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鑳芥祦鍒嗘瀽Service鎺ュ彛
+ *
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public interface IEnergyConsumeInputService {
+    /**
+     * 鏌ヨ  鑳借�楁墜鍔ㄥ綍鍏� 鏁版嵁鍒楄〃
+     *
+     * @return 鑳借�楁墜鍔ㄥ綍鍏�    鍔熻兘闆嗗悎
+     */
+    public List<EnergyConsumeInput> selectEnergyConsumeInputList(String nodeId, String timeCode, String timeType);
+
+    /**
+     * 鏍规嵁鏃ユ湡鍜屾寚鏍噄d鍒犻櫎鏁版嵁
+     *
+     * @param indexIds 鎸囨爣id鍒楄〃
+     * @param timeCode 鏈堜唤鍊�
+     * @return
+     */
+    public int deleteEnergyConsumeInputByIds(List<String> indexIds, String timeCode);
+
+    /**
+     * 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ユ暟鎹�
+     *
+     * @param models
+     * @return
+     */
+    public int saveEnergyConsumeInputList(List<SaveEnergyConsumeInputEntity> models);
+
+    /**
+     * 閲嶇畻鐩稿叧鎸囨爣
+     * @param indexIds
+     * @param timeType
+     * @param authorization
+     * @param dataTime
+     * @return
+     */
+    public boolean reCalcIndexIdByIds(List<String> indexIds, String timeType, String authorization, Date dataTime);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/impl/EnergyConsumeInputServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/impl/EnergyConsumeInputServiceImpl.java
new file mode 100644
index 0000000..fc0a59e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyConsumeInput/service/impl/EnergyConsumeInputServiceImpl.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.project.energyConsumeInput.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.dingzhuo.energy.project.common.*;
+import com.dingzhuo.energy.project.energyBalance.domain.EnergyPic;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.EnergyConsumeInput;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.ReCalcParamsModel;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.ReCalcRespModel;
+import com.dingzhuo.energy.project.energyConsumeInput.domain.SaveEnergyConsumeInputEntity;
+import com.dingzhuo.energy.project.energyConsumeInput.mapper.EnergyConsumeInputMapper;
+import com.dingzhuo.energy.project.energyConsumeInput.service.IEnergyConsumeInputService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳絊ervice涓氬姟灞傚鐞�
+ *
+ * @author zhaow
+ * @date 2020-12-26
+ */
+@Service
+public class EnergyConsumeInputServiceImpl implements IEnergyConsumeInputService {
+    @Autowired
+    private EnergyConsumeInputMapper energyConsumeInputMapper;
+
+    /**
+     * 鏌ヨ  鑳借�楁墜鍔ㄥ綍鍏� 鏁版嵁鍒楄〃
+     *
+     * @return 鑳借�楁墜鍔ㄥ綍鍏�    鍔熻兘闆嗗悎
+     */
+    @Override
+    public List<EnergyConsumeInput> selectEnergyConsumeInputList(String nodeId, String timeCode, String timeType) {
+        List<EnergyConsumeInput> resList = energyConsumeInputMapper.selectEnergyConsumeInputList(nodeId, timeCode, timeType);
+        return resList;
+    }
+
+    /**
+     * 鏍规嵁鏃ユ湡鍜屾寚鏍噄d鍒犻櫎鏁版嵁
+     *
+     * @param indexIds 鎸囨爣id鍒楄〃
+     * @param timeCode 鏈堜唤鍊�
+     * @return
+     */
+    @Override
+    public int deleteEnergyConsumeInputByIds(List<String> indexIds, String timeCode) {
+        return energyConsumeInputMapper.deleteEnergyConsumeInputByIds(indexIds, timeCode);
+    }
+
+    /**
+     * 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ユ暟鎹�
+     *
+     * @param models
+     * @return
+     */
+    @Override
+    public int saveEnergyConsumeInputList(List<SaveEnergyConsumeInputEntity> models) {
+        return energyConsumeInputMapper.saveEnergyConsumeInputList(models);
+    }
+
+    /**
+     * 閲嶇畻鐩稿叧鎸囨爣
+     *
+     * @param indexIds
+     * @param timeType
+     * @param authorization
+     * @param dataTime
+     * @return
+     */
+    @Override
+    public boolean reCalcIndexIdByIds(List<String> indexIds, String timeType, String authorization, Date dataTime) {
+        boolean mark = false;
+        List<EnergyConsumeInput> energyConsumeInputs = energyConsumeInputMapper.queryReCalcIndexIdByIds(indexIds);
+        List<String> indexIdList = energyConsumeInputs.stream().map(EnergyConsumeInput::getIndexId).collect(Collectors.toList());
+        if (!indexIdList.isEmpty()) {
+            List<ReCalcParamsModel> reCalcParamsModels = new ArrayList<>();
+            for (String indexId : indexIdList) {
+                ReCalcParamsModel t1 = new ReCalcParamsModel();
+                t1.setIndexId(indexId);
+                t1.setDataTime(DateTimeUtil.toString(dataTime));
+                t1.setTimeType(timeType);
+                reCalcParamsModels.add(t1);
+            }
+            String json = StringUtil.toJson(reCalcParamsModels);
+            String result = HttpClientUtil.doGet(CommonConst.RE_CALC_INTERFACE_ADDRESS, json, authorization);
+            if (!StringUtil.isEmptyOrNull(result)) {
+                ReCalcRespModel respModel = JSON.parseObject(result, ReCalcRespModel.class);
+                if (respModel != null && respModel.getCode() == 200) {
+                    mark = true;
+                }
+            }
+        }
+
+        return mark;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/controller/EnergyShareAnalysisController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/controller/EnergyShareAnalysisController.java
new file mode 100644
index 0000000..c821d1c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/controller/EnergyShareAnalysisController.java
@@ -0,0 +1,37 @@
+package com.dingzhuo.energy.project.energyShareAnalysis.controller;
+
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.energyShareAnalysis.domain.dto.EnergyAnalysisDTO;
+import com.dingzhuo.energy.project.energyShareAnalysis.domain.vo.EnergyAnalysisVO;
+import com.dingzhuo.energy.project.energyShareAnalysis.service.IEnergyShareAnalysisService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+
+/**
+ * 鑳借�楀崰姣斿垎鏋� 鎺у埗灞�
+ */
+@RestController
+@RequestMapping("/energyShareAnalysis")
+public class EnergyShareAnalysisController extends BaseController {
+
+    @Autowired
+    private IEnergyShareAnalysisService analysisService;
+
+
+    @GetMapping("/getElectricityShareAnalysis")
+    @ApiOperation(value = "鑾峰彇鐢靛崰姣旂粺璁′俊鎭�", notes = "鑾峰彇鐢靛崰姣旂粺璁′俊鎭�")
+    public AjaxResult listElectricityShareAnalysis(@Validated EnergyAnalysisDTO dto) {
+
+        List<EnergyAnalysisVO> yoyList = analysisService.listEnergyShareAnalysis(dto);
+        return AjaxResult.success(yoyList);
+    }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/dto/EnergyAnalysisDTO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/dto/EnergyAnalysisDTO.java
new file mode 100644
index 0000000..3bac957
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/dto/EnergyAnalysisDTO.java
@@ -0,0 +1,49 @@
+package com.dingzhuo.energy.project.energyShareAnalysis.domain.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 鑳芥簮鏁版嵁鍒嗘瀽 璇锋眰鍙傛暟
+ */
+@Data
+public class EnergyAnalysisDTO {
+
+
+    /**
+     * 缁熻寮�濮嬫椂闂�
+     */
+    @NotNull(message = "璇风淮鎶ゆ煡璇㈡椂闂�")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date beginTime;
+
+    /**
+     * 缁熻寮�濮嬫椂闂�
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @NotNull(message = "璇风淮鎶ゆ煡璇㈡椂闂�")
+    private Date endTime;
+
+    /**
+     * 鏃堕棿绫诲瀷
+     */
+    @NotBlank(message = "鏈壘鍒版椂闂寸被鍨�")
+    private String timeType;
+
+    /**
+     * 妯″瀷鑺傜偣缂栧彿
+     */
+    @NotBlank(message = "鏈壘鍒版ā鍨嬭妭鐐圭紪鍙蜂俊鎭�")
+    private String modelCode;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    @NotBlank(message = "璇风淮鎶よ兘婧愮被鍨�")
+    private String energyType;
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/vo/EnergyAnalysisVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/vo/EnergyAnalysisVO.java
new file mode 100644
index 0000000..4051364
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/domain/vo/EnergyAnalysisVO.java
@@ -0,0 +1,34 @@
+package com.dingzhuo.energy.project.energyShareAnalysis.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鑳芥簮鏁版嵁鍗犳瘮鍒嗘瀽 杩斿洖vo
+ */
+@Data
+public class EnergyAnalysisVO {
+
+
+    /**
+     * 鐢ㄨ兘鍗曞厓鍚嶇О
+     */
+    private String energyUnitName;
+
+    /**
+     * 鏈湡鍊�
+     */
+    private BigDecimal value;
+
+    /**
+     * 鍗犳瘮鍊�
+     */
+    private BigDecimal ratio;
+
+    /**
+     * 鍚堣鍊�
+     */
+    private BigDecimal sumValue;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/IEnergyShareAnalysisService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/IEnergyShareAnalysisService.java
new file mode 100644
index 0000000..c3cf00d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/IEnergyShareAnalysisService.java
@@ -0,0 +1,20 @@
+package com.dingzhuo.energy.project.energyShareAnalysis.service;
+
+import com.dingzhuo.energy.project.energyShareAnalysis.domain.dto.EnergyAnalysisDTO;
+import com.dingzhuo.energy.project.energyShareAnalysis.domain.vo.EnergyAnalysisVO;
+
+import java.util.List;
+
+/**
+ * 鑳借�楀崰姣斿垎鏋�  鎺ュ彛灞�
+ */
+public interface IEnergyShareAnalysisService {
+
+    /**
+     * 鑾峰彇鐢靛崰姣旂粺璁′俊鎭�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return 缁撴灉
+     */
+    List<EnergyAnalysisVO> listEnergyShareAnalysis(EnergyAnalysisDTO dto);
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/impl/EnergyShareAnalysisServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/impl/EnergyShareAnalysisServiceImpl.java
new file mode 100644
index 0000000..fb09460
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyShareAnalysis/service/impl/EnergyShareAnalysisServiceImpl.java
@@ -0,0 +1,136 @@
+package com.dingzhuo.energy.project.energyShareAnalysis.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.common.CommonConst;
+import com.dingzhuo.energy.project.common.TimeTypeConst;
+import com.dingzhuo.energy.project.dataEntry.service.IDataItemService;
+import com.dingzhuo.energy.project.energyShareAnalysis.domain.dto.EnergyAnalysisDTO;
+import com.dingzhuo.energy.project.energyShareAnalysis.domain.vo.EnergyAnalysisVO;
+import com.dingzhuo.energy.project.energyShareAnalysis.service.IEnergyShareAnalysisService;
+import com.google.common.collect.Lists;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+/**
+ * 鑳借�楀崰姣斿垎鏋�  鎺ュ彛灞傚疄鐜板眰
+ */
+@Service
+@AllArgsConstructor
+public class EnergyShareAnalysisServiceImpl implements IEnergyShareAnalysisService {
+
+
+    private final IDataItemService dataItemService;
+
+    private final IModelNodeService modelNodeService;
+
+    private final IEnergyIndexService energyIndexService;
+
+
+    /**
+     * 鑾峰彇鐢靛崰姣旂粺璁′俊鎭�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return 缁撴灉
+     */
+    @Override
+    public List<EnergyAnalysisVO> listEnergyShareAnalysis(EnergyAnalysisDTO dto) {
+
+        List<ModelNodeIndexInfor> nodeInforList = modelNodeService.getModelNodeIndexIdRelationInforByCode(dto.getModelCode());
+        if (CollectionUtils.isEmpty(nodeInforList)) {
+            return new ArrayList<>();
+        }
+
+        List<String> indexIds = nodeInforList.stream()
+                .map(ModelNodeIndexInfor::getIndexId)
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toList());
+        // 鎸夌収鐐逛綅杩涜鍒嗙粍
+        Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeInforList.stream().collect(
+                Collectors.groupingBy(ModelNodeIndexInfor::getName));
+        // 鑾峰彇鏌ヨ鏃堕棿
+        Date beginTime = dto.getBeginTime();
+        Date endTime = dto.getEndTime();
+        if (!TimeTypeConst.TIME_TYPE_HOUR.equals(dto.getTimeType())) {
+            endTime = DateUtil.endOfDay(endTime);
+        }
+        // 鏌ヨ瀵瑰簲indexIds锛屾壘鍒板搴攄ataItem淇℃伅
+        List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeTypeConst.TIME_TYPE_HOUR, indexIds);
+        // 姹傛�诲拰
+        BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+        AtomicReference<BigDecimal> sumValue = new AtomicReference<>(sum);
+        if ("electric".equals(dto.getEnergyType())) {
+            List<String> sumIndexIds = Lists.newArrayList("e632a819-7115-483c-9215-b562ccfa8437", "3df75c95-d179-4e58-985d-637b94554d70");
+            List<DataItem> sumDataItem = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeTypeConst.TIME_TYPE_HOUR, sumIndexIds);
+            sumValue.set(BigDecimal.valueOf(sumDataItem.stream().mapToDouble(DataItem::getValue).sum()));
+        }
+        // 濡傛灉鏄按鐨�7001鐨勮瘽 闇�瑕佹湁涓叾浠栫殑鍗犳瘮
+        if ("WaterShareAnalysis_1".equals(dto.getModelCode())) {
+            List<String> sumIndexIds = Lists.newArrayList("07d6b073-f8d7-4e4b-b8fb-a899c64d245c");
+            List<DataItem> sumDataItem = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeTypeConst.TIME_TYPE_HOUR, sumIndexIds);
+            sumValue.set(BigDecimal.valueOf(sumDataItem.stream().mapToDouble(DataItem::getValue).sum()));
+        }
+
+        //  鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
+        AtomicReference<BigDecimal> totalRatio = new AtomicReference<>(BigDecimal.ZERO);
+        AtomicReference<BigDecimal> totalValue = new AtomicReference<>(BigDecimal.ZERO);
+
+        List<EnergyAnalysisVO> analysisVOList = new ArrayList<>();
+        nodeIndexMap.forEach((key, value) -> {
+            EnergyAnalysisVO analysisVO = new EnergyAnalysisVO();
+
+            BigDecimal valueTotal = sumValue.get();
+
+            analysisVO.setSumValue(valueTotal);
+            analysisVO.setEnergyUnitName(key);
+
+            List<String> nodeIndexIds = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            BigDecimal currentValue = BigDecimal.valueOf(dataItemList.stream()
+                            .filter(li -> nodeIndexIds.contains(li.getIndexId()))
+                            .mapToDouble(DataItem::getValue).sum())
+                    .setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+
+            analysisVO.setValue(currentValue);
+            //  鍚屾瘮鍊�
+            BigDecimal ratio = BigDecimal.ZERO;
+            if (valueTotal.compareTo(BigDecimal.ZERO) != 0) {
+                ratio = currentValue.divide(valueTotal, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            }
+            // 瓒呰繃1鍒欑敤1鍓帀
+            if (totalRatio.get().add(ratio).compareTo(BigDecimal.ONE) > 0) {
+                ratio = BigDecimal.ONE.subtract(totalRatio.get());
+            }
+
+            analysisVO.setRatio(ratio.multiply(multiple));
+            analysisVOList.add(analysisVO);
+            totalValue.set(totalValue.get().add(currentValue));
+            totalRatio.set(totalRatio.get().add(ratio));
+        });
+
+        if ("WaterShareAnalysis_1".equals(dto.getModelCode())) {
+            BigDecimal valueTotal = sumValue.get();
+            EnergyAnalysisVO analysisVO = new EnergyAnalysisVO();
+            analysisVO.setEnergyUnitName("鍏朵粬");
+            analysisVO.setValue(valueTotal.subtract(totalValue.get()));
+            analysisVO.setRatio(BigDecimal.ONE.subtract(totalRatio.get()).multiply(multiple));
+            analysisVO.setSumValue(valueTotal);
+
+            analysisVOList.add(analysisVO);
+        }
+
+        // 鍗犳瘮鎺掑簭
+        return analysisVOList.stream().sorted(Comparator.comparing(EnergyAnalysisVO::getRatio).reversed()).collect(Collectors.toList());
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyAnalysisController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyAnalysisController.java
new file mode 100644
index 0000000..31d1d3d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyAnalysisController.java
@@ -0,0 +1,83 @@
+package com.dingzhuo.energy.project.energyStatistics.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.energyStatistics.domain.energyAnalysis;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * electricityPriceController
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/energyAnalysis")
+public class energyAnalysisController extends BaseController {
+
+    @Autowired
+    private PeriodDataService periodDataService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private com.dingzhuo.energy.project.energyStatistics.service.IEnergyStatisticsService IEnergyStatisticsService;
+
+    @GetMapping("/getEnergyAnalysis")
+    public AjaxResult getEnergyAnalysis(DataItem dataItem) {
+        try {
+            List<EnergyIndex> list = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+            List<String> indexCode = list.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            List<DataItem> result = periodDataService.getDatasByIndex(indexCode, dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType());
+            Map<String, List<DataItem>> groupBy = result.stream().collect(Collectors.groupingBy(DataItem::getIndexCode));
+            energyAnalysis tableData =new energyAnalysis();
+            List<energyAnalysis> tableDataMaps = new ArrayList<>();
+            List<Map> energyHeadList = new ArrayList<Map>();
+            AtomicInteger colcount= new AtomicInteger(1);//琛ㄦ牸鍒楃殑鏁伴噺
+            /*groupBy.forEach((IndexName,value)->{
+                Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+                Map table =new HashMap<>();//琛ㄦ暟鎹�
+                for(DataItem re:value){
+                    energyAnalysis energyHead = new energyAnalysis();
+                    energyHead.setDataTime(re.getDataTime());
+                    energyHead.setValue(re.getValue());
+                    energyHead.setProp("col"+ colcount);
+                    tableDataMaps.add(energyHead);
+                }
+                colcount.getAndIncrement();
+                tableColumn.put("IndexName",IndexName);
+                tableColumn.put("prop",IndexName);
+                energyHeadList.add(tableColumn);
+                tableData.setAnalysisTableHead(energyHeadList);
+                tableData.setAnalysisTableDate(tableDataMaps);
+            });*/
+            return AjaxResult.success(result);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+    @Log(title = "鑳借�楃粺璁″垎鏋�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DataItem dataItem) { {
+        List<EnergyIndex> indexCodeList = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+        List<String> indexCode = indexCodeList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<DataItem> list = periodDataService.getDatasByIndex(indexCode, dataItem.getBeginTime(), dataItem.getEndTime(), dataItem.getTimeType());
+        ExcelUtil<DataItem> util = new ExcelUtil<DataItem>(DataItem.class);
+        return util.exportExcel(list, "exportEnergyAnalysis");
+    }
+}}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsController.java
new file mode 100644
index 0000000..396a6b5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsController.java
@@ -0,0 +1,280 @@
+package com.dingzhuo.energy.project.energyStatistics.controller;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+import com.dingzhuo.energy.project.energyStatistics.domain.energyTable;
+import com.dingzhuo.energy.project.energyStatistics.domain.EnergyConsumption;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.StatisticResult;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.project.energyStatistics.service.IEnergyStatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+/**
+ * 鑳芥簮缁熻鍒嗘瀽Controller
+ *
+ * @author ruoyi
+ * @date 2020-02-07
+ */
+@RestController
+@RequestMapping("/energyStatistics")
+public class energyStatisticsController extends BaseController {
+  @Autowired
+  private PeriodDataService periodDataService;
+  @Autowired
+  private IEnergyStatisticsService IEnergyStatisticsService;
+  @Autowired
+  private IModelNodeService modelNodeService;
+  /**
+   * 瀵煎嚭鑳芥簮鎸囨爣瓒嬪娍鍒嗘瀽鍒楄〃
+   */
+  @PreAuthorize("@ss.hasPermi('energyStatistics:energyStatisticsTrend:export')")
+  @Log(title = "鑳借�楁寚鏍囪秼鍔垮垎鏋�", businessType = BusinessType.EXPORT)
+  @GetMapping("/export")
+  public AjaxResult export(DataItem dataItem) {
+    List<StatisticResult> list = periodDataService.statisticById(dataItem.getIndexId(), dataItem.getTimeType(), dataItem.getBeginTime(),dataItem.getEndTime());
+    ExcelUtil<StatisticResult> util = new ExcelUtil<StatisticResult>(StatisticResult.class);
+    return util.exportExcel(list, "set");
+  }
+  /**
+   * 鑳芥簮鎸囨爣瓒嬪娍鍒嗘瀽
+   */
+  @GetMapping("/getEnergyStatisticsTrend")
+  public TableDataInfo getEnergyStatisticsTrend(DataItem dataItem) {
+    startPage();
+    List<StatisticResult> list = periodDataService.statisticById(dataItem.getIndexId(), dataItem.getTimeType(), dataItem.getBeginTime(),dataItem.getEndTime());
+    return getDataTable(list);
+  }
+  /**
+   * 鑳芥簮娑堣垂鎴愭湰鏋勬垚
+   */
+  @GetMapping("/getEnergyConstitute")
+  public AjaxResult getEnergyConstitute(DataItem dataItem) {
+    try {
+      /*List<String> indexCodes = new ArrayList<String>();
+      String[] indexCode =dataItem.getIndexCode().split(",");
+      for(int i =0; i <indexCode.length ; i++){
+        indexCodes.add(indexCode[i]);
+      }*/
+      List<String> indexCodeXFL = new ArrayList<String>();
+      List<String> indexCodeXFCB = new ArrayList<String>();
+      List<String> indexCodeZBL = new ArrayList<String>();
+      List<EnergyIndex> energyIndexList = modelNodeService.getSettingIndex(dataItem.getIndexCode());
+      energyIndexList.forEach(param ->{
+        if (param.getCode().contains("XFL_")){
+          indexCodeXFL.add(param.getCode());
+        }else if(param.getCode().contains("XFCB_")){
+          indexCodeXFCB.add(param.getCode());
+        }else{
+          indexCodeZBL.add(param.getCode());
+        }
+      });
+      energyTable tableData =new energyTable();
+      //娑堣垂閲�
+      List<DataItem> listXFL= IEnergyStatisticsService.statisticByCode(indexCodeXFL,dataItem.getTimeType(),dataItem.getBeginTime(),dataItem.getEndTime());
+      //鎶樻爣
+      List<DataItem> listZBL= IEnergyStatisticsService.statisticByCode(indexCodeZBL,dataItem.getTimeType(),dataItem.getBeginTime(),dataItem.getEndTime());
+      //娑堣垂鎴愭湰
+      List<DataItem> listXFCB= IEnergyStatisticsService.statisticByCode(indexCodeXFCB,dataItem.getTimeType(),dataItem.getBeginTime(),dataItem.getEndTime());
+
+      tableData.setListXFL(listXFL);
+      tableData.setListZBL(listZBL);
+      tableData.setListXFCB(listXFCB);
+      return AjaxResult.success(tableData);
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍑洪敊!");
+    }
+  }
+  /**
+   * 鑳芥簮娑堣垂鎴愭湰鍒嗘瀽
+   */
+  @GetMapping("/getEnergyConsumption")
+  public AjaxResult getEnergyConsumption(DataItem dataItem) {
+    try {
+      /*TimeType timeType=TimeType.MONTH;
+      if( dataItem.getTimeType().name().equals("YEAR")){
+        timeType=TimeType.YEAR;
+      }else if(dataItem.getTimeType().name().equals("MONTH")){
+        timeType=TimeType.MONTH;
+      }if(dataItem.getTimeType().name().equals("DAY")){
+        timeType=TimeType.DAY;
+      }*/
+      String[] indexCode =dataItem.getIndexName().split(",");
+      List<String> indexCodeXFCB = new ArrayList<String>();
+      List<String> indexCodeZBL = new ArrayList<String>();
+      for(int i =0; i <indexCode.length ; i++){
+        if (indexCode[i].contains("ZBL_")){
+          indexCodeZBL.add(indexCode[i]);
+        }else if(indexCode[i].contains("XFCB_")){
+          indexCodeXFCB.add(indexCode[i]);
+        }
+      }
+      energyTable tableData =new energyTable();
+      //鎶樻爣瀵规瘮
+      List<StatisticResult> resultListZBL= periodDataService.statisticByCode(indexCodeZBL,dataItem.getTimeType(),dataItem.getBeginTime(),dataItem.getEndTime());
+      resultListZBL.forEach(statisticResult -> statisticResult.setFormatdate("yyyy-MM-dd"));
+      Map<String, List<StatisticResult>> groupByZBL = resultListZBL.stream().collect(Collectors.groupingBy(StatisticResult::getIndexName));
+      List<Map> tableZBL = new ArrayList<Map>();
+      List<Map> mListZBL = new ArrayList<Map>();
+      groupByZBL.forEach((indexName,value)->{
+        Map tableColumn =new HashMap<>();
+        tableColumn.put("indexName",indexName);
+        tableZBL.add(tableColumn);
+        tableData.setResultZBL(tableZBL);
+        Map table =new HashMap<>();
+        List currentList = new ArrayList<>();
+        List lastYearList = new ArrayList<>();
+        for(StatisticResult result:value){
+          currentList.add(new BigDecimal(result.getCurrentValue()).setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+          lastYearList.add(new BigDecimal(result.getLastYearValue()).setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+        }
+        tableColumn.put("currentValue",currentList);
+        tableColumn.put("lastYearValue",lastYearList);
+        mListZBL.add(tableColumn);
+      });
+      //娑堣垂鎴愭湰瀵规瘮
+      List<StatisticResult> resultListXFCB= periodDataService.statisticByCode(indexCodeXFCB,dataItem.getTimeType(),dataItem.getBeginTime(),dataItem.getEndTime());
+      resultListXFCB.forEach(statisticResult -> statisticResult.setFormatdate("yyyy-MM-dd"));
+      Map<String, List<StatisticResult>> groupByXFCB = resultListXFCB.stream().collect(Collectors.groupingBy(StatisticResult::getIndexName));
+      List<Map> tableXFCB = new ArrayList<Map>();
+      List<Map> mListXFCB = new ArrayList<Map>();
+      groupByXFCB.forEach((indexName,value)->{
+        Map tableColumn =new HashMap<>();
+        tableColumn.put("indexName",indexName);
+        tableXFCB.add(tableColumn);
+        tableData.setResultXFCB(tableXFCB);
+        Map table =new HashMap<>();
+        List currentList = new ArrayList<>();
+        List lastYearList = new ArrayList<>();
+        for(StatisticResult result:value){
+          currentList.add(new BigDecimal(result.getCurrentValue()).setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+          lastYearList.add(new BigDecimal(result.getLastYearValue()).setScale(2,   BigDecimal.ROUND_HALF_UP).doubleValue());
+        }
+        tableColumn.put("currentValue",currentList);
+        tableColumn.put("lastYearValue",lastYearList);
+        mListXFCB.add(tableColumn);
+      });
+      tableData.setResultListZBL(mListZBL);
+      tableData.setResultListXFCB(mListXFCB);
+      return AjaxResult.success(tableData);
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍑洪敊!");
+    }
+  }
+  /**
+   * 鑳芥簮娑堣垂鎴愭湰鍒嗘椂鍒嗘瀽鎶ヨ〃
+   */
+  @GetMapping("/listEnergyConsumption")
+  public AjaxResult listEnergyConsumption(DataItem dataItem){
+    List<String> indexCodes = new ArrayList<String>();
+    String[] indexCode =dataItem.getIndexCode().split(",");
+    for(int i =0; i <indexCode.length ; i++){
+      indexCodes.add(indexCode[i]);
+    }
+    List<StatisticResult> list= periodDataService.statisticByCode(indexCodes,dataItem.getTimeType(),dataItem.getBeginTime(),dataItem.getEndTime());
+    list.forEach(statisticResult -> statisticResult.setFormatdate("yyyy-MM-dd"));
+    List<EnergyConsumption> energyHeadList = new ArrayList<>();
+    energyTable tableData =new energyTable();
+    List<Map> tableDataMaps = new ArrayList<Map>();
+    Map<String, List<StatisticResult>> groupBy = list.stream().collect(Collectors.groupingBy(StatisticResult::getFormatdate));
+    groupBy.forEach((time,value)->{
+      int propcount=0;//琛ㄦ牸prop鐨勬暟閲�
+      int colcount=0;//琛ㄦ牸鍒楃殑鏁伴噺
+      Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+      for(StatisticResult result:value){
+        EnergyConsumption energyHead = new EnergyConsumption();//涓�绾ц〃澶�
+        energyHead.setLable(result.getIndexName());
+        EnergyConsumption energyChildNode1 = new EnergyConsumption();//浜岀骇琛ㄥご鐨勭涓�鍒�
+        energyChildNode1.setProp("col"+colcount);
+        energyChildNode1.setLable("鑰楅噺("+result.getUnitId()+")");
+        tableColumn.put("col"+colcount,result.getMaxValue());
+        EnergyConsumption energyChildNode2 = new EnergyConsumption();//浜岀骇琛ㄥご鐨勭涓�鍒�
+        colcount++;
+        energyChildNode2.setProp("col"+colcount);
+        energyChildNode2.setLable("鎴愭湰(涓囧厓)");
+        tableColumn.put("col"+colcount,result.getMinValue());
+        colcount++;
+        energyHead.addChildNode(energyChildNode1);
+        energyHead.addChildNode(energyChildNode2);
+        energyHeadList.add(energyHead);
+        propcount++;
+      }
+      tableColumn.put("dateTims",time);
+      tableDataMaps.add(tableColumn);
+      tableData.setTabledataMap(tableDataMaps);
+      tableData.setTablehead(energyHeadList);
+    });
+    return AjaxResult.success(tableData);
+  }
+  @Log(title = "鑳芥簮娑堣垂鎴愭湰鍒嗘椂鍒嗘瀽鎶ヨ〃", businessType = BusinessType.EXPORT)
+  @GetMapping("/energyConsumptionExport")
+  public AjaxResult energyConsumptionExport(DataItem dataItem){
+    List<String> indexCodes = new ArrayList<String>();
+    String[] indexCode =dataItem.getIndexCode().split(",");
+    for(int i =0; i <indexCode.length ; i++){
+      indexCodes.add(indexCode[i]);
+    }
+    List<StatisticResult> list= periodDataService.statisticByCode(indexCodes,dataItem.getTimeType(),dataItem.getBeginTime(),dataItem.getEndTime());
+    ExcelUtil<StatisticResult> util = new ExcelUtil<StatisticResult>(StatisticResult.class);
+    return util.exportExcel(list, "set");
+  }
+  /*
+  鐢ㄨ兘鍗曞厓鑳借�楀垎鏋�
+   */
+  @GetMapping("/getEnergyUnit")
+  public AjaxResult getEnergyUnit(DataItem dataItem) {
+    try {
+      List<String> indexCode =  Collections.singletonList(dataItem.getIndexCode());
+      // List<StatisticResult> list= periodDataService.statisticByCode(dataItem.getIndexCode(),timeType, dataItem.getBeginTime(), dataItem.getEndTime());
+      List<StatisticResult> list= periodDataService.statisticByCode(indexCode,dataItem.getTimeType(),dataItem.getDataTime());
+      list.forEach(statisticResult -> statisticResult.setFormatdate("yyyy-MM-dd"));
+      return AjaxResult.success(list);
+    } catch (Exception ex) {
+      logger.error("鑾峰彇鍑洪敊锛�", ex);
+      return AjaxResult.error("鑾峰彇鍑洪敊!");
+    }
+  }
+  /*
+     瀹炴椂妫�娴嬪sheet椤靛睍绀虹粍鎬佸浘鎶ヨ〃
+   */
+  @GetMapping("/reportFormsvg")
+  public AjaxResult reportFormsvg(dataTimeSVG dataItem) {
+    List<dataTimeSVG> list= IEnergyStatisticsService.reportFormsvg(dataItem);
+    list.forEach(dataTimeSVG -> dataTimeSVG.setFormatdate("yyyy-MM-dd HH:mm:ss"));
+    Map<String, List<dataTimeSVG>> groupBy = list.stream().collect(Collectors.groupingBy(dataTimeSVG::getIndexName));
+    energyTable tableData =new energyTable();//琛ㄦ牸
+    List<Map> tablehead = new ArrayList<Map>();
+    groupBy.forEach((indexName,value)->{
+      tableData.setTabledata(value);
+      Map tableColumn =new HashMap<>();
+      tableColumn.put("indexName",indexName);
+      tablehead.add(tableColumn);
+      tableData.setTabledataMap(tablehead);
+    });
+    return AjaxResult.success(tableData);
+  }
+  /*
+    瀹炴椂妫�娴嬪sheet椤靛睍绀虹粍鎬佸浘鎶ヨ〃瀵煎嚭
+  */
+  @GetMapping("/reportFormsvgExport")
+  public AjaxResult reportFormsvgExport(dataTimeSVG dataItem) {
+    List<dataTimeSVG> list = IEnergyStatisticsService.reportFormsvg(dataItem);
+    ExcelUtil<dataTimeSVG> util = new ExcelUtil<dataTimeSVG>(dataTimeSVG.class);
+    return util.exportExcel(list, "set");
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsCurveController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsCurveController.java
new file mode 100644
index 0000000..1464424
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/controller/energyStatisticsCurveController.java
@@ -0,0 +1,77 @@
+package com.dingzhuo.energy.project.energyStatistics.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.StatisticResult;
+import com.dingzhuo.energy.dataservice.service.PeriodDataService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.energyStatistics.service.IEnergyStatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Collections;
+import java.util.List;
+
+@RestController
+@RequestMapping("/energyCurve")
+public class energyStatisticsCurveController extends BaseController {
+
+    @Autowired
+    private PeriodDataService periodDataService;
+    @Autowired
+    private IEnergyStatisticsService IEnergyStatisticsService;
+    /**
+     * 瀵煎嚭鑳芥簮鎸囨爣瓒嬪娍鍒嗘瀽鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('energyCurve:energyCurveTrend:export')")
+    @Log(title = "鑳借�楁寚鏍囪秼鍔垮垎鏋�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DataItem dataItem) {
+        List<StatisticResult> list = periodDataService.statisticById(dataItem.getIndexId(), dataItem.getTimeType(), dataItem.getBeginTime(),dataItem.getEndTime());
+        ExcelUtil<StatisticResult> util = new ExcelUtil<StatisticResult>(StatisticResult.class);
+        return util.exportExcel(list, "set");
+    }
+
+    /**
+     * 鑳芥簮鎸囨爣瓒嬪娍鍒嗘瀽
+     */
+    @GetMapping("/getEnergyCurveTrend")
+    public TableDataInfo getEnergyCurveTrend(DataItem dataItem) {
+        startPage();
+        List<StatisticResult> list = periodDataService.statisticById(dataItem.getIndexId(), dataItem.getTimeType(), dataItem.getBeginTime(),dataItem.getEndTime());
+        return getDataTable(list);
+    }
+
+    /*
+鐢ㄨ兘鍗曞厓鑳借�楀垎鏋�
+ */
+    @GetMapping("/getEnergyUnit")
+    public AjaxResult getEnergyUnit(DataItem dataItem) {
+        try {
+            List<String> indexCode =  Collections.singletonList(dataItem.getIndexCode());
+            // List<StatisticResult> list= periodDataService.statisticByCode(dataItem.getIndexCode(),timeType, dataItem.getBeginTime(), dataItem.getEndTime());
+            List<StatisticResult> list= periodDataService.statisticByCode(indexCode,dataItem.getTimeType(),dataItem.getDataTime());
+            list.forEach(statisticResult -> statisticResult.setFormatdate("yyyy-MM-dd"));
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+   /* @GetMapping("/getEnergyConstitute")
+    public AjaxResult getEnergyConstitute(DataItem dataItem) {
+        energyTable tabledata =new energyTable();
+        List<dataTimeSVG> tabledatalist= IEnergyStatisticsService.statisticByCode(dataItem);
+        tabledata.setTabledata(tabledatalist);
+        return AjaxResult.success(tabledata);
+    }
+*/
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/EnergyConsumption.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/EnergyConsumption.java
new file mode 100644
index 0000000..375e35f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/EnergyConsumption.java
@@ -0,0 +1,72 @@
+package com.dingzhuo.energy.project.energyStatistics.domain;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class EnergyConsumption implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+  private String lable;
+  private String prop;
+  private String maxValue;
+  private String minValue;
+  private String dataTime;
+  private List<EnergyConsumption> childNodes =new ArrayList<>();
+
+
+  public List<EnergyConsumption> getChildNodes() {
+    return childNodes;
+  }
+
+  public void setChildNodes(List<EnergyConsumption> childNodes) {
+    this.childNodes = childNodes;
+  }
+
+  public void addChildNode(EnergyConsumption childNode){
+    this.childNodes.add(childNode);
+  }
+
+  public String getLable() {
+    return lable;
+  }
+
+  public void setLable(String lable) {
+    this.lable = lable;
+  }
+
+  public String getProp() {
+    return prop;
+  }
+
+  public void setProp(String prop) {
+    this.prop = prop;
+  }
+
+  public String getMaxValue() {
+    return maxValue;
+  }
+
+  public void setMaxValue(String maxValue) {
+    this.maxValue = maxValue;
+  }
+
+  public String getMinValue() {
+    return minValue;
+  }
+
+  public void setMinValue(String minValue) {
+    this.minValue = minValue;
+  }
+
+  public String getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(String dataTime) {
+    this.dataTime = dataTime;
+  }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/dataTimeSVG.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/dataTimeSVG.java
new file mode 100644
index 0000000..eec623c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/dataTimeSVG.java
@@ -0,0 +1,169 @@
+package com.dingzhuo.energy.project.energyStatistics.domain;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+public class dataTimeSVG implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+  @Excel(name = "鎸囨爣id")
+  private String indexId;
+  @Excel(name = "鎸囨爣缂栫爜")
+  private String indexCode;
+  @Excel(name = "鎸囨爣鍚嶇О")
+  private String indexName;
+  @Excel(name = "寮�濮嬫椂闂�")
+  private Date beginTime;
+  @Excel(name = "缁撴潫鏃堕棿")
+  private Date endTime;
+  @Excel(name = "鏃堕棿")
+  private Date dataTime;
+  @Excel(name = "timeCode")
+  private String timeCode;
+  @Excel(name = "鏃堕棿绫诲瀷")
+  private TimeType timeType;
+  @Excel(name = "鎸囨爣鍊�")
+  private Double value;
+  @Excel(name = "鍗曚綅")
+  private String unitId;
+  @Excel(name = "澶囨敞")
+  private String remark;
+  @Excel(name = "璁¢噺鍣ㄥ叿id")
+  private String meterId;
+  //妯″瀷鑺傜偣涓婚敭id
+  private String nodeId;
+  private String indexType;
+  //鏃堕棿鏍煎紡鍖�
+  private String formatdate;
+  public String getFormatdate() {
+    return formatdate;
+  }
+  public void setFormatdate(String formatdate) {
+    this.formatdate = DateUtils.parseDateToStr(formatdate,this.dataTime);
+  }
+  /**
+   * SVG鏂囦欢鐨処D
+   */
+  private Integer svgId;
+
+  public String getIndexId() {
+    return indexId;
+  }
+
+  public void setIndexId(String indexId) {
+    this.indexId = indexId;
+  }
+
+  public String getIndexCode() {
+    return indexCode;
+  }
+
+  public void setIndexCode(String indexCode) {
+    this.indexCode = indexCode;
+  }
+
+  public String getIndexName() {
+    return indexName;
+  }
+
+  public void setIndexName(String indexName) {
+    this.indexName = indexName;
+  }
+
+  public Date getBeginTime() {
+    return beginTime;
+  }
+
+  public void setBeginTime(Date beginTime) {
+    this.beginTime = beginTime;
+  }
+
+  public Date getEndTime() {
+    return endTime;
+  }
+
+  public void setEndTime(Date endTime) {
+    this.endTime = endTime;
+  }
+
+  public Date getDataTime() {
+    return dataTime;
+  }
+
+  public void setDataTime(Date dataTime) {
+    this.dataTime = dataTime;
+  }
+
+  public String getTimeCode() {
+    return timeCode;
+  }
+
+  public void setTimeCode(String timeCode) {
+    this.timeCode = timeCode;
+  }
+
+  public TimeType getTimeType() {
+    return timeType;
+  }
+
+  public void setTimeType(TimeType timeType) {
+    this.timeType = timeType;
+  }
+
+  public Double getValue() {
+    return value;
+  }
+
+  public void setValue(Double value) {
+    this.value = value;
+  }
+
+  public String getMeterId() {
+    return meterId;
+  }
+
+  public void setMeterId(String meterId) { this.meterId = meterId; }
+
+  public Integer getSvgId() {
+    return svgId;
+  }
+
+  public void setSvgId(Integer svgId) {
+    this.svgId = svgId;
+  }
+
+  public String getRemark() {
+    return remark;
+  }
+
+  public void setRemark(String remark) {
+    this.remark = remark;
+  }
+
+  public String getNodeId() {
+    return nodeId;
+  }
+
+  public void setNodeId(String nodeId) {
+    this.nodeId = nodeId;
+  }
+
+  public String getIndexType() {
+    return indexType;
+  }
+
+  public void setIndexType(String indexType) {
+    this.indexType = indexType;
+  }
+
+  public String getUnitId() {
+    return unitId;
+  }
+  public void setUnitId(String unitId) {
+    this.unitId = unitId;
+  }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyAnalysis.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyAnalysis.java
new file mode 100644
index 0000000..c77c823
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyAnalysis.java
@@ -0,0 +1,54 @@
+package com.dingzhuo.energy.project.energyStatistics.domain;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+public class energyAnalysis implements Serializable {
+    private static final long serialVersionUID = -2777479013884125925L;
+    private String prop;
+    private Double value;
+    private Date dataTime;
+    private List<energyAnalysis> analysisTableDate = new ArrayList<>();
+    private List<Map> analysisTableHead = new ArrayList<Map>();
+    public String getProp() {
+        return prop;
+    }
+
+    public void setProp(String prop) {
+        this.prop = prop;
+    }
+
+    public Double getValue() {
+        return value;
+    }
+
+    public void setValue(Double value) {
+        this.value = value;
+    }
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public List<energyAnalysis> getAnalysisTableDate() {
+        return analysisTableDate;
+    }
+
+    public void setAnalysisTableDate(List<energyAnalysis> analysisTableDate) {
+        this.analysisTableDate = analysisTableDate;
+    }
+
+    public List<Map> getAnalysisTableHead() {
+        return analysisTableHead;
+    }
+
+    public void setAnalysisTableHead(List<Map> analysisTableHead) {
+        this.analysisTableHead = analysisTableHead;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyTable.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyTable.java
new file mode 100644
index 0000000..9b52b19
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/domain/energyTable.java
@@ -0,0 +1,101 @@
+package com.dingzhuo.energy.project.energyStatistics.domain;
+
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.StatisticResult;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class energyTable implements Serializable {
+  private static final long serialVersionUID = -2777479013884125925L;
+  private List<EnergyConsumption> tablehead =new ArrayList<>();
+  private List<Map> tabledataMap = new ArrayList<Map>();
+  private List<dataTimeSVG> tabledata = new ArrayList<dataTimeSVG>();
+  private List<DataItem> listXFL=new ArrayList<DataItem>();//鑳芥簮娑堣垂鎴愭湰 娑堣垂閲�
+  private List<DataItem> listZBL=new ArrayList<DataItem>(); //鑳芥簮娑堣垂鎴愭湰 鎶樻爣閲�
+  private List<DataItem> listXFCB=new ArrayList<DataItem>(); //鑳芥簮娑堣垂鎴愭湰 娑堣垂鎴愭湰
+  private List<Map> resultListZBL=new ArrayList<>(); //鑳芥簮娑堣垂鎴愭湰 鎶樻爣瀵规瘮
+  private List<Map> resultListXFCB=new ArrayList<>(); //鑳芥簮娑堣垂鎴愭湰 娑堣垂鎴愭湰瀵规瘮
+  private List<Map> resultZBL = new ArrayList<Map>();
+  private List<Map> resultXFCB = new ArrayList<Map>();
+  public List<Map> getTabledataMap() {
+    return tabledataMap;
+  }
+  public void setTabledataMap(List<Map> tabledataMap) {
+    this.tabledataMap = tabledataMap;
+  }
+  public List<EnergyConsumption> getTablehead() {
+    return tablehead;
+  }
+  public void setTablehead(List<EnergyConsumption> tablehead) {
+    this.tablehead = tablehead;
+  }
+
+  public List<dataTimeSVG> getTabledata() {
+    return tabledata;
+  }
+
+  public void setTabledata(List<dataTimeSVG> tabledata) {
+    this.tabledata = tabledata;
+  }
+
+  public List<DataItem> getListXFL() {
+    return listXFL;
+  }
+
+  public void setListXFL(List<DataItem> listXFL) {
+    this.listXFL = listXFL;
+  }
+
+  public List<DataItem> getListZBL() {
+    return listZBL;
+  }
+
+  public void setListZBL(List<DataItem> listZBL) {
+    this.listZBL = listZBL;
+  }
+
+  public List<DataItem> getListXFCB() {
+    return listXFCB;
+  }
+
+  public void setListXFCB(List<DataItem> listXFCB) {
+    this.listXFCB = listXFCB;
+  }
+
+  public List<Map> getResultListZBL() {
+    return resultListZBL;
+  }
+
+  public void setResultListZBL(List<Map> resultListZBL) {
+    this.resultListZBL = resultListZBL;
+  }
+
+  public List<Map> getResultListXFCB() {
+    return resultListXFCB;
+  }
+
+  public void setResultListXFCB(List<Map> resultListXFCB) {
+    this.resultListXFCB = resultListXFCB;
+  }
+
+  public List<Map> getResultZBL() {
+    return resultZBL;
+  }
+
+  public void setResultZBL(List<Map> resultZBL) {
+    this.resultZBL = resultZBL;
+  }
+
+  public List<Map> getResultXFCB() {
+    return resultXFCB;
+  }
+
+  public void setResultXFCB(List<Map> resultXFCB) {
+    this.resultXFCB = resultXFCB;
+  }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/mapper/energyStatisticsMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/mapper/energyStatisticsMapper.java
new file mode 100644
index 0000000..16f9260
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/mapper/energyStatisticsMapper.java
@@ -0,0 +1,10 @@
+package com.dingzhuo.energy.project.energyStatistics.mapper;
+
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+
+import java.util.List;
+
+public interface energyStatisticsMapper {
+  List<dataTimeSVG> reportFormsvg(dataTimeSVG dataItem);
+  List<dataTimeSVG> selectDataTimelist(dataTimeSVG dataItem);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/IEnergyStatisticsService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/IEnergyStatisticsService.java
new file mode 100644
index 0000000..b173a61
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/IEnergyStatisticsService.java
@@ -0,0 +1,21 @@
+package com.dingzhuo.energy.project.energyStatistics.service;
+
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
+ *
+ * @author ruoyi
+ * @date 2020-02-07
+ */
+public interface IEnergyStatisticsService {
+    public List<DataItem> statisticByCode(List<String> indexCodes, TimeType timeType, Date beginTime, Date endTime);
+    List<dataTimeSVG> reportFormsvg(dataTimeSVG dataItem);
+    List<dataTimeSVG> selectDataTimeList(dataTimeSVG dataItem);
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/impl/energyStatisticsServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/impl/energyStatisticsServiceImpl.java
new file mode 100644
index 0000000..0f30d67
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/energyStatistics/service/impl/energyStatisticsServiceImpl.java
@@ -0,0 +1,52 @@
+package com.dingzhuo.energy.project.energyStatistics.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.mapper.PeriodDataMapper;
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+import com.dingzhuo.energy.project.energyStatistics.mapper.energyStatisticsMapper;
+import com.dingzhuo.energy.project.energyStatistics.service.IEnergyStatisticsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
+ *
+ * @author ruoyi
+ * @date 2020-02-07
+ */
+@Service
+public class energyStatisticsServiceImpl implements IEnergyStatisticsService {
+    @Autowired
+    private energyStatisticsMapper energyStatisticsMapper;
+
+    @Autowired
+    private PeriodDataMapper PeriodDataMapper;
+
+    @Override
+    public List<DataItem> statisticByCode(List<String> indexCodes, TimeType timeType, Date beginTime, Date endTime) {
+        if (indexCodes == null || indexCodes.isEmpty()) {
+            return Collections.emptyList();
+        }
+        return PeriodDataMapper.statisticByCode(indexCodes, timeType, beginTime, endTime);
+    }
+    @Override
+    public List<dataTimeSVG> reportFormsvg(dataTimeSVG dataItem) {
+        String timeCode = TimeManager.getTimeCode(dataItem.getDataTime(), dataItem.getTimeType());
+        dataItem.setBeginTime(TimeManager.getBeginTime(timeCode));
+        dataItem.setEndTime(TimeManager.getEndTime(timeCode));
+        return energyStatisticsMapper.reportFormsvg(dataItem);
+    }
+    @Override
+    public List<dataTimeSVG> selectDataTimeList(dataTimeSVG dataItem) {
+        String timeCode = TimeManager.getTimeCode(dataItem.getDataTime(), dataItem.getTimeType());
+        dataItem.setBeginTime(TimeManager.getBeginTime(timeCode));
+        dataItem.setEndTime(TimeManager.getEndTime(timeCode));
+        return energyStatisticsMapper.reportFormsvg(dataItem);
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewayHbtLogController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewayHbtLogController.java
new file mode 100644
index 0000000..ec9f804
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewayHbtLogController.java
@@ -0,0 +1,92 @@
+package com.dingzhuo.energy.project.gateway.controller;
+
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.gateway.domain.GatewayHbtLog;
+import com.dingzhuo.energy.project.gateway.service.IGatewayHbtLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 缃戝叧蹇冭烦鏃ュ織Controller
+ *
+ * @author zhw
+ * @date 2022-04-15
+ */
+@RestController
+@RequestMapping("/gateway/gatewaylog")
+public class GatewayHbtLogController extends BaseController
+{
+    @Autowired
+    private IGatewayHbtLogService gatewayHbtLogService;
+
+    /**
+     * 鏌ヨ缃戝叧蹇冭烦鏃ュ織鍒楄〃
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(GatewayHbtLog gatewayHbtLog)
+    {
+        startPage();
+        List<GatewayHbtLog> list = gatewayHbtLogService.selectGatewayHbtLogList(gatewayHbtLog);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭缃戝叧蹇冭烦鏃ュ織鍒楄〃
+     */
+    @Log(title = "缃戝叧蹇冭烦鏃ュ織", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(GatewayHbtLog gatewayHbtLog)
+    {
+        List<GatewayHbtLog> list = gatewayHbtLogService.selectGatewayHbtLogList(gatewayHbtLog);
+        ExcelUtil<GatewayHbtLog> util = new ExcelUtil<GatewayHbtLog>(GatewayHbtLog.class);
+        return util.exportExcel(list, "gatewaylog");
+    }
+
+    /**
+     * 鑾峰彇缃戝叧蹇冭烦鏃ュ織璇︾粏淇℃伅
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(gatewayHbtLogService.selectGatewayHbtLogById(id));
+    }
+
+    /**
+     * 鏂板缃戝叧蹇冭烦鏃ュ織
+     */
+    @Log(title = "缃戝叧蹇冭烦鏃ュ織", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody GatewayHbtLog gatewayHbtLog)
+    {
+        gatewayHbtLog.setId(UUID.fastUUID().toString());
+        return toAjax(gatewayHbtLogService.insertGatewayHbtLog(gatewayHbtLog));
+    }
+
+    /**
+     * 淇敼缃戝叧蹇冭烦鏃ュ織
+     */
+    @Log(title = "缃戝叧蹇冭烦鏃ュ織", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody GatewayHbtLog gatewayHbtLog)
+    {
+        return toAjax(gatewayHbtLogService.updateGatewayHbtLog(gatewayHbtLog));
+    }
+
+    /**
+     * 鍒犻櫎缃戝叧蹇冭烦鏃ュ織
+     */
+    @Log(title = "缃戝叧蹇冭烦鏃ュ織", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(gatewayHbtLogService.deleteGatewayHbtLogByIds(ids));
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewaySettingController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewaySettingController.java
new file mode 100644
index 0000000..8d44060
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/controller/GatewaySettingController.java
@@ -0,0 +1,135 @@
+package com.dingzhuo.energy.project.gateway.controller;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.dingzhuo.energy.common.core.lang.UUID;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.gateway.domain.GatewaySetting;
+import com.dingzhuo.energy.project.gateway.service.IGatewaySettingService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 缃戝叧閰嶇疆淇℃伅Controller
+ *
+ * @author zhw
+ * @date 2022-04-15
+ */
+@RestController
+@RequestMapping("/gateway/gatewaysetting")
+public class GatewaySettingController extends BaseController
+{
+    @Autowired
+    private IGatewaySettingService gatewaySettingService;
+
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅鍒楄〃
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(GatewaySetting gatewaySetting)
+    {
+        startPage();
+        List<GatewaySetting> list = gatewaySettingService.selectGatewaySettingList(gatewaySetting);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭缃戝叧閰嶇疆淇℃伅鍒楄〃
+     */
+    @Log(title = "缃戝叧閰嶇疆淇℃伅", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(GatewaySetting gatewaySetting)
+    {
+        List<GatewaySetting> list = gatewaySettingService.selectGatewaySettingList(gatewaySetting);
+        ExcelUtil<GatewaySetting> util = new ExcelUtil<GatewaySetting>(GatewaySetting.class);
+        return util.exportExcel(list, "gatewaysetting");
+    }
+
+    /**
+     * 鑾峰彇缃戝叧閰嶇疆淇℃伅璇︾粏淇℃伅
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(gatewaySettingService.selectGatewaySettingById(id));
+    }
+
+    /**
+     * 鏂板缃戝叧閰嶇疆淇℃伅
+     */
+    @Log(title = "鏂板缃戝叧閰嶇疆淇℃伅", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody GatewaySetting gatewaySetting)
+    {
+        List<GatewaySetting> gatewaySettingList =  gatewaySettingService.checkOne(gatewaySetting);
+        if(!CollectionUtil.isEmpty(gatewaySettingList)){
+            return AjaxResult.error("缃戝叧缂栧彿閲嶅");
+        }
+        gatewaySetting.setId(UUID.fastUUID().toString());
+        return toAjax(gatewaySettingService.insertGatewaySetting(gatewaySetting));
+    }
+
+    /**
+     * 淇敼缃戝叧閰嶇疆淇℃伅
+     */
+    @Log(title = "缃戝叧閰嶇疆淇℃伅", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody GatewaySetting gatewaySetting)
+    {
+        if(ObjectUtils.isEmpty(gatewaySetting.getId())){
+            return AjaxResult.error("鏃犵綉鍏充富閿�");
+        }
+        List<GatewaySetting> gatewaySettingList =  gatewaySettingService.checkOne(gatewaySetting);
+        if(!CollectionUtil.isEmpty(gatewaySettingList)){
+            return AjaxResult.error("缃戝叧缂栧彿閲嶅");
+        }
+        return toAjax(gatewaySettingService.updateGatewaySetting(gatewaySetting));
+    }
+
+    /**
+     * 鍒犻櫎缃戝叧閰嶇疆淇℃伅
+     */
+    @Log(title = "缃戝叧閰嶇疆淇℃伅", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(gatewaySettingService.deleteGatewaySettingByIds(ids));
+    }
+
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅鍒楄〃
+     */
+    @GetMapping("/monitor")
+    public TableDataInfo monitor()
+    {
+        startPage();
+        List<GatewaySetting> list = gatewaySettingService.selectGatewaySettingMonitorList();
+
+        if(CollectionUtils.isNotEmpty(list)){
+            list.forEach(f->{
+                Date dd = f.getHbtTime();
+                //3鍒嗛挓娌℃湁蹇冭烦灏辫秴鏃�
+                if(ObjectUtils.isEmpty(dd)){
+                    f.setState("鏈煡");
+                }else  if(dd.getTime()+60000*5>(new Date()).getTime())
+                {
+                    f.setState("鍦ㄧ嚎");
+                }else{
+                    f.setState("绂荤嚎");
+                }
+            });
+        }
+        list.stream().sorted(Comparator.comparing(GatewaySetting::getHbtTime));
+        return getDataTable(list);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewayHbtLog.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewayHbtLog.java
new file mode 100644
index 0000000..3535b78
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewayHbtLog.java
@@ -0,0 +1,80 @@
+package com.dingzhuo.energy.project.gateway.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 缃戝叧蹇冭烦鏃ュ織瀵硅薄 gateway_hbt_log
+ * 
+ * @author zhw
+ * @date 2022-04-15
+ */
+public class GatewayHbtLog extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭 */
+    private String id;
+
+    /** 缃戝叧缂栧彿 */
+    @Excel(name = "缃戝叧缂栧彿")
+    private String gatewayNo;
+
+    /** 蹇冭烦鏃堕棿 */
+    @Excel(name = "蹇冭烦鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date hbtTime;
+
+    /** 蹇冭烦鍖� */
+    @Excel(name = "蹇冭烦鍖�")
+    private String content;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setGatewayNo(String gatewayNo) 
+    {
+        this.gatewayNo = gatewayNo;
+    }
+
+    public String getGatewayNo() 
+    {
+        return gatewayNo;
+    }
+    public void setHbtTime(Date hbtTime) 
+    {
+        this.hbtTime = hbtTime;
+    }
+
+    public Date getHbtTime() 
+    {
+        return hbtTime;
+    }
+    public void setContent(String content) 
+    {
+        this.content = content;
+    }
+
+    public String getContent() 
+    {
+        return content;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("gatewayNo", getGatewayNo())
+            .append("hbtTime", getHbtTime())
+            .append("content", getContent())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewaySetting.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewaySetting.java
new file mode 100644
index 0000000..03b8935
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/domain/GatewaySetting.java
@@ -0,0 +1,118 @@
+package com.dingzhuo.energy.project.gateway.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+import org.springframework.data.annotation.Transient;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * 缃戝叧閰嶇疆淇℃伅瀵硅薄 gateway_setting
+ *
+ * @author zhw
+ * @date 2022-04-15
+ */
+public class GatewaySetting extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** UUID涓婚敭 */
+    private String id;
+
+    /** 缃戝叧缂栧彿 */
+    @Excel(name = "缃戝叧缂栧彿")
+    private String gatewayNum;
+
+    /** 鍘傚尯 */
+    @Excel(name = "鍘傚尯")
+    private String plantArea;
+
+    /** 鍦板潃 */
+    @Excel(name = "鍦板潃")
+    private String address;
+
+    /** 蹇冭烦鏃堕棿 */
+    @Excel(name = "蹇冭烦鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date hbtTime;
+
+    /**
+     * 缃戝叧鐘舵�� 绂荤嚎/鍦ㄧ嚎
+     */
+    @Transient
+    private String state;
+
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setGatewayNum(String gatewayNum)
+    {
+        this.gatewayNum = gatewayNum;
+    }
+
+    public String getGatewayNum()
+    {
+        return gatewayNum;
+    }
+    public void setPlantArea(String plantArea)
+    {
+        this.plantArea = plantArea;
+    }
+
+    public String getPlantArea()
+    {
+        return plantArea;
+    }
+    public void setAddress(String address)
+    {
+        this.address = address;
+    }
+
+    public String getAddress()
+    {
+        return address;
+    }
+    public void setHbtTime(Date hbtTime)
+    {
+        this.hbtTime = hbtTime;
+    }
+
+    public Date getHbtTime()
+    {
+        return hbtTime;
+    }
+
+    public String getState() {
+        return state;
+    }
+
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("gatewayNum", getGatewayNum())
+            .append("plantArea", getPlantArea())
+            .append("address", getAddress())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("hbtTime", getHbtTime())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewayHbtLogMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewayHbtLogMapper.java
new file mode 100644
index 0000000..9b03053
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewayHbtLogMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.gateway.mapper;
+
+import com.dingzhuo.energy.project.gateway.domain.GatewayHbtLog;
+import java.util.List;
+
+/**
+ * 缃戝叧蹇冭烦鏃ュ織Mapper鎺ュ彛
+ * 
+ * @author zhw
+ * @date 2022-04-15
+ */
+public interface GatewayHbtLogMapper 
+{
+    /**
+     * 鏌ヨ缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param id 缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缃戝叧蹇冭烦鏃ュ織
+     */
+    public GatewayHbtLog selectGatewayHbtLogById(String id);
+
+    /**
+     * 鏌ヨ缃戝叧蹇冭烦鏃ュ織鍒楄〃
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缃戝叧蹇冭烦鏃ュ織闆嗗悎
+     */
+    public List<GatewayHbtLog> selectGatewayHbtLogList(GatewayHbtLog gatewayHbtLog);
+
+    /**
+     * 鏂板缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertGatewayHbtLog(GatewayHbtLog gatewayHbtLog);
+
+    /**
+     * 淇敼缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateGatewayHbtLog(GatewayHbtLog gatewayHbtLog);
+
+    /**
+     * 鍒犻櫎缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param id 缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewayHbtLogById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewayHbtLogByIds(String[] ids);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewaySettingMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewaySettingMapper.java
new file mode 100644
index 0000000..62645d5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/mapper/GatewaySettingMapper.java
@@ -0,0 +1,81 @@
+package com.dingzhuo.energy.project.gateway.mapper;
+
+import com.dingzhuo.energy.project.gateway.domain.GatewaySetting;
+import java.util.List;
+
+/**
+ * 缃戝叧閰嶇疆淇℃伅Mapper鎺ュ彛
+ *
+ * @author zhw
+ * @date 2022-04-15
+ */
+public interface GatewaySettingMapper
+{
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅
+     *
+     * @param id 缃戝叧閰嶇疆淇℃伅ID
+     * @return 缃戝叧閰嶇疆淇℃伅
+     */
+    public GatewaySetting selectGatewaySettingById(String id);
+
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅鍒楄〃
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缃戝叧閰嶇疆淇℃伅闆嗗悎
+     */
+    public List<GatewaySetting> selectGatewaySettingList(GatewaySetting gatewaySetting);
+
+
+    /**
+     * 鏂板缃戝叧閰嶇疆淇℃伅
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertGatewaySetting(GatewaySetting gatewaySetting);
+
+    /**
+     * 淇敼缃戝叧閰嶇疆淇℃伅
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateGatewaySetting(GatewaySetting gatewaySetting);
+
+    /**
+     * 鍒犻櫎缃戝叧閰嶇疆淇℃伅
+     *
+     * @param id 缃戝叧閰嶇疆淇℃伅ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewaySettingById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎缃戝叧閰嶇疆淇℃伅
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewaySettingByIds(String[] ids);
+
+    /**
+     * 鏍规嵁缃戝叧缂栧彿鏇存柊蹇冭烦鏃堕棿
+     * @param gatewaySetting
+     * @return
+     */
+    public int updateGatewaySettingByNum(GatewaySetting gatewaySetting);
+
+    /**
+     * 缃戝叧瀹炴椂鐘舵�佺洃鎺у垪琛�
+     * @return
+     */
+    public List<GatewaySetting> selectGatewaySettingMonitorList();
+
+    /**
+     * 缃戝叧缂栧彿鍞竴鎬ф鏌�
+     * @return
+     */
+    public List<GatewaySetting> checkOne(GatewaySetting gatewaySetting);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewayHbtLogService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewayHbtLogService.java
new file mode 100644
index 0000000..b397c53
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewayHbtLogService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.gateway.service;
+
+import com.dingzhuo.energy.project.gateway.domain.GatewayHbtLog;
+import java.util.List;
+
+/**
+ * 缃戝叧蹇冭烦鏃ュ織Service鎺ュ彛
+ * 
+ * @author zhw
+ * @date 2022-04-15
+ */
+public interface IGatewayHbtLogService 
+{
+    /**
+     * 鏌ヨ缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param id 缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缃戝叧蹇冭烦鏃ュ織
+     */
+    public GatewayHbtLog selectGatewayHbtLogById(String id);
+
+    /**
+     * 鏌ヨ缃戝叧蹇冭烦鏃ュ織鍒楄〃
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缃戝叧蹇冭烦鏃ュ織闆嗗悎
+     */
+    public List<GatewayHbtLog> selectGatewayHbtLogList(GatewayHbtLog gatewayHbtLog);
+
+    /**
+     * 鏂板缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缁撴灉
+     */
+    public int insertGatewayHbtLog(GatewayHbtLog gatewayHbtLog);
+
+    /**
+     * 淇敼缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缁撴灉
+     */
+    public int updateGatewayHbtLog(GatewayHbtLog gatewayHbtLog);
+
+    /**
+     * 鎵归噺鍒犻櫎缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewayHbtLogByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎缃戝叧蹇冭烦鏃ュ織淇℃伅
+     * 
+     * @param id 缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewayHbtLogById(String id);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewaySettingService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewaySettingService.java
new file mode 100644
index 0000000..54cb1a0
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/IGatewaySettingService.java
@@ -0,0 +1,81 @@
+package com.dingzhuo.energy.project.gateway.service;
+
+import com.dingzhuo.energy.project.gateway.domain.GatewaySetting;
+import java.util.List;
+
+/**
+ * 缃戝叧閰嶇疆淇℃伅Service鎺ュ彛
+ *
+ * @author zhw
+ * @date 2022-04-15
+ */
+public interface IGatewaySettingService
+{
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅
+     *
+     * @param id 缃戝叧閰嶇疆淇℃伅ID
+     * @return 缃戝叧閰嶇疆淇℃伅
+     */
+    public GatewaySetting selectGatewaySettingById(String id);
+
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅鍒楄〃
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缃戝叧閰嶇疆淇℃伅闆嗗悎
+     */
+    public List<GatewaySetting> selectGatewaySettingList(GatewaySetting gatewaySetting);
+
+    /**
+     * 鏂板缃戝叧閰嶇疆淇℃伅
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    public int insertGatewaySetting(GatewaySetting gatewaySetting);
+
+    /**
+     * 淇敼缃戝叧閰嶇疆淇℃伅
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    public int updateGatewaySetting(GatewaySetting gatewaySetting);
+
+    /**
+     * 鎵归噺鍒犻櫎缃戝叧閰嶇疆淇℃伅
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑缃戝叧閰嶇疆淇℃伅ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewaySettingByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎缃戝叧閰嶇疆淇℃伅淇℃伅
+     *
+     * @param id 缃戝叧閰嶇疆淇℃伅ID
+     * @return 缁撴灉
+     */
+    public int deleteGatewaySettingById(String id);
+
+    /**
+     * 鏍规嵁缃戝叧缂栧彿鏇存柊蹇冭烦鏃堕棿
+     * @param gatewaySetting
+     * @return
+     */
+    public int updateGatewaySettingByNum(GatewaySetting gatewaySetting);
+
+    /**
+     * 鏌ヨ缃戝叧鐩戞帶淇℃伅鍒楄〃
+     *
+     * @return 缃戝叧閰嶇疆淇℃伅
+     */
+    public List<GatewaySetting> selectGatewaySettingMonitorList();
+
+    /**
+     * 缃戝叧缂栧彿鍞竴鎬ф鏌�
+     * @return
+     */
+    public List<GatewaySetting> checkOne(GatewaySetting gatewaySetting);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewayHbtLogServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewayHbtLogServiceImpl.java
new file mode 100644
index 0000000..e883658
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewayHbtLogServiceImpl.java
@@ -0,0 +1,93 @@
+package com.dingzhuo.energy.project.gateway.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.gateway.mapper.GatewayHbtLogMapper;
+import com.dingzhuo.energy.project.gateway.domain.GatewayHbtLog;
+import com.dingzhuo.energy.project.gateway.service.IGatewayHbtLogService;
+
+/**
+ * 缃戝叧蹇冭烦鏃ュ織Service涓氬姟灞傚鐞�
+ * 
+ * @author zhw
+ * @date 2022-04-15
+ */
+@Service
+public class GatewayHbtLogServiceImpl implements IGatewayHbtLogService 
+{
+    @Autowired
+    private GatewayHbtLogMapper gatewayHbtLogMapper;
+
+    /**
+     * 鏌ヨ缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param id 缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缃戝叧蹇冭烦鏃ュ織
+     */
+    @Override
+    public GatewayHbtLog selectGatewayHbtLogById(String id)
+    {
+        return gatewayHbtLogMapper.selectGatewayHbtLogById(id);
+    }
+
+    /**
+     * 鏌ヨ缃戝叧蹇冭烦鏃ュ織鍒楄〃
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缃戝叧蹇冭烦鏃ュ織
+     */
+    @Override
+    public List<GatewayHbtLog> selectGatewayHbtLogList(GatewayHbtLog gatewayHbtLog)
+    {
+        return gatewayHbtLogMapper.selectGatewayHbtLogList(gatewayHbtLog);
+    }
+
+    /**
+     * 鏂板缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertGatewayHbtLog(GatewayHbtLog gatewayHbtLog)
+    {
+        return gatewayHbtLogMapper.insertGatewayHbtLog(gatewayHbtLog);
+    }
+
+    /**
+     * 淇敼缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param gatewayHbtLog 缃戝叧蹇冭烦鏃ュ織
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateGatewayHbtLog(GatewayHbtLog gatewayHbtLog)
+    {
+        return gatewayHbtLogMapper.updateGatewayHbtLog(gatewayHbtLog);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎缃戝叧蹇冭烦鏃ュ織
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteGatewayHbtLogByIds(String[] ids)
+    {
+        return gatewayHbtLogMapper.deleteGatewayHbtLogByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎缃戝叧蹇冭烦鏃ュ織淇℃伅
+     * 
+     * @param id 缃戝叧蹇冭烦鏃ュ織ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteGatewayHbtLogById(String id)
+    {
+        return gatewayHbtLogMapper.deleteGatewayHbtLogById(id);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewaySettingServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewaySettingServiceImpl.java
new file mode 100644
index 0000000..d5f4986
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/gateway/service/impl/GatewaySettingServiceImpl.java
@@ -0,0 +1,126 @@
+package com.dingzhuo.energy.project.gateway.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.gateway.mapper.GatewaySettingMapper;
+import com.dingzhuo.energy.project.gateway.domain.GatewaySetting;
+import com.dingzhuo.energy.project.gateway.service.IGatewaySettingService;
+
+/**
+ * 缃戝叧閰嶇疆淇℃伅Service涓氬姟灞傚鐞�
+ *
+ * @author zhw
+ * @date 2022-04-15
+ */
+@Service
+public class GatewaySettingServiceImpl implements IGatewaySettingService
+{
+    @Autowired
+    private GatewaySettingMapper gatewaySettingMapper;
+
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅
+     *
+     * @param id 缃戝叧閰嶇疆淇℃伅ID
+     * @return 缃戝叧閰嶇疆淇℃伅
+     */
+    @Override
+    public GatewaySetting selectGatewaySettingById(String id)
+    {
+        return gatewaySettingMapper.selectGatewaySettingById(id);
+    }
+
+    /**
+     * 鏌ヨ缃戝叧閰嶇疆淇℃伅鍒楄〃
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缃戝叧閰嶇疆淇℃伅
+     */
+    @Override
+    public List<GatewaySetting> selectGatewaySettingList(GatewaySetting gatewaySetting)
+    {
+        return gatewaySettingMapper.selectGatewaySettingList(gatewaySetting);
+    }
+
+    /**
+     * 鏂板缃戝叧閰嶇疆淇℃伅
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertGatewaySetting(GatewaySetting gatewaySetting)
+    {
+        gatewaySetting.setCreateTime(DateUtils.getNowDate());
+        return gatewaySettingMapper.insertGatewaySetting(gatewaySetting);
+    }
+
+    /**
+     * 淇敼缃戝叧閰嶇疆淇℃伅
+     *
+     * @param gatewaySetting 缃戝叧閰嶇疆淇℃伅
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateGatewaySetting(GatewaySetting gatewaySetting)
+    {
+        gatewaySetting.setUpdateTime(DateUtils.getNowDate());
+        return gatewaySettingMapper.updateGatewaySetting(gatewaySetting);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎缃戝叧閰嶇疆淇℃伅
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑缃戝叧閰嶇疆淇℃伅ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteGatewaySettingByIds(String[] ids)
+    {
+        return gatewaySettingMapper.deleteGatewaySettingByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎缃戝叧閰嶇疆淇℃伅淇℃伅
+     *
+     * @param id 缃戝叧閰嶇疆淇℃伅ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteGatewaySettingById(String id)
+    {
+        return gatewaySettingMapper.deleteGatewaySettingById(id);
+    }
+
+    /**
+     * 鏍规嵁缃戝叧缂栧彿鏇存柊蹇冭烦鏃堕棿
+     * @param gatewaySetting
+     * @return
+     */
+    @Override
+    public int updateGatewaySettingByNum(GatewaySetting gatewaySetting){
+        return gatewaySettingMapper.updateGatewaySettingByNum(gatewaySetting);
+    }
+
+    /**
+     * 鏌ヨ缃戝叧鐩戞帶淇℃伅鍒楄〃
+     *
+     * @return 缃戝叧閰嶇疆淇℃伅
+     */
+    @Override
+    public List<GatewaySetting> selectGatewaySettingMonitorList()
+    {
+        return gatewaySettingMapper.selectGatewaySettingMonitorList();
+    }
+
+    /**
+     * 缃戝叧缂栧彿鍞竴鎬ф鏌�
+     * @return
+     */
+    @Override
+    public List<GatewaySetting> checkOne(GatewaySetting gatewaySetting){
+        return gatewaySettingMapper.checkOne(gatewaySetting);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/GovReportsTask.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/GovReportsTask.java
new file mode 100644
index 0000000..ddaa0a0
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/GovReportsTask.java
@@ -0,0 +1,95 @@
+package com.dingzhuo.energy.project.govReports;
+
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.project.govReports.domain.DataItemPub;
+import com.dingzhuo.energy.project.govReports.service.IDataItemPubService;
+import com.dingzhuo.energy.project.reportForm.domain.reportSet;
+import com.dingzhuo.energy.project.reportForm.mapper.reportSetMapper;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+
+@Configuration
+@Component
+public class GovReportsTask {
+
+    private static final String DATE_TYPE_DAY = "DAY";
+    private static final String DATE_TYPE_MONTH = "MONTH";
+
+    /**
+     * 琚鐞嗙殑琛ㄧ殑鏁版嵁
+     **/
+    final IDataItemPubService dataItemPubService;
+
+    final reportSetMapper reportSetMapper;
+
+    public GovReportsTask(IDataItemPubService dataItemPubService, reportSetMapper reportSetMapper) {
+        this.dataItemPubService = dataItemPubService;
+        this.reportSetMapper = reportSetMapper;
+    }
+
+    @Scheduled(cron = "${govReport.cronDay}")
+    private void handleDayDataTask() {
+        Date yesterday = DateUtil.yesterday();
+        String timeCode = MessageFormat.format("D{0}", DateUtil.format(yesterday, "yyyyMMdd"));
+        List<reportSet> reportSetList = reportSetMapper.getAllEnableSetByDateType(DATE_TYPE_DAY);
+        List<DataItemPub> data = dataItemPubService.getReportData(timeCode, DATE_TYPE_DAY);
+        compareData(data, reportSetList);
+        // 鎻掑叆鎴栬�呮洿鏂版暟鎹�
+        dataItemPubService.insertOrUpdateDateItemPub(data);
+    }
+
+    @Scheduled(cron = "${govReport.cronMonth}")
+    private void handleMonthDataTask() {
+        Date lastMonth = DateUtil.lastMonth();
+        String timeCode = MessageFormat.format("M{0}", DateUtil.format(lastMonth, "yyyyMM"));
+        List<reportSet> reportSetList = reportSetMapper.getAllEnableSetByDateType(DATE_TYPE_MONTH);
+        List<DataItemPub> data = dataItemPubService.getReportData(timeCode, DATE_TYPE_MONTH);
+        compareData(data, reportSetList);
+        // 鎻掑叆鎴栬�呮洿鏂版暟鎹�
+        dataItemPubService.insertOrUpdateDateItemPub(data);
+    }
+
+    /**
+     * 姣旇緝骞朵笖澶勭悊鏁版嵁
+     *
+     * @param itemPubList 鍘熷鏁版嵁
+     **/
+    private List<DataItemPub> compareData(List<DataItemPub> itemPubList, List<reportSet> mReportSet) {
+
+        // 鍙栧嚭鏉ョ殑鏄┖锛屽垯鐩存帴杩斿洖鏁版嵁
+        if (mReportSet.isEmpty()) {
+            return itemPubList;
+        }
+
+        itemPubList.forEach(m -> {
+            m.setOriginValue(m.getValue());
+            // 鑾峰彇姝ょ偣浣嶇殑璁剧疆
+            reportSet current = mReportSet.stream().filter(n -> n.getIndexId().equals(m.getIndexId())).findFirst().orElse(null);
+            if (current != null) {
+                // id
+                m.setReportSetId(current.getId());
+                // 涓嬮檺鍊�
+                m.setReportLowerLimit(Double.valueOf(current.getLimitValDown()));
+                // 涓嬮檺鏇挎崲
+                m.setReportLowerReplace(Double.valueOf(current.getLimitReplaceValDown()));
+                // 涓婇檺鍊�
+                m.setReportUpperLimit(Double.valueOf(current.getLimitValUp()));
+                // 涓婇檺鏇挎崲
+                m.setReportLowerLimit(Double.valueOf(current.getLimitReplaceValUp()));
+                if (m.getOriginValue() > m.getReportUpperLimit()) {
+                    m.setValue(m.getReportUpperReplace());
+                }
+                if (m.getOriginValue() < m.getReportLowerLimit()) {
+                    m.setValue(m.getReportLowerReplace());
+                }
+            }
+        });
+
+        return itemPubList;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/controller/DataItemPubController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/controller/DataItemPubController.java
new file mode 100644
index 0000000..07bdc2b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/controller/DataItemPubController.java
@@ -0,0 +1,102 @@
+package com.dingzhuo.energy.project.govReports.controller;
+
+import com.dingzhuo.energy.common.utils.StringUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.govReports.domain.DataItemPub;
+import com.dingzhuo.energy.project.govReports.domain.DataItemPubVo;
+import com.dingzhuo.energy.project.govReports.service.IDataItemPubService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * GovReportsController
+ *
+ * @author zy
+ * @date 2022-04-06
+ */
+@RestController
+@RequestMapping("/govReports/govReports")
+public class DataItemPubController extends BaseController
+{
+    @Autowired
+    private IDataItemPubService dataItemPubService;
+
+    /**
+     * 鏌ヨGovReports鍒楄〃
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(@RequestParam(value = "timeCode",required = false) String timeCode,@RequestParam(value = "timeType",required = false) String timeType)
+    {
+        if(StringUtils.isNotEmpty(timeCode)){
+            if("DAY".equals(timeType)){
+                timeCode="D"+timeCode;
+            }
+            if("MONTH".equals(timeType)){
+                timeCode="M"+timeCode;
+            }
+        }
+        DataItemPub dip = new DataItemPub();
+        dip.setTimeCode(timeCode);
+        startPage();
+        List<DataItemPubVo> list = dataItemPubService.selectDataItemPubInfoList(dip);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭GovReports鍒楄〃
+     */
+    @Log(title = "GovReports", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DataItemPub dataItemPub)
+    {
+        List<DataItemPub> list = dataItemPubService.selectDataItemPubList(dataItemPub);
+        ExcelUtil<DataItemPub> util = new ExcelUtil<DataItemPub>(DataItemPub.class);
+        return util.exportExcel(list, "govReports");
+    }
+
+//    /**
+//     * 鑾峰彇GovReports璇︾粏淇℃伅
+//     */
+//    @GetMapping(value = "/{indexId}")
+//    public AjaxResult getInfo(@PathVariable("indexId") String indexId)
+//    {
+//        return AjaxResult.success(dataItemPubService.selectDataItemPubById(indexId));
+//    }
+
+    /**
+     * 鏂板GovReports
+     */
+    @Log(title = "GovReports", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody DataItemPub dataItemPub)
+    {
+        return toAjax(dataItemPubService.insertDataItemPub(dataItemPub));
+    }
+
+    /**
+     * 淇敼GovReports
+     */
+    @Log(title = "GovReports", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody DataItemPub dataItemPub)
+    {
+        return toAjax(dataItemPubService.updateDataItemPub(dataItemPub));
+    }
+
+    /**
+     * 鍒犻櫎GovReports
+     */
+    @Log(title = "GovReports", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{indexIds}")
+    public AjaxResult remove(@PathVariable String[] indexIds)
+    {
+        return toAjax(dataItemPubService.deleteDataItemPubByIds(indexIds));
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPub.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPub.java
new file mode 100644
index 0000000..8a97319
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPub.java
@@ -0,0 +1,151 @@
+package com.dingzhuo.energy.project.govReports.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * GovReports瀵硅薄 data_item_pub
+ *
+ * @author zy
+ * @date 2022-04-06
+ */
+@Data
+public class DataItemPub {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * $column.columnComment
+     */
+    private String indexId;
+
+    /**
+     * $column.columnComment
+     */
+    private String timeCode;
+
+    /**
+     * $column.columnComment
+     */
+    private Date beginTime;
+
+    /**
+     * $column.columnComment
+     */
+    private Date endTime;
+
+    /**
+     * 涓婃姤鍊�
+     */
+    @Excel(name = "涓婃姤鍊�")
+    private Double value;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "涓婃姤鍊�")
+    private String quality;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "涓婃姤鍊�")
+    private String timeType;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "涓婃姤鍊�", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date dataTime;
+
+    /**
+     * 鍙戦�佺姸鎬� 0 鏈彂閫� 1 宸插彂閫� 2鍙戦�佸け璐�
+     */
+    private Integer sendStatus = 0;
+
+    /**
+     * 鍙戦�佹椂闂�
+     */
+    private Date sendDate;
+
+    /**
+     * 鍙戦�佹鏁�
+     */
+    private Integer sendTimes;
+
+    /**
+     * 璁剧疆鐨刬d
+     */
+    private String reportSetId;
+
+    /**
+     * 涓婇檺闄愬��
+     */
+    private Double reportUpperLimit;
+
+    /**
+     * 涓婇檺鏇挎崲鍊�
+     */
+    private Double reportUpperReplace;
+
+    /**
+     * 涓嬮檺闄愬��
+     */
+    private Double reportLowerLimit;
+
+    /**
+     * 涓嬮檺鏇挎崲鍊�
+     */
+    private Double reportLowerReplace;
+
+    /**
+     * 鍘熷鍊�
+     */
+    private Double originValue;
+
+    /** 鍒涘缓鑰� */
+    private String createBy;
+
+    /** 鍒涘缓鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 鏇存柊鑰� */
+    private String updateBy;
+
+    /** 鏇存柊鏃堕棿 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("indexId", getIndexId())
+                .append("timeCode", getTimeCode())
+                .append("beginTime", getBeginTime())
+                .append("endTime", getEndTime())
+                .append("value", getValue())
+                .append("quality", getQuality())
+                .append("createTime", getCreateTime())
+                .append("updateTime", getUpdateTime())
+                .append("timeType", getTimeType())
+                .append("dataTime", getDataTime())
+                .append("createBy", getCreateBy())
+                .append("sendStatus", getSendStatus())
+                .append("sendDate", getSendDate())
+                .append("sendTimes", getSendTimes())
+                .append("reportSetId", getReportSetId())
+                .append("reportUpperLimit", getReportUpperLimit())
+                .append("reportUpperReplace", getReportUpperReplace())
+                .append("reportLowerLimit", getReportLowerLimit())
+                .append("reportLowerReplace", getReportLowerReplace())
+                .append("originValue", getOriginValue())
+                .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPubVo.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPubVo.java
new file mode 100644
index 0000000..56d7d28
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/domain/DataItemPubVo.java
@@ -0,0 +1,91 @@
+package com.dingzhuo.energy.project.govReports.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * GovReportsVo瀵硅薄 data_item_pub
+ *
+ * @author zw
+ * @date 2022-04-07
+ */
+@Data
+public class DataItemPubVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鎸囨爣涓婚敭
+     */
+    private String indexId;
+    /**
+     * 鎸囨爣缂栫爜
+     */
+    @Excel(name = "鎸囨爣缂栫爜")
+    private String indexCode;
+    /**
+     * 鎸囨爣鍚嶇О
+     */
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+
+    /**
+     * 鎵�灞炴湡
+     */
+    @Excel(name = "涓婃姤鎵�灞炴湡")
+    private String timeCode;
+
+    /**
+     * 涓婃姤鍊�
+     */
+    @Excel(name = "涓婃姤鍊�")
+    private Double value;
+
+    /**
+     * 鍘熷鍊�
+     */
+    @Excel(name = "鍘熷鍊�")
+    private Double originValue;
+
+    /**
+     * 涓婇檺闄愬��
+     */
+    @Excel(name = "涓婇檺闄愬��")
+    private Double reportUpperLimit;
+
+    /**
+     * 涓婇檺鏇挎崲鍊�
+     */
+    @Excel(name = "涓婇檺鏇挎崲鍊�")
+    private Double reportUpperReplace;
+
+    /**
+     * 涓嬮檺闄愬��
+     */
+    @Excel(name = "涓嬮檺闄愬��")
+    private Double reportLowerLimit;
+
+    /**
+     * 涓嬮檺鏇挎崲鍊�
+     */
+    @Excel(name = "涓嬮檺鏇挎崲鍊�")
+    private Double reportLowerReplace;
+
+
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("indexId", getIndexId())
+                .append("timeCode", getTimeCode())
+                .append("value", getValue())
+                .append("reportUpperLimit", getReportUpperLimit())
+                .append("reportUpperReplace", getReportUpperReplace())
+                .append("reportLowerLimit", getReportLowerLimit())
+                .append("reportLowerReplace", getReportLowerReplace())
+                .append("originValue", getOriginValue())
+                .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/mapper/DataItemPubMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/mapper/DataItemPubMapper.java
new file mode 100644
index 0000000..49c2cf0
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/mapper/DataItemPubMapper.java
@@ -0,0 +1,84 @@
+package com.dingzhuo.energy.project.govReports.mapper;
+
+import com.dingzhuo.energy.project.govReports.domain.DataItemPub;
+import com.dingzhuo.energy.project.govReports.domain.DataItemPubVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * GovReportsMapper鎺ュ彛
+ *
+ * @author zy
+ * @date 2022-04-06
+ */
+public interface DataItemPubMapper {
+    /**
+     * 鏌ヨGovReports
+     *
+     * @param indexId GovReportsID
+     * @return GovReports
+     */
+    DataItemPub selectDataItemPubById(String indexId);
+
+    /**
+     * 鏌ヨGovReports鍒楄〃
+     *
+     * @param dataItemPub GovReports
+     * @return GovReports闆嗗悎
+     */
+    List<DataItemPub> selectDataItemPubList(DataItemPub dataItemPub);
+
+    /**
+     * 鏂板GovReports
+     *
+     * @param dataItemPub GovReports
+     * @return 缁撴灉
+     */
+    int insertDataItemPub(DataItemPub dataItemPub);
+
+    /**
+     * 淇敼GovReports
+     *
+     * @param dataItemPub GovReports
+     * @return 缁撴灉
+     */
+    int updateDataItemPub(DataItemPub dataItemPub);
+
+    /**
+     * 鍒犻櫎GovReports
+     *
+     * @param indexId GovReportsID
+     * @return 缁撴灉
+     */
+    int deleteDataItemPubById(String indexId);
+
+    /**
+     * 鎵归噺鍒犻櫎GovReports
+     *
+     * @param indexIds 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    int deleteDataItemPubByIds(String[] indexIds);
+
+    /**
+     * 鑾峰彇闇�瑕佸鐞嗙殑鏁版嵁
+     *
+     * @param dateType 鏃ユ湡绫诲瀷 DAY 澶�  MONTH 鏈�
+     * @param timeCode 鏃堕棿缂栫爜
+     **/
+    List<DataItemPub> getReportData(@Param("timeCode") String timeCode, @Param("dateType") String dateType);
+
+    /**
+     * 鎻掑叆鎴栬�呮洿鏂版暟鎹�
+     **/
+    int insertOrUpdateDateItemPub(@Param("list") List<DataItemPub> list);
+
+    /**
+     * 鏌ヨGovReports鐨勬樉绀轰俊鎭垪琛�
+     *
+     * @param dataItemPub GovReports
+     * @return GovReports闆嗗悎
+     */
+    List<DataItemPubVo> selectDataItemPubInfoList(DataItemPub dataItemPub);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/IDataItemPubService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/IDataItemPubService.java
new file mode 100644
index 0000000..b4a4016
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/IDataItemPubService.java
@@ -0,0 +1,84 @@
+package com.dingzhuo.energy.project.govReports.service;
+
+import com.dingzhuo.energy.project.govReports.domain.DataItemPub;
+import com.dingzhuo.energy.project.govReports.domain.DataItemPubVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * GovReportsService鎺ュ彛
+ *
+ * @author zy
+ * @date 2022-04-06
+ */
+public interface IDataItemPubService {
+    /**
+     * 鏌ヨGovReports
+     *
+     * @param indexId GovReportsID
+     * @return GovReports
+     */
+    DataItemPub selectDataItemPubById(String indexId);
+
+    /**
+     * 鏌ヨGovReports鍒楄〃
+     *
+     * @param dataItemPub GovReports
+     * @return GovReports闆嗗悎
+     */
+    List<DataItemPub> selectDataItemPubList(DataItemPub dataItemPub);
+
+    /**
+     * 鏂板GovReports
+     *
+     * @param dataItemPub GovReports
+     * @return 缁撴灉
+     */
+    int insertDataItemPub(DataItemPub dataItemPub);
+
+    /**
+     * 淇敼GovReports
+     *
+     * @param dataItemPub GovReports
+     * @return 缁撴灉
+     */
+    int updateDataItemPub(DataItemPub dataItemPub);
+
+    /**
+     * 鎵归噺鍒犻櫎GovReports
+     *
+     * @param indexIds 闇�瑕佸垹闄ょ殑GovReportsID
+     * @return 缁撴灉
+     */
+    int deleteDataItemPubByIds(String[] indexIds);
+
+    /**
+     * 鍒犻櫎GovReports淇℃伅
+     *
+     * @param indexId GovReportsID
+     * @return 缁撴灉
+     */
+    int deleteDataItemPubById(String indexId);
+
+    /**
+     * 鑾峰彇闇�瑕佸鐞嗙殑鏁版嵁
+     *
+     * @param dateType 鏃ユ湡绫诲瀷 DAY 澶�  MONTH 鏈�
+     * @param timeCode 鏃堕棿缂栫爜
+     **/
+    List<DataItemPub> getReportData(String timeCode, String dateType);
+
+    /**
+     * 鎻掑叆鎴栬�呮洿鏂版暟鎹�
+     **/
+    int insertOrUpdateDateItemPub(List<DataItemPub> list);
+
+    /**
+     * 鏌ヨGovReports鐨勬樉绀轰俊鎭垪琛�
+     *
+     * @param dataItemPub GovReports
+     * @return GovReports闆嗗悎
+     */
+    List<DataItemPubVo> selectDataItemPubInfoList(DataItemPub dataItemPub);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/impl/DataItemPubServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/impl/DataItemPubServiceImpl.java
new file mode 100644
index 0000000..3a68d37
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/govReports/service/impl/DataItemPubServiceImpl.java
@@ -0,0 +1,117 @@
+package com.dingzhuo.energy.project.govReports.service.impl;
+
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.project.govReports.domain.DataItemPubVo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.govReports.mapper.DataItemPubMapper;
+import com.dingzhuo.energy.project.govReports.domain.DataItemPub;
+import com.dingzhuo.energy.project.govReports.service.IDataItemPubService;
+
+/**
+ * GovReportsService涓氬姟灞傚鐞�
+ *
+ * @author zy
+ * @date 2022-04-06
+ */
+@Service
+public class DataItemPubServiceImpl implements IDataItemPubService {
+
+    @Autowired
+    private DataItemPubMapper dataItemPubMapper;
+
+    /**
+     * 鏌ヨGovReports
+     *
+     * @param indexId GovReportsID
+     * @return GovReports
+     */
+    @Override
+    public DataItemPub selectDataItemPubById(String indexId) {
+        return dataItemPubMapper.selectDataItemPubById(indexId);
+    }
+
+    /**
+     * 鏌ヨGovReports鍒楄〃
+     *
+     * @param dataItemPub GovReports
+     * @return GovReports
+     */
+    @Override
+    public List<DataItemPub> selectDataItemPubList(DataItemPub dataItemPub) {
+        return dataItemPubMapper.selectDataItemPubList(dataItemPub);
+    }
+
+    /**
+     * 鏂板GovReports
+     *
+     * @param dataItemPub GovReports
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertDataItemPub(DataItemPub dataItemPub) {
+        dataItemPub.setCreateTime(DateUtils.getNowDate());
+        return dataItemPubMapper.insertDataItemPub(dataItemPub);
+    }
+
+    /**
+     * 淇敼GovReports
+     *
+     * @param dataItemPub GovReports
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateDataItemPub(DataItemPub dataItemPub) {
+        dataItemPub.setUpdateTime(DateUtils.getNowDate());
+        return dataItemPubMapper.updateDataItemPub(dataItemPub);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎GovReports
+     *
+     * @param indexIds 闇�瑕佸垹闄ょ殑GovReportsID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDataItemPubByIds(String[] indexIds) {
+        return dataItemPubMapper.deleteDataItemPubByIds(indexIds);
+    }
+
+    /**
+     * 鍒犻櫎GovReports淇℃伅
+     *
+     * @param indexId GovReportsID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteDataItemPubById(String indexId) {
+        return dataItemPubMapper.deleteDataItemPubById(indexId);
+    }
+
+    @Override
+    public List<DataItemPub> getReportData(String timeCode, String dateType) {
+        return dataItemPubMapper.getReportData(timeCode, dateType);
+    }
+
+    /**
+     * 鎻掑叆鎴栬�呮洿鏂版暟鎹�
+     **/
+    @Override
+    public int insertOrUpdateDateItemPub(List<DataItemPub> list) {
+        return dataItemPubMapper.insertOrUpdateDateItemPub(list);
+    }
+
+    /**
+     * 鏌ヨGovReports鐨勬樉绀轰俊鎭垪琛�
+     *
+     * @param dataItemPub GovReports
+     * @return GovReports
+     */
+    @Override
+    public List<DataItemPubVo> selectDataItemPubInfoList(DataItemPub dataItemPub) {
+        return dataItemPubMapper.selectDataItemPubInfoList(dataItemPub);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/controller/HomeController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/controller/HomeController.java
new file mode 100644
index 0000000..6b9d740
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/controller/HomeController.java
@@ -0,0 +1,104 @@
+package com.dingzhuo.energy.project.home.controller;
+
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.home.domain.vo.*;
+import com.dingzhuo.energy.project.home.service.IHomeService;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.service.ISysDictDataService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+
+/**
+ * 棣栭〉 鎺у埗灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@RestController
+@RequestMapping("/home")
+public class HomeController extends BaseController {
+
+    @Autowired
+    private IHomeService homeService;
+
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @GetMapping("/getHomeEnergyConsumptionSummation")
+    @ApiOperation(value = "棣栭〉鑾峰彇鍏ㄥ巶缁煎悎鑳借��", notes = "棣栭〉鑾峰彇鍏ㄥ巶缁煎悎鑳借��")
+    public AjaxResult getHomeenergyConsumptionSummation() {
+        String code = "Home_Equipment";
+        return AjaxResult.success(homeService.geEnergyConsumptionSummation(code));
+    }
+
+    @GetMapping("/getHomeEnergyConsumptionRatio")
+    @ApiOperation(value = "棣栭〉鑾峰彇缁煎悎鑳借�楀崰姣斿垎鏋�", notes = "棣栭〉鑾峰彇缁煎悎鑳借�楀崰姣斿垎鏋�")
+    public AjaxResult getHomeEnergyConsumptionRatio() {
+        // 鍏ㄥ満缁煎悎鑳借�� code
+        String code = "Home_Equipment";
+        List<HomeEnergyConsumptionRatioVO> ratioList = homeService.getHomeEnergyConsumptionRatio(code);
+        return AjaxResult.success(ratioList);
+    }
+
+    @GetMapping("/getHomeEnergyMonitoring")
+    @ApiOperation(value = "棣栭〉鑾峰彇鑳芥簮鍒嗘椂鐩戞祴", notes = "棣栭〉鑾峰彇鑳芥簮鍒嗘椂鐩戞祴")
+    public AjaxResult getHomeEnergyMonitoring(String energyType) {
+        // 鍒嗙被鑳芥簮缁熻code
+        String code  = "Home_TimeMonitoring";
+        HomeEnergyMonitoringHistogramVO vo = homeService.getHomeEnergyMonitoring(code, energyType);
+        return AjaxResult.success(vo);
+    }
+
+    @GetMapping("/getHomeEnergyStatistic")
+    @ApiOperation(value = "棣栭〉鑾峰彇鍒嗙被鑳芥簮缁熻", notes = "棣栭〉鑾峰彇鍒嗙被鑳芥簮缁熻")
+    public AjaxResult getHomeEnergyStatistic() {
+        // 鍒嗙被鑳芥簮缁熻code
+        String code = "Home_Cumulative";
+        List<HomeEnergyStatisticsVO> voList = homeService.getHomeEnergyStatistic(code);
+        return AjaxResult.success(voList);
+    }
+
+    @GetMapping("/getHomeEnergyUnitConsumptionRatio")
+    @ApiOperation(value = "棣栭〉鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�", notes = "棣栭〉鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�")
+    public AjaxResult getHomeEnergyUnitConsumptionRatio() {
+        String code = "Home_Equipment";
+        List<HomeEnergyUnitConsumptionChartVO> voList = homeService.getHomeEnergyUnitConsumptionRatio(code);
+        return AjaxResult.success(voList);
+    }
+
+    @GetMapping("/listEnergyType")
+    @ApiOperation(value = "棣栭〉鑾峰彇鑳芥簮绫诲瀷", notes = "棣栭〉鑾峰彇鑳芥簮绫诲瀷")
+    public AjaxResult listEnergyType() {
+        String dictType = "energy_type";
+        List<SysDictData> energyTypeList = dictDataService.selectDictDataByType(dictType);
+        List<HomeEnergyTypeVO> voList = new ArrayList<>();
+        if (CollectionUtils.isNotEmpty(energyTypeList)) {
+            voList = energyTypeList.stream().map(data-> {
+                HomeEnergyTypeVO vo = new HomeEnergyTypeVO();
+                vo.setEnergy(data.getDictValue());
+                vo.setEnergyName(data.getDictLabel());
+                return vo;
+            }).sorted(Comparator.comparing(HomeEnergyTypeVO::getEnergy)).collect(Collectors.toList());
+        }
+        return AjaxResult.success(voList);
+    }
+
+
+    @GetMapping("/getHomeOutdoorTemperature")
+    @ApiOperation(value = "棣栭〉鑾峰彇瀹ゅ娓╂箍搴�", notes = "棣栭〉鑾峰彇瀹ゅ娓╂箍搴�")
+    public AjaxResult getHomeOutdoorTemperature() {
+        return AjaxResult.success(homeService.getHomeOutdoorTemperature());
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyConsumptionRatioVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyConsumptionRatioVO.java
new file mode 100644
index 0000000..e655fc0
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyConsumptionRatioVO.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 棣栭〉缁煎悎鑳借�楀崰姣斿垎鏋愯繑鍥� VO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Data
+public class HomeEnergyConsumptionRatioVO {
+
+
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    private String item;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    private String energyType;
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鍚堣鍊�
+     */
+    private BigDecimal count;
+
+    /**
+     * 鍗犳瘮
+     */
+    private BigDecimal percent;
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyCostRatioVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyCostRatioVO.java
new file mode 100644
index 0000000..4fb7484
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyCostRatioVO.java
@@ -0,0 +1,32 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 棣栭〉璐圭敤鍗犳瘮鍒嗘瀽杩斿洖 VO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Data
+public class HomeEnergyCostRatioVO {
+
+
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    private String item;
+
+    /**
+     * 鍚堣鍊�
+     */
+    private BigDecimal count;
+
+    /**
+     * 鍗犳瘮
+     */
+    private BigDecimal percent;
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyDetectionChart.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyDetectionChart.java
new file mode 100644
index 0000000..75f17f2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyDetectionChart.java
@@ -0,0 +1,53 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 鑳芥簮妫�娴嬫煴鐘跺浘淇℃伅
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+public class HomeEnergyDetectionChart {
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鏃堕棿
+     */
+    private String date;
+
+    /**
+     * 鍊�
+     */
+    private BigDecimal value;
+
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public BigDecimal getValue() {
+        return value;
+    }
+
+    public void setValue(BigDecimal value) {
+        this.value = value;
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyMonitoringHistogramVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyMonitoringHistogramVO.java
new file mode 100644
index 0000000..3008170
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyMonitoringHistogramVO.java
@@ -0,0 +1,41 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+import java.util.List;
+
+
+/**
+ * 鑳芥簮鐩戞祴鏌辩姸鍥炬暟鎹� VO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+//@Data
+public class HomeEnergyMonitoringHistogramVO {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鍗曚綅淇℃伅
+     */
+    private String unit;
+
+    /**
+     * 鍥惧舰鏁版嵁
+     */
+    private List<HomeEnergyDetectionChart> chartData;
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public List<HomeEnergyDetectionChart> getChartData() {
+        return chartData;
+    }
+
+    public void setChartData(List<HomeEnergyDetectionChart> chartData) {
+        this.chartData = chartData;
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyStatisticsVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyStatisticsVO.java
new file mode 100644
index 0000000..154e937
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyStatisticsVO.java
@@ -0,0 +1,32 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 棣栭〉鑾峰彇鍒嗙被鑳芥簮缁熻杩斿洖 VO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Data
+public class HomeEnergyStatisticsVO {
+
+
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    private String item;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    private String energyType;
+
+    /**
+     * 鍚堣鍊�
+     */
+    private String count;
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyTypeVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyTypeVO.java
new file mode 100644
index 0000000..a29feec
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyTypeVO.java
@@ -0,0 +1,25 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+
+import lombok.Data;
+
+
+/**
+ * 棣栭〉鑳芥簮绫诲瀷杩斿洖vo
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/2
+ */
+@Data
+public class HomeEnergyTypeVO {
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    private String energy;
+
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    private String energyName;
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyUnitConsumptionChartVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyUnitConsumptionChartVO.java
new file mode 100644
index 0000000..9771f9b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeEnergyUnitConsumptionChartVO.java
@@ -0,0 +1,37 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 棣栭〉鑾峰彇鑳借�楄澶囧崰姣� 杩斿洖 vo
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Data
+public class HomeEnergyUnitConsumptionChartVO {
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鍊�
+     */
+    private BigDecimal value;
+
+    /**
+     * 鍚堣鍊�
+     */
+    private BigDecimal total;
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeOutdoorTemperatureVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeOutdoorTemperatureVO.java
new file mode 100644
index 0000000..7aa6ed7
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/domain/vo/HomeOutdoorTemperatureVO.java
@@ -0,0 +1,23 @@
+package com.dingzhuo.energy.project.home.domain.vo;
+
+
+import lombok.Data;
+
+/**
+ * 棣栭〉瀹ゅ娓╁害杩斿洖 VO
+ */
+@Data
+public class HomeOutdoorTemperatureVO {
+
+
+    /**
+     * 娓╁害
+     */
+    private String temperature = "--";
+
+    /**
+     * 婀垮害
+     */
+    private String humidity = "--";
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/IHomeService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/IHomeService.java
new file mode 100644
index 0000000..0b9a73f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/IHomeService.java
@@ -0,0 +1,63 @@
+package com.dingzhuo.energy.project.home.service;
+
+import com.dingzhuo.energy.project.home.domain.vo.*;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 棣栭〉  鎺ュ彛灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+public interface IHomeService {
+
+    /**
+     * 棣栭〉鑾峰彇鍏ㄥ巶缁煎悎鑳借��
+     *
+     * @return
+     */
+    BigDecimal geEnergyConsumptionSummation(String code);
+
+
+    /**
+     * 棣栭〉鑾峰彇缁煎悎鑳借�楀崰姣斿垎鏋�
+     *
+     * @param code 鏌ヨ缂栧彿
+     * @return
+     */
+    List<HomeEnergyConsumptionRatioVO> getHomeEnergyConsumptionRatio(String code);
+
+    /**
+     * 棣栭〉鑾峰彇鍒嗙被鑳芥簮缁熻
+     *
+     * @param code 鏌ヨ缂栧彿
+     * @return
+     */
+    List<HomeEnergyStatisticsVO> getHomeEnergyStatistic(String code);
+
+    /**
+     * 棣栭〉鑾峰彇鑳芥簮鍒嗘椂鐩戞祴
+     *
+     * @param code       鏌ヨ缂栧彿
+     * @param energyType 鑳芥簮绫诲瀷
+     * @return
+     */
+    HomeEnergyMonitoringHistogramVO getHomeEnergyMonitoring(String code, String energyType);
+
+    /**
+     * 棣栭〉鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�
+     *
+     * @param code 鏌ヨ缂栧彿
+     * @return
+     */
+    List<HomeEnergyUnitConsumptionChartVO> getHomeEnergyUnitConsumptionRatio(String code);
+
+    /**
+     * 棣栭〉鑾峰彇瀹ゅ娓╂箍搴�
+     *
+     * @return 缁撴灉
+     */
+    HomeOutdoorTemperatureVO getHomeOutdoorTemperature();
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/impl/HomeServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/impl/HomeServiceImpl.java
new file mode 100644
index 0000000..75f47a2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/home/service/impl/HomeServiceImpl.java
@@ -0,0 +1,369 @@
+package com.dingzhuo.energy.project.home.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.data.RealtimeDatabaseManager;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.domain.TagValue;
+import com.dingzhuo.energy.project.common.CommonConst;
+import com.dingzhuo.energy.project.dataEntry.service.IDataItemService;
+import com.dingzhuo.energy.project.home.domain.vo.*;
+import com.dingzhuo.energy.project.home.service.IHomeService;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.service.ISysDictDataService;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+
+/**
+ * 棣栭〉   鎺ュ彛瀹炵幇灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Service
+@AllArgsConstructor
+public class HomeServiceImpl implements IHomeService {
+
+
+    private final IDataItemService dataItemService;
+
+    private final IModelNodeService modelNodeService;
+
+    private final ISysDictDataService dictDataService;
+
+    private final IEnergyIndexService energyIndexService;
+
+    private RealtimeDatabaseManager realtimeDatabaseManager;
+
+
+    /**
+     * 棣栭〉鑾峰彇鍏ㄥ巶缁煎悎鑳借��
+     *
+     * @return
+     */
+    @Override
+    public BigDecimal geEnergyConsumptionSummation(String code) {
+        // 鑾峰彇鏌ヨ鏃堕棿
+        String timeCode = TimeManager.getTimeCode(DateUtil.date(), TimeType.DAY);
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲indexId淇℃伅
+        List<String> indexIds = modelNodeService.listIndexIdsByModelCode(code);
+        if (CollectionUtils.isEmpty(indexIds)) {
+            return BigDecimal.ZERO;
+        }
+        // 閫氳繃indexIds鎵綿ata_Item鏁版嵁
+        List<DataItem> itemList = dataItemService.getDataItemInforByIndexIds(timeCode, indexIds);
+        // 杞瑃ce鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_1000);
+        double sum = itemList.stream().mapToDouble(DataItem::getValue).sum();
+        return BigDecimal.valueOf(sum).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 棣栭〉鑾峰彇缁煎悎鑳借�楀崰姣斿垎鏋�
+     *
+     * @param code 鏌ヨ缂栧彿
+     * @return
+     */
+    @Override
+    public List<HomeEnergyConsumptionRatioVO> getHomeEnergyConsumptionRatio(String code) {
+        List<HomeEnergyConsumptionRatioVO> ratioVOList = new ArrayList<>();
+        // 鏌ヨ瀛楀吀鑾峰彇鎵�鏈夎兘婧愬悕瀛�
+        List<SysDictData> energyTypeDictist = dictDataService.selectDictDataByType("energy_type");
+        energyTypeDictist.forEach(energyType -> {
+            HomeEnergyConsumptionRatioVO ratioVO = new HomeEnergyConsumptionRatioVO();
+            ratioVO.setItem(energyType.getDictLabel());
+            ratioVO.setEnergyType(energyType.getDictValue());
+            ratioVOList.add(ratioVO);
+        });
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<String> indexIds = modelNodeService.listIndexIdsByModelCode(code);
+        if (CollectionUtils.isEmpty(indexIds)) {
+            return ratioVOList;
+        }
+        // 鑾峰彇鏌ヨ鏃堕棿
+        String timeCode = TimeManager.getTimeCode(DateUtil.date(), TimeType.DAY);
+        // 閫氳繃indexIds鎵綿ata_Item鏁版嵁
+        List<DataItem> itemList = dataItemService.getDataItemInforByIndexIds(timeCode, indexIds);
+        // 杞瑃ce鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_1000);
+        // 鎬诲悎璁″��
+        double sum = itemList.stream().mapToDouble(DataItem::getValue).sum();
+        BigDecimal totalValue = BigDecimal.valueOf(sum).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+        // 鏌ヨ鐐逛綅璇︾粏淇℃伅
+        List<EnergyIndex> energyIndexInforList = energyIndexService.getEnergyIndexByIds(indexIds);
+        // 鑾峰彇鐐逛綅鑳芥簮绫诲瀷
+        Map<String, List<String>> energyTypeMap = energyIndexInforList.stream()
+                .filter(l -> StringUtils.isNotEmpty(l.getEnergyId()))
+                .collect(Collectors.groupingBy(
+                        EnergyIndex::getEnergyId, Collectors.mapping(EnergyIndex::getIndexId, Collectors.toList())
+                ));
+        AtomicReference<BigDecimal> totalRatio = new AtomicReference<>(BigDecimal.ZERO);
+        for (HomeEnergyConsumptionRatioVO ratioVO : ratioVOList) {
+            List<String> indexs = energyTypeMap.get(ratioVO.getEnergyType());
+            ratioVO.setUnit("tce");
+            if (CollectionUtils.isEmpty(indexs)) {
+                continue;
+            }
+            // 鎵惧埌鍚堣鍊�
+            double doubleCount = itemList.stream().filter(li -> indexs.contains(li.getIndexId())).mapToDouble(DataItem::getValue).sum();
+            BigDecimal count = BigDecimal.valueOf(doubleCount).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            BigDecimal ratio = BigDecimal.ZERO;
+            if (totalValue.compareTo(BigDecimal.ZERO) != 0 || count.compareTo(BigDecimal.ZERO) != 0) {
+                // 璁$畻姣斾緥
+                ratio = count.divide(totalValue, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+                // 瓒呰繃1鍒欑敤1鍓帀
+                if (totalRatio.get().add(ratio).compareTo(BigDecimal.ONE) > 0) {
+                    ratio = BigDecimal.ONE.subtract(totalRatio.get());
+                }
+            }
+            ratioVO.setCount(count);
+            ratioVO.setPercent(ratio);
+            totalRatio.set(totalRatio.get().add(ratio));
+        }
+        return ratioVOList;
+    }
+
+    /**
+     * 棣栭〉鑾峰彇鍒嗙被鑳芥簮缁熻
+     *
+     * @param code 鏌ヨ缂栧彿
+     * @return
+     */
+    @Override
+    public List<HomeEnergyStatisticsVO> getHomeEnergyStatistic(String code) {
+        List<HomeEnergyStatisticsVO> voList;
+        // 鏌ヨ瀛楀吀鑾峰彇鎵�鏈夎兘婧愬悕瀛�
+        List<SysDictData> energyTypeDictist = dictDataService.selectDictDataByType("energy_type");
+        voList = energyTypeDictist.stream().map(dict -> {
+            HomeEnergyStatisticsVO vo = new HomeEnergyStatisticsVO();
+            vo.setItem(dict.getDictLabel());
+            vo.setEnergyType(dict.getDictValue());
+            return vo;
+        }).sorted(Comparator.comparing(HomeEnergyStatisticsVO::getEnergyType)).collect(Collectors.toList());
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(code);
+        if (ObjectUtils.isEmpty(modelNode)) {
+            return voList;
+        }
+        List<ModelNodeIndexInfor> inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(modelNode.getNodeId());
+        List<String> indexIds = inforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        // 鑾峰彇鏌ヨ鏃堕棿
+        Date beginTime = DateUtil.beginOfDay(DateUtil.date());
+        Date endTime = DateUtil.endOfDay(beginTime);
+        // 閫氳繃indexIds鎵綿ata_Item鏁版嵁
+        List<DataItem> itemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds);
+        // 鏌ヨ鐐逛綅璇︾粏淇℃伅
+        List<EnergyIndex> energyIndexInforList = energyIndexService.getEnergyIndexByIds(indexIds);
+        // 鑾峰彇鐐逛綅鑳芥簮绫诲瀷
+        Map<String, List<String>> energyTypeMap = energyIndexInforList.stream()
+                .filter(l -> StringUtils.isNotEmpty(l.getEnergyId())).collect(Collectors.groupingBy(
+                        EnergyIndex::getEnergyId, Collectors.mapping(EnergyIndex::getIndexId, Collectors.toList())
+                ));
+        for (HomeEnergyStatisticsVO vo : voList) {
+            List<String> value = energyTypeMap.get(vo.getEnergyType());
+            if (CollectionUtils.isEmpty(value)) {
+                continue;
+            }
+            // 鎵惧埌鍚堣鍊�
+            double doubleCount = itemList.stream().filter(li -> value.contains(li.getIndexId())).mapToDouble(DataItem::getValue).sum();
+
+            BigDecimal count = BigDecimal.valueOf(doubleCount).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            switch (vo.getEnergyType()) {
+                case "electric":
+                    vo.setCount(count + "KWh");
+                    break;
+//                case "water":
+                default:
+                    vo.setCount(count + "m鲁");
+                    break;
+            }
+        }
+        return voList;
+    }
+
+    /**
+     * 棣栭〉鑾峰彇鑳芥簮鍒嗘椂鐩戞祴
+     *
+     * @param code       鏌ヨ缂栧彿
+     * @param energyType 鑳芥簮绫诲瀷
+     * @return
+     */
+    @Override
+    public HomeEnergyMonitoringHistogramVO getHomeEnergyMonitoring(String code, String energyType) {
+        HomeEnergyMonitoringHistogramVO vo = new HomeEnergyMonitoringHistogramVO();
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<String> indexIds = modelNodeService.listIndexIdsByModelCode(code);
+        if (CollectionUtils.isEmpty(indexIds)) {
+            return vo;
+        }
+        // 鏌ヨ鐐逛綅璇︾粏淇℃伅
+        List<EnergyIndex> energyIndexInforList = energyIndexService.getEnergyIndexByIds(indexIds);
+        if (StringUtils.isNotEmpty(energyType)) {
+            energyIndexInforList = energyIndexInforList.stream().filter(li -> energyType.equals(li.getEnergyId()))
+                    .collect(Collectors.toList());
+            indexIds = energyIndexInforList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(indexIds)) {
+                return vo;
+            }
+        }
+        Optional<EnergyIndex> first = energyIndexInforList.stream().filter(li -> StringUtils.isNotEmpty(li.getUnitId()))
+                .findFirst();
+        first.ifPresent(energyIndex -> vo.setUnit(energyIndex.getUnitId()));
+        // 鑾峰彇鏌ヨ鏃堕棿
+        DateTime beginTime = DateUtil.beginOfDay(DateUtil.date());
+        DateTime endTime = DateUtil.endOfDay(beginTime);
+        // 瀵规瘮鏌ヨ鏃堕棿
+        DateTime lastBeginTime = DateUtil.offsetDay(beginTime, -1);
+        DateTime lastEndTime = DateUtil.offsetDay(endTime, -1);
+        // 閫氳繃indexIds鎵綿ata_Item鏁版嵁
+        String timeType = TimeType.HOUR.name();
+        List<DataItem> itemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, timeType, indexIds);
+        List<DataItem> lastItemList = dataItemService.getDataItemHourInforByIndexIds(lastBeginTime, lastEndTime, timeType, indexIds);
+        // 鎸夋椂闂村垎缁�
+        Map<String, List<DataItem>> timeValueMap = new HashMap<>();
+        Map<String, List<DataItem>> lastTimeValueMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(itemList)) {
+            timeValueMap = itemList.stream().collect(Collectors.groupingBy(li -> DateUtil.format(li.getDataTime(), "yyyy-MM-dd HH")));
+        }
+        if (CollectionUtils.isNotEmpty(lastItemList)) {
+            lastTimeValueMap = lastItemList.stream().collect(Collectors.groupingBy(li -> DateUtil.format(li.getDataTime(), "yyyy-MM-dd HH")));
+        }
+        List<HomeEnergyDetectionChart> chartList = new ArrayList<>();
+        // 閬嶅巻鐢熸垚淇℃伅
+        while (beginTime.isBefore(endTime)) {
+            HomeEnergyDetectionChart chart = new HomeEnergyDetectionChart();
+            String name = DateUtil.formatDate(beginTime);
+            chart.setName(name);
+            String date = DateUtil.format(beginTime, "HH:mm");
+            chart.setDate(date);
+            String format = DateUtil.format(beginTime, "yyyy-MM-dd HH");
+            // 姹傚拰
+            BigDecimal total = BigDecimal.ZERO;
+            List<DataItem> dataItemList = timeValueMap.get(format);
+            if (CollectionUtils.isNotEmpty(dataItemList)) {
+                total = BigDecimal.valueOf(dataItemList.stream().mapToDouble(DataItem::getValue).sum());
+            }
+            chart.setValue(total.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            // 瀵规瘮鍊�
+            HomeEnergyDetectionChart lastChart = new HomeEnergyDetectionChart();
+            String lastName = DateUtil.formatDate(lastBeginTime);
+            lastChart.setName(lastName);
+            String lastDate = DateUtil.format(lastBeginTime, "HH:mm");
+            lastChart.setDate(lastDate);
+            // 姹傚拰
+            String lastFormat = DateUtil.format(lastBeginTime, "yyyy-MM-dd HH");
+            BigDecimal lastTotal = BigDecimal.ZERO;
+            List<DataItem> lastDataItemList = lastTimeValueMap.get(lastFormat);
+            if (CollectionUtils.isNotEmpty(lastDataItemList)) {
+                lastTotal = BigDecimal.valueOf(lastDataItemList.stream().mapToDouble(DataItem::getValue).sum());
+            }
+            lastChart.setValue(lastTotal.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            chartList.add(chart);
+            chartList.add(lastChart);
+            beginTime = DateUtil.offsetHour(beginTime, 1);
+            lastBeginTime = DateUtil.offsetHour(lastBeginTime, 1);
+        }
+        vo.setChartData(chartList);
+        return vo;
+    }
+
+    /**
+     * 棣栭〉鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�
+     *
+     * @param code 鏌ヨ缂栧彿
+     * @return
+     */
+    @Override
+    public List<HomeEnergyUnitConsumptionChartVO> getHomeEnergyUnitConsumptionRatio(String code) {
+        List<HomeEnergyUnitConsumptionChartVO> chartVOList = new ArrayList<>();
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<ModelNodeIndexInfor> inforList = modelNodeService.getModelNodeIndexIdRelationInforByCode(code);
+        if (CollectionUtils.isEmpty(inforList)) {
+            return chartVOList;
+        }
+        // 鑾峰彇鏃堕棿缂栫爜
+        String timeCode = TimeManager.getTimeCode(DateUtil.date(), TimeType.DAY);
+        List<String> indexIds = inforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        // 杞瑃ce鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_1000);
+        // 鏍规嵁鐐逛綅id鏌ヨdataitem
+        List<DataItem> dataItemList = dataItemService.getDataItemInforByIndexIds(timeCode, indexIds);
+        // 鍚堣鍊�
+        double totalSum = dataItemList.stream().mapToDouble(DataItem::getValue).sum();
+        BigDecimal totalValue = BigDecimal.valueOf(totalSum).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+        // 鏍规嵁鐢ㄨ兘鍗曞厓id鍒嗙粍
+        Map<String, List<ModelNodeIndexInfor>> nodeMap = inforList.stream().collect(Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
+        nodeMap.forEach((key, value) -> {
+            HomeEnergyUnitConsumptionChartVO chartVO = new HomeEnergyUnitConsumptionChartVO();
+            // 璁剧疆鍚嶅瓧
+            Optional<ModelNodeIndexInfor> first = value.stream().findFirst();
+            first.ifPresent(modelNodeIndexInfor -> chartVO.setName(modelNodeIndexInfor.getName()));
+            // 璁剧疆褰撳墠鍊�
+            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            double sum = dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())).mapToDouble(DataItem::getValue).sum();
+            BigDecimal energyValue = BigDecimal.valueOf(sum).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            chartVO.setValue(energyValue);
+            chartVO.setUnit("tce");
+            // 璁剧疆鍚堣鍊�
+            chartVO.setTotal(totalValue);
+            chartVOList.add(chartVO);
+        });
+        return chartVOList;
+    }
+
+    /**
+     * 棣栭〉鑾峰彇瀹ゅ娓╂箍搴�
+     *
+     * @return 缁撴灉
+     */
+    @Override
+    public HomeOutdoorTemperatureVO getHomeOutdoorTemperature() {
+
+        HomeOutdoorTemperatureVO outdoorTemperatureVO = new HomeOutdoorTemperatureVO();
+
+        String code = "Outside_Temperature";
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<ModelNodeIndexInfor> infoList = modelNodeService.getModelNodeIndexIdRelationInforByCode(code);
+        if (CollectionUtils.isEmpty(infoList)) {
+            return outdoorTemperatureVO;
+        }
+
+        List<String> indexIds = infoList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+
+        List<EnergyIndex> energyIndexList = energyIndexService.selectEnergyIndexByIds(indexIds);
+        List<String> codeList = energyIndexList.stream().map(EnergyIndex::getCode).collect(Collectors.toList());
+
+        List<TagValue> tagValueList = realtimeDatabaseManager.retrieve(codeList);
+
+        if (CollectionUtils.isNotEmpty(tagValueList)) {
+            for (TagValue tagValue : tagValueList) {
+                double value = tagValue.getValue() * 0.1;
+                if (tagValue.getTagCode().endsWith("SD")) {
+                    outdoorTemperatureVO.setHumidity(String.format("%.2f",value) + CommonConst.PERCENTAGE);
+                } else {
+                    outdoorTemperatureVO.setTemperature(String.format("%.2f",value) + CommonConst.UNIT_TEMPERATURE);
+                }
+            }
+        }
+
+        return outdoorTemperatureVO;
+    }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/dailyKeyEquipmenteController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/dailyKeyEquipmenteController.java
new file mode 100644
index 0000000..586f1c1
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/dailyKeyEquipmenteController.java
@@ -0,0 +1,122 @@
+package com.dingzhuo.energy.project.keyEquipment.controller;
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.keyEquipment.domain.dailyKeyEquipment;
+import com.dingzhuo.energy.project.keyEquipment.service.IdailyKeyEquipmentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏃�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+@RestController
+@RequestMapping("/keyEquipment/dailyKeyEquipment")
+@Api(value = "閲嶇偣璁惧鑳借�楃粺璁★紙鏃ワ級",tags = {"璁惧鍗曡�楀垎鏋�"})
+public class dailyKeyEquipmenteController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IdailyKeyEquipmentService dailykeyEquipment;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "閲嶇偣璁惧鑳借�楀垎鏋愶紙鏃ワ級鍒楄〃")
+    public TableDataInfo list(DataItem dataItem) throws ParseException {
+        List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+        if(CollectionUtils.isEmpty(nodeId)){
+            return getDataTable(new ArrayList<>());
+        }
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+        if(CollectionUtils.isEmpty(energyList)){
+            return getDataTable(new ArrayList<>());
+        }
+        List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<dailyKeyEquipment> dataList=new ArrayList<>();
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String bb="";
+        int i = 0;
+        dataItem.setBeginTime(dataItem.getDataTime());
+        String endTime=aa+" 24:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        while (i < 24) {
+            if(i>9){
+                bb=aa+" "+i+":00:00";
+            }else{
+                bb=aa+" 0"+i+":00:00";
+            }
+            dailyKeyEquipment report=new dailyKeyEquipment();
+            report.setDataTime(sf.parse(bb));
+            report.setValue("value"+i);
+            dataList.add(report);
+            i++;
+        };
+        startPage();
+        List<dailyKeyEquipment> list = dailykeyEquipment.getdailyKeyEquipmentList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        //return AjaxResult.success(list);
+        return getDataTable(list);
+    }
+
+    @GetMapping("/listChart")
+    @ApiOperation(value = "閲嶇偣璁惧鑳借�楀垎鏋愶紙鏃ワ級鍥捐〃")
+    public AjaxResult listChart(DataItem dataItem) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        dataItem.setBeginTime(dataItem.getDataTime());
+        String endTime=aa+" 24:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        List<dailyKeyEquipment> list = dailykeyEquipment.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+    /*鎵�鏈夎澶�*/
+    @GetMapping("/getFacilityArchives")
+    @ApiOperation(value = "鏌ヨ鎵�鏈夎澶囧垪琛�")
+    public AjaxResult getFacilityArchives() {
+        try {
+            List<FacilityArchives> list=dailykeyEquipment.getFacilityArchives();
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇璁惧鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鏍囬鍑洪敊!");
+        }
+    }
+
+    /**
+     * 閲嶇偣鑳借�楄澶�
+     * @return
+     */
+    @GetMapping("/getPointFacility")
+    @ApiOperation(value = "鏌ヨ閲嶇偣璁惧鍒楄〃")
+    public AjaxResult getPointFacility() {
+        try {
+            List<FacilityArchives> list=dailykeyEquipment.getPointFacility();
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇璁惧鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鏍囬鍑洪敊!");
+        }
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/monthlyKeyEquipmentController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/monthlyKeyEquipmentController.java
new file mode 100644
index 0000000..1db350b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/monthlyKeyEquipmentController.java
@@ -0,0 +1,133 @@
+package com.dingzhuo.energy.project.keyEquipment.controller;
+
+import com.dingzhuo.energy.common.constant.HttpStatus;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.keyEquipment.domain.monthlyKeyEquipment;
+import com.dingzhuo.energy.project.keyEquipment.service.ImonthlyKeyEquipmentService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏈�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+@RestController
+@RequestMapping("/keyEquipment/monthlyKeyEquipment")
+@Api(value = "閲嶇偣璁惧鑳借�楃粺璁★紙鏈堬級",tags = {"璁惧鍗曡�楀垎鏋�"})
+public class monthlyKeyEquipmentController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private ImonthlyKeyEquipmentService monthlyKeyEquipment;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "閲嶇偣璁惧鑳借�楃粺璁★紙鏈堬級鍒楄〃")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+            List<monthlyKeyEquipment> dataList=new ArrayList<>();
+
+            Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            String beginTime=aa+"-01 00:00:00";
+            dataItem.setBeginTime(sf.parse(beginTime));
+            String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i <= Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))) {
+                if(i>9){
+                    bb=aa+"-"+i+" 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+" 00:00:00";
+                }
+                monthlyKeyEquipment report=new monthlyKeyEquipment();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                tableColumn.put("value"+i,String.valueOf(i)+"鏃�");
+                i++;
+            }
+            List<Map> table=new ArrayList<>();
+            monthlyKeyEquipment reportList =new  monthlyKeyEquipment();
+            table.add(tableColumn);
+            reportList.setTablehead(table);
+            List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+            if(CollectionUtils.isEmpty(nodeId)){
+                return AjaxResult.success(reportList);
+            }
+            List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+            if(CollectionUtils.isEmpty(energyList)){
+                return AjaxResult.success(reportList);
+            }
+            List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+
+            startPage();
+            List<monthlyKeyEquipment> list = monthlyKeyEquipment.getMonthlyKeyEquipmentList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            int count=Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2));
+            list.forEach(monthlyReport -> monthlyReport.setCount(count));
+            reportList.setTabledata(list);
+            reportList.setTotal(new PageInfo(list).getTotal());
+
+            return AjaxResult.success(reportList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    @GetMapping("/listChart")
+    @ApiOperation(value = "閲嶇偣璁惧鑳借�楃粺璁★紙鏈堬級鍥捐〃")
+    public AjaxResult listChart(DataItem dataItem) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String beginTime=aa+"-01 00:00:00";
+        dataItem.setBeginTime(sf.parse(beginTime));
+        String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        List<monthlyKeyEquipment> list = monthlyKeyEquipment.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+    public static String getLastDayOfMonth(String yearMonth) {
+        int year = Integer.parseInt(yearMonth.split("-")[0]);  //骞�
+        int month = Integer.parseInt(yearMonth.split("-")[1]); //鏈�
+        Calendar cal = Calendar.getInstance();
+        // 璁剧疆骞翠唤
+        cal.set(Calendar.YEAR, year);
+        // 璁剧疆鏈堜唤
+        // cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.MONTH, month); //璁剧疆褰撳墠鏈堢殑涓婁竴涓湀
+        // 鑾峰彇鏌愭湀鏈�澶уぉ鏁�
+        //int lastDay = cal.getActualMaximum(Calendar.DATE);
+        int lastDay = cal.getMinimum(Calendar.DATE); //鑾峰彇鏈堜唤涓殑鏈�灏忓�硷紝鍗崇涓�澶�
+        // 璁剧疆鏃ュ巻涓湀浠界殑鏈�澶уぉ鏁�
+        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //涓婃湀鐨勭涓�澶╁噺鍘�1灏辨槸褰撴湀鐨勬渶鍚庝竴澶�
+        // 鏍煎紡鍖栨棩鏈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(cal.getTime());
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/yearKeyEquipmentController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/yearKeyEquipmentController.java
new file mode 100644
index 0000000..6ffaf85
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/controller/yearKeyEquipmentController.java
@@ -0,0 +1,84 @@
+package com.dingzhuo.energy.project.keyEquipment.controller;
+
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.keyEquipment.domain.yearKeyEquipment;
+import com.dingzhuo.energy.project.keyEquipment.service.IyearKeyEquipmentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 骞�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+@RestController
+@RequestMapping("/keyEquipment/yearKeyEquipment")
+@Api(value = "閲嶇偣璁惧鑳借�楃粺璁★紙骞达級",tags = {"璁惧鍗曡�楀垎鏋�"})
+public class yearKeyEquipmentController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IyearKeyEquipmentService yearKeyEquipment;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "閲嶇偣璁惧鑳借�楃粺璁★紙骞达級鍒楄〃")
+    public TableDataInfo list(DataItem dataItem) throws ParseException {
+        List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+        if(CollectionUtils.isEmpty(nodeId)){
+            return getDataTable(new ArrayList<>());
+        }
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+        if(CollectionUtils.isEmpty(energyList)){
+            return getDataTable(new ArrayList<>());
+        }
+        List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<yearKeyEquipment> dataList=new ArrayList<>();
+        DateFormat df = new SimpleDateFormat("yyyy");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getBeginTime());
+        String bb="";
+        int i = 1;
+        while (i <= 12) {
+            if(i>9){
+                bb=aa+"-"+i+"-01 00:00:00";
+            }else{
+                bb=aa+"-0"+i+"-01 00:00:00";
+            }
+            yearKeyEquipment report=new yearKeyEquipment();
+            report.setDataTime(sf.parse(bb));
+            report.setValue("value"+i);
+            dataList.add(report);
+            i++;
+        }
+        startPage();
+        List<yearKeyEquipment> list = yearKeyEquipment.getYearKeyEquipmentList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return getDataTable(list);
+    }
+
+    @GetMapping("/listChart")
+    @ApiOperation(value = "閲嶇偣璁惧鑳借�楃粺璁★紙骞达級鍥捐〃")
+    public AjaxResult listChart(DataItem dataItem){
+        List<yearKeyEquipment> list = yearKeyEquipment.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/dailyKeyEquipment.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/dailyKeyEquipment.java
new file mode 100644
index 0000000..19e4d27
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/dailyKeyEquipment.java
@@ -0,0 +1,323 @@
+package com.dingzhuo.energy.project.keyEquipment.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏃�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public class dailyKeyEquipment implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String timeCode;
+    private String unitId;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    @Excel(name = "0鏃�")
+    private Double value0;
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue0() {
+        return value0;
+    }
+
+    public void setValue0(Double value0) {
+        this.value0 = value0;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/monthlyKeyEquipment.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/monthlyKeyEquipment.java
new file mode 100644
index 0000000..705bd5f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/monthlyKeyEquipment.java
@@ -0,0 +1,427 @@
+package com.dingzhuo.energy.project.keyEquipment.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏈�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public class monthlyKeyEquipment implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String timeCode;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    @Excel(name = "24鏃�")
+    private Double value24;
+    @Excel(name = "25鏃�")
+    private Double value25;
+    @Excel(name = "26鏃�")
+    private Double value26;
+    @Excel(name = "27鏃�")
+    private Double value27;
+    @Excel(name = "28鏃�")
+    private Double value28;
+    @Excel(name = "29鏃�")
+    private Double value29;
+    @Excel(name = "30鏃�")
+    private Double value30;
+    @Excel(name = "31鏃�")
+    private Double value31;
+    private Integer count;
+    private String unitId;
+    /** 鎬昏褰曟暟 */
+    private long total;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<monthlyKeyEquipment> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue24() {
+        return value24;
+    }
+
+    public void setValue24(Double value24) {
+        this.value24 = value24;
+    }
+
+    public Double getValue25() {
+        return value25;
+    }
+
+    public void setValue25(Double value25) {
+        this.value25 = value25;
+    }
+
+    public Double getValue26() {
+        return value26;
+    }
+
+    public void setValue26(Double value26) {
+        this.value26 = value26;
+    }
+
+    public Double getValue27() {
+        return value27;
+    }
+
+    public void setValue27(Double value27) {
+        this.value27 = value27;
+    }
+
+    public Double getValue28() {
+        return value28;
+    }
+
+    public void setValue28(Double value28) {
+        this.value28 = value28;
+    }
+
+    public Double getValue29() {
+        return value29;
+    }
+
+    public void setValue29(Double value29) {
+        this.value29 = value29;
+    }
+
+    public Double getValue30() {
+        return value30;
+    }
+
+    public void setValue30(Double value30) {
+        this.value30 = value30;
+    }
+
+    public Double getValue31() {
+        return value31;
+    }
+
+    public void setValue31(Double value31) {
+        this.value31 = value31;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<monthlyKeyEquipment> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<monthlyKeyEquipment> tabledata) {
+        this.tabledata = tabledata;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+    public long getTotal() {
+        return total;
+    }
+
+    public void setTotal(long total) {
+        this.total = total;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/yearKeyEquipment.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/yearKeyEquipment.java
new file mode 100644
index 0000000..f0ce2f2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/domain/yearKeyEquipment.java
@@ -0,0 +1,201 @@
+package com.dingzhuo.energy.project.keyEquipment.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 骞�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public class yearKeyEquipment implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "1鏈�")
+    private Double value1;
+    @Excel(name = "2鏈�")
+    private Double value2;
+    @Excel(name = "3鏈�")
+    private Double value3;
+    @Excel(name = "4鏈�")
+    private Double value4;
+    @Excel(name = "5鏈�")
+    private Double value5;
+    @Excel(name = "6鏈�")
+    private Double value6;
+    @Excel(name = "7鏈�")
+    private Double value7;
+    @Excel(name = "8鏈�")
+    private Double value8;
+    @Excel(name = "9鏈�")
+    private Double value9;
+    @Excel(name = "10鏈�")
+    private Double value10;
+    @Excel(name = "11鏈�")
+    private Double value11;
+    @Excel(name = "12鏈�")
+    private Double value12;
+    private String timeCode;
+    private  String unitId;
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/dailyKeyEquipmentMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/dailyKeyEquipmentMapper.java
new file mode 100644
index 0000000..54b037f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/dailyKeyEquipmentMapper.java
@@ -0,0 +1,31 @@
+package com.dingzhuo.energy.project.keyEquipment.mapper;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.dailyKeyEquipment;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏃�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public interface dailyKeyEquipmentMapper {
+    public List<dailyKeyEquipment> getdailyKeyEquipmentList(@Param("indexIds") List<String> indexIds,
+                                                            @Param("dataList") List<dailyKeyEquipment> dataList,
+                                                            @Param("beginTime") Date beginTime,
+                                                            @Param("endTime") Date endTime,
+                                                            @Param("timeType") TimeType timeType,
+                                                            @Param("indexStorageId") String indexStorageId);
+    List<dailyKeyEquipment> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId")  String indexStorageId);
+    List<FacilityArchives> getFacilityArchives();
+    List<FacilityArchives> getPointFacility();
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/monthlyKeyEquipmentMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/monthlyKeyEquipmentMapper.java
new file mode 100644
index 0000000..05ea1f7
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/monthlyKeyEquipmentMapper.java
@@ -0,0 +1,29 @@
+package com.dingzhuo.energy.project.keyEquipment.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.monthlyKeyEquipment;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏈�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public interface monthlyKeyEquipmentMapper {
+    public List<monthlyKeyEquipment> getMonthlyKeyEquipmentList(@Param("indexIds") List<String> indexIds,
+                                                                    @Param("dataList") List<monthlyKeyEquipment> dataList,
+                                                                    @Param("beginTime") Date beginTime,
+                                                                    @Param("endTime") Date endTime,
+                                                                    @Param("timeType") TimeType timeType,
+                                                                    @Param("indexStorageId") String indexStorageId);
+    List<monthlyKeyEquipment> getListChart(@Param("indexId") String indexId,
+                                               @Param("beginTime") Date beginTime,
+                                               @Param("endTime") Date endTime,
+                                               @Param("timeType") TimeType timeType,
+                                               @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/yearKeyEquipmentMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/yearKeyEquipmentMapper.java
new file mode 100644
index 0000000..102d279
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/mapper/yearKeyEquipmentMapper.java
@@ -0,0 +1,29 @@
+package com.dingzhuo.energy.project.keyEquipment.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.yearKeyEquipment;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 骞�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public interface yearKeyEquipmentMapper {
+    public List<yearKeyEquipment> getYearKeyEquipmentList(@Param("indexIds") List<String> indexIds,
+                                                              @Param("dataList") List<yearKeyEquipment> dataList,
+                                                              @Param("beginTime") Date beginTime,
+                                                              @Param("endTime") Date endTime,
+                                                              @Param("timeType") TimeType timeType,
+                                                              @Param("indexStorageId") String indexStorageId);
+    List<yearKeyEquipment> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IdailyKeyEquipmentService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IdailyKeyEquipmentService.java
new file mode 100644
index 0000000..2d768be
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IdailyKeyEquipmentService.java
@@ -0,0 +1,21 @@
+package com.dingzhuo.energy.project.keyEquipment.service;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.dailyKeyEquipment;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏃�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public interface IdailyKeyEquipmentService {
+    public List<dailyKeyEquipment> getdailyKeyEquipmentList(List<String> indexIds, List<dailyKeyEquipment> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    public List<dailyKeyEquipment> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    public List<FacilityArchives> getFacilityArchives();
+    public List<FacilityArchives> getPointFacility();
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/ImonthlyKeyEquipmentService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/ImonthlyKeyEquipmentService.java
new file mode 100644
index 0000000..e8404da
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/ImonthlyKeyEquipmentService.java
@@ -0,0 +1,19 @@
+package com.dingzhuo.energy.project.keyEquipment.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.monthlyKeyEquipment;
+
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏈�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public interface ImonthlyKeyEquipmentService {
+    public List<monthlyKeyEquipment> getMonthlyKeyEquipmentList(List<String> indexIds, List<monthlyKeyEquipment> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    List<monthlyKeyEquipment> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IyearKeyEquipmentService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IyearKeyEquipmentService.java
new file mode 100644
index 0000000..0f9f0de
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/IyearKeyEquipmentService.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.project.keyEquipment.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.yearKeyEquipment;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 骞�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+public interface IyearKeyEquipmentService {
+    public List<yearKeyEquipment> getYearKeyEquipmentList(List<String> indexIds, List<yearKeyEquipment> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    List<yearKeyEquipment> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/dailyKeyEquipmentServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/dailyKeyEquipmentServiceImpl.java
new file mode 100644
index 0000000..ca4a796
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/dailyKeyEquipmentServiceImpl.java
@@ -0,0 +1,48 @@
+package com.dingzhuo.energy.project.keyEquipment.service.impl;
+
+import com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.dailyKeyEquipment;
+import com.dingzhuo.energy.project.keyEquipment.mapper.dailyKeyEquipmentMapper;
+import com.dingzhuo.energy.project.keyEquipment.service.IdailyKeyEquipmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏃�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+@Service
+public class dailyKeyEquipmentServiceImpl implements IdailyKeyEquipmentService {
+    @Autowired
+    private dailyKeyEquipmentMapper dailyMapper;
+
+    @Override
+    public List<dailyKeyEquipment> getdailyKeyEquipmentList(List<String> indexIds, List<dailyKeyEquipment> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return dailyMapper.getdailyKeyEquipmentList(indexIds, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<dailyKeyEquipment> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return dailyMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<FacilityArchives> getFacilityArchives() {
+        return dailyMapper.getFacilityArchives();
+    }
+    @Override
+    public List<FacilityArchives> getPointFacility() {
+        return dailyMapper.getPointFacility();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/monthlyKeyEquipmentServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/monthlyKeyEquipmentServiceImpl.java
new file mode 100644
index 0000000..aefc5a2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/monthlyKeyEquipmentServiceImpl.java
@@ -0,0 +1,39 @@
+package com.dingzhuo.energy.project.keyEquipment.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.monthlyKeyEquipment;
+import com.dingzhuo.energy.project.keyEquipment.mapper.monthlyKeyEquipmentMapper;
+import com.dingzhuo.energy.project.keyEquipment.service.ImonthlyKeyEquipmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 鏈�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+@Service
+public class monthlyKeyEquipmentServiceImpl implements ImonthlyKeyEquipmentService {
+    @Autowired
+    private monthlyKeyEquipmentMapper monthMapper;
+
+    public List<monthlyKeyEquipment> getMonthlyKeyEquipmentList(List<String> indexIds, List<monthlyKeyEquipment> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return monthMapper.getMonthlyKeyEquipmentList(indexIds, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<monthlyKeyEquipment> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return monthMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/yearKeyEquipmentServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/yearKeyEquipmentServiceImpl.java
new file mode 100644
index 0000000..199ff68
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/keyEquipment/service/impl/yearKeyEquipmentServiceImpl.java
@@ -0,0 +1,38 @@
+package com.dingzhuo.energy.project.keyEquipment.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.keyEquipment.domain.yearKeyEquipment;
+import com.dingzhuo.energy.project.keyEquipment.mapper.yearKeyEquipmentMapper;
+import com.dingzhuo.energy.project.keyEquipment.service.IyearKeyEquipmentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *閲嶇偣璁惧鑳借�楃粺璁� 骞�
+ *
+ * @author sys
+ * @date 2021-01-11
+ */
+@Service
+public class yearKeyEquipmentServiceImpl implements IyearKeyEquipmentService {
+    @Autowired
+    private yearKeyEquipmentMapper yearMapper;
+
+    public List<yearKeyEquipment> getYearKeyEquipmentList(List<String> indexIds, List<yearKeyEquipment> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return yearMapper.getYearKeyEquipmentList(indexIds, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<yearKeyEquipment> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return yearMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlanEnergyController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlanEnergyController.java
new file mode 100644
index 0000000..8d6cfc6
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlanEnergyController.java
@@ -0,0 +1,89 @@
+package com.dingzhuo.energy.project.plannedOutput.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlanEnergy;
+import com.dingzhuo.energy.project.plannedOutput.service.IPlanEnergyService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慍ontroller
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+@RestController
+@RequestMapping("/PlanEnergy")
+public class PlanEnergyController extends BaseController {
+    @Autowired
+    private IPlanEnergyService planEnergyService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    /**
+     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('system:energy:list')")
+    @GetMapping("/list")
+    public AjaxResult list(PlanEnergy planEnergy)
+    {
+
+        List<SysProduct> productList= modelNodeService.getSettingProduct(planEnergy.getIndexCode());
+        List<Integer> indexCode = productList.stream().map(SysProduct::getProductid).collect(Collectors.toList());
+        List<PlanEnergy> list;
+        list = planEnergyService.PlanEnergyList(indexCode,planEnergy.getTimeType(),planEnergy.getDataTime(),planEnergy.getType());
+        if(list.size()==0){
+            list = planEnergyService.selectPlanEnergyList(indexCode,planEnergy.getTimeType(),planEnergy.getDataTime());
+        }
+        return AjaxResult.success(list);
+    }
+    /**
+     * 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
+     */
+    @PreAuthorize("@ss.hasPermi('system:energy:add')")
+    @Log(title = "銆愯濉啓鍔熻兘鍚嶇О銆�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody List<PlanEnergy> listMap){
+        List<PlanEnergy> dataItems = new ArrayList<>();
+        listMap.forEach(data -> {
+            String timeCode = TimeManager.getTimeCode(data.getDataTime(), data.getTimeType());
+            PlanEnergy dataItem = new PlanEnergy();
+            dataItem.setTimeCode(timeCode);
+            dataItem.setProductId(data.getProductId());
+            dataItem.setTimeType(data.getTimeType());
+            dataItem.setActualValue(data.getActualValue());
+            dataItem.setValue(data.getValue());
+            dataItem.setEnergyValue(data.getEnergyValue());
+            dataItem.setCoalValue(data.getCoalValue());
+            data.setCoalEnergyValue(data.getCoalEnergyValue());
+            dataItem.setSteamValue(data.getSteamValue());
+            dataItem.setSteamEnereyValue(data.getSteamEnereyValue());
+            dataItem.setWaterValue(data.getWaterValue());
+            dataItem.setWaterEnergyValue(data.getWaterEnergyValue());
+            dataItem.setDataTime(dataItem.getDataTime());
+            dataItems.add(dataItem);
+        });
+        try {
+            this.planEnergyService.insertPlanEnergy(dataItems);
+            return AjaxResult.success("淇濆瓨鎴愬姛锛�");
+        }catch (Exception ex) {
+            logger.error("淇濆瓨澶辫触锛�" + ex.getMessage());
+            return AjaxResult.success(ex.getMessage());
+        }
+        //return toAjax(planEnergyService.insertPlanEnergy(planEnergy));
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlannedOutputController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlannedOutputController.java
new file mode 100644
index 0000000..66cd2b9
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/PlannedOutputController.java
@@ -0,0 +1,113 @@
+package com.dingzhuo.energy.project.plannedOutput.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+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.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlannedOutput;
+import com.dingzhuo.energy.project.plannedOutput.service.IPlannedOutputService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+
+/**
+ * plannedOutputController
+ * 
+ * @author sys
+ * @date 2020-12-16
+ */
+@RestController
+@RequestMapping("/planned/plannedOutput")
+public class PlannedOutputController extends BaseController {
+    @Autowired
+    private IPlannedOutputService plannedOutputService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+
+    /**
+     * 鏌ヨplannedOutput鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('planned:plannedOutput:list')")
+    @GetMapping("/list")
+    public AjaxResult list(PlannedOutput plannedOutput) {
+        //startPage();
+        List<SysProduct> productList= modelNodeService.getSettingProduct(plannedOutput.getIndexCode());
+        List<Integer> indexCode = productList.stream().map(SysProduct::getProductid).collect(Collectors.toList());
+        List<PlannedOutput> list= plannedOutputService.selectPlannedOutputList(indexCode,plannedOutput.getTimeType(),plannedOutput.getDataTime(),plannedOutput.getPalnType());
+        if(list.size()==0){
+            list= plannedOutputService.selectPlanList(indexCode);
+        }
+        //return getDataTable(list);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 鏂板plannedOutput
+     */
+    @PreAuthorize("@ss.hasPermi('planned:plannedOutput:add')")
+    @Log(title = "plannedOutput", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody List<PlannedOutput> listMap) {
+        List<PlannedOutput> dataItems = new ArrayList<>();
+        listMap.forEach(data -> {
+            String timeCode = TimeManager.getTimeCode(data.getDataTime(), data.getTimeType());
+            PlannedOutput dataItem = new PlannedOutput();
+            dataItem.setPalnType(data.getPalnType());
+            dataItem.setTimeCode(timeCode);
+            dataItem.setDataTime(data.getDataTime());
+            dataItem.setProductId(data.getProductId());
+            dataItem.setPlanValue(data.getPlanValue());
+            dataItem.setValue(data.getValue());
+            dataItem.setCoalValue(data.getCoalValue());
+            dataItem.setSteamValue(data.getSteamValue());
+            dataItem.setWaterValue(data.getWaterValue());
+            dataItems.add(dataItem);
+        });
+        try {
+            this.plannedOutputService.insertPlannedOutput(dataItems);
+            return AjaxResult.success("淇濆瓨鎴愬姛锛�");
+        }catch (Exception ex) {
+            logger.error("淇濆瓨澶辫触锛�" + ex.getMessage());
+            return AjaxResult.success(ex.getMessage());
+        }
+        //return toAjax(plannedOutputService.insertPlannedOutput(plannedOutput));
+    }
+
+    /**
+     * 淇敼plannedOutput
+     */
+    @PreAuthorize("@ss.hasPermi('planned:plannedOutput:edit')")
+    @Log(title = "plannedOutput", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody PlannedOutput plannedOutput) {
+        return toAjax(plannedOutputService.updatePlannedOutput(plannedOutput));
+    }
+
+
+    /**
+     * 瀵煎嚭plannedOutput鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('planned:plannedOutput:export')")
+    @Log(title = "plannedOutput", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(PlannedOutput plannedOutput) {
+        List<SysProduct> productList= modelNodeService.getSettingProduct(plannedOutput.getIndexCode());
+        List<Integer> indexCode = productList.stream().map(SysProduct::getProductid).collect(Collectors.toList());
+        List<PlannedOutput> list= plannedOutputService.selectPlannedOutputList(indexCode,plannedOutput.getTimeType(),plannedOutput.getDataTime(),plannedOutput.getPalnType());
+        ExcelUtil<PlannedOutput> util = new ExcelUtil<PlannedOutput>(PlannedOutput.class);
+        return util.exportExcel(list, "plannedOutput");
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/energyMonitoringController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/energyMonitoringController.java
new file mode 100644
index 0000000..135bb23
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/controller/energyMonitoringController.java
@@ -0,0 +1,44 @@
+package com.dingzhuo.energy.project.plannedOutput.controller;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysProduct;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlanEnergy;
+import com.dingzhuo.energy.project.plannedOutput.domain.energyMonitoring;
+import com.dingzhuo.energy.project.plannedOutput.service.energyMonitoringService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+
+/**
+ * 璁″垝浜庡疄缁╁姣斿垎鏋怌ontroller
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+@RestController
+@RequestMapping("/energyMonitoring")
+public class energyMonitoringController extends BaseController {
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private energyMonitoringService energyMonitoringService;
+    /**
+     * 鏌ヨ鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:energy:list')")
+    @GetMapping("/list")
+    public AjaxResult list(PlanEnergy planEnergy) {
+        List<SysProduct> productList= modelNodeService.getSettingProduct(planEnergy.getIndexCode());
+        List<Integer> indexCode = productList.stream().map(SysProduct::getProductid).collect(Collectors.toList());
+        List<energyMonitoring> list=energyMonitoringService.selectEnergyMonitoringList(indexCode,planEnergy.getTimeType(),planEnergy.getDataTime());
+        return AjaxResult.success(list);
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlanEnergy.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlanEnergy.java
new file mode 100644
index 0000000..8d66079
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlanEnergy.java
@@ -0,0 +1,246 @@
+package com.dingzhuo.energy.project.plannedOutput.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import java.util.Date;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆戝璞� plan_energy
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+public class PlanEnergy extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    @Excel(name = "浜у搧ID")
+    private Integer productId;
+    @Excel(name = "浜у搧鍚嶇О")
+    private String productname;
+    @Excel(name = "鍗曚綅")
+    private String muid;
+    @Excel(name = "璁″垝鍊�")
+    private String planValue;
+    @Excel(name = "瀹為檯鍊�")
+    private String actualValue;
+    /** 鐢佃兘鑰楅噺 */
+    @Excel(name = "鐢佃兘鑰楅噺")
+    private String value;
+    /** 鐢靛崟浣嶄骇鍝佽兘鑰楅噺 */
+    @Excel(name = "鐢靛崟浣嶄骇鍝佽兘鑰楅噺")
+    private String energyValue;
+
+    /** 绫诲瀷 */
+    @Excel(name = "绫诲瀷")
+    private TimeType timeType;
+
+    /** 钂告苯鍗曚綅浜у搧鑳借�楅噺 */
+    @Excel(name = "钂告苯鍗曚綅浜у搧鑳借�楅噺")
+    private String steamEnereyValue;
+
+    /** 鐢靛崟浣嶄骇鍝佽兘鑰楅噺 */
+    @Excel(name = "姘村崟浣嶄骇鍝佽兘鑰楅噺")
+    private String waterValue;
+
+    /** 姘村崟浣嶄骇鍝佽兘鑰楅噺 */
+    @Excel(name = "姘村崟浣嶄骇鍝佽兘鑰楅噺")
+    private String waterEnergyValue;
+
+    /** 鐓ゆ皵鑳借�楅噺 */
+    @Excel(name = "鐓ゆ皵鑳借�楅噺")
+    private String coalValue;
+
+    /** 鐓ゆ皵鍗曚綅浜у搧鑳借�楅噺 */
+    @Excel(name = "鐓ゆ皵鍗曚綅浜у搧鑳借�楅噺")
+    private String coalEnergyValue;
+
+    /** 钂告苯鑳借�楅噺 */
+    @Excel(name = "钂告苯鑳借�楅噺")
+    private String steamValue;
+
+    /** 鏃ユ湡 */
+    @Excel(name = "鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date dataTime;
+    private String indexCode;
+    private String timeCode;
+    private String type;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public void setProductId(Integer productId)
+    {
+        this.productId = productId;
+    }
+
+    public Integer getProductId()
+    {
+        return productId;
+    }
+
+    public String getProductname() {
+        return productname;
+    }
+
+    public void setProductname(String productname) {
+        this.productname = productname;
+    }
+
+    public String getMuid() {
+        return muid;
+    }
+
+    public void setMuid(String muid) {
+        this.muid = muid;
+    }
+
+    public String getPlanValue() {
+        return planValue;
+    }
+
+    public void setPlanValue(String planValue) {
+        this.planValue = planValue;
+    }
+
+    public String getActualValue() {
+        return actualValue;
+    }
+
+    public void setActualValue(String actualValue) {
+        this.actualValue = actualValue;
+    }
+
+    public void setValue(String value)
+    {
+        this.value = value;
+    }
+
+    public String getValue() 
+    {
+        return value;
+    }
+    public void setEnergyValue(String energyValue) 
+    {
+        this.energyValue = energyValue;
+    }
+
+    public String getEnergyValue() 
+    {
+        return energyValue;
+    }
+
+    public String getSteamEnereyValue() {
+        return steamEnereyValue;
+    }
+
+    public void setSteamEnereyValue(String steamEnereyValue) {
+        this.steamEnereyValue = steamEnereyValue;
+    }
+
+    public String getWaterValue() {
+        return waterValue;
+    }
+
+    public void setWaterValue(String waterValue) {
+        this.waterValue = waterValue;
+    }
+
+    public String getWaterEnergyValue() {
+        return waterEnergyValue;
+    }
+
+    public void setWaterEnergyValue(String waterEnergyValue) {
+        this.waterEnergyValue = waterEnergyValue;
+    }
+
+    public String getCoalValue() {
+        return coalValue;
+    }
+
+    public void setCoalValue(String coalValue) {
+        this.coalValue = coalValue;
+    }
+
+    public String getCoalEnergyValue() {
+        return coalEnergyValue;
+    }
+
+    public void setCoalEnergyValue(String coalEnergyValue) {
+        this.coalEnergyValue = coalEnergyValue;
+    }
+
+    public String getSteamValue() {
+        return steamValue;
+    }
+
+    public void setSteamValue(String steamValue) {
+        this.steamValue = steamValue;
+    }
+
+    public void setDataTime(Date dataTime)
+    {
+        this.dataTime = dataTime;
+    }
+
+    public Date getDataTime() 
+    {
+        return dataTime;
+    }
+    public void setTimeType(TimeType timeType)
+    {
+        this.timeType = timeType;
+    }
+
+    public TimeType getTimeType()
+    {
+        return timeType;
+    }
+
+    public String getIndexCode() {
+        return indexCode;
+    }
+
+    public void setIndexCode(String indexCode) {
+        this.indexCode = indexCode;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("productId", getProductId())
+            .append("productname", getProductname())
+            .append("muid", getMuid())
+            .append("planValue", getPlanValue())
+            .append("value", getValue())
+            .append("energyValue", getEnergyValue())
+            .append("steamEnereyValue", getSteamEnereyValue())
+            .append("waterValue", getWaterValue())
+            .append("waterEnergyValue", getWaterEnergyValue())
+            .append("coalValue", getCoalValue())
+            .append("coalEnergyValue", getCoalEnergyValue())
+            .append("steamValue", getSteamValue())
+            .append("dataTime", getDataTime())
+            .append("timeType", getTimeType())
+            .append("createTime", getCreateTime())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlannedOutput.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlannedOutput.java
new file mode 100644
index 0000000..7a7220f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/PlannedOutput.java
@@ -0,0 +1,181 @@
+package com.dingzhuo.energy.project.plannedOutput.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * plannedOutput瀵硅薄 planned_output
+ * 
+ * @author sys
+ * @date 2020-12-16
+ */
+public class PlannedOutput extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+    /** 璁″垝鍒嗙被 */
+    @Excel(name = "璁″垝鍒嗙被")
+    private String palnType;
+
+    /** 浜у搧id */
+    @Excel(name = "浜у搧id")
+    private Integer productId;
+
+    /** 璁″垝鍊� */
+    @Excel(name = "璁″垝鍊�")
+    private String planValue;
+    /** 璁″垝鍊� */
+    @Excel(name = "璁″垝鐢电敤閲�")
+    private String value;
+    /** 璁″垝鐢ㄦ按閲� */
+    @Excel(name = "璁″垝姘寸敤閲�")
+    private String waterValue;
+    /** 璁″垝鍊� */
+    @Excel(name = "璁″垝鐓ゆ皵鐢ㄩ噺")
+    private String coalValue;
+    /** 璁″垝鍊� */
+    @Excel(name = "璁″垝钂告苯鐢ㄩ噺")
+    private String steamValue;
+    /** 鏃ユ湡 */
+    @Excel(name = "鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date dataTime;
+    private String indexCode;
+    private String productname;
+    private String productsno;
+    private String muid;
+    private String timeCode;
+    private TimeType timeType;
+    public void setPalnType(String palnType)
+    {
+        this.palnType = palnType;
+    }
+
+    public String getPalnType()
+    {
+        return palnType;
+    }
+    public void setProductId(Integer productId)
+    {
+        this.productId = productId;
+    }
+
+    public Integer getProductId()
+    {
+        return productId;
+    }
+    public void setPlanValue(String planValue)
+    {
+        this.planValue = planValue;
+    }
+
+    public String getPlanValue()
+    {
+        return planValue;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getWaterValue() {
+        return waterValue;
+    }
+
+    public void setWaterValue(String waterValue) {
+        this.waterValue = waterValue;
+    }
+
+    public String getCoalValue() {
+        return coalValue;
+    }
+
+    public void setCoalValue(String coalValue) {
+        this.coalValue = coalValue;
+    }
+
+    public String getSteamValue() {
+        return steamValue;
+    }
+
+    public void setSteamValue(String steamValue) {
+        this.steamValue = steamValue;
+    }
+
+    public void setDataTime(Date dataTime)
+    {
+        this.dataTime = dataTime;
+    }
+
+    public Date getDataTime()
+    {
+        return dataTime;
+    }
+
+    public String getIndexCode() {
+        return indexCode;
+    }
+
+    public void setIndexCode(String indexCode) {
+        this.indexCode = indexCode;
+    }
+
+    public String getProductname() {
+        return productname;
+    }
+
+    public void setProductname(String productname) {
+        this.productname = productname;
+    }
+
+    public String getProductsno() {
+        return productsno;
+    }
+
+    public void setProductsno(String productsno) {
+        this.productsno = productsno;
+    }
+
+    public String getMuid() {
+        return muid;
+    }
+
+    public void setMuid(String muid) {
+        this.muid = muid;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+    public TimeType getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(TimeType timeType) {
+        this.timeType = timeType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("palnType", getPalnType())
+                .append("productId", getProductId())
+                .append("planValue", getPlanValue())
+                .append("dataTime", getDataTime())
+                .append("createTime", getCreateTime())
+                .append("updateTime", getUpdateTime())
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/energyMonitoring.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/energyMonitoring.java
new file mode 100644
index 0000000..d6541d5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/domain/energyMonitoring.java
@@ -0,0 +1,132 @@
+package com.dingzhuo.energy.project.plannedOutput.domain;
+
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * plannedOutput瀵硅薄 planned_output
+ * 
+ * @author sys
+ * @date 2020-12-16
+ */
+public class energyMonitoring extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+    private String peValue;
+    private String peWaterValue;
+    private String peCoalValue;
+    private String peSteamValue;
+    private String actualValue;
+    private String planValue;
+    private String poValue;
+    private String poVaterValue;
+    private String poCoalValue;
+    private String poSteamValue;
+    private String productid;
+    private String productname;
+    private String muid;
+
+    public String getPeValue() {
+        return peValue;
+    }
+
+    public void setPeValue(String peValue) {
+        this.peValue = peValue;
+    }
+
+    public String getPeWaterValue() {
+        return peWaterValue;
+    }
+
+    public void setPeWaterValue(String peWaterValue) {
+        this.peWaterValue = peWaterValue;
+    }
+
+    public String getPeCoalValue() {
+        return peCoalValue;
+    }
+
+    public void setPeCoalValue(String peCoalValue) {
+        this.peCoalValue = peCoalValue;
+    }
+
+    public String getPeSteamValue() {
+        return peSteamValue;
+    }
+
+    public void setPeSteamValue(String peSteamValue) {
+        this.peSteamValue = peSteamValue;
+    }
+
+    public String getActualValue() {
+        return actualValue;
+    }
+
+    public void setActualValue(String actualValue) {
+        this.actualValue = actualValue;
+    }
+
+    public String getPlanValue() {
+        return planValue;
+    }
+
+    public void setPlanValue(String planValue) {
+        this.planValue = planValue;
+    }
+
+    public String getPoValue() {
+        return poValue;
+    }
+
+    public void setPoValue(String poValue) {
+        this.poValue = poValue;
+    }
+
+    public String getPoVaterValue() {
+        return poVaterValue;
+    }
+
+    public void setPoVaterValue(String poVaterValue) {
+        this.poVaterValue = poVaterValue;
+    }
+
+    public String getPoCoalValue() {
+        return poCoalValue;
+    }
+
+    public void setPoCoalValue(String poCoalValue) {
+        this.poCoalValue = poCoalValue;
+    }
+
+    public String getPoSteamValue() {
+        return poSteamValue;
+    }
+
+    public void setPoSteamValue(String poSteamValue) {
+        this.poSteamValue = poSteamValue;
+    }
+
+    public String getProductid() {
+        return productid;
+    }
+
+    public void setProductid(String productid) {
+        this.productid = productid;
+    }
+
+    public String getProductname() {
+        return productname;
+    }
+
+    public void setProductname(String productname) {
+        this.productname = productname;
+    }
+
+    public String getMuid() {
+        return muid;
+    }
+
+    public void setMuid(String muid) {
+        this.muid = muid;
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlanEnergyMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlanEnergyMapper.java
new file mode 100644
index 0000000..741c99a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlanEnergyMapper.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.project.plannedOutput.mapper;
+
+import com.dingzhuo.energy.project.plannedOutput.domain.PlanEnergy;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+public interface PlanEnergyMapper 
+{
+
+    /**
+     * 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
+     * 
+     * @param
+     * @return 銆愯濉啓鍔熻兘鍚嶇О銆戦泦鍚�
+     */
+    public List<PlanEnergy> selectPlanEnergyList(@Param("indexIds") List<Integer> indexIds,@Param("timeCode") String timeCode);
+    public List<PlanEnergy> PlanEnergyList(@Param("indexIds") List<Integer> indexIds,@Param("timeCode") String timeCode, @Param("type") String type);
+    void save(@Param("planEnergy") PlanEnergy planEnergy);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlannedOutputMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlannedOutputMapper.java
new file mode 100644
index 0000000..1737851
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/PlannedOutputMapper.java
@@ -0,0 +1,46 @@
+package com.dingzhuo.energy.project.plannedOutput.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlannedOutput;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * plannedOutputMapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-16
+ */
+public interface PlannedOutputMapper 
+{
+    /**
+     * 鏌ヨplannedOutput鍒楄〃
+     * 
+     * @param
+     * @return plannedOutput闆嗗悎
+     */
+    public List<PlannedOutput> selectPlannedOutputList (@Param("indexIds") List<Integer> indexIds,
+                                                        @Param("timeCode") String timeCode, @Param("palnType") String palnType);
+    public List<PlannedOutput> selectPlanList (@Param("indexIds") List<Integer> indexIds);
+    /**
+     * 鏂板plannedOutput
+     * 
+     * @param plannedOutput plannedOutput
+     * @return 缁撴灉
+     */
+    public int insertPlannedOutput(PlannedOutput plannedOutput);
+
+    /**
+     * 淇敼plannedOutput
+     * 
+     * @param plannedOutput plannedOutput
+     * @return 缁撴灉
+     */
+    public int updatePlannedOutput(PlannedOutput plannedOutput);
+    void save(@Param("plannedOutput") PlannedOutput plannedOutput);
+    void saveDataList(@Param("PlannedOutput") List<PlannedOutput> datas);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/energyMonitoringMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/energyMonitoringMapper.java
new file mode 100644
index 0000000..79625b5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/mapper/energyMonitoringMapper.java
@@ -0,0 +1,22 @@
+package com.dingzhuo.energy.project.plannedOutput.mapper;
+
+import com.dingzhuo.energy.project.plannedOutput.domain.energyMonitoring;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慚apper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+public interface energyMonitoringMapper
+{
+
+    /**
+     * 鏌ヨ鍒楄〃
+     */
+    public List<energyMonitoring> selectEnergyMonitoringList(@Param("indexIds") List<Integer> indexIds, @Param("timeCode") String timeCode);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlanEnergyService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlanEnergyService.java
new file mode 100644
index 0000000..137464a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlanEnergyService.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.project.plannedOutput.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlanEnergy;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlannedOutput;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+public interface IPlanEnergyService 
+{
+    /**
+     * 鏌ヨ鍒楄〃
+     * 
+     * @param
+     * @return
+     */
+    public List<PlanEnergy> selectPlanEnergyList(List<Integer> indexIds,TimeType timeType, Date dataTime);
+    public List<PlanEnergy> PlanEnergyList(List<Integer> indexIds, TimeType timeType, Date dataTime,String type);
+    /**
+     * 鏂板淇敼
+     */
+    public void insertPlanEnergy(List<PlanEnergy> datas);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlannedOutputService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlannedOutputService.java
new file mode 100644
index 0000000..f10bbae
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/IPlannedOutputService.java
@@ -0,0 +1,39 @@
+package com.dingzhuo.energy.project.plannedOutput.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlannedOutput;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * plannedOutputService鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-16
+ */
+public interface IPlannedOutputService {
+    /**
+     * 鏌ヨplannedOutput鍒楄〃
+     * 
+     * @param
+     * @return plannedOutput闆嗗悎
+     */
+    public List<PlannedOutput> selectPlannedOutputList(List<Integer> indexIds, TimeType timeType,Date dataTime,String palnType);
+    public List<PlannedOutput> selectPlanList(List<Integer> indexIds);
+    /**
+     * 鏂板plannedOutput
+     *
+     * @return 缁撴灉
+     */
+    //public int insertPlannedOutput(PlannedOutput plannedOutput);
+    public void insertPlannedOutput(List<PlannedOutput> datas);
+    /**
+     * 淇敼plannedOutput
+     * 
+     * @param plannedOutput plannedOutput
+     * @return 缁撴灉
+     */
+    public int updatePlannedOutput(PlannedOutput plannedOutput);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/energyMonitoringService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/energyMonitoringService.java
new file mode 100644
index 0000000..f074a8f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/energyMonitoringService.java
@@ -0,0 +1,25 @@
+package com.dingzhuo.energy.project.plannedOutput.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.plannedOutput.domain.energyMonitoring;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+public interface energyMonitoringService
+{
+    /**
+     * 鏌ヨ鍒楄〃
+     *
+     * @param
+     * @return
+     */
+    public List<energyMonitoring> selectEnergyMonitoringList(List<Integer> indexIds, TimeType timeType, Date dataTime);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlanEnergyServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlanEnergyServiceImpl.java
new file mode 100644
index 0000000..16010c9
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlanEnergyServiceImpl.java
@@ -0,0 +1,99 @@
+package com.dingzhuo.energy.project.plannedOutput.service.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlanEnergy;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlannedOutput;
+import com.dingzhuo.energy.project.plannedOutput.mapper.PlanEnergyMapper;
+import com.dingzhuo.energy.project.plannedOutput.service.IPlanEnergyService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+@Service
+public class PlanEnergyServiceImpl implements IPlanEnergyService
+{
+    private Logger logger = LogManager.getLogger(PlanEnergyServiceImpl.class);
+    @Autowired
+    private PlanEnergyMapper planEnergyMapper;
+
+    /**
+     * 鏌ヨ鍒楄〃
+     */
+    @Override
+    public List<PlanEnergy> selectPlanEnergyList(List<Integer> indexIds,TimeType timeType, Date dataTime)
+    {
+        if (indexIds.size() !=0) {
+            String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+            return planEnergyMapper.selectPlanEnergyList(indexIds,timeCode);
+        }
+        return Collections.emptyList();
+    }
+
+    public List<PlanEnergy> PlanEnergyList(List<Integer> indexIds, TimeType timeType, Date dataTime,String type)
+    {
+        if (indexIds.size() !=0) {
+            String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+            return planEnergyMapper.PlanEnergyList(indexIds, timeCode,type);
+        }
+        return Collections.emptyList();
+    }
+
+
+    /**
+     * 鏂板淇敼
+     */
+    @Override
+    public void insertPlanEnergy(List<PlanEnergy> datas) {
+        List<List<PlanEnergy>> splitDatas = splitList(datas, 100);
+        if (splitDatas != null) {
+            splitDatas.parallelStream().forEach(dataPart -> {
+                /*try {
+                    plannedOutputMapper.saveDataList(dataPart);
+                } catch (Exception ex) {
+                    logger.error("鎵归噺淇濆瓨鏁版嵁澶辫触", ex);*/
+                dataPart.parallelStream().forEach(dataItem -> {
+                    try {
+                        planEnergyMapper.save(dataItem);
+                    } catch (Exception singleEx) {
+                        logger.error("鍗曚釜鎸囨爣鏁版嵁淇濆瓨澶辫触锛併��" + dataItem + "銆�", singleEx);
+                    }
+                });
+                /* }*/
+            });
+        }
+    }
+    public static <E> List<List<E>> splitList(List<E> targetList, Integer splitSize) {
+        if (targetList == null) {
+            return Collections.emptyList();
+        }
+
+        int size = targetList.size();
+        List<List<E>> resultList = new ArrayList<>();
+        if (size <= splitSize) {
+            resultList.add(targetList);
+        } else {
+            for (int i = 0; i < size; i += splitSize) {
+                //鐢ㄤ簬闄愬埗鏈�鍚庝竴閮ㄥ垎size灏忎簬splitSize鐨刲ist
+                int limit = i + splitSize;
+                if (limit > size) {
+                    limit = size;
+                }
+                resultList.add(targetList.subList(i, limit));
+            }
+        }
+        return resultList;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlannedOutputServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlannedOutputServiceImpl.java
new file mode 100644
index 0000000..eb9fe31
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/PlannedOutputServiceImpl.java
@@ -0,0 +1,116 @@
+package com.dingzhuo.energy.project.plannedOutput.service.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.dataservice.service.impl.PeriodDataServiceImpl;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.plannedOutput.mapper.PlannedOutputMapper;
+import com.dingzhuo.energy.project.plannedOutput.domain.PlannedOutput;
+import com.dingzhuo.energy.project.plannedOutput.service.IPlannedOutputService;
+
+/**
+ * plannedOutputService涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-12-16
+ */
+@Service
+public class PlannedOutputServiceImpl implements IPlannedOutputService 
+{
+    private Logger logger = LogManager.getLogger(PlannedOutputServiceImpl.class);
+    @Autowired
+    private PlannedOutputMapper plannedOutputMapper;
+
+    /**
+     * 鏌ヨplannedOutput鍒楄〃
+     * 
+     * @param
+     * @return plannedOutput
+     */
+    @Override
+    public List<PlannedOutput> selectPlannedOutputList(List<Integer> indexIds, TimeType timeType,Date dataTime,String palnType)
+    {
+        if (indexIds.size() !=0) {
+            String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+            return plannedOutputMapper.selectPlannedOutputList(indexIds, timeCode,palnType);
+        }
+        return Collections.emptyList();
+    }
+    public List<PlannedOutput> selectPlanList(List<Integer> indexIds){
+        if (indexIds.size() !=0) {
+            return plannedOutputMapper.selectPlanList(indexIds);
+        }
+        return Collections.emptyList();
+    }
+    /**
+     * 鏂板plannedOutput
+     *
+     * @return 缁撴灉
+     */
+    /*@Override
+    public int insertPlannedOutput(PlannedOutput plannedOutput)
+    {
+        return plannedOutputMapper.insertPlannedOutput(plannedOutput);
+    }*/
+    @Override
+    public void insertPlannedOutput(List<PlannedOutput> datas) {
+        List<List<PlannedOutput>> splitDatas = splitList(datas, 100);
+        if (splitDatas != null) {
+            splitDatas.parallelStream().forEach(dataPart -> {
+                /*try {
+                    plannedOutputMapper.saveDataList(dataPart);
+                } catch (Exception ex) {
+                    logger.error("鎵归噺淇濆瓨鏁版嵁澶辫触", ex);*/
+                    dataPart.parallelStream().forEach(dataItem -> {
+                        try {
+                            plannedOutputMapper.save(dataItem);
+                        } catch (Exception singleEx) {
+                            logger.error("鍗曚釜鎸囨爣鏁版嵁淇濆瓨澶辫触锛併��" + dataItem + "銆�", singleEx);
+                        }
+                    });
+               /* }*/
+            });
+        }
+    }
+    /**
+     * 淇敼plannedOutput
+     * 
+     * @param plannedOutput plannedOutput
+     * @return 缁撴灉
+     */
+    @Override
+    public int updatePlannedOutput(PlannedOutput plannedOutput)
+    {
+        return plannedOutputMapper.updatePlannedOutput(plannedOutput);
+    }
+    public static <E> List<List<E>> splitList(List<E> targetList, Integer splitSize) {
+        if (targetList == null) {
+            return Collections.emptyList();
+        }
+
+        int size = targetList.size();
+        List<List<E>> resultList = new ArrayList<>();
+        if (size <= splitSize) {
+            resultList.add(targetList);
+        } else {
+            for (int i = 0; i < size; i += splitSize) {
+                //鐢ㄤ簬闄愬埗鏈�鍚庝竴閮ㄥ垎size灏忎簬splitSize鐨刲ist
+                int limit = i + splitSize;
+                if (limit > size) {
+                    limit = size;
+                }
+                resultList.add(targetList.subList(i, limit));
+            }
+        }
+        return resultList;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/energyMonitoringServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/energyMonitoringServiceImpl.java
new file mode 100644
index 0000000..f229104
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/plannedOutput/service/impl/energyMonitoringServiceImpl.java
@@ -0,0 +1,43 @@
+package com.dingzhuo.energy.project.plannedOutput.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.plannedOutput.domain.energyMonitoring;
+import com.dingzhuo.energy.project.plannedOutput.mapper.energyMonitoringMapper;
+import com.dingzhuo.energy.project.plannedOutput.service.energyMonitoringService;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 銆愯濉啓鍔熻兘鍚嶇О銆慡ervice涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-12-17
+ */
+@Service
+public class energyMonitoringServiceImpl implements energyMonitoringService
+{
+    private Logger logger = LogManager.getLogger(energyMonitoringServiceImpl.class);
+    @Autowired
+    private energyMonitoringMapper energyMonitoringMapper;
+
+    /**
+     * 鏌ヨ鍒楄〃
+     */
+    @Override
+    public List<energyMonitoring> selectEnergyMonitoringList(List<Integer> indexIds, TimeType timeType, Date dataTime)
+    {
+        if (indexIds.size() !=0) {
+            String timeCode = TimeManager.getTimeCode(dataTime, timeType);
+            return energyMonitoringMapper.selectEnergyMonitoringList(indexIds,timeCode);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ComprehensiveReportsController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ComprehensiveReportsController.java
new file mode 100644
index 0000000..e3539a8
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ComprehensiveReportsController.java
@@ -0,0 +1,75 @@
+package com.dingzhuo.energy.project.reportForm.controller;
+
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.reportForm.domain.dto.ComprehensiveReportsDTO;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveConsumptionRatioVO;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveReportsItem;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveUnitConsumptionChartVO;
+import com.dingzhuo.energy.project.reportForm.service.IComprehensiveReportsService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 缁煎悎鎶ヨ〃
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/16
+ */
+@RestController
+@RequestMapping("/report/comprehensive")
+class ComprehensiveReportsController extends BaseController {
+    @Autowired
+    private IComprehensiveReportsService service;
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鍒楄〃淇℃伅
+     */
+    //    @PreAuthorize("@ss.hasPermi('dailyReport:list')")
+    @GetMapping("/list")
+    @ApiOperation(value = "缁煎悎鎶ヨ〃鏌ヨ鍒楄〃淇℃伅", notes = "棣栭〉鑾峰彇鑳芥簮鍒嗘椂鐩戞祴")
+    public AjaxResult list(@Validated ComprehensiveReportsDTO dto) {
+        List<ComprehensiveReportsItem> reportsItemList = service.listComprehensiveReport(dto);
+        return AjaxResult.success(reportsItemList);
+    }
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鐢ㄨ兘鍗曞厓鏌辩姸鍥句俊鎭�
+     */
+    //    @PreAuthorize("@ss.hasPermi('dailyReport:list')")
+    @GetMapping("/listEnergyUnitChart")
+    @ApiOperation(value = "缁煎悎鎶ヨ〃鏌ヨ淇℃伅", notes = "棣栭〉鑾峰彇鑳芥簮鍒嗘椂鐩戞祴")
+    public AjaxResult listUnitChart(@Validated ComprehensiveReportsDTO dto) {
+        List<ComprehensiveReportsItem> chart = service.listEnergyUnitComprehensiveReport(dto);
+        return AjaxResult.success(chart);
+    }
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鑳借�楀崰姣斾俊鎭�
+     */
+    //    @PreAuthorize("@ss.hasPermi('dailyReport:list')")
+    @GetMapping("/getEnergyConsumptionRatio")
+    @ApiOperation(value = "缁煎悎鎶ヨ〃鏌ヨ鑳借�楀崰姣斾俊鎭�", notes = "缁煎悎鎶ヨ〃鏌ヨ鑳借�楀崰姣斾俊鎭�")
+    public AjaxResult getEnergyConsumptionRatio(@Validated ComprehensiveReportsDTO dto) {
+        List<ComprehensiveConsumptionRatioVO> vo = service.getEnergyConsumptionRatio(dto);
+        return AjaxResult.success(vo);
+    }
+
+    /**
+     * 缁煎悎鎶ヨ〃鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�
+     */
+    //    @PreAuthorize("@ss.hasPermi('dailyReport:list')")
+    @GetMapping("/getEnergyUnitConsumptionRatio")
+    @ApiOperation(value = "缁煎悎鎶ヨ〃鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�", notes = "缁煎悎鎶ヨ〃鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�")
+    public AjaxResult getEnergyUnitConsumptionRatio(@Validated ComprehensiveReportsDTO dto) {
+        List<ComprehensiveUnitConsumptionChartVO> vo = service.getEnergyUnitConsumptionRatio(dto);
+        return AjaxResult.success(vo);
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ReportSetController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ReportSetController.java
new file mode 100644
index 0000000..e352796
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/ReportSetController.java
@@ -0,0 +1,99 @@
+package com.dingzhuo.energy.project.reportForm.controller;
+
+import com.dingzhuo.energy.common.utils.ServletUtils;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.monitoring.alarm.domain.AlarmItem;
+import com.dingzhuo.energy.data.monitoring.alarm.service.IAlarmItemService;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.security.LoginUser;
+import com.dingzhuo.energy.framework.security.service.TokenService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+import com.dingzhuo.energy.project.reportForm.domain.reportSet;
+import com.dingzhuo.energy.project.reportForm.domain.reportSetRequestModel;
+import com.dingzhuo.energy.project.reportForm.service.IreportSetService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 涓婃姤璁剧疆Controller
+ *
+ * @author sys
+ * @date 2020-03-02
+ */
+@RestController
+@RequestMapping("/system/report")
+public class ReportSetController extends BaseController {
+
+    @Autowired
+    private IAlarmItemService alarmItemService;
+
+    @Autowired
+    private TokenService tokenService;
+
+    @Autowired
+    private IreportSetService reportSetService;
+
+    /**
+     * 鏌ヨ涓婃姤璁剧疆鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('system:reportSet:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(reportSetRequestModel requestModel) {
+        List<reportSet> list = reportSetService.listReportSet(requestModel);
+        return getDataTable(list);
+    }
+
+    /**
+     * 淇濆瓨涓婃姤閰嶇疆
+     *
+     * @param listMap
+     * @return
+     */
+    @PutMapping(value = "/save")
+    public AjaxResult save(@RequestBody List<reportSet> listMap) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String username = loginUser.getUsername();
+
+        return toAjax(reportSetService.saveReportSet(listMap, username));
+    }
+
+    /**
+     * 鏌ヨ鑺傜偣涓嬬殑鐐逛綅
+     *
+     * @param nodeId    鑺傜偣id
+     * @param indexType 鐐逛綅绫诲瀷
+     * @return
+     */
+    @GetMapping(value = "/listNodeEnergyIndex")
+    public AjaxResult listNodeEnergyIndex(String nodeId, String indexType) {
+
+        return AjaxResult.success(reportSetService.listNodeIndex(nodeId, indexType));
+    }
+
+    /**
+     * 鏌ヨ鑺傜偣涓嬬殑鐐逛綅
+     *
+     * @param nodeId       鑺傜偣id
+     * @param indexId      鐐逛綅id
+     * @param enableStatus 鍚敤闄愬�肩姸鎬�
+     * @return
+     */
+    @GetMapping(value = "/updateEnableStatus")
+    public AjaxResult updateEnableStatus(String nodeId, String indexId, boolean enableStatus) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String username = loginUser.getUsername();
+//        int res = reportSetService.updateEnableStatus(nodeId, indexId, enableStatus, username);
+//        if (res <= 0) {
+//            return AjaxResult.error("璇峰厛璁剧疆鎶ヨ鍊间互鍙婃浛鎹㈠�硷紒");
+//        }
+        return AjaxResult.success(reportSetService.updateEnableStatus(nodeId, indexId, enableStatus, username));
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/annualReportController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/annualReportController.java
new file mode 100644
index 0000000..808afc9
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/annualReportController.java
@@ -0,0 +1,180 @@
+package com.dingzhuo.energy.project.reportForm.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.reportForm.domain.annualReport;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.service.IannualReportService;
+import com.dingzhuo.energy.project.reportForm.service.IreportFormService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鎶ヨ〃
+ * @author sys
+ * @date 2020-03-25
+ */
+@RestController
+@RequestMapping("/report/annualReport")
+class annualReportController extends BaseController {
+    @Autowired
+    private IannualReportService annualReportService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    /**
+     * 鎶ヨ〃鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('report:annualReport:list')")
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) throws ParseException {
+        List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+        List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<annualReport> dataList=new ArrayList<>();
+        DateFormat df = new SimpleDateFormat("yyyy");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getBeginTime());
+        String bb="";
+        int i = 1;
+        while (i <= 12) {
+            if(i>9){
+                bb=aa+"-"+i+"-01 00:00:00";
+            }else{
+                bb=aa+"-0"+i+"-01 00:00:00";
+            }
+            annualReport report=new annualReport();
+            report.setDataTime(sf.parse(bb));
+            report.setValue("value"+i);
+            dataList.add(report);
+            i++;
+        }
+        List<annualReport> list = annualReportService.getannualReportList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+    /**
+     * 瀵煎嚭鎶ヨ〃璁剧疆鍔熻兘鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('report:annualReport::export')")
+    @Log(title = "缁煎悎鎶ヨ〃", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DataItem dataItem) throws ParseException {
+        List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+        List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<annualReport> dataList=new ArrayList<>();
+        if(dataItem.getTimeType().name().equals("HOUR")){
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+            String aa= df.format(dataItem.getBeginTime());
+            String bb="";
+            int i = 1;
+            while (i <= 24) {
+                if(i>9){
+                    bb=aa+" "+i+":00:00";
+                }else{
+                    bb=aa+" 0"+i+":00:00";
+                }
+                annualReport report=new annualReport();
+                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+        }else if(dataItem.getTimeType().name().equals("DAY")){
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            annualReport report1=new annualReport();
+            while (i <= Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))) {
+                if(i>9){
+                    bb=aa+"-"+i+" 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+" 00:00:00";
+                }
+                annualReport report=new annualReport();
+                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                i++;
+            }
+            //table.add(report1);
+        }else if(dataItem.getTimeType().name().equals("MONTH")){
+            DateFormat df = new SimpleDateFormat("yyyy");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            while (i <= 12) {
+                if(i>9){
+                    bb=aa+"-"+i+"-01 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+"-01 00:00:00";
+                }
+                annualReport report=new annualReport();
+                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+        }
+        List<annualReport> list = annualReportService.getannualReportList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());;
+        ExcelUtil<annualReport> util = new ExcelUtil<annualReport>(annualReport.class);
+        return util.exportExcel(list, "缁煎悎鎶ヨ〃");
+    }
+    public static String getLastDayOfMonth(String yearMonth) {
+        int year = Integer.parseInt(yearMonth.split("-")[0]);  //骞�
+        int month = Integer.parseInt(yearMonth.split("-")[1]); //鏈�
+        Calendar cal = Calendar.getInstance();
+        // 璁剧疆骞翠唤
+        cal.set(Calendar.YEAR, year);
+        // 璁剧疆鏈堜唤
+        // cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.MONTH, month); //璁剧疆褰撳墠鏈堢殑涓婁竴涓湀
+        // 鑾峰彇鏌愭湀鏈�澶уぉ鏁�
+        //int lastDay = cal.getActualMaximum(Calendar.DATE);
+        int lastDay = cal.getMinimum(Calendar.DATE); //鑾峰彇鏈堜唤涓殑鏈�灏忓�硷紝鍗崇涓�澶�
+        // 璁剧疆鏃ュ巻涓湀浠界殑鏈�澶уぉ鏁�
+        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //涓婃湀鐨勭涓�澶╁噺鍘�1灏辨槸褰撴湀鐨勬渶鍚庝竴澶�
+        // 鏍煎紡鍖栨棩鏈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(cal.getTime());
+    }
+    private static Map<String, DataItem> change(List<DataItem> list) {
+        Map<String, DataItem> resultMap = new HashMap<String, DataItem>();
+        Set setTmp = new HashSet();
+        for (DataItem tmp : list) {
+            setTmp.add(tmp.getIndexId());
+        }
+        Iterator it = setTmp.iterator();
+        while (it.hasNext()) {
+            String oneSetTmpStr = (String) it.next();
+            List<DataItem> oneSetTmpList = new ArrayList<DataItem>();
+            for (DataItem tmp : list) {
+                String oneMapValueStr = tmp.getIndexId();
+                if (oneMapValueStr.equals(oneSetTmpStr)) {
+                    oneSetTmpList.add(tmp);
+                }
+            }
+            resultMap.put(oneSetTmpStr, oneSetTmpList.get(0));
+        }
+        return  resultMap;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/consolidatedStatementsController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/consolidatedStatementsController.java
new file mode 100644
index 0000000..6d7d6fa
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/consolidatedStatementsController.java
@@ -0,0 +1,127 @@
+package com.dingzhuo.energy.project.reportForm.controller;
+
+import java.io.*;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.common.utils.SecurityUtils;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import com.dingzhuo.energy.project.reportForm.domain.JtZhnhExcel;
+import org.apache.commons.io.FileUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.ClassUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements;
+import com.dingzhuo.energy.project.reportForm.service.IconsolidatedStatementsService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+import javax.servlet.ServletContext;
+
+/**
+ * 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃Controller
+ * 
+ * @author sys
+ * @date 2021-01-15
+ */
+@RestController
+@RequestMapping("/reportForm/consolidatedStatements")
+public class consolidatedStatementsController extends BaseController
+{
+    @Autowired
+    private IconsolidatedStatementsService consolidatedStatementsService;
+
+    /**
+     * 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('reportForm:consolidatedStatements:list')")
+    @GetMapping("/list")
+    public AjaxResult list(consolidatedStatements consolidatedStatements)
+    {
+        List<consolidatedStatements> list = consolidatedStatementsService.selectconsolidatedStatementsList(consolidatedStatements);
+        return AjaxResult.success(list);
+    }
+
+    /**
+     * 鑾峰彇鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('reportForm:consolidatedStatements:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(consolidatedStatementsService.selectconsolidatedStatementsById(id));
+    }
+
+    /**
+     * 鏂板鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     */
+    @PreAuthorize("@ss.hasPermi('reportForm:consolidatedStatements:add')")
+    @Log(title = "鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody consolidatedStatements consolidatedStatements) throws ParseException {
+        consolidatedStatements.setId(UUID.randomUUID().toString());
+        consolidatedStatements.setCreateBy(SecurityUtils.getUsername());
+        return toAjax(consolidatedStatementsService.insertconsolidatedStatements(consolidatedStatements));
+    }
+
+    /**
+     * 淇敼鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     */
+    @PreAuthorize("@ss.hasPermi('reportForm:consolidatedStatements:edit')")
+    @Log(title = "鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody consolidatedStatements consolidatedStatements)
+    {
+        return toAjax(consolidatedStatementsService.updateconsolidatedStatements(consolidatedStatements));
+    }
+
+    /**
+     * 鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     */
+    @PreAuthorize("@ss.hasPermi('reportForm:consolidatedStatements:remove')")
+    @Log(title = "鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(consolidatedStatementsService.deleteconsolidatedStatementsByIds(ids));
+    }
+    /**
+     * 瀵煎嚭鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('reportForm:consolidatedStatements:export')")
+    @Log(title = "鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(consolidatedStatements consolidatedStatements)
+    {
+        List<consolidatedStatements> list = consolidatedStatementsService.selectconsolidatedStatementsList(consolidatedStatements);
+        /*ExcelUtil<consolidatedStatements> util = new ExcelUtil<consolidatedStatements>(consolidatedStatements.class);
+        return util.exportExcel(list, "consolidatedStatements");*/
+        String downLoadFilePaht = null;
+        if(list.size()>0){
+            JtZhnhExcel excelout=new JtZhnhExcel();
+            downLoadFilePaht=excelout.writeExcel(RuoYiConfig.getDownloadPath() + "jhnhrep.xlsx",list);
+        }
+        return AjaxResult.success(downLoadFilePaht);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/dailyReportController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/dailyReportController.java
new file mode 100644
index 0000000..2111899
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/dailyReportController.java
@@ -0,0 +1,216 @@
+package com.dingzhuo.energy.project.reportForm.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.service.IdailyReportService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.lang.reflect.Field;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鎶ヨ〃
+ * @author sys
+ * @date 2020-03-25
+ */
+@RestController
+@RequestMapping("/report/dailyReport")
+class dailyReportController extends BaseController {
+    @Autowired
+    private IdailyReportService dailyReportService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    /**
+     * 鎶ヨ〃鏌ヨ
+     */
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) throws ParseException {
+        List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+        List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        dailyReport reportList =new  dailyReport();
+        List<dailyReport> dataList=new ArrayList<>();
+        /*List<Map> table=new ArrayList<>();
+        Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�*/
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String bb="";
+        int i = 0;
+        dataItem.setBeginTime(dataItem.getDataTime());
+        String endTime=aa+" 24:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        while (i < 24) {
+            if(i>9){
+                bb=aa+" "+i+":00:00";
+            }else{
+                bb=aa+" 0"+i+":00:00";
+            }
+            dailyReport report=new dailyReport();
+            report.setDataTime(sf.parse(bb));
+            report.setValue("value"+i);
+            dataList.add(report);
+            i++;
+        }
+       List<dailyReport> list = dailyReportService.getDailyReportList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        reportList.setTabledata(list);
+        /*table.add(tableColumn);
+        reportList.setTablehead(table);*/
+        return AjaxResult.success(list);
+        /*//琛ㄦ牸鏁版嵁
+        List<DataItem> list = reportFormService.getDailyReportList(indexCode, dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType());
+        Map<Date, List<DataItem>> groupBy = list.stream().collect(Collectors.groupingBy(DataItem::getDataTime));
+        List<Map<String,Object>> tableRows= new ArrayList<>();
+        AtomicInteger colcount= new AtomicInteger(0);//鏃ユ湡鍒楃殑鍒嗙粍璁板綍鏁�
+        groupBy.forEach((time,indexDatas)->{
+            //time 鏄瘡涓�鍒楃殑 鏃ユ湡
+            //indexdatas鏄瘡涓�鍒楃殑琛屾暟鎹�
+            //閬嶅巻姣忎竴鍒楃殑琛岄泦鍚�
+            for(int rowCounts=0;rowCounts<indexDatas.size();rowCounts++)
+            {
+                DataItem indexData = indexDatas.get(rowCounts);//鍙栧垪鐨勮鍗曞厓鏍�
+                if(rowCounts==0 && tableRows.size()==0)
+                {
+                    Map<String,Object> indexDataRow = new HashMap<>();
+                    indexDataRow.put("indexname",indexData.getIndexName());
+                    indexDataRow.put(time.getHours()+"",indexData.getValue());
+                    tableRows.add(indexDataRow);
+                }else
+                {
+                    if((tableRows.size()-1)==rowCounts)
+                    {
+                        Map<String,Object> t = tableRows.get(rowCounts);
+                        t.put("indexname",indexData.getIndexName());
+                        t.put(time.getHours()+"",indexData.getValue());
+                        tableRows.add(t);
+                    }else if((tableRows.size()-1)<rowCounts){
+                        Map<String,Object> indexDataRow = new HashMap<>();
+                        indexDataRow.put("indexname",indexData.getIndexName());
+                        indexDataRow.put(time.getHours()+"",indexData.getValue());
+                        tableRows.add(indexDataRow);
+                    }
+                }
+            }
+            colcount.getAndIncrement();
+        });
+        System.out.print("tableRows="+tableRows.size());
+        System.out.print("=========================");*/
+    }
+    /**
+     * 瀵煎嚭宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳藉垪琛�
+     */
+    @Log(title = "缁煎悎鎶ヨ〃", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DataItem dataItem) throws ParseException {
+        ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dataItem.getIndexCode());
+        if (ObjectUtils.isEmpty(modelNode)) {
+            return AjaxResult.success("鏆傛棤鏁版嵁");
+        }
+        List<dailyReport> dataList=new ArrayList<>();
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String bb;
+        int i = 0;
+        dataItem.setBeginTime(dataItem.getDataTime());
+        String endTime=aa+" 24:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        while (i < 24) {
+            if(i>9){
+                bb=aa+" "+i+":00:00";
+            }else{
+                bb=aa+" 0"+i+":00:00";
+            }
+            dailyReport report=new dailyReport();
+            report.setDataTime(sf.parse(bb));
+            report.setValue("value"+i);
+            dataList.add(report);
+            i++;
+        }
+        List<dailyReport> list = dailyReportService.listDailyReportList(modelNode.getNodeId(), dataList,dataItem.getBeginTime(),
+                dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        if(CollectionUtils.isNotEmpty(list)){
+            list.forEach(this::valueRep);
+        }
+        ExcelUtil<dailyReport> util = new ExcelUtil<>(dailyReport.class);
+        return util.exportExcel(list, "缁煎悎鎸囨爣鍒嗘瀽鏃�");
+    }
+
+    public void valueRep(dailyReport dr){
+        Field[] fields = dr.getClass().getDeclaredFields();
+        for(Field field:fields){
+            field.setAccessible(true);
+            Object obj = field.getType();
+            if(field.getType().getName().equals("java.lang.Double")){
+                String name = field.getName();
+                try {
+                    if(ObjectUtils.isEmpty(field.get(dr)))
+                    {
+                        field.set(dr,0.00);
+                    }
+                } catch (IllegalAccessException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+
+    public static String getLastDayOfMonth(String yearMonth) {
+        int year = Integer.parseInt(yearMonth.split("-")[0]);  //骞�
+        int month = Integer.parseInt(yearMonth.split("-")[1]); //鏈�
+        Calendar cal = Calendar.getInstance();
+        // 璁剧疆骞翠唤
+        cal.set(Calendar.YEAR, year);
+        // 璁剧疆鏈堜唤
+        // cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.MONTH, month); //璁剧疆褰撳墠鏈堢殑涓婁竴涓湀
+        // 鑾峰彇鏌愭湀鏈�澶уぉ鏁�
+        //int lastDay = cal.getActualMaximum(Calendar.DATE);
+        int lastDay = cal.getMinimum(Calendar.DATE); //鑾峰彇鏈堜唤涓殑鏈�灏忓�硷紝鍗崇涓�澶�
+        // 璁剧疆鏃ュ巻涓湀浠界殑鏈�澶уぉ鏁�
+        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //涓婃湀鐨勭涓�澶╁噺鍘�1灏辨槸褰撴湀鐨勬渶鍚庝竴澶�
+        // 鏍煎紡鍖栨棩鏈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(cal.getTime());
+    }
+    private static Map<String, DataItem> change(List<DataItem> list) {
+        Map<String, DataItem> resultMap = new HashMap<String, DataItem>();
+        Set setTmp = new HashSet();
+        for (DataItem tmp : list) {
+            setTmp.add(tmp.getIndexId());
+        }
+        Iterator it = setTmp.iterator();
+        while (it.hasNext()) {
+            String oneSetTmpStr = (String) it.next();
+            List<DataItem> oneSetTmpList = new ArrayList<DataItem>();
+            for (DataItem tmp : list) {
+                String oneMapValueStr = tmp.getIndexId();
+                if (oneMapValueStr.equals(oneSetTmpStr)) {
+                    oneSetTmpList.add(tmp);
+                }
+            }
+            resultMap.put(oneSetTmpStr, oneSetTmpList.get(0));
+        }
+        return  resultMap;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/monthlyReportController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/monthlyReportController.java
new file mode 100644
index 0000000..df5119b
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/monthlyReportController.java
@@ -0,0 +1,201 @@
+package com.dingzhuo.energy.project.reportForm.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.reportForm.domain.monthlyReport;
+import com.dingzhuo.energy.project.reportForm.service.ImonthlyReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鎶ヨ〃
+ * @author sys
+ * @date 2020-03-25
+ */
+@RestController
+@RequestMapping("/report/monthlyReport")
+class monthlyReportController extends BaseController {
+    @Autowired
+    private ImonthlyReportService ImonthlyReportService;
+    @Autowired
+    private IModelNodeService modelNodeService;
+    /**
+     * 鎶ヨ〃鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('report:monthlyReport:list')")
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) throws ParseException {
+        List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+        List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        monthlyReport reportList =new  monthlyReport();
+        List<monthlyReport> dataList=new ArrayList<>();
+        List<Map> table=new ArrayList<>();
+        Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+        DateFormat df = new SimpleDateFormat("yyyy-MM");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String bb="";
+        int i = 1;
+        monthlyReport report1=new monthlyReport();
+        String beginTime=aa+"-01 00:00:00";
+        dataItem.setBeginTime(sf.parse(beginTime));
+        String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        while (i <= Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))) {
+            if(i>9){
+                bb=aa+"-"+i+" 00:00:00";
+            }else{
+                bb=aa+"-0"+i+" 00:00:00";
+            }
+            monthlyReport report=new monthlyReport();
+            report.setDataTime(sf.parse(bb));
+            report.setValue("value"+i);
+            dataList.add(report);
+            tableColumn.put("value"+i,String.valueOf(i)+"鏃�");
+            i++;
+        }
+        List<monthlyReport> list = ImonthlyReportService.getMonthlyReporList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        int count=Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2));
+        list.forEach(monthlyReport -> monthlyReport.setCount(count));
+        reportList.setTabledata(list);
+        table.add(tableColumn);
+        reportList.setTablehead(table);
+        return AjaxResult.success(reportList);
+    }
+    /**
+     * 瀵煎嚭宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳藉垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('report:monthlyReport::export')")
+    @Log(title = "缁煎悎鎶ヨ〃", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(DataItem dataItem) throws ParseException {
+        List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+        List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+        List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        List<monthlyReport> dataList=new ArrayList<>();
+
+        if(dataItem.getTimeType().name().equals("HOUR")){
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            while (i <= 24) {
+                if(i>9){
+                    bb=aa+" "+i+":00:00";
+                }else{
+                    bb=aa+" 0"+i+":00:00";
+                }
+                monthlyReport report=new monthlyReport();
+                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+        }else if(dataItem.getTimeType().name().equals("DAY")){
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            monthlyReport report1=new monthlyReport();
+
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String beginTime=aa+"-01 00:00:00";
+            dataItem.setBeginTime(sf.parse(beginTime));
+            String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+
+            while (i <= Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))) {
+                if(i>9){
+                    bb=aa+"-"+i+" 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+" 00:00:00";
+                }
+                monthlyReport report=new monthlyReport();
+                //SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+            //table.add(report1);
+        }else if(dataItem.getTimeType().name().equals("MONTH")){
+            DateFormat df = new SimpleDateFormat("yyyy");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            while (i <= 12) {
+                if(i>9){
+                    bb=aa+"-"+i+"-01 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+"-01 00:00:00";
+                }
+                monthlyReport report=new monthlyReport();
+                SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+        }
+        List<monthlyReport> list = ImonthlyReportService.getMonthlyReporList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());;
+        ExcelUtil<monthlyReport> util = new ExcelUtil<monthlyReport>(monthlyReport.class);
+        return util.exportExcel(list, "缁煎悎鎶ヨ〃");
+    }
+    public static String getLastDayOfMonth(String yearMonth) {
+        int year = Integer.parseInt(yearMonth.split("-")[0]);  //骞�
+        int month = Integer.parseInt(yearMonth.split("-")[1]); //鏈�
+        Calendar cal = Calendar.getInstance();
+        // 璁剧疆骞翠唤
+        cal.set(Calendar.YEAR, year);
+        // 璁剧疆鏈堜唤
+        // cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.MONTH, month); //璁剧疆褰撳墠鏈堢殑涓婁竴涓湀
+        // 鑾峰彇鏌愭湀鏈�澶уぉ鏁�
+        //int lastDay = cal.getActualMaximum(Calendar.DATE);
+        int lastDay = cal.getMinimum(Calendar.DATE); //鑾峰彇鏈堜唤涓殑鏈�灏忓�硷紝鍗崇涓�澶�
+        // 璁剧疆鏃ュ巻涓湀浠界殑鏈�澶уぉ鏁�
+        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //涓婃湀鐨勭涓�澶╁噺鍘�1灏辨槸褰撴湀鐨勬渶鍚庝竴澶�
+        // 鏍煎紡鍖栨棩鏈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(cal.getTime());
+    }
+    private static Map<String, DataItem> change(List<DataItem> list) {
+        Map<String, DataItem> resultMap = new HashMap<String, DataItem>();
+        Set setTmp = new HashSet();
+        for (DataItem tmp : list) {
+            setTmp.add(tmp.getIndexId());
+        }
+        Iterator it = setTmp.iterator();
+        while (it.hasNext()) {
+            String oneSetTmpStr = (String) it.next();
+            List<DataItem> oneSetTmpList = new ArrayList<DataItem>();
+            for (DataItem tmp : list) {
+                String oneMapValueStr = tmp.getIndexId();
+                if (oneMapValueStr.equals(oneSetTmpStr)) {
+                    oneSetTmpList.add(tmp);
+                }
+            }
+            resultMap.put(oneSetTmpStr, oneSetTmpList.get(0));
+        }
+        return  resultMap;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/reportFormController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/reportFormController.java
new file mode 100644
index 0000000..e7e9585
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/controller/reportFormController.java
@@ -0,0 +1,112 @@
+package com.dingzhuo.energy.project.reportForm.controller;
+
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+import com.dingzhuo.energy.project.reportForm.service.IreportFormService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 鎶ヨ〃
+ * @author sys
+ * @date 2020-03-25
+ */
+@RestController
+@RequestMapping("/reportForm")
+class reportFormController extends BaseController {
+    @Autowired
+    private IreportFormService reportFormService;
+
+    /**
+     * 鎶ヨ〃鏌ヨ
+     */
+    @PreAuthorize("@ss.hasPermi('dailyReport:list')")
+    @GetMapping("/list")
+    public AjaxResult list(reportForm report) {
+        List<reportForm> list= reportFormService.selectReportFormList(report.getCode());//鏍规嵁鐖剁骇鏌ヨ浜岀骇鏁版嵁
+        List<reportForm> resultList= reportFormService.selectReportFormListp(report.getCode());//鏍规嵁浜岀骇鏌ヨ涓夌骇鏁版嵁
+        List<reportForm> result= reportFormService.selectList(report.getTimeDate(),report.getCode(),report.getTimeYear(),report.getTimeType());//鏌ヨ涓夌骇
+
+        List<Map> table = new ArrayList<Map>();
+        List<reportForm> tables = new ArrayList<reportForm>();
+        resultList.forEach(value->{
+            list.forEach(item->{
+                if(item.getParentId().equals(value.getNodeId())){
+                    Map map=new HashMap();
+                    map.put("parentName",value.getName());
+                    map.put("name",item.getName());
+                    map.put("nodeId",item.getNodeId());
+                    table.add(map);
+                }
+            });
+        });
+        Map<String, List<reportForm>> groupBy = result.stream().filter(item-> StringUtils.isNotBlank(item.getNodeId())).collect(Collectors.groupingBy(reportForm::getNodeId));
+        groupBy.forEach((indexName,value)->{
+            for (Map item : table) {
+                //Map map=new HashMap();
+                reportForm map=new reportForm();
+                if(item.get("nodeId").equals(indexName)){
+                    for(reportForm resultValue:value){
+                        if(report.getTimeYear().equals(resultValue.getTimeYear())){
+                            //map.put("value13",resultValue.getValue());
+                            map.setValue13(resultValue.getValue());
+                        }else  if(resultValue.getTimeDate().equals("01")){
+                            //map.put("value1",resultValue.getValue());
+                            map.setValue1(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("02")){
+                            //map.put("value2",resultValue.getValue());
+                            map.setValue2(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("03")){
+                            //map.put("value3",resultValue.getValue());
+                            map.setValue3(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("04")){
+                            //map.put("value4",resultValue.getValue());
+                            map.setValue4(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("05")){
+                            //map.put("value5",resultValue.getValue());
+                            map.setValue5(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("06")){
+                            //map.put("value6",resultValue.getValue());
+                            map.setValue6(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("07")){
+                            //map.put("value7",resultValue.getValue());
+                            map.setValue7(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("08")){
+                            //map.put("value8",resultValue.getValue());
+                            map.setValue8(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("09")){
+                            //map.put("value9",resultValue.getValue());
+                            map.setValue9(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("10")){
+                            //map.put("value10",resultValue.getValue());
+                            map.setValue10(resultValue.getValue());
+                        }else if(resultValue.getTimeDate().equals("11")){
+                            //map.put("value11",resultValue.getValue());
+                            map.setValue11(resultValue.getValue());
+                        }else {
+                            //map.put("value12",resultValue.getValue());
+                            map.setValue12(resultValue.getValue());
+                        }
+                    }
+                    //map.put("parentName",item.get("parentName"));
+                    //map.put("name",item.get("name"));
+                    map.setParentName((String) item.get("parentName"));
+                    map.setName((String) item.get("name"));
+                    tables.add(map);
+                }
+            }
+        });
+        return AjaxResult.success(tables);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/JtZhnhExcel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/JtZhnhExcel.java
new file mode 100644
index 0000000..9cf0500
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/JtZhnhExcel.java
@@ -0,0 +1,207 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+import com.dingzhuo.energy.framework.config.RuoYiConfig;
+import org.apache.commons.io.FileUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+/**
+ * 鐒﹀寲宸ュ簭缁煎悎鑳借�� 瀹氬埗鐨� 鐢熸垚Excel
+ */
+public class JtZhnhExcel {
+    /*public static void main(String[] args) {
+        JtZhnhExcel a = new JtZhnhExcel();
+        String downLoadFilePaht = a.writeExcel("e:\\jhnhrep.xlsx",new Object());
+        System.out.println("鐢熸垚鍚庡彲浠ヤ笅杞界殑鏂囦欢璺緞:"+downLoadFilePaht);
+    }*/
+    /**
+     * 鐢熸垚鐒︾偔缁煎悎鑳借�桬xcel鎶ヨ〃
+     * @param modeFilePath  瑕佺敓鎴愮殑Excel浣跨敤鐨勬ā鏉跨粷瀵硅矾寰�
+     * @param list    杩欎釜灏辨槸涓�寮犳姤琛ㄧ殑 JavaBean
+     */
+    public String writeExcel(String modeFilePath, List<consolidatedStatements> list) {
+        OutputStream out = null;
+
+        // 鐢熸垚鐨勪笅杞芥枃浠惰矾寰�
+        String fownLoadFileName = System.currentTimeMillis()+ "_zhnhRep.xlsx";
+        //String fownLoadFileName = "jhnhrep" + ".xlsx";
+        //杩欎釜鏂规硶瑕佹敞鎰忎笅  鍙湁鍦╞oot涓惎鍔ㄦ墠鏈夋晥锛屽鏋滃崟鐙瑀un杩欎釜绫诲仛娴嬭瘯锛岃鏀逛笅閲岄潰鐨勫唴瀹�
+        String downLoadFilePath = getAbsoluteFile(fownLoadFileName);
+        // 璇诲彇Excel鏂囨。
+        File finalXlsxFile = createNewFile(modeFilePath,downLoadFilePath);//澶嶅埗妯℃澘锛�
+        Workbook workBook = null;
+        try {
+            workBook = getWorkbok(finalXlsxFile);
+        } catch (IOException e1) {
+            e1.printStackTrace();
+        }
+
+        // sheet 瀵瑰簲涓�涓伐浣滈〉 鎻掑叆鏁版嵁寮�濮� ------
+        Sheet sheet = workBook.getSheetAt(0);
+        Row row2 = sheet.getRow(2);// 鑾峰彇鍒扮3琛�
+        Cell B3 = row2.getCell(1);// 3琛� 2鍒� 鎶曞叆_鎶樻爣绯绘暟
+        B3.setCellValue(list.get(0).getTrRljmZb());  // 杩欓噷灏辨敼鎴恓tzhnhBean.get鍊煎氨琛岋紝鐒跺悗鍙堝嚑琛屽啓鍑犺鐨勬暟鎹氨瀹屾椿浜�
+        Cell C3 = row2.getCell(2);// 3琛� 3鍒� 鎶曞叆_瀹炵墿閲�
+        C3.setCellValue(list.get(0).getTrRljmSwl());
+        Cell D3 = row2.getCell(3);// 3琛� 4鍒� 鎶曞叆_鎶樻爣鍑嗙叅
+        D3.setCellValue(list.get(0).getTrRljmZbzm());
+        Cell F3 = row2.getCell(5);// 3琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        F3.setCellValue(list.get(0).getCcJtZb());
+        Cell G3 = row2.getCell(6);// 3琛� 7鍒� 浜у嚭_瀹炵墿閲�
+        G3.setCellValue(list.get(0).getCcJtSwl());
+        Cell H3 = row2.getCell(7);// 3琛� 8鍒� 浜у嚭_鎶樻爣鍑嗙叅
+        H3.setCellValue(list.get(0).getCcJtZbzm());
+
+        Row row3 = sheet.getRow(3);// 鑾峰彇鍒扮4琛�
+        Cell B4 = row3.getCell(1);// 4琛� 2鍒� 鎶曞叆_鎶樻爣绯绘暟
+        B4.setCellValue(list.get(0).getTrDianZb());  // 杩欓噷灏辨敼鎴恓tzhnhBean.get鍊煎氨琛岋紝鐒跺悗鍙堝嚑琛屽啓鍑犺鐨勬暟鎹氨瀹屾椿浜�
+        Cell C4 = row3.getCell(2);// 4琛� 3鍒� 鎶曞叆_瀹炵墿閲�
+        C4.setCellValue(list.get(0).getTrDianSwl());
+        Cell D4 = row3.getCell(3);// 4琛� 4鍒� 鎶曞叆_鎶樻爣鍑嗙叅
+        D4.setCellValue(list.get(0).getTrDianZbzm());
+        Cell F4 = row3.getCell(5);// 4琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        F4.setCellValue(list.get(0).getCcJyZb());
+        Cell G4 = row3.getCell(6);// 4琛� 7鍒� 浜у嚭_瀹炵墿閲�
+        G4.setCellValue(list.get(0).getCcJySwl());
+        Cell H4 = row3.getCell(7);// 4琛� 8鍒� 浜у嚭_鎶樻爣鍑嗙叅
+        H4.setCellValue(list.get(0).getCcJyZbzm());
+
+        Row row4 = sheet.getRow(4);// 鑾峰彇鍒扮5琛�
+        Cell B5 = row4.getCell(1);// 5琛� 2鍒� 鎶曞叆_鎶樻爣绯绘暟
+        B5.setCellValue(list.get(0).getTrShuiZb());  // 杩欓噷灏辨敼鎴恓tzhnhBean.get鍊煎氨琛岋紝鐒跺悗鍙堝嚑琛屽啓鍑犺鐨勬暟鎹氨瀹屾椿浜�
+        Cell C5 = row4.getCell(2);// 5琛� 3鍒� 鎶曞叆_瀹炵墿閲�
+        C5.setCellValue(list.get(0).getTrShuiSwl());
+        Cell D5 = row4.getCell(3);// 5琛� 4鍒� 鎶曞叆_鎶樻爣鍑嗙叅
+        D5.setCellValue(list.get(0).getTrShuiZbzm());
+        Cell F5 = row4.getCell(5);// 5琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        F5.setCellValue(list.get(0).getCcCbZb());
+        Cell G5 = row4.getCell(6);// 5琛� 7鍒� 浜у嚭_瀹炵墿閲�
+        G5.setCellValue(list.get(0).getCcCbSwl());
+        Cell H5 = row4.getCell(7);// 5琛� 8鍒� 浜у嚭_鎶樻爣鍑嗙叅
+        H5.setCellValue(list.get(0).getCcCbZbzm());
+
+        Row row5 = sheet.getRow(5);// 鑾峰彇鍒扮6琛�
+        Cell B6 = row5.getCell(1);// 6琛� 2鍒� 鎶曞叆_鎶樻爣绯绘暟
+        B6.setCellValue(list.get(0).getTrZqZb());  // 杩欓噷灏辨敼鎴恓tzhnhBean.get鍊煎氨琛岋紝鐒跺悗鍙堝嚑琛屽啓鍑犺鐨勬暟鎹氨瀹屾椿浜�
+        Cell C6 = row5.getCell(2);// 6琛� 3鍒� 鎶曞叆_瀹炵墿閲�
+        C6.setCellValue(list.get(0).getTrZqSwl());
+        Cell D6 = row5.getCell(3);//6琛� 4鍒� 鎶曞叆_鎶樻爣鍑嗙叅
+        D6.setCellValue(list.get(0).getTrZqZbzm());
+        Cell F6 = row5.getCell(5);// 6琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        F6.setCellValue(list.get(0).getCcMqZb());
+        Cell G6 = row5.getCell(6);// 6琛� 7鍒� 浜у嚭_瀹炵墿閲�
+        G6.setCellValue(list.get(0).getCcMqSwl());
+        Cell H6 = row5.getCell(7);// 6琛� 8鍒� 浜у嚭_鎶樻爣鍑嗙叅
+        H6.setCellValue(list.get(0).getCcMqZbzm());
+
+        Row row6 = sheet.getRow(6);// 鑾峰彇鍒扮7琛�
+        Cell F7 = row6.getCell(5);// 7琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        F7.setCellValue(list.get(0).getCcDianZb());
+        Cell G7 = row6.getCell(6);// 7琛� 7鍒� 浜у嚭_瀹炵墿閲�
+        G7.setCellValue(list.get(0).getCcDianSwl());
+        Cell H7 = row6.getCell(7);// 7琛� 8鍒� 浜у嚭_鎶樻爣鍑嗙叅
+        H7.setCellValue(list.get(0).getCcDianZbzm());
+
+        Row row7 = sheet.getRow(7);// 8鑾峰彇鍒扮3琛�
+        Cell F8 = row7.getCell(5);// 8琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        F8.setCellValue(list.get(0).getCcZqZb());
+        Cell G8 = row7.getCell(6);// 8琛� 7鍒� 浜у嚭_瀹炵墿閲�
+        G8.setCellValue(list.get(0).getCcZqSwl());
+        Cell H8 = row7.getCell(7);// 8琛� 8鍒� 浜у嚭_鎶樻爣鍑嗙叅
+        H8.setCellValue(list.get(0).getCcZqZbzm());
+
+        Row row8 = sheet.getRow(8);// 鑾峰彇鍒扮9琛�
+        Cell B9 = row8.getCell(3);// 9琛� 2鍒� 鎶曞叆_鎶樻爣绯绘暟
+        B9.setCellValue(list.get(0).getTrZbzm());  // 杩欓噷灏辨敼鎴恓tzhnhBean.get鍊煎氨琛岋紝鐒跺悗鍙堝嚑琛屽啓鍑犺鐨勬暟鎹氨瀹屾椿浜�
+        Cell F9 = row8.getCell(6);// 9琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        F9.setCellValue(list.get(0).getCcZbzm());
+
+        Row row9 = sheet.getRow(9);// 鑾峰彇鍒扮10琛�
+        Cell C9 = row9.getCell(3);// 10琛� 2鍒� 鎶曞叆_鎶樻爣绯绘暟
+        C9.setCellValue(list.get(0).getJhbm());  // 杩欓噷灏辨敼鎴恓tzhnhBean.get鍊煎氨琛岋紝鐒跺悗鍙堝嚑琛屽啓鍑犺鐨勬暟鎹氨瀹屾椿浜�
+        Cell G9 = row9.getCell(6);// 10琛� 6鍒� 浜у嚭_鎶樻爣绯绘暟
+        G9.setCellValue(list.get(0).getZhnh());
+        //鎻掑叆鏁版嵁缁撴潫
+        try {
+            out = new FileOutputStream(finalXlsxFile);
+            workBook.write(out);
+        } catch (Exception e1) {
+            e1.printStackTrace();
+        }
+        finally {
+            if (out != null) {
+                try {
+                    out.flush();
+                    out.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return fownLoadFileName;
+    }
+    /**
+     * 鑾峰彇Excel宸ヤ綔绨�
+     *
+     * @param file
+     * @return
+     * @throws IOException
+     */
+    public static Workbook getWorkbok(File file) throws IOException {
+        Workbook wb = null;
+        FileInputStream in = new FileInputStream(file);
+        wb = new XSSFWorkbook(in);
+        return wb;
+    }
+    /**
+     * 鏍规嵁妯℃澘鏂板缓鏂囦欢骞惰繑鍥炴枃浠舵祦鐢ㄤ簬濉厖鏁版嵁
+     * @param path   杩欎釜鏄ā鏉胯矾寰�
+     * @param downLoadFilePath 杩欎釜鏄敓鎴愬甫鏁版嵁鐨勬姤琛� 涓嬭浇璺緞
+     * @return
+     */
+    private static File createNewFile(String path,String downLoadFilePath) {
+        // 璇诲彇妯℃澘锛屽苟璧嬪�煎埌鏂版枃浠�************************************************************
+        // 鏂囦欢妯℃澘璺緞
+        File file = new File(path);
+        if (!file.exists()) {
+            System.out.println("鍘熸ā鏉挎枃浠朵笉瀛樺湪");
+        }
+        // 鍐欏叆鍒版柊鐨別xcel
+        File newFile = new File(downLoadFilePath);
+        try {
+            newFile.createNewFile();
+            // 澶嶅埗妯℃澘鍒版柊鏂囦欢
+            FileUtils.copyFile(file, newFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return newFile;
+    }
+
+    /**
+     * 鑾峰彇涓嬭浇璺緞
+     *
+     * @param filename 鏂囦欢鍚嶇О
+     */
+    private String getAbsoluteFile(String filename) {
+        //Web杩愯鐨勬柟娉�
+        String downloadPath = RuoYiConfig.getDownloadPath() + filename;
+        //main鏂规硶鐙珛杩愯娴嬭瘯
+        //String downloadPath = "e:\\"+filename;
+        File desc = new File(downloadPath);
+        if (!desc.getParentFile().exists()) {
+            desc.getParentFile().mkdirs();
+        }
+        return downloadPath;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/annualReport.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/annualReport.java
new file mode 100644
index 0000000..9f6bb72
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/annualReport.java
@@ -0,0 +1,206 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.project.energyStatistics.domain.EnergyConsumption;
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class annualReport implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "1鏈�")
+    private Double value1;
+    @Excel(name = "2鏈�")
+    private Double value2;
+    @Excel(name = "3鏈�")
+    private Double value3;
+    @Excel(name = "4鏈�")
+    private Double value4;
+    @Excel(name = "5鏈�")
+    private Double value5;
+    @Excel(name = "6鏈�")
+    private Double value6;
+    @Excel(name = "7鏈�")
+    private Double value7;
+    @Excel(name = "8鏈�")
+    private Double value8;
+    @Excel(name = "9鏈�")
+    private Double value9;
+    @Excel(name = "10鏈�")
+    private Double value10;
+    @Excel(name = "11鏈�")
+    private Double value11;
+    @Excel(name = "12鏈�")
+    private Double value12;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<dailyReport> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<dailyReport> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<dailyReport> tabledata) {
+        this.tabledata = tabledata;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/consolidatedStatements.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/consolidatedStatements.java
new file mode 100644
index 0000000..8b84daa
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/consolidatedStatements.java
@@ -0,0 +1,554 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.util.Date;
+
+/**
+ * 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃瀵硅薄 consolidated_statements
+ *
+ * @author sys
+ * @date 2021-01-15
+ */
+public class consolidatedStatements extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private String id;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trRljmZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trRljmSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trRljmZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trDianZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trDianSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trDianZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trShuiZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trShuiSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trShuiZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trZqZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trZqSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trZqZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccJtZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccJtSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccJtZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccJyZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccJySwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccJyZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccCbZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccCbSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccCbZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccMqZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccMqSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccMqZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccDianZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccDianSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccDianZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccZqZb;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccZqSwl;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccZqZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}")
+    private TimeType timeType;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String timeCode;
+    @Excel(name = "${comment}")
+    private String dataTime;
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String trZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String ccZbzm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String jhbm;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String zhnh;
+    public void setId(String id)
+    {
+        this.id = id;
+    }
+
+    public String getId()
+    {
+        return id;
+    }
+    public void setTrRljmZb(String trRljmZb)
+    {
+        this.trRljmZb = trRljmZb;
+    }
+
+    public String getTrRljmZb()
+    {
+        return trRljmZb;
+    }
+    public void setTrRljmSwl(String trRljmSwl)
+    {
+        this.trRljmSwl = trRljmSwl;
+    }
+
+    public String getTrRljmSwl()
+    {
+        return trRljmSwl;
+    }
+    public void setTrRljmZbzm(String trRljmZbzm)
+    {
+        this.trRljmZbzm = trRljmZbzm;
+    }
+
+    public String getTrRljmZbzm()
+    {
+        return trRljmZbzm;
+    }
+    public void setTrDianZb(String trDianZb)
+    {
+        this.trDianZb = trDianZb;
+    }
+
+    public String getTrDianZb()
+    {
+        return trDianZb;
+    }
+    public void setTrDianSwl(String trDianSwl)
+    {
+        this.trDianSwl = trDianSwl;
+    }
+
+    public String getTrDianSwl()
+    {
+        return trDianSwl;
+    }
+    public void setTrDianZbzm(String trDianZbzm)
+    {
+        this.trDianZbzm = trDianZbzm;
+    }
+
+    public String getTrDianZbzm()
+    {
+        return trDianZbzm;
+    }
+    public void setTrShuiZb(String trShuiZb)
+    {
+        this.trShuiZb = trShuiZb;
+    }
+
+    public String getTrShuiZb()
+    {
+        return trShuiZb;
+    }
+    public void setTrShuiSwl(String trShuiSwl)
+    {
+        this.trShuiSwl = trShuiSwl;
+    }
+
+    public String getTrShuiSwl()
+    {
+        return trShuiSwl;
+    }
+    public void setTrShuiZbzm(String trShuiZbzm)
+    {
+        this.trShuiZbzm = trShuiZbzm;
+    }
+
+    public String getTrShuiZbzm()
+    {
+        return trShuiZbzm;
+    }
+    public void setTrZqZb(String trZqZb)
+    {
+        this.trZqZb = trZqZb;
+    }
+
+    public String getTrZqZb()
+    {
+        return trZqZb;
+    }
+    public void setTrZqSwl(String trZqSwl)
+    {
+        this.trZqSwl = trZqSwl;
+    }
+
+    public String getTrZqSwl()
+    {
+        return trZqSwl;
+    }
+    public void setTrZqZbzm(String trZqZbzm)
+    {
+        this.trZqZbzm = trZqZbzm;
+    }
+
+    public String getTrZqZbzm()
+    {
+        return trZqZbzm;
+    }
+    public void setCcJtZb(String ccJtZb)
+    {
+        this.ccJtZb = ccJtZb;
+    }
+
+    public String getCcJtZb()
+    {
+        return ccJtZb;
+    }
+    public void setCcJtSwl(String ccJtSwl)
+    {
+        this.ccJtSwl = ccJtSwl;
+    }
+
+    public String getCcJtSwl()
+    {
+        return ccJtSwl;
+    }
+    public void setCcJtZbzm(String ccJtZbzm)
+    {
+        this.ccJtZbzm = ccJtZbzm;
+    }
+
+    public String getCcJtZbzm()
+    {
+        return ccJtZbzm;
+    }
+    public void setCcJyZb(String ccJyZb)
+    {
+        this.ccJyZb = ccJyZb;
+    }
+
+    public String getCcJyZb()
+    {
+        return ccJyZb;
+    }
+    public void setCcJySwl(String ccJySwl)
+    {
+        this.ccJySwl = ccJySwl;
+    }
+
+    public String getCcJySwl()
+    {
+        return ccJySwl;
+    }
+    public void setCcJyZbzm(String ccJyZbzm)
+    {
+        this.ccJyZbzm = ccJyZbzm;
+    }
+
+    public String getCcJyZbzm()
+    {
+        return ccJyZbzm;
+    }
+    public void setCcCbZb(String ccCbZb)
+    {
+        this.ccCbZb = ccCbZb;
+    }
+
+    public String getCcCbZb()
+    {
+        return ccCbZb;
+    }
+    public void setCcCbSwl(String ccCbSwl)
+    {
+        this.ccCbSwl = ccCbSwl;
+    }
+
+    public String getCcCbSwl()
+    {
+        return ccCbSwl;
+    }
+    public void setCcCbZbzm(String ccCbZbzm)
+    {
+        this.ccCbZbzm = ccCbZbzm;
+    }
+
+    public String getCcCbZbzm()
+    {
+        return ccCbZbzm;
+    }
+    public void setCcMqZb(String ccMqZb)
+    {
+        this.ccMqZb = ccMqZb;
+    }
+
+    public String getCcMqZb()
+    {
+        return ccMqZb;
+    }
+    public void setCcMqSwl(String ccMqSwl)
+    {
+        this.ccMqSwl = ccMqSwl;
+    }
+
+    public String getCcMqSwl()
+    {
+        return ccMqSwl;
+    }
+    public void setCcMqZbzm(String ccMqZbzm)
+    {
+        this.ccMqZbzm = ccMqZbzm;
+    }
+
+    public String getCcMqZbzm()
+    {
+        return ccMqZbzm;
+    }
+    public void setCcDianZb(String ccDianZb)
+    {
+        this.ccDianZb = ccDianZb;
+    }
+
+    public String getCcDianZb()
+    {
+        return ccDianZb;
+    }
+    public void setCcDianSwl(String ccDianSwl)
+    {
+        this.ccDianSwl = ccDianSwl;
+    }
+
+    public String getCcDianSwl()
+    {
+        return ccDianSwl;
+    }
+    public void setCcDianZbzm(String ccDianZbzm)
+    {
+        this.ccDianZbzm = ccDianZbzm;
+    }
+
+    public String getCcDianZbzm()
+    {
+        return ccDianZbzm;
+    }
+    public void setCcZqZb(String ccZqZb)
+    {
+        this.ccZqZb = ccZqZb;
+    }
+
+    public String getCcZqZb()
+    {
+        return ccZqZb;
+    }
+    public void setCcZqSwl(String ccZqSwl)
+    {
+        this.ccZqSwl = ccZqSwl;
+    }
+
+    public String getCcZqSwl()
+    {
+        return ccZqSwl;
+    }
+    public void setCcZqZbzm(String ccZqZbzm)
+    {
+        this.ccZqZbzm = ccZqZbzm;
+    }
+
+    public String getCcZqZbzm()
+    {
+        return ccZqZbzm;
+    }
+    public void setTimeType(TimeType timeType)
+    {
+        this.timeType = timeType;
+    }
+
+    public TimeType getTimeType()
+    {
+        return timeType;
+    }
+    public void setTimeCode(String timeCode)
+    {
+        this.timeCode = timeCode;
+    }
+
+    public String getTimeCode()
+    {
+        return timeCode;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public String getTrZbzm() {
+        return trZbzm;
+    }
+
+    public void setTrZbzm(String trZbzm) {
+        this.trZbzm = trZbzm;
+    }
+
+    public String getCcZbzm() {
+        return ccZbzm;
+    }
+
+    public void setCcZbzm(String ccZbzm) {
+        this.ccZbzm = ccZbzm;
+    }
+
+    public String getJhbm() {
+        return jhbm;
+    }
+
+    public void setJhbm(String jhbm) {
+        this.jhbm = jhbm;
+    }
+
+    public String getZhnh() {
+        return zhnh;
+    }
+
+    public void setZhnh(String zhnh) {
+        this.zhnh = zhnh;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("trRljmZb", getTrRljmZb())
+                .append("trRljmSwl", getTrRljmSwl())
+                .append("trRljmZbzm", getTrRljmZbzm())
+                .append("trDianZb", getTrDianZb())
+                .append("trDianSwl", getTrDianSwl())
+                .append("trDianZbzm", getTrDianZbzm())
+                .append("trShuiZb", getTrShuiZb())
+                .append("trShuiSwl", getTrShuiSwl())
+                .append("trShuiZbzm", getTrShuiZbzm())
+                .append("trZqZb", getTrZqZb())
+                .append("trZqSwl", getTrZqSwl())
+                .append("trZqZbzm", getTrZqZbzm())
+                .append("ccJtZb", getCcJtZb())
+                .append("ccJtSwl", getCcJtSwl())
+                .append("ccJtZbzm", getCcJtZbzm())
+                .append("ccJyZb", getCcJyZb())
+                .append("ccJySwl", getCcJySwl())
+                .append("ccJyZbzm", getCcJyZbzm())
+                .append("ccCbZb", getCcCbZb())
+                .append("ccCbSwl", getCcCbSwl())
+                .append("ccCbZbzm", getCcCbZbzm())
+                .append("ccMqZb", getCcMqZb())
+                .append("ccMqSwl", getCcMqSwl())
+                .append("ccMqZbzm", getCcMqZbzm())
+                .append("ccDianZb", getCcDianZb())
+                .append("ccDianSwl", getCcDianSwl())
+                .append("ccDianZbzm", getCcDianZbzm())
+                .append("ccZqZb", getCcZqZb())
+                .append("ccZqSwl", getCcZqSwl())
+                .append("ccZqZbzm", getCcZqZbzm())
+                .append("timeType", getTimeType())
+                .append("createTime", getCreateTime())
+                .append("createBy", getCreateBy())
+                .append("updateTime", getUpdateTime())
+                .append("updateBy", getUpdateBy())
+                .append("remark", getRemark())
+                .append("timeCode", getTimeCode())
+                .append("dataTime", getDataTime())
+                .append("trZbzm", getTrZbzm())
+                .append("ccZbzm", getCcZbzm())
+                .append("jhbm", getJhbm())
+                .append("zhnh", getZhnh())
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dailyReport.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dailyReport.java
new file mode 100644
index 0000000..db3adb4
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dailyReport.java
@@ -0,0 +1,326 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.project.energyStatistics.domain.EnergyConsumption;
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+public class dailyReport implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "0鏃�")
+    private Double value0;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<dailyReport> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue0() {
+        return value0;
+    }
+
+    public void setValue0(Double value0) {
+        this.value0 = value0;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<dailyReport> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<dailyReport> tabledata) {
+        this.tabledata = tabledata;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dto/ComprehensiveReportsDTO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dto/ComprehensiveReportsDTO.java
new file mode 100644
index 0000000..b8e0588
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/dto/ComprehensiveReportsDTO.java
@@ -0,0 +1,39 @@
+package com.dingzhuo.energy.project.reportForm.domain.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 缁煎悎鎶ヨ〃璇锋眰绫�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/16
+ */
+@Data
+public class ComprehensiveReportsDTO {
+
+    /**
+     * 妯″瀷code
+     */
+    @NotBlank(message = "妯″瀷缂栫爜涓虹┖")
+    private String modeCode;
+
+    /**
+     * 鏌ヨ鏃堕棿
+     */
+    @NotNull(message = "鏈壘鍒版煡璇㈡椂闂�")
+    @DateTimeFormat(pattern = "yyyy-MM")
+    @JsonFormat(pattern = "yyyy-MM")
+    private Date time;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    private String energyType;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/monthlyReport.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/monthlyReport.java
new file mode 100644
index 0000000..badc9a7
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/monthlyReport.java
@@ -0,0 +1,406 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import com.dingzhuo.energy.project.energyStatistics.domain.EnergyConsumption;
+import com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG;
+
+import java.io.Serializable;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-12-31
+ */
+public class monthlyReport implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    @Excel(name = "24鏃�")
+    private Double value24;
+    @Excel(name = "25鏃�")
+    private Double value25;
+    @Excel(name = "26鏃�")
+    private Double value26;
+    @Excel(name = "27鏃�")
+    private Double value27;
+    @Excel(name = "28鏃�")
+    private Double value28;
+    @Excel(name = "29鏃�")
+    private Double value29;
+    @Excel(name = "30鏃�")
+    private Double value30;
+    @Excel(name = "31鏃�")
+    private Double value31;
+
+    private Integer count;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<monthlyReport> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue24() {
+        return value24;
+    }
+
+    public void setValue24(Double value24) {
+        this.value24 = value24;
+    }
+
+    public Double getValue25() {
+        return value25;
+    }
+
+    public void setValue25(Double value25) {
+        this.value25 = value25;
+    }
+
+    public Double getValue26() {
+        return value26;
+    }
+
+    public void setValue26(Double value26) {
+        this.value26 = value26;
+    }
+
+    public Double getValue27() {
+        return value27;
+    }
+
+    public void setValue27(Double value27) {
+        this.value27 = value27;
+    }
+
+    public Double getValue28() {
+        return value28;
+    }
+
+    public void setValue28(Double value28) {
+        this.value28 = value28;
+    }
+
+    public Double getValue29() {
+        return value29;
+    }
+
+    public void setValue29(Double value29) {
+        this.value29 = value29;
+    }
+
+    public Double getValue30() {
+        return value30;
+    }
+
+    public void setValue30(Double value30) {
+        this.value30 = value30;
+    }
+
+    public Double getValue31() {
+        return value31;
+    }
+
+    public void setValue31(Double value31) {
+        this.value31 = value31;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<monthlyReport> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<monthlyReport> tabledata) {
+        this.tabledata = tabledata;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportForm.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportForm.java
new file mode 100644
index 0000000..d50298a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportForm.java
@@ -0,0 +1,276 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+import java.time.Instant;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class reportForm extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private String code;
+    private String name;
+    private String nodeId;
+    private String parentId;
+    private String address;
+    private String modelCode;
+    private String nodeCategory;
+    private String orderNum;
+    private String indexId;
+    private String indexType;
+    private String value;
+    private String dataTime;
+    private String timeDate;
+    private String parentName;
+    private String timeYear;
+    private TimeType timeType;
+    private String value1;
+    private String value2;
+    private String value3;
+    private String value4;
+    private String value5;
+    private String value6;
+    private String value7;
+    private String value8;
+    private String value9;
+    private String value10;
+    private String value11;
+    private String value12;
+    private String value13;
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNodeId() {
+        return nodeId;
+    }
+
+    public void setNodeId(String nodeId) {
+        this.nodeId = nodeId;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getAddress() {
+        return address;
+    }
+
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
+    public String getModelCode() {
+        return modelCode;
+    }
+
+    public void setModelCode(String modelCode) {
+        this.modelCode = modelCode;
+    }
+
+    public String getNodeCategory() {
+        return nodeCategory;
+    }
+
+    public void setNodeCategory(String nodeCategory) {
+        this.nodeCategory = nodeCategory;
+    }
+
+    public String getOrderNum() {
+        return orderNum;
+    }
+
+    public void setOrderNum(String orderNum) {
+        this.orderNum = orderNum;
+    }
+
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexType() {
+        return indexType;
+    }
+
+    public void setIndexType(String indexType) {
+        this.indexType = indexType;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(String dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public String getTimeDate() {
+        return timeDate;
+    }
+
+    public void setTimeDate(String timeDate) {
+        this.timeDate = timeDate;
+    }
+
+    public String getParentName() {
+        return parentName;
+    }
+
+    public void setParentName(String parentName) {
+        this.parentName = parentName;
+    }
+
+    public String getTimeYear() {
+        return timeYear;
+    }
+
+    public void setTimeYear(String timeYear) {
+        this.timeYear = timeYear;
+    }
+
+    public TimeType getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(TimeType timeType) {
+        this.timeType = timeType;
+    }
+
+    public String getValue1() {
+        return value1;
+    }
+
+    public void setValue1(String value1) {
+        this.value1 = value1;
+    }
+
+    public String getValue2() {
+        return value2;
+    }
+
+    public void setValue2(String value2) {
+        this.value2 = value2;
+    }
+
+    public String getValue3() {
+        return value3;
+    }
+
+    public void setValue3(String value3) {
+        this.value3 = value3;
+    }
+
+    public String getValue4() {
+        return value4;
+    }
+
+    public void setValue4(String value4) {
+        this.value4 = value4;
+    }
+
+    public String getValue5() {
+        return value5;
+    }
+
+    public void setValue5(String value5) {
+        this.value5 = value5;
+    }
+
+    public String getValue6() {
+        return value6;
+    }
+
+    public void setValue6(String value6) {
+        this.value6 = value6;
+    }
+
+    public String getValue7() {
+        return value7;
+    }
+
+    public void setValue7(String value7) {
+        this.value7 = value7;
+    }
+
+    public String getValue8() {
+        return value8;
+    }
+
+    public void setValue8(String value8) {
+        this.value8 = value8;
+    }
+
+    public String getValue9() {
+        return value9;
+    }
+
+    public void setValue9(String value9) {
+        this.value9 = value9;
+    }
+
+    public String getValue10() {
+        return value10;
+    }
+
+    public void setValue10(String value10) {
+        this.value10 = value10;
+    }
+
+    public String getValue11() {
+        return value11;
+    }
+
+    public void setValue11(String value11) {
+        this.value11 = value11;
+    }
+
+    public String getValue12() {
+        return value12;
+    }
+
+    public void setValue12(String value12) {
+        this.value12 = value12;
+    }
+
+    public String getValue13() {
+        return value13;
+    }
+
+    public void setValue13(String value13) {
+        this.value13 = value13;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSet.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSet.java
new file mode 100644
index 0000000..df75d69
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSet.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Date;
+import java.math.BigDecimal;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: report_set
+ * @Author: jeecg-boot
+ * @Date:   2022-04-01
+ * @Version: V1.0
+ */
+@Data
+public class reportSet implements Serializable {
+	/**id*/
+    @ApiModelProperty(value = "id")
+    private String id;
+	/**indexId*/
+    @ApiModelProperty(value = "indexId")
+    private String indexId;
+	/**鏃堕棿绫诲瀷锛欴AY/MONTH*/
+    @ApiModelProperty(value = "鏃堕棿绫诲瀷锛欴AY/MONTH")
+    private String dateType;
+    /**
+     * 鏃堕棿绫诲瀷鏄剧ず瀛楃涓�
+     */
+    private String dateTypeShow;
+	/**涓婇檺鍊�*/
+    @ApiModelProperty(value = "涓婇檺鍊�")
+    private String limitValUp;
+	/**createTime*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "createTime")
+    private Date createTime;
+	/**createBy*/
+    @ApiModelProperty(value = "createBy")
+    private String createBy;
+	/**updateTime*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "updateTime")
+    private Date updateTime;
+	/**updateBy*/
+    @ApiModelProperty(value = "updateBy")
+    private String updateBy;
+	/**涓嬮檺鍊�*/
+    @ApiModelProperty(value = "涓嬮檺鍊�")
+    private String limitValDown;
+	/**nodeId*/
+    @ApiModelProperty(value = "nodeId")
+    private String nodeId;
+	/**涓婇檺鏇挎崲鍊�*/
+    @ApiModelProperty(value = "涓婇檺鏇挎崲鍊�")
+    private String limitReplaceValUp;
+	/**涓嬮檺鏇挎崲鍊�*/
+    @ApiModelProperty(value = "涓嬮檺鏇挎崲鍊�")
+    private String limitReplaceValDown;
+
+    /** 鏄惁鍚敤闄愬�兼浛鎹�*/
+    @ApiModelProperty(value = "鏄惁鍚敤闄愬�兼浛鎹�")
+    private Integer enableLimitValue;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetDataModel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetDataModel.java
new file mode 100644
index 0000000..4e4fd7d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetDataModel.java
@@ -0,0 +1,20 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import lombok.Data;
+
+/**
+ * @Description: 鑾峰彇鑺傜偣涓嬬殑鐐逛綅鍒楄〃
+ * @author: yxw
+ * @date: 2022骞�04鏈�01鏃� 18:30
+ */
+@Data
+public class reportSetDataModel {
+
+    private String indexId;
+    private String indexCode;
+    private String indexName;
+    private String meterId;
+    private String meterName;
+    /** 鏄惁鍚敤闄愬�兼浛鎹�*/
+    private boolean enableLimitValue;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetRequestModel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetRequestModel.java
new file mode 100644
index 0000000..df36938
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/reportSetRequestModel.java
@@ -0,0 +1,22 @@
+package com.dingzhuo.energy.project.reportForm.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+/**
+ * @Description: 鑾峰彇涓婃姤鑺傜偣閰嶇疆鍒楄〃璇锋眰鍙傛暟瀹炰綋
+ * @author: yxw
+ * @date: 2022骞�04鏈�01鏃� 11:04
+ */
+@Data
+public class reportSetRequestModel {
+    /**
+     * nodeid
+     */
+    @Excel(name = "鑺傜偣ID")
+    private String nodeId;
+    /**
+     * 鎸囨爣id
+     */
+    private String indexId;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveConsumptionRatioVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveConsumptionRatioVO.java
new file mode 100644
index 0000000..e2f2f57
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveConsumptionRatioVO.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.project.reportForm.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 缁煎悎鎶ヨ〃鏌ヨ鑳借�楀崰姣斾俊鎭繑鍥� VO
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Data
+public class ComprehensiveConsumptionRatioVO {
+
+
+    /**
+     * 鑳芥簮绫诲瀷鍚嶇О
+     */
+    private String item;
+
+    /**
+     * 鑳芥簮绫诲瀷
+     */
+    private String energyType;
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鍚堣鍊�
+     */
+    private BigDecimal count;
+
+    /**
+     * 鍗犳瘮
+     */
+    private BigDecimal percent;
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsItem.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsItem.java
new file mode 100644
index 0000000..4bf6758
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsItem.java
@@ -0,0 +1,41 @@
+package com.dingzhuo.energy.project.reportForm.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 缁煎悎鎶ヨ〃杩斿洖璇︾粏淇℃伅
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/16
+ */
+@Data
+public class ComprehensiveReportsItem {
+
+    /**
+     * 鐢ㄨ兘鍗曞厓
+     */
+    private String energyUnit;
+
+    /**
+     * 骞翠唤1
+     */
+    private BigDecimal value;
+
+    /**
+     * 骞翠唤2
+     */
+    private BigDecimal value2;
+
+    /**
+     * 骞翠唤3
+     */
+    private BigDecimal value3;
+
+    /**
+     * 骞翠唤4
+     */
+    private BigDecimal value4;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsVO.java
new file mode 100644
index 0000000..163f548
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveReportsVO.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.project.reportForm.domain.vo;
+
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 缁煎悎鎶ヨ〃杩斿洖绫�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/16
+ */
+@Data
+public class ComprehensiveReportsVO {
+
+    /**
+     * MC鐢ㄧ數鎬婚噺
+     */
+    private List<ComprehensiveReportsItem> reportsItemList;
+
+    /**
+     * 缁煎悎鑳借�楁姌绾垮浘
+     */
+    private List<ComprehensiveReportsItem> chart;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveUnitConsumptionChartVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveUnitConsumptionChartVO.java
new file mode 100644
index 0000000..53cffcc
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/domain/vo/ComprehensiveUnitConsumptionChartVO.java
@@ -0,0 +1,37 @@
+package com.dingzhuo.energy.project.reportForm.domain.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+/**
+ * 缁煎悎鎶ヨ〃鑾峰彇鑳借�楄澶囧崰姣斾俊鎭� 杩斿洖 vo
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Data
+public class ComprehensiveUnitConsumptionChartVO {
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鍊�
+     */
+    private BigDecimal value;
+
+    /**
+     * 鍚堣鍊�
+     */
+    private BigDecimal total;
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/annualReportMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/annualReportMapper.java
new file mode 100644
index 0000000..ef84392
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/annualReportMapper.java
@@ -0,0 +1,24 @@
+package com.dingzhuo.energy.project.reportForm.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.annualReport;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface annualReportMapper {
+    public List<annualReport> getannualReportList(@Param("indexIds") List<String> indexIds,
+                                                @Param("dataList") List<annualReport> dataList,
+                                                @Param("beginTime") Date beginTime,
+                                                @Param("endTime") Date endTime,
+                                                @Param("timeType") TimeType timeType,
+                                                @Param("indexStorageId")  String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/consolidatedStatementsMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/consolidatedStatementsMapper.java
new file mode 100644
index 0000000..9b85605
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/consolidatedStatementsMapper.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.reportForm.mapper;
+
+import com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements;
+import java.util.List;
+
+/**
+ * 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃Mapper鎺ュ彛
+ * 
+ * @author sys
+ * @date 2021-01-15
+ */
+public interface consolidatedStatementsMapper 
+{
+    /**
+     * 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param id 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     */
+    public consolidatedStatements selectconsolidatedStatementsById(String id);
+
+    /**
+     * 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃鍒楄〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃闆嗗悎
+     */
+    public List<consolidatedStatements> selectconsolidatedStatementsList(consolidatedStatements consolidatedStatements);
+
+    /**
+     * 鏂板鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 缁撴灉
+     */
+    public int insertconsolidatedStatements(consolidatedStatements consolidatedStatements);
+
+    /**
+     * 淇敼鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 缁撴灉
+     */
+    public int updateconsolidatedStatements(consolidatedStatements consolidatedStatements);
+
+    /**
+     * 鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param id 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 缁撴灉
+     */
+    public int deleteconsolidatedStatementsById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteconsolidatedStatementsByIds(String[] ids);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/dailyReportMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/dailyReportMapper.java
new file mode 100644
index 0000000..2bd98db
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/dailyReportMapper.java
@@ -0,0 +1,36 @@
+package com.dingzhuo.energy.project.reportForm.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface dailyReportMapper {
+    /*public List<DataItem> getDailyReportList(*//*@Param("indexIds") List<String> indexIds,
+                                             @Param("beginTime") Date beginTime,
+                                             @Param("endTime") Date endTime,
+                                             @Param("timeType") TimeType timeType*//*);*/
+    public List<dailyReport> getDailyReportList(@Param("indexIds") List<String> indexIds,
+                                                @Param("dataList") List<dailyReport> dataList,
+                                                @Param("beginTime") Date beginTime,
+                                                @Param("endTime") Date endTime,
+                                                @Param("timeType") TimeType timeType,
+                                                @Param("indexStorageId")  String indexStorageId);
+
+    public List<dailyReport> listDailyReportList(@Param("nodeId") String nodeId,
+                                                @Param("dataList") List<dailyReport> dataList,
+                                                @Param("beginTime") Date beginTime,
+                                                @Param("endTime") Date endTime,
+                                                @Param("timeType") TimeType timeType,
+                                                @Param("indexStorageId")  String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/monthlyReportMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/monthlyReportMapper.java
new file mode 100644
index 0000000..2c6318c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/monthlyReportMapper.java
@@ -0,0 +1,26 @@
+package com.dingzhuo.energy.project.reportForm.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.domain.monthlyReport;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface monthlyReportMapper {
+    public List<monthlyReport> getmonthlyReportList(@Param("indexIds") List<String> indexIds,
+                                                    @Param("dataList") List<monthlyReport> dataList,
+                                                    @Param("beginTime") Date beginTime,
+                                                    @Param("endTime") Date endTime,
+                                                    @Param("timeType") TimeType timeType,
+                                                    @Param("indexStorageId")  String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportFormMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportFormMapper.java
new file mode 100644
index 0000000..9ac6b14
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportFormMapper.java
@@ -0,0 +1,35 @@
+package com.dingzhuo.energy.project.reportForm.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface reportFormMapper {
+    public List<reportForm> selectReportFormList(@Param("code") String code);
+    public List<reportForm> selectReportFormListp(@Param("code") String code);
+    public List<reportForm> selectList(@Param("timeDate") String timeDate,
+                                       @Param("code") String code,
+                                       @Param("timeYear") String timeYear,
+                                       @Param("timeType") TimeType timeType);
+    /*public List<DataItem> getDailyReportList(*//*@Param("indexIds") List<String> indexIds,
+                                             @Param("beginTime") Date beginTime,
+                                             @Param("endTime") Date endTime,
+                                             @Param("timeType") TimeType timeType*//*);*/
+    public List<dailyReport> getDailyReportList(@Param("indexIds") List<String> indexIds,
+                                                @Param("dataList") List<dailyReport> dataList,
+                                                @Param("beginTime") Date beginTime,
+                                                @Param("endTime") Date endTime,
+                                                @Param("timeType") TimeType timeType,
+                                                @Param("indexStorageId")  String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportSetMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportSetMapper.java
new file mode 100644
index 0000000..49f24c5
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/mapper/reportSetMapper.java
@@ -0,0 +1,73 @@
+package com.dingzhuo.energy.project.reportForm.mapper;
+
+import java.util.List;
+
+import com.dingzhuo.energy.project.reportForm.domain.reportSet;
+import com.dingzhuo.energy.project.reportForm.domain.reportSetDataModel;
+import com.dingzhuo.energy.project.reportForm.domain.reportSetRequestModel;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @Description: report_set
+ * @Author: jeecg-boot
+ * @Date: 2022-04-01
+ * @Version: V1.0
+ */
+public interface reportSetMapper {
+    /**
+     * 鑾峰彇涓婃姤璁剧疆鍒楄〃
+     *
+     * @param nodeId  鑺傜偣id
+     * @param indexId 鎸囨爣id
+     * @return
+     */
+    List<reportSet> listReportSet(String nodeId, String indexId);
+    /**
+     * 鑾峰彇鑺傜偣涓嬫墍鏈夌殑涓婃姤璁剧疆鍒楄〃
+     *
+     * @param nodeId  鑺傜偣id
+     * @return
+     */
+    List<reportSet> listNodeReportSet(String nodeId);
+
+    /**
+     * 淇濆瓨涓婃姤閰嶇疆
+     *
+     * @param listMap
+     * @return
+     */
+    int saveReportSet(List<reportSet> listMap);
+
+    /**
+     * 鍒犻櫎璇ョ偣浣嶇殑涓婃姤閰嶇疆
+     *
+     * @param nodeId
+     * @param indexId
+     * @param username
+     * @return
+     */
+    int deleteReportSetByNodeId(String nodeId, String indexId, String username);
+
+    /**
+     * 鑾峰彇鑺傜偣涓嬬殑鐐逛綅鍒楄〃
+     * @param nodeId
+     * @param indexType
+     * @return
+     */
+    List<reportSetDataModel> listNodeIndex(String nodeId, String indexType);
+
+    /**
+     * 璁剧疆璇ョ偣浣嶇殑闄愬�煎惎鐢ㄧ姸鎬�
+     * @param nodeId
+     * @param indexId
+     * @param enableStatus 瑕佽缃殑鐘舵��
+     * @param username
+     * @return
+     */
+    int updateEnableStatus(String nodeId,String indexId, int enableStatus, String username);
+
+    /**
+     * 鏍规嵁鏃ユ湡绫诲瀷鑾峰彇涓婃姤璁剧疆
+     **/
+    List<reportSet> getAllEnableSetByDateType(@Param("dateType") String dateType);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IComprehensiveReportsService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IComprehensiveReportsService.java
new file mode 100644
index 0000000..3f5797a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IComprehensiveReportsService.java
@@ -0,0 +1,49 @@
+package com.dingzhuo.energy.project.reportForm.service;
+
+import com.dingzhuo.energy.project.reportForm.domain.dto.ComprehensiveReportsDTO;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveConsumptionRatioVO;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveReportsItem;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveUnitConsumptionChartVO;
+
+import java.util.List;
+
+/**
+ * 缁煎悎鎶ヨ〃 鎺ュ彛灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/16
+ */
+public interface IComprehensiveReportsService {
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鍒楄〃淇℃伅
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return
+     */
+    List<ComprehensiveReportsItem> listComprehensiveReport(ComprehensiveReportsDTO dto);
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鑳借�楀崰姣斾俊鎭�
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return
+     */
+    List<ComprehensiveConsumptionRatioVO> getEnergyConsumptionRatio(ComprehensiveReportsDTO dto);
+
+    /**
+     * 缁煎悎鎶ヨ〃鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return
+     */
+    List<ComprehensiveUnitConsumptionChartVO> getEnergyUnitConsumptionRatio(ComprehensiveReportsDTO dto);
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鐢ㄨ兘鍗曞厓鏌辩姸鍥句俊鎭�
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return
+     */
+    List<ComprehensiveReportsItem> listEnergyUnitComprehensiveReport(ComprehensiveReportsDTO dto);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IannualReportService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IannualReportService.java
new file mode 100644
index 0000000..d1502b7
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IannualReportService.java
@@ -0,0 +1,17 @@
+package com.dingzhuo.energy.project.reportForm.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.annualReport;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IannualReportService {
+    public List<annualReport> getannualReportList(List<String> indexIds, List<annualReport> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IconsolidatedStatementsService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IconsolidatedStatementsService.java
new file mode 100644
index 0000000..dba2969
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IconsolidatedStatementsService.java
@@ -0,0 +1,61 @@
+package com.dingzhuo.energy.project.reportForm.service;
+
+import com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements;
+import java.util.List;
+
+/**
+ * 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃Service鎺ュ彛
+ * 
+ * @author sys
+ * @date 2021-01-15
+ */
+public interface IconsolidatedStatementsService 
+{
+    /**
+     * 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param id 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     */
+    public consolidatedStatements selectconsolidatedStatementsById(String id);
+
+    /**
+     * 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃鍒楄〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃闆嗗悎
+     */
+    public List<consolidatedStatements> selectconsolidatedStatementsList(consolidatedStatements consolidatedStatements);
+
+    /**
+     * 鏂板鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 缁撴灉
+     */
+    public int insertconsolidatedStatements(consolidatedStatements consolidatedStatements);
+
+    /**
+     * 淇敼鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 缁撴灉
+     */
+    public int updateconsolidatedStatements(consolidatedStatements consolidatedStatements);
+
+    /**
+     * 鎵归噺鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 缁撴灉
+     */
+    public int deleteconsolidatedStatementsByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃淇℃伅
+     * 
+     * @param id 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 缁撴灉
+     */
+    public int deleteconsolidatedStatementsById(String id);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IdailyReportService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IdailyReportService.java
new file mode 100644
index 0000000..22ac2f2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IdailyReportService.java
@@ -0,0 +1,22 @@
+package com.dingzhuo.energy.project.reportForm.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IdailyReportService {
+    public List<dailyReport> getDailyReportList(List<String> indexIds,List<dailyReport> dataList, Date beginTime,
+                                                Date endTime, TimeType timeType,String indexStorageId);
+
+    public List<dailyReport> listDailyReportList(String nodeId,List<dailyReport> dataList, Date beginTime,
+                                                 Date endTime, TimeType timeType,String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/ImonthlyReportService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/ImonthlyReportService.java
new file mode 100644
index 0000000..7980638
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/ImonthlyReportService.java
@@ -0,0 +1,17 @@
+package com.dingzhuo.energy.project.reportForm.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.monthlyReport;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface ImonthlyReportService {
+    public List<monthlyReport> getMonthlyReporList(List<String> indexIds, List<monthlyReport> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportFormService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportFormService.java
new file mode 100644
index 0000000..7c44b01
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportFormService.java
@@ -0,0 +1,22 @@
+package com.dingzhuo.energy.project.reportForm.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IreportFormService {
+    public List<reportForm> selectReportFormList(String code);
+    public List<reportForm> selectReportFormListp(String code);
+    public List<reportForm> selectList(String timeDate, String code, String timeYear, TimeType timeType);
+    //public List<DataItem> getDailyReportList(List<String> indexIds, Date beginTime, Date endTime, TimeType timeType);
+    public List<dailyReport> getDailyReportList(List<String> indexIds,List<dailyReport> dataList, Date beginTime, Date endTime, TimeType timeType,String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportSetService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportSetService.java
new file mode 100644
index 0000000..74b9f6f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/IreportSetService.java
@@ -0,0 +1,48 @@
+package com.dingzhuo.energy.project.reportForm.service;
+
+import com.dingzhuo.energy.project.reportForm.domain.reportSet;
+import com.dingzhuo.energy.project.reportForm.domain.reportSetDataModel;
+import com.dingzhuo.energy.project.reportForm.domain.reportSetRequestModel;
+
+import java.util.List;
+
+/**
+ * 闃舵鏁版嵁褰曞叆鎺ュ彛
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IreportSetService {
+    /**
+     * 鑾峰彇涓婃姤璁剧疆鍒楄〃
+     *
+     * @param requestModel 鍙傛暟
+     * @return
+     */
+    List<reportSet> listReportSet(reportSetRequestModel requestModel);
+
+    /**
+     * 淇濆瓨涓婃姤閰嶇疆
+     *
+     * @param listMap
+     */
+    int saveReportSet(List<reportSet> listMap, String username);
+
+    /**
+     * 鑾峰彇鑺傜偣涓嬬殑鐐逛綅鍒楄〃
+     * @param nodeId
+     * @param indexType
+     * @return
+     */
+    List<reportSetDataModel> listNodeIndex(String nodeId, String indexType);
+
+    /**
+     * 璁剧疆璇ョ偣浣嶇殑闄愬�煎惎鐢ㄧ姸鎬�
+     * @param nodeId
+     * @param indexId
+     * @param enableStatus 瑕佽缃殑鐘舵��
+     * @param username
+     * @return
+     */
+    int updateEnableStatus(String nodeId,String indexId, boolean enableStatus, String username);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/AnnualReportFormServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/AnnualReportFormServiceImpl.java
new file mode 100644
index 0000000..67524ae
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/AnnualReportFormServiceImpl.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.project.reportForm.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.annualReport;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.mapper.annualReportMapper;
+import com.dingzhuo.energy.project.reportForm.mapper.reportFormMapper;
+import com.dingzhuo.energy.project.reportForm.service.IannualReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * stagseDataEntryService涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class AnnualReportFormServiceImpl implements IannualReportService {
+    @Autowired
+    private annualReportMapper annualReportMapper;
+
+    @Override
+    public List<annualReport> getannualReportList(List<String> indexIds, List<annualReport> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId) {
+        return annualReportMapper.getannualReportList(indexIds,dataList, beginTime, endTime, timeType,indexStorageId);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/ComprehensiveReportsServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/ComprehensiveReportsServiceImpl.java
new file mode 100644
index 0000000..b696220
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/ComprehensiveReportsServiceImpl.java
@@ -0,0 +1,347 @@
+package com.dingzhuo.energy.project.reportForm.service.impl;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.common.CommonConst;
+import com.dingzhuo.energy.project.dataEntry.service.IDataItemService;
+import com.dingzhuo.energy.project.reportForm.domain.dto.ComprehensiveReportsDTO;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveConsumptionRatioVO;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveReportsItem;
+import com.dingzhuo.energy.project.reportForm.domain.vo.ComprehensiveUnitConsumptionChartVO;
+import com.dingzhuo.energy.project.reportForm.service.IComprehensiveReportsService;
+import com.dingzhuo.energy.project.system.domain.SysDictData;
+import com.dingzhuo.energy.project.system.service.ISysConfigService;
+import com.dingzhuo.energy.project.system.service.ISysDictDataService;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+
+/**
+ * 缁煎悎鎶ヨ〃鎺ュ彛瀹炵幇灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/16
+ */
+@Service
+@AllArgsConstructor
+public class ComprehensiveReportsServiceImpl implements IComprehensiveReportsService {
+
+
+    private final IDataItemService dataItemService;
+
+    private final IModelNodeService modelNodeService;
+
+    private final ISysConfigService sysConfigService;
+
+    private final ISysDictDataService dictDataService;
+
+    private final IEnergyIndexService energyIndexService;
+
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鍒楄〃淇℃伅
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return
+     */
+    @Override
+    public List<ComprehensiveReportsItem> listComprehensiveReport(ComprehensiveReportsDTO dto) {
+        List<ComprehensiveReportsItem> ratio = new ArrayList<>();
+        // 鏍规嵁code鏌ヨmodel淇℃伅
+        ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dto.getModeCode());
+        if (ObjectUtils.isEmpty(modelNode)) {
+            return ratio;
+        }
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(modelNode.getNodeId());
+        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(indexIds)) {
+            return ratio;
+        }
+        // 濡傛灉濉叆浜嗚兘婧愮被鍨嬪垯闇�瑕佽繘琛岀瓫閫�
+        if (StringUtils.isNotEmpty(dto.getEnergyType())) {
+            List<EnergyIndex> energyIndexList = energyIndexService.getEnergyIndexByIds(indexIds).stream()
+                    .filter(li -> dto.getEnergyType().equals(li.getEnergyId())).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(energyIndexList)) {
+                return ratio;
+            }
+            indexIds = energyIndexList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        }
+        // 鍒嗙粍
+        Map<String, List<String>> nodeIndexMap = nodeIndexInforList.stream().collect(
+                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId,
+                        Collectors.mapping(ModelNodeIndexInfor::getIndexId, Collectors.toList())));
+        // 鏌ヨ鏁版嵁
+        Date time = dto.getTime();
+        AtomicReference<List<DataItem>> dataItemList = new AtomicReference<>();
+        AtomicReference<List<DataItem>> dataItemList2 = new AtomicReference<>();
+        AtomicReference<List<DataItem>> dataItemList3 = new AtomicReference<>();
+        AtomicReference<List<DataItem>> dataItemList4 = new AtomicReference<>();
+        for (int i = 0; i < CommonConst.DIGIT_4; i++) {
+            int offset = i * CommonConst.DIGIT_MINUS_1;
+            // 鑾峰彇鏌ヨ鏃堕棿
+            Date newDate = DateUtil.offset(time, DateField.YEAR, offset);
+            Date newEndDate = DateUtil.endOfMonth(newDate);
+            // 鏌ヨdataItem 鏁版嵁
+            switch (i) {
+                case 0:
+                    dataItemList.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+                case 1:
+                    dataItemList2.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+                case 2:
+                    dataItemList3.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+                default:
+                    dataItemList4.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+            }
+        }
+        // 瀵绘壘鍏崇郴
+        nodeIndexMap.forEach((key, value) -> {
+            ComprehensiveReportsItem reportsItem = new ComprehensiveReportsItem();
+            Optional<ModelNodeIndexInfor> first = nodeIndexInforList.stream().filter(li -> key.equals(li.getNodeId())).findFirst();
+            ModelNodeIndexInfor infor = first.get();
+            // 璁剧疆鍚嶇О
+            reportsItem.setEnergyUnit(infor.getName());
+            // 璁剧疆鍊�
+            BigDecimal sum = BigDecimal.valueOf(dataItemList.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            BigDecimal sum2 = BigDecimal.valueOf(dataItemList2.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            BigDecimal sum3 = BigDecimal.valueOf(dataItemList3.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            BigDecimal sum4 = BigDecimal.valueOf(dataItemList4.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            reportsItem.setValue(sum.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            reportsItem.setValue2(sum2.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            reportsItem.setValue3(sum3.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            reportsItem.setValue4(sum4.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            ratio.add(reportsItem);
+        });
+        return ratio;
+    }
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鐢ㄨ兘鍗曞厓鏌辩姸鍥句俊鎭�
+     *
+     * @param dto   璇锋眰鍙傛暟
+     * @return
+     */
+    @Override
+    public List<ComprehensiveReportsItem> listEnergyUnitComprehensiveReport(ComprehensiveReportsDTO dto) {
+        List<ComprehensiveReportsItem> ratio = new ArrayList<>();
+        // 鏍规嵁code鏌ヨmodel淇℃伅
+        ModelNode modelNode = modelNodeService.getModelNodeByModelCodeByIndexCode(dto.getModeCode());
+        if (ObjectUtils.isEmpty(modelNode)) {
+            return ratio;
+        }
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<ModelNodeIndexInfor> nodeIndexInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(modelNode.getNodeId());
+        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(indexIds)) {
+            return ratio;
+        }
+        // 濡傛灉濉叆浜嗚兘婧愮被鍨嬪垯闇�瑕佽繘琛岀瓫閫�
+        if (StringUtils.isNotEmpty(dto.getEnergyType())) {
+            List<EnergyIndex> energyIndexList = energyIndexService.getEnergyIndexByIds(indexIds).stream()
+                    .filter(li -> dto.getEnergyType().equals(li.getEnergyId())).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(energyIndexList)) {
+                return ratio;
+            }
+            indexIds = energyIndexList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        }
+        // 鍒嗙粍
+        Map<String, List<String>> nodeIndexMap = nodeIndexInforList.stream().collect(
+                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId,
+                        Collectors.mapping(ModelNodeIndexInfor::getIndexId, Collectors.toList())));
+        // 鏌ヨ鏁版嵁
+        Date time = dto.getTime();
+        AtomicReference<List<DataItem>> dataItemList = new AtomicReference<>();
+        AtomicReference<List<DataItem>> dataItemList2 = new AtomicReference<>();
+        AtomicReference<List<DataItem>> dataItemList3 = new AtomicReference<>();
+        AtomicReference<List<DataItem>> dataItemList4 = new AtomicReference<>();
+        for (int i = 0; i < CommonConst.DIGIT_4; i++) {
+            int offset = i * CommonConst.DIGIT_MINUS_1;
+            // 鑾峰彇鏌ヨ鏃堕棿
+            Date newDate = DateUtil.offset(time, DateField.YEAR, offset);
+            Date newEndDate = DateUtil.endOfMonth(newDate);
+            // 鏌ヨdataItem 鏁版嵁
+            switch (i) {
+                case 0:
+                    dataItemList.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+                case 1:
+                    dataItemList2.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+                case 2:
+                    dataItemList3.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+                default:
+                    dataItemList4.set(dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds));
+                    break;
+            }
+        }
+        // 瀵绘壘鍏崇郴
+        nodeIndexMap.forEach((key, value) -> {
+            ComprehensiveReportsItem charItem = new ComprehensiveReportsItem();
+            Optional<ModelNodeIndexInfor> first = nodeIndexInforList.stream().filter(li -> key.equals(li.getNodeId())).findFirst();
+            ModelNodeIndexInfor infor = first.get();
+            // 璁剧疆鍚嶇О
+            charItem.setEnergyUnit(infor.getName());
+            // 璁剧疆鍊�
+            BigDecimal sum = BigDecimal.valueOf(dataItemList.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            BigDecimal sum2 = BigDecimal.valueOf(dataItemList2.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            BigDecimal sum3 = BigDecimal.valueOf(dataItemList3.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            BigDecimal sum4 = BigDecimal.valueOf(dataItemList4.get().stream().filter(li -> value.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum());
+            charItem.setValue(sum.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            charItem.setValue2(sum2.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            charItem.setValue3(sum3.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            charItem.setValue4(sum4.setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP));
+            ratio.add(charItem);
+        });
+        return ratio;
+    }
+
+    /**
+     * 缁煎悎鎶ヨ〃鏌ヨ鑳借�楀崰姣斾俊鎭�
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return
+     */
+    @Override
+    public List<ComprehensiveConsumptionRatioVO> getEnergyConsumptionRatio(ComprehensiveReportsDTO dto) {
+        List<ComprehensiveConsumptionRatioVO> ratioVOList = new ArrayList<>();
+        // 鏌ヨ瀛楀吀鑾峰彇鎵�鏈夎兘婧愬悕瀛�
+        List<SysDictData> energyTypeDictist = dictDataService.selectDictDataByType("energy_type");
+        energyTypeDictist.forEach(energyType -> {
+            ComprehensiveConsumptionRatioVO ratioVO = new ComprehensiveConsumptionRatioVO();
+            ratioVO.setItem(energyType.getDictLabel());
+            ratioVO.setEnergyType(energyType.getDictValue());
+            ratioVOList.add(ratioVO);
+        });
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<String> indexIds = modelNodeService.listIndexIdsByModelCode(dto.getModeCode());
+        if (CollectionUtils.isEmpty(indexIds)) {
+            return ratioVOList;
+        }
+        // 鏌ヨ鐐逛綅璇︾粏淇℃伅
+        List<EnergyIndex> energyIndexInforList = energyIndexService.getEnergyIndexByIds(indexIds);
+        // 鑾峰彇鏌ヨ鏃堕棿
+        Date newDate = dto.getTime();
+        Date newEndDate = DateUtil.endOfMonth(newDate);
+        // 閫氳繃indexIds鎵綿ata_Item鏁版嵁
+        List<DataItem> itemList = dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds);
+        // 杞瑃ce鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_1000);
+        // 鎬诲悎璁″��
+        double sum = itemList.stream().mapToDouble(DataItem::getValue).sum();
+        BigDecimal totalValue = BigDecimal.valueOf(sum).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+        // 鑾峰彇鐐逛綅鑳芥簮绫诲瀷
+        Map<String, List<String>> energyTypeMap = energyIndexInforList.stream()
+                .filter(l -> StringUtils.isNotEmpty(l.getEnergyId()))
+                .collect(Collectors.groupingBy(
+                        EnergyIndex::getEnergyId, Collectors.mapping(EnergyIndex::getIndexId, Collectors.toList())
+                ));
+        AtomicReference<BigDecimal> totalRatio = new AtomicReference<>(BigDecimal.ZERO);
+        for (ComprehensiveConsumptionRatioVO ratioVO : ratioVOList) {
+            List<String> indexs = energyTypeMap.get(ratioVO.getEnergyType());
+            ratioVO.setUnit("tce");
+            if (CollectionUtils.isEmpty(indexs)) {
+                continue;
+            }
+            // 鎵惧埌鍚堣鍊�
+            double doubleCount = itemList.stream().filter(li -> indexs.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum();
+            BigDecimal count = BigDecimal.valueOf(doubleCount).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            BigDecimal ratio = BigDecimal.ZERO;
+            if (totalValue.compareTo(BigDecimal.ZERO) != 0 || count.compareTo(BigDecimal.ZERO) != 0) {
+                // 璁$畻姣斾緥
+                ratio = count.divide(totalValue, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+                // 瓒呰繃1鍒欑敤1鍓帀
+                if (totalRatio.get().add(ratio).compareTo(BigDecimal.ONE) > 0) {
+                    ratio = BigDecimal.ONE.subtract(totalRatio.get());
+                }
+            }
+            ratioVO.setCount(count);
+            ratioVO.setPercent(ratio);
+            totalRatio.set(totalRatio.get().add(ratio));
+        }
+        return ratioVOList;
+    }
+
+    /**
+     * 缁煎悎鎶ヨ〃鑾峰彇鑳借�楄澶囧崰姣斾俊鎭�
+     *
+     * @param dto 璇锋眰鍙傛暟
+     * @return
+     */
+    @Override
+    public List<ComprehensiveUnitConsumptionChartVO> getEnergyUnitConsumptionRatio(ComprehensiveReportsDTO dto) {
+        List<ComprehensiveUnitConsumptionChartVO> chartVOList = new ArrayList<>();
+        // 閫氳繃code鑾峰彇modelnode瀵瑰簲index淇℃伅
+        List<ModelNodeIndexInfor> inforList = modelNodeService.getModelNodeIndexIdRelationInforByCode(dto.getModeCode());
+        if (CollectionUtils.isEmpty(inforList)) {
+            return chartVOList;
+        }
+        List<String> indexIds = inforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        // 濡傛灉濉叆浜嗚兘婧愮被鍨嬪垯闇�瑕佽繘琛岀瓫閫�
+        if (StringUtils.isNotEmpty(dto.getEnergyType())) {
+            List<EnergyIndex> energyIndexList = energyIndexService.getEnergyIndexByIds(indexIds).stream().filter(li -> dto.getEnergyType().equals(li.getEnergyId())).collect(Collectors.toList());
+            if (CollectionUtils.isEmpty(energyIndexList)) {
+                return chartVOList;
+            }
+            indexIds = energyIndexList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+        }
+        // 鑾峰彇鏃堕棿缂栫爜
+        Date newDate = dto.getTime();
+        Date newEndDate = DateUtil.endOfMonth(newDate);
+        // 鏍规嵁鐐逛綅id鏌ヨdataitem
+        List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(newDate, newEndDate, TimeType.HOUR.name(), indexIds);
+        // 鍚堣鍊�
+        double totalSum = dataItemList.stream().mapToDouble(DataItem::getValue).sum();
+        BigDecimal totalValue = BigDecimal.valueOf(totalSum).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+        // 杞瑃ce鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_1000);
+        // 鏍规嵁鐢ㄨ兘鍗曞厓id鍒嗙粍
+        Map<String, List<ModelNodeIndexInfor>> nodeMap = inforList.stream().collect(Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
+        nodeMap.forEach((key, value) -> {
+            ComprehensiveUnitConsumptionChartVO chartVO = new ComprehensiveUnitConsumptionChartVO();
+            // 璁剧疆鍚嶅瓧
+            Optional<ModelNodeIndexInfor> first = value.stream().findFirst();
+            first.ifPresent(modelNodeIndexInfor -> chartVO.setName(modelNodeIndexInfor.getName()));
+            // 璁剧疆褰撳墠鍊�
+            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            double sum = dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId())).mapToDouble(DataItem::getValue).sum();
+            BigDecimal energyValue = BigDecimal.valueOf(sum).divide(multiple, CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            chartVO.setValue(energyValue);
+            chartVO.setUnit("tce");
+            // 璁剧疆鍚堣鍊�
+            chartVO.setTotal(totalValue);
+            chartVOList.add(chartVO);
+        });
+        return chartVOList;
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/consolidatedStatementsServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/consolidatedStatementsServiceImpl.java
new file mode 100644
index 0000000..094f984
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/consolidatedStatementsServiceImpl.java
@@ -0,0 +1,96 @@
+package com.dingzhuo.energy.project.reportForm.service.impl;
+
+import java.util.List;
+import com.dingzhuo.energy.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.reportForm.mapper.consolidatedStatementsMapper;
+import com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements;
+import com.dingzhuo.energy.project.reportForm.service.IconsolidatedStatementsService;
+
+/**
+ * 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃Service涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2021-01-15
+ */
+@Service
+public class consolidatedStatementsServiceImpl implements IconsolidatedStatementsService 
+{
+    @Autowired
+    private consolidatedStatementsMapper consolidatedStatementsMapper;
+
+    /**
+     * 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param id 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     */
+    @Override
+    public consolidatedStatements selectconsolidatedStatementsById(String id)
+    {
+        return consolidatedStatementsMapper.selectconsolidatedStatementsById(id);
+    }
+
+    /**
+     * 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃鍒楄〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     */
+    @Override
+    public List<consolidatedStatements> selectconsolidatedStatementsList(consolidatedStatements consolidatedStatements)
+    {
+        return consolidatedStatementsMapper.selectconsolidatedStatementsList(consolidatedStatements);
+    }
+
+    /**
+     * 鏂板鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertconsolidatedStatements(consolidatedStatements consolidatedStatements)
+    {
+        consolidatedStatements.setCreateTime(DateUtils.getNowDate());
+        return consolidatedStatementsMapper.insertconsolidatedStatements(consolidatedStatements);
+    }
+
+    /**
+     * 淇敼鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param consolidatedStatements 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateconsolidatedStatements(consolidatedStatements consolidatedStatements)
+    {
+        consolidatedStatements.setUpdateTime(DateUtils.getNowDate());
+        return consolidatedStatementsMapper.updateconsolidatedStatements(consolidatedStatements);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteconsolidatedStatementsByIds(String[] ids)
+    {
+        return consolidatedStatementsMapper.deleteconsolidatedStatementsByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃淇℃伅
+     * 
+     * @param id 鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteconsolidatedStatementsById(String id)
+    {
+        return consolidatedStatementsMapper.deleteconsolidatedStatementsById(id);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/dailyReportServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/dailyReportServiceImpl.java
new file mode 100644
index 0000000..920f88a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/dailyReportServiceImpl.java
@@ -0,0 +1,45 @@
+package com.dingzhuo.energy.project.reportForm.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.mapper.dailyReportMapper;
+import com.dingzhuo.energy.project.reportForm.service.IdailyReportService;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * stagseDataEntryService涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class dailyReportServiceImpl implements IdailyReportService {
+    @Autowired
+    private dailyReportMapper dailyReportMapper;
+
+    @Override
+    public List<dailyReport> getDailyReportList(List<String> indexIds, List<dailyReport> dataList, Date beginTime, Date endTime,
+                                                TimeType timeType, String indexStorageId) {
+        if (CollectionUtils.isNotEmpty(indexIds)) {
+            return dailyReportMapper.getDailyReportList(indexIds, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<dailyReport> listDailyReportList(String nodeId, List<dailyReport> dataList, Date beginTime,
+                                                 Date endTime, TimeType timeType, String indexStorageId) {
+
+        if (StringUtils.isNotEmpty(nodeId)) {
+            return dailyReportMapper.listDailyReportList(nodeId, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/monthlyReportServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/monthlyReportServiceImpl.java
new file mode 100644
index 0000000..ad542cf
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/monthlyReportServiceImpl.java
@@ -0,0 +1,30 @@
+package com.dingzhuo.energy.project.reportForm.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.domain.monthlyReport;
+import com.dingzhuo.energy.project.reportForm.mapper.monthlyReportMapper;
+import com.dingzhuo.energy.project.reportForm.mapper.reportFormMapper;
+import com.dingzhuo.energy.project.reportForm.service.ImonthlyReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * stagseDataEntryService涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class monthlyReportServiceImpl implements ImonthlyReportService {
+    @Autowired
+    private monthlyReportMapper monthlyReportMapper;
+
+    public List<monthlyReport> getMonthlyReporList(List<String> indexIds,List<monthlyReport> dataList, Date beginTime, Date endTime, TimeType timeType,String indexStorageId){
+        return monthlyReportMapper.getmonthlyReportList(indexIds,dataList, beginTime, endTime, timeType,indexStorageId);
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportFormServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportFormServiceImpl.java
new file mode 100644
index 0000000..70bb610
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportFormServiceImpl.java
@@ -0,0 +1,43 @@
+package com.dingzhuo.energy.project.reportForm.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+import com.dingzhuo.energy.project.reportForm.domain.reportForm;
+import com.dingzhuo.energy.project.reportForm.mapper.reportFormMapper;
+import com.dingzhuo.energy.project.reportForm.service.IreportFormService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * stagseDataEntryService涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class reportFormServiceImpl implements IreportFormService {
+    @Autowired
+    private reportFormMapper reportFormMapper;
+    public List<reportForm> selectReportFormList(String code){
+        return reportFormMapper.selectReportFormList(code);
+    }
+    public List<reportForm> selectReportFormListp(String code){
+        return reportFormMapper.selectReportFormListp(code);
+    }
+    public List<reportForm> selectList(String timeDate,String code,String timeYear,TimeType timeType){
+        return reportFormMapper.selectList(timeDate,code,timeYear,timeType);
+    }
+    /*public List<DataItem> getDailyReportList(List<String> indexIds, Date beginTime, Date endTime, TimeType timeType){
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return reportFormMapper.getDailyReportList(indexIds, beginTime, endTime, timeType);
+        }
+        return Collections.emptyList();
+        return reportFormMapper.getDailyReportList(*//*indexIds, beginTime, endTime, timeType*//*);
+    }*/
+    public List<dailyReport> getDailyReportList(List<String> indexIds,List<dailyReport> dataList, Date beginTime, Date endTime, TimeType timeType,String indexStorageId){
+        return reportFormMapper.getDailyReportList(indexIds,dataList, beginTime, endTime, timeType,indexStorageId);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportSetServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportSetServiceImpl.java
new file mode 100644
index 0000000..5fd76ac
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/reportForm/service/impl/reportSetServiceImpl.java
@@ -0,0 +1,120 @@
+package com.dingzhuo.energy.project.reportForm.service.impl;
+
+import com.dingzhuo.energy.project.common.CommonConst;
+import com.dingzhuo.energy.project.common.StringUtil;
+import com.dingzhuo.energy.project.reportForm.domain.reportSet;
+import com.dingzhuo.energy.project.reportForm.domain.reportSetDataModel;
+import com.dingzhuo.energy.project.reportForm.domain.reportSetRequestModel;
+import com.dingzhuo.energy.project.reportForm.mapper.reportSetMapper;
+import com.dingzhuo.energy.project.reportForm.service.IreportSetService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * stagseDataEntryService涓氬姟灞傚鐞�
+ *
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class reportSetServiceImpl implements IreportSetService {
+    @Autowired
+    private reportSetMapper reportSetMapper;
+
+    /**
+     * 鑾峰彇涓婃姤璁剧疆鍒楄〃
+     *
+     * @param requestModel 鍙傛暟
+     * @return
+     */
+    @Override
+    public List<reportSet> listReportSet(reportSetRequestModel requestModel) {
+        List<reportSet> models = reportSetMapper.listReportSet(requestModel.getNodeId(), requestModel.getIndexId());
+        if (models.isEmpty()) {
+            reportSet daySet = new reportSet();
+            daySet.setDateType("DAY");
+            daySet.setIndexId(requestModel.getIndexId());
+            daySet.setNodeId(requestModel.getNodeId());
+            models.add(daySet);
+            reportSet monthSet = new reportSet();
+            monthSet.setDateType("MONTH");
+            monthSet.setIndexId(requestModel.getIndexId());
+            monthSet.setNodeId(requestModel.getNodeId());
+            models.add(monthSet);
+        }
+        for (reportSet model : models) {
+            if ("DAY".equals(model.getDateType())) {
+                model.setDateTypeShow("鏃�");
+            } else {
+                model.setDateTypeShow("鏈�");
+            }
+        }
+        return models;
+    }
+
+    /**
+     * 淇濆瓨涓婃姤閰嶇疆
+     *
+     * @param listMap
+     */
+    @Override
+    public int saveReportSet(List<reportSet> listMap, String username) {
+        if (!listMap.isEmpty()) {
+            for (reportSet reportSet : listMap) {
+                reportSet.setCreateBy(username);
+                reportSet.setUpdateBy(username);
+                reportSet.setId(UUID.randomUUID().toString());
+            }
+            reportSet rs = listMap.get(0);
+            int delRes = reportSetMapper.deleteReportSetByNodeId(rs.getNodeId(), rs.getIndexId(), username);
+            int res = reportSetMapper.saveReportSet(listMap);
+        }
+
+        return 1;
+    }
+
+    /**
+     * 鑾峰彇鑺傜偣涓嬬殑鐐逛綅鍒楄〃
+     *
+     * @param nodeId
+     * @param indexType
+     * @return
+     */
+    @Override
+    public List<reportSetDataModel> listNodeIndex(String nodeId, String indexType) {
+        List<reportSetDataModel> models = reportSetMapper.listNodeIndex(nodeId, indexType);
+        List<reportSet> reportSetList = reportSetMapper.listNodeReportSet(nodeId);
+        for (reportSetDataModel model : models) {
+            reportSet rs = reportSetList.stream().filter(x -> StringUtil.ifEmptyOrNullReturnValue(x.getIndexId()).equals(model.getIndexId())).findAny().orElse(null);
+            if (rs != null) {
+                if (rs.getEnableLimitValue() != null) {
+                    model.setEnableLimitValue(rs.getEnableLimitValue() == CommonConst.DIGIT_1);
+                }
+            }
+        }
+        return models;
+    }
+
+    /**
+     * 璁剧疆璇ョ偣浣嶇殑闄愬�煎惎鐢ㄧ姸鎬�
+     *
+     * @param nodeId
+     * @param indexId
+     * @param enableStatus 瑕佽缃殑鐘舵��
+     * @param username
+     * @return
+     */
+    @Override
+    public int updateEnableStatus(String nodeId, String indexId, boolean enableStatus, String username) {
+        List<reportSet> models = reportSetMapper.listReportSet(nodeId, indexId);
+        if(models.isEmpty()){
+            return -1;
+        }
+        int intEnableStatus = enableStatus ? CommonConst.DIGIT_1 : CommonConst.DIGIT_0;
+        return reportSetMapper.updateEnableStatus(nodeId, indexId, intEnableStatus, username);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/controller/StatisticalAnalysisController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/controller/StatisticalAnalysisController.java
new file mode 100644
index 0000000..d7fce29
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/controller/StatisticalAnalysisController.java
@@ -0,0 +1,132 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.controller;
+
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.dto.DataAnalysisMoMDTO;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisMoMExcel;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisMoMVO;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisYoYExcel;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisYoYVO;
+import com.dingzhuo.energy.project.statisticalAnalysis.service.IStatisticalAnalysisService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 缁熻鍒嗘瀽 鎺у埗灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@RestController
+@RequestMapping("/statisticalAnalysis")
+public class StatisticalAnalysisController extends BaseController {
+
+    @Autowired
+    private IStatisticalAnalysisService analysisService;
+
+
+    @PostMapping("/getElectricDataComparisonYoY")
+    @ApiOperation(value = "鑾峰彇鐢佃兘鑰楀悓姣旀暟鎹�", notes = "鑾峰彇鐢佃兘鑰楀悓姣旀暟鎹�")
+    public AjaxResult listElectricDataComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisYoYVO> yoyList = analysisService.listElectricDataComparisonYoY(dto);
+        return AjaxResult.success(yoyList);
+    }
+
+    @PostMapping("/getElectricDataComparisonMoM")
+    @ApiOperation(value = "鑾峰彇鐢佃兘鑰楃幆姣旀暟鎹�", notes = "鑾峰彇鐢佃兘鑰楃幆姣旀暟鎹�")
+    public AjaxResult listElectricDataComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisMoMVO> momList = analysisService.listElectricDataComparisonMoM(dto);
+        return AjaxResult.success(momList);
+    }
+
+    @PostMapping("/getWaterDataComparisonYoY")
+    @ApiOperation(value = "鑾峰彇姘磋兘鑰楀悓姣旀暟鎹�", notes = "鑾峰彇姘磋兘鑰楀悓姣旀暟鎹�")
+    public AjaxResult listWaterDataComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisYoYVO> yoyList = analysisService.listWaterDataComparisonYoY(dto);
+        return AjaxResult.success(yoyList);
+    }
+
+    @PostMapping("/getWaterDataComparisonMoM")
+    @ApiOperation(value = "鑾峰彇姘磋兘鑰楃幆姣旀暟鎹�", notes = "鑾峰彇姘磋兘鑰楃幆姣旀暟鎹�")
+    public AjaxResult listWaterDataComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisMoMVO> momList = analysisService.listWaterDataComparisonMoM(dto);
+        return AjaxResult.success(momList);
+    }
+
+    @PostMapping("/exportElectricYoY")
+    @ApiOperation(value = "瀵煎嚭鐢佃兘鑰楀悓姣旀暟鎹�", notes = "瀵煎嚭鐢佃兘鑰楀悓姣旀暟鎹�")
+    public AjaxResult exportElectricComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisYoYExcel> yoYExcelsList = new ArrayList<>();
+        List<DataAnalysisYoYVO> yoYList = analysisService.listElectricDataComparisonYoY(dto);
+        if (CollectionUtils.isNotEmpty(yoYList)) {
+            for (DataAnalysisYoYVO vo : yoYList) {
+                DataAnalysisYoYExcel excel = new DataAnalysisYoYExcel();
+                BeanUtils.copyProperties(vo, excel);
+                yoYExcelsList.add(excel);
+            }
+        }
+        ExcelUtil<DataAnalysisYoYExcel> util = new ExcelUtil<>(DataAnalysisYoYExcel.class);
+        return util.exportExcel(yoYExcelsList, "鐢电患鍚堣兘鑰楀悓姣斾俊鎭�");
+    }
+
+    @PostMapping("/exportElectricMoM")
+    @ApiOperation(value = "瀵煎嚭鐢佃兘鑰楃幆姣旀暟鎹�", notes = "瀵煎嚭鐢佃兘鑰楃幆姣旀暟鎹�")
+    public AjaxResult exportElectricComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisMoMExcel> moMExcelsList = new ArrayList<>();
+        List<DataAnalysisMoMVO> moMList = analysisService.listElectricDataComparisonMoM(dto);
+        if (CollectionUtils.isNotEmpty(moMList)) {
+            for (DataAnalysisMoMVO vo : moMList) {
+                DataAnalysisMoMExcel excel = new DataAnalysisMoMExcel();
+                BeanUtils.copyProperties(vo, excel);
+                moMExcelsList.add(excel);
+            }
+        }
+        ExcelUtil<DataAnalysisMoMExcel> util = new ExcelUtil<>(DataAnalysisMoMExcel.class);
+        return util.exportRealTimeDataExcel(moMExcelsList, "鐢电患鍚堣兘鑰楃幆姣斾俊鎭�");
+    }
+
+    @PostMapping("/exportWaterYoY")
+    @ApiOperation(value = "瀵煎嚭姘磋�楀悓姣旀暟鎹�", notes = "瀵煎嚭姘磋�楀悓姣旀暟鎹�")
+    public AjaxResult exportWaterComparisonYoY(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisYoYExcel> yoYExcelsList = new ArrayList<>();
+        List<DataAnalysisYoYVO> yoYList = analysisService.listWaterDataComparisonYoY(dto);
+        if (CollectionUtils.isNotEmpty(yoYList)) {
+            for (DataAnalysisYoYVO vo : yoYList) {
+                DataAnalysisYoYExcel excel = new DataAnalysisYoYExcel();
+                BeanUtils.copyProperties(vo, excel);
+                yoYExcelsList.add(excel);
+            }
+        }
+        ExcelUtil<DataAnalysisYoYExcel> util = new ExcelUtil<>(DataAnalysisYoYExcel.class);
+        return util.exportExcel(yoYExcelsList, "姘寸患鍚堣兘鑰楄�楀悓姣斾俊鎭�");
+    }
+
+    @PostMapping("/exportWaterMoM")
+    @ApiOperation(value = "瀵煎嚭姘磋�楃幆姣旀暟鎹�", notes = "瀵煎嚭姘磋�楃幆姣旀暟鎹�")
+    public AjaxResult exportWaterComparisonMoM(@RequestBody @Validated DataAnalysisMoMDTO dto) {
+        List<DataAnalysisMoMExcel> moMExcelsList = new ArrayList<>();
+        List<DataAnalysisMoMVO> moMList = analysisService.listWaterDataComparisonMoM(dto);
+        if (CollectionUtils.isNotEmpty(moMList)) {
+            for (DataAnalysisMoMVO vo : moMList) {
+                DataAnalysisMoMExcel excel = new DataAnalysisMoMExcel();
+                BeanUtils.copyProperties(vo, excel);
+                moMExcelsList.add(excel);
+            }
+        }
+        ExcelUtil<DataAnalysisMoMExcel> util = new ExcelUtil<>(DataAnalysisMoMExcel.class);
+        return util.exportExcel(moMExcelsList, "姘寸患鍚堣兘鑰楄�楃幆姣斾俊鎭�");
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/dto/DataAnalysisMoMDTO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/dto/DataAnalysisMoMDTO.java
new file mode 100644
index 0000000..109a2fa
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/dto/DataAnalysisMoMDTO.java
@@ -0,0 +1,49 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.domain.dto;
+
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 鏁版嵁鍒嗘瀽鐜瘮 璇锋眰鍙傛暟
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/3
+ */
+@Data
+public class DataAnalysisMoMDTO {
+
+
+    /**
+     * 缁熻寮�濮嬫椂闂�
+     */
+    @NotNull(message = "璇风淮鎶ゆ煡璇㈡椂闂�")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "鎶ヨ寮�濮嬫椂闂�", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date beginTime;
+
+    /**
+     * 缁熻寮�濮嬫椂闂�
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "鎶ヨ寮�濮嬫椂闂�", dateFormat = "yyyy-MM-dd HH:mm:ss")
+    @NotNull(message = "璇风淮鎶ゆ煡璇㈡椂闂�")
+    private Date endTime;
+
+    /**
+     * 鏃堕棿绫诲瀷
+     */
+    @NotBlank(message = "鏈壘鍒版椂闂寸被鍨�")
+    private String timeType;
+
+    /**
+     * 妯″瀷鑺傜偣id
+     */
+    @NotBlank(message = "鏈壘鍒版ā鍨嬭妭鐐逛俊鎭�")
+    private String nodeId;
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMExcel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMExcel.java
new file mode 100644
index 0000000..e8d551e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMExcel.java
@@ -0,0 +1,48 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.domain.vo;
+
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鏁版嵁鍒嗘瀽鐜瘮 瀵煎嚭Excel
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/3
+ */
+@Data
+public class DataAnalysisMoMExcel {
+
+
+    /**
+     * 鐢ㄨ兘鍗曞厓鍚嶇О
+     */
+    @Excel(name = "鐢ㄨ兘鍗曞厓")
+    private String energyUnitName;
+
+    /**
+     * 鏈湡鍊�
+     */
+    @Excel(name = "鏈湡鍊�")
+    private BigDecimal currentValue;
+
+    /**
+     * 鍚屾湡鍊�
+     */
+    @Excel(name = "鍚屾湡鍊�")
+    private BigDecimal oldValue;
+
+    /**
+     * 鍚屾瘮鍊�
+     */
+    @Excel(name = "鍚屾瘮鍊�")
+    private BigDecimal ratio;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    private String unit;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMVO.java
new file mode 100644
index 0000000..18cec00
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisMoMVO.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鏁版嵁鍒嗘瀽鐜瘮 杩斿洖vo
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/3
+ */
+@Data
+public class DataAnalysisMoMVO {
+
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鐢ㄨ兘鍗曞厓鍚嶇О
+     */
+    private String energyUnitName;
+
+    /**
+     * 鏈湡鍊�
+     */
+    private BigDecimal currentValue;
+
+    /**
+     * 鍚屾湡鍊�
+     */
+    private BigDecimal oldValue;
+
+    /**
+     * 鍚屾瘮鍊�
+     */
+    private BigDecimal ratio;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYExcel.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYExcel.java
new file mode 100644
index 0000000..506fbcd
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYExcel.java
@@ -0,0 +1,48 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.domain.vo;
+
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鏁版嵁鍒嗘瀽鍚屾瘮 瀵煎嚭Excel
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/3
+ */
+@Data
+public class DataAnalysisYoYExcel {
+
+
+    /**
+     * 鐢ㄨ兘鍗曞厓鍚嶇О
+     */
+    @Excel(name = "鐢ㄨ兘鍗曞厓鍚嶇О")
+    private String energyUnitName;
+
+    /**
+     * 鏈湡鍊�
+     */
+    @Excel(name = "鏈湡鍊�")
+    private BigDecimal currentValue;
+
+    /**
+     * 鍚屾湡鍊�
+     */
+    @Excel(name = "鍚屾湡鍊�")
+    private BigDecimal oldValue;
+
+    /**
+     * 鍚屾瘮鍊�
+     */
+    @Excel(name = "鍚屾瘮鍊�")
+    private BigDecimal ratio;
+
+    /**
+     * 鍗曚綅
+     */
+    @Excel(name = "鍗曚綅")
+    private String unit;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYVO.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYVO.java
new file mode 100644
index 0000000..50e811e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/domain/vo/DataAnalysisYoYVO.java
@@ -0,0 +1,42 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.domain.vo;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 鏁版嵁鍒嗘瀽鍚屾瘮 杩斿洖vo
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/3
+ */
+@Data
+public class DataAnalysisYoYVO {
+
+
+    /**
+     * 鍗曚綅
+     */
+    private String unit;
+
+    /**
+     * 鐢ㄨ兘鍗曞厓鍚嶇О
+     */
+    private String energyUnitName;
+
+    /**
+     * 鏈湡鍊�
+     */
+    private BigDecimal currentValue;
+
+    /**
+     * 鍚屾湡鍊�
+     */
+    private BigDecimal oldValue;
+
+    /**
+     * 鍚屾瘮鍊�
+     */
+    private BigDecimal ratio;
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/IStatisticalAnalysisService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/IStatisticalAnalysisService.java
new file mode 100644
index 0000000..8ea84b7
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/IStatisticalAnalysisService.java
@@ -0,0 +1,49 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.service;
+
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.dto.DataAnalysisMoMDTO;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisMoMVO;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisYoYExcel;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisYoYVO;
+
+import java.util.List;
+
+/**
+ * 缁熻鍒嗘瀽  鎺ュ彛灞�
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+public interface IStatisticalAnalysisService {
+
+    /**
+     * 鑾峰彇鐢佃兘鑰楀悓姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    List<DataAnalysisYoYVO> listElectricDataComparisonYoY(DataAnalysisMoMDTO dto);
+
+    /**
+     * 鑾峰彇鐢佃兘鑰楃幆姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    List<DataAnalysisMoMVO> listElectricDataComparisonMoM(DataAnalysisMoMDTO dto);
+
+    /**
+     * 鑾峰彇鑳借�楀悓姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    List<DataAnalysisYoYVO> listWaterDataComparisonYoY(DataAnalysisMoMDTO dto);
+
+    /**
+     * 鑾峰彇鑳借�楃幆姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    List<DataAnalysisMoMVO> listWaterDataComparisonMoM(DataAnalysisMoMDTO dto);
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/impl/StatisticalAnalysisServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/impl/StatisticalAnalysisServiceImpl.java
new file mode 100644
index 0000000..b0ff8bd
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalAnalysis/service/impl/StatisticalAnalysisServiceImpl.java
@@ -0,0 +1,315 @@
+package com.dingzhuo.energy.project.statisticalAnalysis.service.impl;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateUtil;
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.data.model.domain.vo.ModelNodeIndexInfor;
+import com.dingzhuo.energy.data.model.service.IEnergyIndexService;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.project.common.CommonConst;
+import com.dingzhuo.energy.project.common.TimeTypeConst;
+import com.dingzhuo.energy.project.dataEntry.service.IDataItemService;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.dto.DataAnalysisMoMDTO;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisMoMVO;
+import com.dingzhuo.energy.project.statisticalAnalysis.domain.vo.DataAnalysisYoYVO;
+import com.dingzhuo.energy.project.statisticalAnalysis.service.IStatisticalAnalysisService;
+import lombok.AllArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 缁熻鍒嗘瀽  鎺ュ彛灞傚疄鐜板眰
+ *
+ * @Author: Zhujw
+ * @Date: 2023/3/1
+ */
+@Service
+@AllArgsConstructor
+public class StatisticalAnalysisServiceImpl implements IStatisticalAnalysisService {
+
+
+    private final IDataItemService dataItemService;
+
+    private final IModelNodeService modelNodeService;
+
+    private final IEnergyIndexService energyIndexService;
+
+
+    /**
+     * 鑾峰彇鐢佃兘鑰楀悓姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    @Override
+    public List<DataAnalysisYoYVO> listElectricDataComparisonYoY(DataAnalysisMoMDTO dto) {
+        List<DataAnalysisYoYVO> yoyList = new ArrayList<>();
+        // 鏌ヨ鐐逛綅涓庣敤鑳藉崟鍏冧俊鎭�
+        List<ModelNodeIndexInfor> nodeInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId());
+        if (CollectionUtils.isEmpty(nodeInforList)) {
+            return yoyList;
+        }
+        List<String> indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        // 鎸夌収鐐逛綅杩涜鍒嗙粍
+        Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeInforList.stream().collect(
+                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
+        // 鑾峰彇鏌ヨ鏃堕棿
+        Date beginTime = dto.getBeginTime();
+        Date endTime = dto.getEndTime();
+        // 鍚屾瘮鏃堕棿
+        Date lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        Date lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        // 鏌ヨ瀵瑰簲indexIds锛屾壘鍒板搴攄ataItem淇℃伅
+        List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds);
+        List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds);
+        //  鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
+        nodeIndexMap.forEach((key, value) -> {
+            DataAnalysisYoYVO yoyVO = new DataAnalysisYoYVO();
+            Optional<ModelNodeIndexInfor> first = value.stream().findFirst();
+            first.ifPresent(modelNodeIndexInfor -> yoyVO.setEnergyUnitName(modelNodeIndexInfor.getName()));
+            // 璧嬪�煎崟浣�
+            yoyVO.setUnit("kWh");
+            // 鎵惧嚭indexIds
+            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            // 姹傚拰
+            BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            yoyVO.setCurrentValue(sum);
+            yoyVO.setOldValue(lastSum);
+            //  鍚屾瘮鍊�
+            BigDecimal ratio = BigDecimal.ZERO;
+            if (lastSum.compareTo(BigDecimal.ZERO) != 0) {
+                ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple);
+            }
+            yoyVO.setRatio(ratio);
+            yoyList.add(yoyVO);
+        });
+        return yoyList;
+    }
+
+    /**
+     * 鑾峰彇鐢佃兘鑰楃幆姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    @Override
+    public List<DataAnalysisMoMVO> listElectricDataComparisonMoM(DataAnalysisMoMDTO dto) {
+        List<DataAnalysisMoMVO> momList = new ArrayList<>();
+        // 鏍规嵁id鏌ヨ鐐逛綅淇℃伅
+        List<ModelNodeIndexInfor> nodeIndexInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId());
+        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
+            return momList;
+        }
+        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        Date beginTime = dto.getBeginTime();
+        Date endTime = dto.getEndTime();
+        Date lastTime;
+        Date lastEndTime;
+        String queryTimeType = dto.getTimeType();
+        // 灏忔椂
+        if (TimeTypeConst.TIME_TYPE_HOUR.equals(queryTimeType)) {
+            lastTime = DateUtil.offsetHour(beginTime, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offsetHour(endTime, CommonConst.DIGIT_MINUS_1);
+            // 澶�
+        } else if (TimeTypeConst.TIME_TYPE_DAY.equals(queryTimeType)) {
+            lastTime = DateUtil.offsetDay(beginTime, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offsetDay(endTime, CommonConst.DIGIT_MINUS_1);
+            // 鏈�
+        } else if (TimeTypeConst.TIME_TYPE_MONTH.equals(queryTimeType)) {
+            lastTime = DateUtil.offsetMonth(beginTime, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offsetMonth(endTime, CommonConst.DIGIT_MINUS_1);
+            // 骞�
+        } else {
+            lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        }
+        // 鎸夌収鐐逛綅杩涜鍒嗙粍
+        Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeIndexInforList.stream().collect(
+                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
+        // 鏍规嵁indexId鏌ヨdataItem
+        List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds);
+        List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds);
+        //  鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
+        nodeIndexMap.forEach((key, value) -> {
+            DataAnalysisMoMVO momVO = new DataAnalysisMoMVO();
+            Optional<ModelNodeIndexInfor> first = value.stream().findFirst();
+            first.ifPresent(modelNodeIndexInfor -> momVO.setEnergyUnitName(modelNodeIndexInfor.getName()));
+            // 璧嬪�煎崟浣�
+            momVO.setUnit("kWh");
+            // 鎵惧嚭indexIds
+            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            // 姹傚拰
+            BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            momVO.setCurrentValue(sum);
+            momVO.setOldValue(lastSum);
+            //  鍚屾瘮鍊�
+            BigDecimal ratio = BigDecimal.ZERO;
+            if (lastSum.compareTo(BigDecimal.ZERO) != 0) {
+                ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple);
+            }
+            momVO.setRatio(ratio);
+            momList.add(momVO);
+        });
+        return momList;
+    }
+
+    /**
+     * 鑾峰彇鑳借�楀悓姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    @Override
+    public List<DataAnalysisYoYVO> listWaterDataComparisonYoY(DataAnalysisMoMDTO dto) {
+        List<DataAnalysisYoYVO> yoyList = new ArrayList<>();
+        // 鏌ヨ鐐逛綅涓庣敤鑳藉崟鍏冧俊鎭�
+        List<ModelNodeIndexInfor> nodeInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId());
+        if (CollectionUtils.isEmpty(nodeInforList)) {
+            return yoyList;
+        }
+        List<String> indexIds = nodeInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        // 鎸夌収鐐逛綅杩涜鍒嗙粍
+        Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeInforList.stream().collect(
+                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
+        // 鏃堕棿绫诲瀷
+        // 鑾峰彇鏌ヨ鏃堕棿
+        Date beginTime = dto.getBeginTime();
+        Date endTime = dto.getEndTime();
+        // 鍚屾瘮鏃堕棿
+        Date lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        Date lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        // 鏌ヨ瀵瑰簲indexIds锛屾壘鍒板搴攄ataItem淇℃伅
+        List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds);
+        List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds);
+        //  鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
+        nodeIndexMap.forEach((key, value) -> {
+            DataAnalysisYoYVO yoyVO = new DataAnalysisYoYVO();
+            Optional<ModelNodeIndexInfor> first = value.stream().findFirst();
+            first.ifPresent(modelNodeIndexInfor -> yoyVO.setEnergyUnitName(modelNodeIndexInfor.getName()));
+            // 璧嬪�煎崟浣�
+            yoyVO.setUnit("m鲁");
+            // 鎵惧嚭indexIds
+            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            // 姹傚拰
+            BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            yoyVO.setCurrentValue(sum);
+            yoyVO.setOldValue(lastSum);
+            //  鍚屾瘮鍊�
+            BigDecimal ratio = BigDecimal.ZERO;
+            if (lastSum.compareTo(BigDecimal.ZERO) != 0) {
+                ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple);
+            }
+            yoyVO.setRatio(ratio);
+            yoyList.add(yoyVO);
+        });
+        return yoyList;
+    }
+
+    /**
+     * 鑾峰彇鑳借�楃幆姣旀暟鎹�
+     *
+     * @param dto 鏌ヨ鍙傛暟
+     * @return
+     */
+    @Override
+    public List<DataAnalysisMoMVO> listWaterDataComparisonMoM(DataAnalysisMoMDTO dto) {
+        List<DataAnalysisMoMVO> momList = new ArrayList<>();
+        // 鏍规嵁id鏌ヨ鐐逛綅淇℃伅
+        List<ModelNodeIndexInfor> nodeIndexInforList = listModelNodeIndexIdRelationInfor(dto.getNodeId());
+        if (CollectionUtils.isEmpty(nodeIndexInforList)) {
+            return momList;
+        }
+        List<String> indexIds = nodeIndexInforList.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+        Date beginTime = dto.getBeginTime();
+        Date endTime = dto.getEndTime();
+        Date lastTime;
+        Date lastEndTime;
+        String queryTimeType = dto.getTimeType();
+        // 灏忔椂
+        if (TimeTypeConst.TIME_TYPE_HOUR.equals(queryTimeType)) {
+            lastTime = DateUtil.offsetHour(beginTime, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offsetHour(endTime, CommonConst.DIGIT_MINUS_1);
+            // 澶�
+        } else if (TimeTypeConst.TIME_TYPE_DAY.equals(queryTimeType)) {
+            lastTime = DateUtil.offsetDay(beginTime, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offsetDay(endTime, CommonConst.DIGIT_MINUS_1);
+            // 鏈�
+        } else if (TimeTypeConst.TIME_TYPE_MONTH.equals(queryTimeType)) {
+            lastTime = DateUtil.offsetMonth(beginTime, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offsetMonth(endTime, CommonConst.DIGIT_MINUS_1);
+            // 骞�
+        } else {
+            lastTime = DateUtil.offset(beginTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+            lastEndTime = DateUtil.offset(endTime, DateField.YEAR, CommonConst.DIGIT_MINUS_1);
+        }
+        // 鎸夌収鐐逛綅杩涜鍒嗙粍
+        Map<String, List<ModelNodeIndexInfor>> nodeIndexMap = nodeIndexInforList.stream().collect(
+                Collectors.groupingBy(ModelNodeIndexInfor::getNodeId));
+        // 鏌ヨ瀵瑰簲indexIds锛屾壘鍒板搴攄ataItem淇℃伅
+        List<DataItem> dataItemList = dataItemService.getDataItemHourInforByIndexIds(beginTime, endTime, TimeType.HOUR.name(), indexIds);
+        List<DataItem> lastDataItemList = dataItemService.getDataItemHourInforByIndexIds(lastTime, lastEndTime, TimeType.HOUR.name(), indexIds);
+        //  鍊嶇巼
+        BigDecimal multiple = BigDecimal.valueOf(CommonConst.DIGIT_100);
+        nodeIndexMap.forEach((key, value) -> {
+            DataAnalysisMoMVO momVO = new DataAnalysisMoMVO();
+            Optional<ModelNodeIndexInfor> first = value.stream().findFirst();
+            first.ifPresent(modelNodeIndexInfor -> momVO.setEnergyUnitName(modelNodeIndexInfor.getName()));
+            // 璧嬪�煎崟浣�
+            momVO.setUnit("m鲁");
+            // 鎵惧嚭indexIds
+            List<String> indexIdList = value.stream().map(ModelNodeIndexInfor::getIndexId).collect(Collectors.toList());
+            // 姹傚拰
+            BigDecimal sum = BigDecimal.valueOf(dataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            BigDecimal lastSum = BigDecimal.valueOf(lastDataItemList.stream().filter(li -> indexIdList.contains(li.getIndexId()))
+                    .mapToDouble(DataItem::getValue).sum()).setScale(CommonConst.DIGIT_2, RoundingMode.HALF_UP);
+            momVO.setCurrentValue(sum);
+            momVO.setOldValue(lastSum);
+            //  鍚屾瘮鍊�
+            BigDecimal ratio = BigDecimal.ZERO;
+            if (lastSum.compareTo(BigDecimal.ZERO) != 0) {
+                ratio = sum.subtract(lastSum).divide(lastSum, CommonConst.DIGIT_2, RoundingMode.HALF_UP).multiply(multiple);
+            }
+            momVO.setRatio(ratio);
+            momList.add(momVO);
+        });
+        return momList;
+    }
+
+    /**
+     * 鏌ヨ鐐逛綅涓庣敤鑳藉崟鍏冧俊鎭�
+     *
+     * @param nodeId
+     * @return
+     */
+    private List<ModelNodeIndexInfor> listModelNodeIndexIdRelationInfor(String nodeId) {
+        List<ModelNodeIndexInfor> nodeInforList = modelNodeService.listModelNodeIndexIdRelationInforByParentId(nodeId);
+        // 濡傛灉鏄┖瀛樺湪涓ょ鎯呭喌锛�1锛歩d鏈夐棶棰橈紝2锛氭渶搴曞眰
+        if (CollectionUtils.isEmpty(nodeInforList)) {
+            List<ModelNodeIndexInfor> inforList = modelNodeService.getModelNodeIndexIdRelationInforByNodeId(nodeId);
+            if (CollectionUtils.isNotEmpty(inforList)) {
+                nodeInforList.addAll(inforList);
+            }
+        }
+        return nodeInforList;
+    }
+
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/controller/GxdhCountController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/controller/GxdhCountController.java
new file mode 100644
index 0000000..ce400b1
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/controller/GxdhCountController.java
@@ -0,0 +1,117 @@
+package com.dingzhuo.energy.project.statisticalData.controller;
+
+import java.util.List;
+import java.util.UUID;
+
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCountIndex;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCount;
+import com.dingzhuo.energy.project.statisticalData.service.IGxdhCountService;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳紺ontroller
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+@RestController
+@RequestMapping("/statisticalData/gxdhcount")
+public class GxdhCountController extends BaseController
+{
+    @Autowired
+    private IGxdhCountService gxdhCountService;
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳藉垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('statisticalData:gxdhcount:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(GxdhCount gxdhCount)
+    {
+        startPage();
+        List<GxdhCount> list = gxdhCountService.selectGxdhCountList(gxdhCount);
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳藉垪琛�
+     */
+    @PreAuthorize("@ss.hasPermi('statisticalData:gxdhcount:export')")
+    @Log(title = "宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳�", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(GxdhCount gxdhCount)
+    {
+        List<GxdhCount> list = gxdhCountService.selectGxdhCountList(gxdhCount);
+        ExcelUtil<GxdhCount> util = new ExcelUtil<GxdhCount>(GxdhCount.class);
+        return util.exportExcel(list, "gxdhcount");
+    }
+
+    /**
+     * 鑾峰彇宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳借缁嗕俊鎭�
+     */
+    @PreAuthorize("@ss.hasPermi('statisticalData:gxdhcount:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") String id)
+    {
+        return AjaxResult.success(gxdhCountService.selectGxdhCountById(id));
+    }
+
+    /**
+     * 鏂板宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳�
+     */
+    @PreAuthorize("@ss.hasPermi('statisticalData:gxdhcount:add')")
+    @Log(title = "宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳�", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody GxdhCount gxdhCount)
+    {
+        gxdhCount.setId(UUID.randomUUID().toString());
+        return toAjax(gxdhCountService.insertGxdhCount(gxdhCount));
+    }
+
+    /**
+     * 淇敼宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳�
+     */
+    @PreAuthorize("@ss.hasPermi('statisticalData:gxdhcount:edit')")
+    @Log(title = "宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳�", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody GxdhCount gxdhCount)
+    {
+        return toAjax(gxdhCountService.updateGxdhCount(gxdhCount));
+    }
+
+    /**
+     * 鍒犻櫎宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳�
+     */
+    @PreAuthorize("@ss.hasPermi('statisticalData:gxdhcount:remove')")
+    @Log(title = "宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳�", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable String[] ids)
+    {
+        return toAjax(gxdhCountService.deleteGxdhCountByIds(ids));
+    }
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁℃寚鏍囪缃姛鑳藉垪琛�
+     */
+    @GetMapping("/listReportIndex")
+    public TableDataInfo list(GxdhCountIndex gxdhCountIndex)
+    {
+        List<GxdhCountIndex> list = gxdhCountService.selectGxdhCountIndexList(gxdhCountIndex);
+        return getDataTable(list);
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCount.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCount.java
new file mode 100644
index 0000000..0d71b43
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCount.java
@@ -0,0 +1,107 @@
+package com.dingzhuo.energy.project.statisticalData.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳藉璞� gxdh_count
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public class GxdhCount extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 閰嶇疆涓婚敭 */
+    private String id;
+
+    /** 浜у搧绫诲瀷 */
+    @Excel(name = "浜у搧绫诲瀷")
+    private String repProductType;
+
+    /** 鐢垫寚鏍� */
+    @Excel(name = "鐢垫寚鏍�")
+    private String electricIndex;
+
+    /** 鐓ゆ皵鎸囨爣 */
+    @Excel(name = "鐓ゆ皵鎸囨爣")
+    private String gasIndex;
+
+    /** 钂告苯鎸囨爣 */
+    @Excel(name = "钂告苯鎸囨爣")
+    private String steamIndex;
+
+    /** 鑳芥簮鍝佺 */
+    @Excel(name = "鑳芥簮鍝佺")
+    private String varietyType;
+
+    public void setId(String id) 
+    {
+        this.id = id;
+    }
+
+    public String getId() 
+    {
+        return id;
+    }
+    public void setRepProductType(String repProductType) 
+    {
+        this.repProductType = repProductType;
+    }
+
+    public String getRepProductType() 
+    {
+        return repProductType;
+    }
+    public void setElectricIndex(String electricIndex) 
+    {
+        this.electricIndex = electricIndex;
+    }
+
+    public String getElectricIndex() 
+    {
+        return electricIndex;
+    }
+    public void setGasIndex(String gasIndex) 
+    {
+        this.gasIndex = gasIndex;
+    }
+
+    public String getGasIndex() 
+    {
+        return gasIndex;
+    }
+    public void setSteamIndex(String steamIndex) 
+    {
+        this.steamIndex = steamIndex;
+    }
+
+    public String getSteamIndex() 
+    {
+        return steamIndex;
+    }
+    public void setVarietyType(String varietyType) 
+    {
+        this.varietyType = varietyType;
+    }
+
+    public String getVarietyType() 
+    {
+        return varietyType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("repProductType", getRepProductType())
+            .append("electricIndex", getElectricIndex())
+            .append("gasIndex", getGasIndex())
+            .append("steamIndex", getSteamIndex())
+            .append("varietyType", getVarietyType())
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCountIndex.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCountIndex.java
new file mode 100644
index 0000000..82e6bcc
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/domain/GxdhCountIndex.java
@@ -0,0 +1,425 @@
+package com.dingzhuo.energy.project.statisticalData.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳絖_鎸囨爣鍊� 椤甸潰鏄剧ず 瀵硅薄 GxdhCountIndex
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public class GxdhCountIndex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 閰嶇疆涓婚敭 */
+    private String index_id;
+
+    /** 浜у搧绫诲瀷  鐒︾偔  鐒︽补 绛夌瓑 6绉�*/
+    private String repProductType;
+
+    /** 鑳芥簮鍝佺  鑳芥簮娑堣�楅噺   浜у搧浜ч噺*/
+    private String varietyType;
+
+    /** 鍒嗙被  鐢�     鐓ゆ皵   钂告苯  */
+    private String FL;
+    /**鏌ヨ骞村害**/
+    private String selectYear;
+
+    private String 	a1;
+    private String 	a2;
+    private String 	a3;
+    private String 	a4;
+    private String 	a5;
+    private String 	a6;
+    private String 	a7;
+    private String 	a8;
+    private String 	a9;
+    private String 	a10;
+    private String 	a11;
+    private String 	a12;
+    private String 	a13;
+    private String 	a14;
+    private String 	a15;
+    private String 	a16;
+    private String 	a17;
+    private String 	a18;
+    private String 	a19;
+    private String 	a20;
+    private String 	a21;
+    private String 	a22;
+    private String 	a23;
+    private String 	a24;
+    private String 	a25;
+    private String 	a26;
+    private String 	a27;
+    private String 	a28;
+    private String 	a29;
+    private String 	a30;
+    private String 	a31;
+    private String 	a32;
+    private String 	a33;
+    private String 	a34;
+    private String 	a35;
+    private String 	a36;
+
+    public String getIndex_id() {
+        return index_id;
+    }
+
+    public void setIndex_id(String index_id) {
+        this.index_id = index_id;
+    }
+
+    public void setRepProductType(String repProductType)
+    {
+        this.repProductType = repProductType;
+    }
+
+    public String getRepProductType()
+    {
+        return repProductType;
+    }
+    public void setVarietyType(String varietyType)
+    {
+        this.varietyType = varietyType;
+    }
+
+    public String getVarietyType()
+    {
+        return varietyType;
+    }
+
+    public String getFL() {
+        return FL;
+    }
+
+    public void setFL(String FL) {
+        this.FL = FL;
+    }
+
+    public String getA1() {
+        return getNlfxVal(getNlfxVal(this.a1));
+    }
+
+    public void setA1(String a1) {
+        this.a1 = a1;
+    }
+
+    public String getA2() {
+        return getNlfxVal(this.a2);
+    }
+
+    public void setA2(String a2) {
+        this.a2 = a2;
+    }
+
+    public String getA3() {
+        return getNlfxVal(this.a3);
+    }
+
+    public void setA3(String a3) {
+        this.a3 = a3;
+    }
+
+    public String getA4() {
+        return getNlfxVal(this.a4);
+    }
+
+    public void setA4(String a4) {
+        this.a4 = a4;
+    }
+
+    public String getA5() {
+        return getNlfxVal(this.a5);
+    }
+
+    public void setA5(String a5) {
+        this.a5 = a5;
+    }
+
+    public String getA6() {
+        return getNlfxVal(this.a6);
+    }
+
+    public void setA6(String a6) {
+        this.a6 = a6;
+    }
+
+    public String getA7() {
+        return getNlfxVal(this.a7);
+    }
+
+    public void setA7(String a7) {
+        this.a7 = a7;
+    }
+
+    public String getA8() {
+        return getNlfxVal(this.a8);
+    }
+
+    public void setA8(String a8) {
+        this.a8 = a8;
+    }
+
+    public String getA9() {
+        return getNlfxVal(this.a9);
+    }
+
+    public void setA9(String a9) {
+        this.a9 = a9;
+    }
+
+    public String getA10() {
+        return getNlfxVal(this.a10);
+    }
+
+    public void setA10(String a10) {
+        this.a10 = a10;
+    }
+
+    public String getA11() {
+        return getNlfxVal(this.a11);
+    }
+
+    public void setA11(String a11) {
+        this.a11 = a11;
+    }
+
+    public String getA12() {
+        return getNlfxVal(this.a12);
+    }
+
+    public void setA12(String a12) {
+        this.a12 = a12;
+    }
+
+    public String getA13() {
+        return getNlfxVal(this.a13);
+    }
+
+    public void setA13(String a13) {
+        this.a13 = a13;
+    }
+
+    public String getA14() {
+        return getNlfxVal(this.a14);
+    }
+
+    public void setA14(String a14) {
+        this.a14 = a14;
+    }
+
+    public String getA15() {
+        return getNlfxVal(this.a15);
+    }
+
+    public void setA15(String a15) {
+        this.a15 = a15;
+    }
+
+    public String getA16() {
+        return getNlfxVal(this.a16);
+    }
+
+    public void setA16(String a16) {
+        this.a16 = a16;
+    }
+
+    public String getA17() {
+        return getNlfxVal(this.a17);
+    }
+
+    public void setA17(String a17) {
+        this.a17 = a17;
+    }
+
+    public String getA18() {
+        return getNlfxVal(this.a18);
+    }
+
+    public void setA18(String a18) {
+        this.a18 = a18;
+    }
+
+    public String getA19() {
+        return getNlfxVal(this.a19);
+    }
+
+    public void setA19(String a19) {
+        this.a19 = a19;
+    }
+
+    public String getA20() {
+        return getNlfxVal(this.a20);
+    }
+
+    public void setA20(String a20) {
+        this.a20 = a20;
+    }
+
+    public String getA21() {
+        return getNlfxVal(this.a21);
+    }
+
+    public void setA21(String a21) {
+        this.a21 = a21;
+    }
+
+    public String getA22() {
+        return getNlfxVal(this.a22);
+    }
+
+    public void setA22(String a22) {
+        this.a22 = a22;
+    }
+
+    public String getA23() {
+        return getNlfxVal(this.a23);
+    }
+
+    public void setA23(String a23) {
+        this.a23 = a23;
+    }
+
+    public String getA24() {
+        return getNlfxVal(this.a24);
+    }
+
+    public void setA24(String a24) {
+        this.a24 = a24;
+    }
+
+    public String getA25() {
+        return getNlfxVal(this.a25);
+    }
+
+    public void setA25(String a25) {
+        this.a25 = a25;
+    }
+
+    public String getA26() {
+        return getNlfxVal(this.a26);
+    }
+
+    public void setA26(String a26) {
+        this.a26 = a26;
+    }
+
+    public String getA27() {
+        return getNlfxVal(this.a27);
+    }
+
+    public void setA27(String a27) {
+        this.a27 = a27;
+    }
+
+    public String getA28() {
+        return getNlfxVal(this.a28);
+    }
+
+    public void setA28(String a28) {
+        this.a28 = a28;
+    }
+
+    public String getA29() {
+        return getNlfxVal(this.a29);
+    }
+
+    public void setA29(String a29) {
+        this.a29 = a29;
+    }
+
+    public String getA30() {
+        return getNlfxVal(this.a30);
+    }
+
+    public void setA30(String a30) {
+        this.a30 = a30;
+    }
+
+    public String getA31() {
+        return getNlfxVal(this.a31);
+    }
+
+    public void setA31(String a31) {
+        this.a31 = a31;
+    }
+
+    public String getA32() {
+        return getNlfxVal(this.a32);
+    }
+
+    public void setA32(String a32) {
+        this.a32 = a32;
+    }
+
+    public String getA33() {
+        return getNlfxVal(this.a33);
+    }
+
+    public void setA33(String a33) {
+        this.a33 = a33;
+    }
+
+    public String getA34() {
+        return getNlfxVal(this.a34);
+    }
+
+    public void setA34(String a34) {
+        this.a34 = a34;
+    }
+
+    public String getA35() {
+        return getNlfxVal(this.a35);
+    }
+
+    public void setA35(String a35) {
+        this.a35 = a35;
+    }
+
+    public String getA36() {
+        return getNlfxVal(this.a36);
+    }
+
+    public void setA36(String a36) {
+        this.a36 = a36;
+    }
+
+    public String getSelectYear() {
+        return selectYear;
+    }
+
+    public void setSelectYear(String selectYear) {
+        this.selectYear = selectYear;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("index_id", getIndex_id())
+            .append("repProductType", getRepProductType())
+            .append("varietyType", getVarietyType())
+            .toString();
+    }
+
+    private String getNlfxVal(String val)
+    {
+        String tVal = (val==null || val.length()==0)?"--":val;
+        if(tVal.indexOf(".")>-1)
+        {
+            tVal = String.format("%.2f", Double.parseDouble(tVal));
+        }
+        return tVal;
+    }
+
+//    public static void main(String args[])
+//    {
+//        GxdhCountIndex a = new GxdhCountIndex();
+//        System.out.println(a.getNlfxVal("1.1"));
+
+//    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/mapper/GxdhCountMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/mapper/GxdhCountMapper.java
new file mode 100644
index 0000000..7f02084
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/mapper/GxdhCountMapper.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.project.statisticalData.mapper;
+
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCount;
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCountIndex;
+
+import java.util.List;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳組apper鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public interface GxdhCountMapper 
+{
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param id 宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     */
+    public GxdhCount selectGxdhCountById(String id);
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳藉垪琛�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳介泦鍚�
+     */
+    public List<GxdhCount> selectGxdhCountList(GxdhCount gxdhCount);
+
+    /**
+     * 鏂板宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 缁撴灉
+     */
+    public int insertGxdhCount(GxdhCount gxdhCount);
+
+    /**
+     * 淇敼宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 缁撴灉
+     */
+    public int updateGxdhCount(GxdhCount gxdhCount);
+
+    /**
+     * 鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param id 宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 缁撴灉
+     */
+    public int deleteGxdhCountById(String id);
+
+    /**
+     * 鎵归噺鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int deleteGxdhCountByIds(String[] ids);
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁鍒楄〃
+     *
+     * @param gxdhCountIndex 宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳介泦鍚�
+     */
+    public List<GxdhCountIndex> selectGxdhCountIndexList(GxdhCountIndex gxdhCountIndex);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/IGxdhCountService.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/IGxdhCountService.java
new file mode 100644
index 0000000..be7e400
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/IGxdhCountService.java
@@ -0,0 +1,71 @@
+package com.dingzhuo.energy.project.statisticalData.service;
+
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCount;
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCountIndex;
+
+import java.util.List;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳絊ervice鎺ュ彛
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+public interface IGxdhCountService 
+{
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param id 宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     */
+    public GxdhCount selectGxdhCountById(String id);
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳藉垪琛�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳介泦鍚�
+     */
+    public List<GxdhCount> selectGxdhCountList(GxdhCount gxdhCount);
+
+    /**
+     * 鏂板宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 缁撴灉
+     */
+    public int insertGxdhCount(GxdhCount gxdhCount);
+
+    /**
+     * 淇敼宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 缁撴灉
+     */
+    public int updateGxdhCount(GxdhCount gxdhCount);
+
+    /**
+     * 鎵归噺鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 缁撴灉
+     */
+    public int deleteGxdhCountByIds(String[] ids);
+
+    /**
+     * 鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳戒俊鎭�
+     * 
+     * @param id 宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 缁撴灉
+     */
+    public int deleteGxdhCountById(String id);
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁鍒楄〃
+     *
+     * @param gxdhCountIndex 宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳介泦鍚�
+     */
+    public List<GxdhCountIndex> selectGxdhCountIndexList(GxdhCountIndex gxdhCountIndex);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/impl/GxdhCountServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/impl/GxdhCountServiceImpl.java
new file mode 100644
index 0000000..e6d202c
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/statisticalData/service/impl/GxdhCountServiceImpl.java
@@ -0,0 +1,279 @@
+package com.dingzhuo.energy.project.statisticalData.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCountIndex;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.dingzhuo.energy.project.statisticalData.mapper.GxdhCountMapper;
+import com.dingzhuo.energy.project.statisticalData.domain.GxdhCount;
+import com.dingzhuo.energy.project.statisticalData.service.IGxdhCountService;
+
+/**
+ * 宸ュ簭鍗曡�楃粺璁″姛鑳絊ervice涓氬姟灞傚鐞�
+ * 
+ * @author zhaow
+ * @date 2020-12-26
+ */
+@Service
+public class GxdhCountServiceImpl implements IGxdhCountService 
+{
+    @Autowired
+    private GxdhCountMapper gxdhCountMapper;
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param id 宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     */
+    @Override
+    public GxdhCount selectGxdhCountById(String id)
+    {
+        return gxdhCountMapper.selectGxdhCountById(id);
+    }
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳藉垪琛�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     */
+    @Override
+    public List<GxdhCount> selectGxdhCountList(GxdhCount gxdhCount)
+    {
+        return gxdhCountMapper.selectGxdhCountList(gxdhCount);
+    }
+
+    /**
+     * 鏂板宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertGxdhCount(GxdhCount gxdhCount)
+    {
+        return gxdhCountMapper.insertGxdhCount(gxdhCount);
+    }
+
+    /**
+     * 淇敼宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param gxdhCount 宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateGxdhCount(GxdhCount gxdhCount)
+    {
+        return gxdhCountMapper.updateGxdhCount(gxdhCount);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳�
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteGxdhCountByIds(String[] ids)
+    {
+        return gxdhCountMapper.deleteGxdhCountByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳戒俊鎭�
+     * 
+     * @param id 宸ュ簭鍗曡�楃粺璁″姛鑳絀D
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteGxdhCountById(String id)
+    {
+        return gxdhCountMapper.deleteGxdhCountById(id);
+    }
+
+    /**
+     * 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁鍒楄〃
+     *
+     * @param gxdhCountIndex 宸ュ簭鍗曡�楃粺璁″姛鑳芥姤琛ㄧ殑鎸囨爣鏁版嵁
+     * @return 宸ュ簭鍗曡�楃粺璁″姛鑳介泦鍚�
+     */
+    public List<GxdhCountIndex> selectGxdhCountIndexList(GxdhCountIndex gxdhCountIndex){
+        List<GxdhCountIndex> resList = new ArrayList<>();
+        GxdhCountIndex nyxhl = new GxdhCountIndex();
+        nyxhl.setVarietyType("鑳芥簮娑堣�楅噺");
+
+        GxdhCountIndex cpcl = new GxdhCountIndex();
+        cpcl.setVarietyType("浜у搧浜ч噺");
+
+        GxdhCountIndex cpdh = new GxdhCountIndex();
+        cpdh.setVarietyType("浜у搧鍗曡��");
+        //鍏堟煡 鑳芥簮娑堣�楅噺
+        gxdhCountIndex.setVarietyType("NYXHL");
+        List<GxdhCountIndex> queryNyxhlRes = gxdhCountMapper.selectGxdhCountIndexList(gxdhCountIndex);
+        if(queryNyxhlRes!=null && queryNyxhlRes.size()>0)
+        {
+            for(GxdhCountIndex gxdhCountIndexT:queryNyxhlRes)
+            {
+                if(gxdhCountIndexT.getFL().equals("DIAN"))
+                {
+                    nyxhl.setA1(gxdhCountIndexT.getA1());
+                    nyxhl.setA4(gxdhCountIndexT.getA2());
+                    nyxhl.setA7(gxdhCountIndexT.getA3());
+                    nyxhl.setA10(gxdhCountIndexT.getA4());
+                    nyxhl.setA13(gxdhCountIndexT.getA5());
+                    nyxhl.setA16(gxdhCountIndexT.getA6());
+                    nyxhl.setA19(gxdhCountIndexT.getA7());
+                    nyxhl.setA22(gxdhCountIndexT.getA8());
+                    nyxhl.setA25(gxdhCountIndexT.getA9());
+                    nyxhl.setA28(gxdhCountIndexT.getA10());
+                    nyxhl.setA31(gxdhCountIndexT.getA11());
+                    nyxhl.setA34(gxdhCountIndexT.getA12());
+                }else if(gxdhCountIndexT.getFL().equals("MQ"))
+                {
+                    nyxhl.setA2(gxdhCountIndexT.getA1());
+                    nyxhl.setA5(gxdhCountIndexT.getA2());
+                    nyxhl.setA8(gxdhCountIndexT.getA3());
+                    nyxhl.setA11(gxdhCountIndexT.getA4());
+                    nyxhl.setA14(gxdhCountIndexT.getA5());
+                    nyxhl.setA17(gxdhCountIndexT.getA6());
+                    nyxhl.setA20(gxdhCountIndexT.getA7());
+                    nyxhl.setA23(gxdhCountIndexT.getA8());
+                    nyxhl.setA26(gxdhCountIndexT.getA9());
+                    nyxhl.setA29(gxdhCountIndexT.getA10());
+                    nyxhl.setA32(gxdhCountIndexT.getA11());
+                    nyxhl.setA35(gxdhCountIndexT.getA12());
+                }else if(gxdhCountIndexT.getFL().equals("ZQ"))
+                {
+                    nyxhl.setA3(gxdhCountIndexT.getA1());
+                    nyxhl.setA6(gxdhCountIndexT.getA2());
+                    nyxhl.setA9(gxdhCountIndexT.getA3());
+                    nyxhl.setA12(gxdhCountIndexT.getA4());
+                    nyxhl.setA15(gxdhCountIndexT.getA5());
+                    nyxhl.setA18(gxdhCountIndexT.getA6());
+                    nyxhl.setA21(gxdhCountIndexT.getA7());
+                    nyxhl.setA24(gxdhCountIndexT.getA8());
+                    nyxhl.setA27(gxdhCountIndexT.getA9());
+                    nyxhl.setA30(gxdhCountIndexT.getA10());
+                    nyxhl.setA33(gxdhCountIndexT.getA11());
+                    nyxhl.setA36(gxdhCountIndexT.getA12());
+                }
+            }
+        }
+
+        //鍐嶆煡  浜у搧浜ч噺
+        gxdhCountIndex.setVarietyType("CPCL");
+        List<GxdhCountIndex> queryCpclRes = gxdhCountMapper.selectGxdhCountIndexList(gxdhCountIndex);
+        if(queryCpclRes!=null && queryCpclRes.size()>0)
+        {
+            for(GxdhCountIndex gxdhCountIndexCpcl:queryCpclRes)
+            {
+                if(gxdhCountIndexCpcl.getFL().equals("DIAN"))
+                {
+                    cpcl.setA1(gxdhCountIndexCpcl.getA1());
+                    cpcl.setA4(gxdhCountIndexCpcl.getA2());
+                    cpcl.setA7(gxdhCountIndexCpcl.getA3());
+                    cpcl.setA10(gxdhCountIndexCpcl.getA4());
+                    cpcl.setA13(gxdhCountIndexCpcl.getA5());
+                    cpcl.setA16(gxdhCountIndexCpcl.getA6());
+                    cpcl.setA19(gxdhCountIndexCpcl.getA7());
+                    cpcl.setA22(gxdhCountIndexCpcl.getA8());
+                    cpcl.setA25(gxdhCountIndexCpcl.getA9());
+                    cpcl.setA28(gxdhCountIndexCpcl.getA10());
+                    cpcl.setA31(gxdhCountIndexCpcl.getA11());
+                    cpcl.setA34(gxdhCountIndexCpcl.getA12());
+                }else if(gxdhCountIndexCpcl.getFL().equals("MQ"))
+                {
+                    cpcl.setA2(gxdhCountIndexCpcl.getA1());
+                    cpcl.setA5(gxdhCountIndexCpcl.getA2());
+                    cpcl.setA8(gxdhCountIndexCpcl.getA3());
+                    cpcl.setA11(gxdhCountIndexCpcl.getA4());
+                    cpcl.setA14(gxdhCountIndexCpcl.getA5());
+                    cpcl.setA17(gxdhCountIndexCpcl.getA6());
+                    cpcl.setA20(gxdhCountIndexCpcl.getA7());
+                    cpcl.setA23(gxdhCountIndexCpcl.getA8());
+                    cpcl.setA26(gxdhCountIndexCpcl.getA9());
+                    cpcl.setA29(gxdhCountIndexCpcl.getA10());
+                    cpcl.setA32(gxdhCountIndexCpcl.getA11());
+                    cpcl.setA35(gxdhCountIndexCpcl.getA12());
+                }else if(gxdhCountIndexCpcl.getFL().equals("ZQ"))
+                {
+                    cpcl.setA3(gxdhCountIndexCpcl.getA1());
+                    cpcl.setA6(gxdhCountIndexCpcl.getA2());
+                    cpcl.setA9(gxdhCountIndexCpcl.getA3());
+                    cpcl.setA12(gxdhCountIndexCpcl.getA4());
+                    cpcl.setA15(gxdhCountIndexCpcl.getA5());
+                    cpcl.setA18(gxdhCountIndexCpcl.getA6());
+                    cpcl.setA21(gxdhCountIndexCpcl.getA7());
+                    cpcl.setA24(gxdhCountIndexCpcl.getA8());
+                    cpcl.setA27(gxdhCountIndexCpcl.getA9());
+                    cpcl.setA30(gxdhCountIndexCpcl.getA10());
+                    cpcl.setA33(gxdhCountIndexCpcl.getA11());
+                    cpcl.setA36(gxdhCountIndexCpcl.getA12());
+                }
+            }
+        }
+
+        resList.add(nyxhl);
+        resList.add(cpcl);
+        //璁$畻浜у搧鍗曡��=鑳芥簮娑堣�楅噺/浜у搧浜ч噺
+        cpdh.setA1(calculationCpdh(nyxhl.getA1(),cpcl.getA1()));
+        cpdh.setA2(calculationCpdh(nyxhl.getA2(),cpcl.getA2()));
+        cpdh.setA3(calculationCpdh(nyxhl.getA3(),cpcl.getA3()));
+        cpdh.setA4(calculationCpdh(nyxhl.getA4(),cpcl.getA4()));
+        cpdh.setA5(calculationCpdh(nyxhl.getA5(),cpcl.getA5()));
+        cpdh.setA6(calculationCpdh(nyxhl.getA6(),cpcl.getA6()));
+        cpdh.setA7(calculationCpdh(nyxhl.getA7(),cpcl.getA7()));
+        cpdh.setA8(calculationCpdh(nyxhl.getA8(),cpcl.getA8()));
+        cpdh.setA9(calculationCpdh(nyxhl.getA9(),cpcl.getA9()));
+        cpdh.setA10(calculationCpdh(nyxhl.getA10(),cpcl.getA10()));
+        cpdh.setA11(calculationCpdh(nyxhl.getA11(),cpcl.getA11()));
+        cpdh.setA12(calculationCpdh(nyxhl.getA12(),cpcl.getA12()));
+        cpdh.setA13(calculationCpdh(nyxhl.getA13(),cpcl.getA13()));
+        cpdh.setA14(calculationCpdh(nyxhl.getA14(),cpcl.getA14()));
+        cpdh.setA15(calculationCpdh(nyxhl.getA15(),cpcl.getA15()));
+        cpdh.setA16(calculationCpdh(nyxhl.getA16(),cpcl.getA16()));
+        cpdh.setA17(calculationCpdh(nyxhl.getA17(),cpcl.getA17()));
+        cpdh.setA18(calculationCpdh(nyxhl.getA18(),cpcl.getA18()));
+        cpdh.setA19(calculationCpdh(nyxhl.getA19(),cpcl.getA19()));
+        cpdh.setA20(calculationCpdh(nyxhl.getA20(),cpcl.getA20()));
+        cpdh.setA21(calculationCpdh(nyxhl.getA21(),cpcl.getA21()));
+        cpdh.setA22(calculationCpdh(nyxhl.getA22(),cpcl.getA22()));
+        cpdh.setA23(calculationCpdh(nyxhl.getA23(),cpcl.getA23()));
+        cpdh.setA24(calculationCpdh(nyxhl.getA24(),cpcl.getA24()));
+        cpdh.setA25(calculationCpdh(nyxhl.getA25(),cpcl.getA25()));
+        cpdh.setA26(calculationCpdh(nyxhl.getA26(),cpcl.getA26()));
+        cpdh.setA27(calculationCpdh(nyxhl.getA27(),cpcl.getA27()));
+        cpdh.setA28(calculationCpdh(nyxhl.getA28(),cpcl.getA28()));
+        cpdh.setA29(calculationCpdh(nyxhl.getA29(),cpcl.getA29()));
+        cpdh.setA30(calculationCpdh(nyxhl.getA30(),cpcl.getA30()));
+        cpdh.setA31(calculationCpdh(nyxhl.getA31(),cpcl.getA31()));
+        cpdh.setA32(calculationCpdh(nyxhl.getA32(),cpcl.getA32()));
+        cpdh.setA33(calculationCpdh(nyxhl.getA33(),cpcl.getA33()));
+        cpdh.setA34(calculationCpdh(nyxhl.getA34(),cpcl.getA34()));
+        cpdh.setA35(calculationCpdh(nyxhl.getA35(),cpcl.getA35()));
+        cpdh.setA36(calculationCpdh(nyxhl.getA36(),cpcl.getA36()));
+        resList.add(cpdh);
+        return resList;
+    }
+
+    private String calculationCpdh(String nyxhl,String cpcl)
+    {
+        try{
+            if(nyxhl.equals("--")||cpcl.equals("--"))
+            {
+                return "--";
+            }else{
+                double fz = Double.parseDouble(nyxhl);
+                double fm = Double.parseDouble(cpcl);
+                return String.format("%.2f", fz/fm);
+            }
+        }catch (Exception e)
+        {
+            e.printStackTrace();
+            return "--";
+        }
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/dailyWorkingProcedureController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/dailyWorkingProcedureController.java
new file mode 100644
index 0000000..673f703
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/dailyWorkingProcedureController.java
@@ -0,0 +1,82 @@
+package com.dingzhuo.energy.project.workingProcedure.controller;
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.workingProcedure.domain.dailyWorkingProcedure;
+import com.dingzhuo.energy.project.workingProcedure.service.IdailyWorkingProcedure;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *宸ュ簭鑳借�楃粺璁�
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/workingProcedure/dailyWorkingProcedure")
+public class dailyWorkingProcedureController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IdailyWorkingProcedure dailyWorkingProcedure;
+
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+            List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+            List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+            List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            List<dailyWorkingProcedure> dataList=new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 0;
+            dataItem.setBeginTime(dataItem.getDataTime());
+            String endTime=aa+" 24:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i < 24) {
+                if(i>9){
+                    bb=aa+" "+i+":00:00";
+                }else{
+                    bb=aa+" 0"+i+":00:00";
+                }
+                dailyWorkingProcedure report=new dailyWorkingProcedure();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            };
+            List<dailyWorkingProcedure> list = dailyWorkingProcedure.getdailyWorkingProcedureList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    @GetMapping("/listChart")
+    public AjaxResult listChart(DataItem dataItem) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        dataItem.setBeginTime(dataItem.getDataTime());
+        String endTime=aa+" 24:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        List<dailyWorkingProcedure> list = dailyWorkingProcedure.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/monthlyWorkingProcedureController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/monthlyWorkingProcedureController.java
new file mode 100644
index 0000000..c4728d4
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/monthlyWorkingProcedureController.java
@@ -0,0 +1,115 @@
+package com.dingzhuo.energy.project.workingProcedure.controller;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.workingProcedure.domain.monthlyWorkingProcedure;
+import com.dingzhuo.energy.project.workingProcedure.service.ImonthlyWorkingProcedure;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 宸ュ簭鑳借�楃粺璁�
+ *
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/workingProcedure/monthlyWorkingProcedure")
+public class monthlyWorkingProcedureController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private ImonthlyWorkingProcedure imonthlyWorkingProcedure;
+
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+            List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+            List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+            List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            List<monthlyWorkingProcedure> dataList=new ArrayList<>();
+            Map tableColumn =new HashMap<>();//琛ㄦ暟鎹�
+            monthlyWorkingProcedure report1=new monthlyWorkingProcedure();
+            DateFormat df = new SimpleDateFormat("yyyy-MM");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getDataTime());
+            String bb="";
+            int i = 1;
+            String beginTime=aa+"-01 00:00:00";
+            dataItem.setBeginTime(sf.parse(beginTime));
+            String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+            dataItem.setEndTime(sf.parse(endTime));
+            while (i <= Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))) {
+                if(i>9){
+                    bb=aa+"-"+i+" 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+" 00:00:00";
+                }
+                monthlyWorkingProcedure report=new monthlyWorkingProcedure();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                tableColumn.put("value"+i,String.valueOf(i)+"鏃�");
+                i++;
+            }
+            monthlyWorkingProcedure reportList =new  monthlyWorkingProcedure();
+            List<Map> table=new ArrayList<>();
+            List<monthlyWorkingProcedure> list = imonthlyWorkingProcedure.getMonthlyWorkingProcedureList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            int count=Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2));
+            list.forEach(monthlyReport -> monthlyReport.setCount(count));
+            reportList.setTabledata(list);
+            table.add(tableColumn);
+            reportList.setTablehead(table);
+            return AjaxResult.success(reportList);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    @GetMapping("/listChart")
+    public AjaxResult listChart(DataItem dataItem) throws ParseException {
+        DateFormat df = new SimpleDateFormat("yyyy-MM");
+        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String aa= df.format(dataItem.getDataTime());
+        String beginTime=aa+"-01 00:00:00";
+        dataItem.setBeginTime(sf.parse(beginTime));
+        String endTime=aa+"-"+Integer.valueOf(getLastDayOfMonth(aa).substring(getLastDayOfMonth(aa).length()-2))+" 00:00:00";
+        dataItem.setEndTime(sf.parse(endTime));
+        List<monthlyWorkingProcedure> list = imonthlyWorkingProcedure.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+    public static String getLastDayOfMonth(String yearMonth) {
+        int year = Integer.parseInt(yearMonth.split("-")[0]);  //骞�
+        int month = Integer.parseInt(yearMonth.split("-")[1]); //鏈�
+        Calendar cal = Calendar.getInstance();
+        // 璁剧疆骞翠唤
+        cal.set(Calendar.YEAR, year);
+        // 璁剧疆鏈堜唤
+        // cal.set(Calendar.MONTH, month - 1);
+        cal.set(Calendar.MONTH, month); //璁剧疆褰撳墠鏈堢殑涓婁竴涓湀
+        // 鑾峰彇鏌愭湀鏈�澶уぉ鏁�
+        //int lastDay = cal.getActualMaximum(Calendar.DATE);
+        int lastDay = cal.getMinimum(Calendar.DATE); //鑾峰彇鏈堜唤涓殑鏈�灏忓�硷紝鍗崇涓�澶�
+        // 璁剧疆鏃ュ巻涓湀浠界殑鏈�澶уぉ鏁�
+        //cal.set(Calendar.DAY_OF_MONTH, lastDay);
+        cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //涓婃湀鐨勭涓�澶╁噺鍘�1灏辨槸褰撴湀鐨勬渶鍚庝竴澶�
+        // 鏍煎紡鍖栨棩鏈�
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        return sdf.format(cal.getTime());
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/yearWorkingProcedureController.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/yearWorkingProcedureController.java
new file mode 100644
index 0000000..0f9cdd2
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/controller/yearWorkingProcedureController.java
@@ -0,0 +1,74 @@
+package com.dingzhuo.energy.project.workingProcedure.controller;
+
+import com.dingzhuo.energy.common.utils.time.TimeManager;
+import com.dingzhuo.energy.data.model.domain.EnergyIndex;
+import com.dingzhuo.energy.data.model.domain.ModelNode;
+import com.dingzhuo.energy.data.model.service.IModelNodeService;
+import com.dingzhuo.energy.dataservice.domain.DataItem;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.project.workingProcedure.domain.yearWorkingProcedure;
+import com.dingzhuo.energy.project.workingProcedure.service.IyearWorkingProcedure;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ *宸ュ簭鑳借�楃粺璁�
+ * @author sys
+ * @date 2020-02-18
+ */
+@RestController
+@RequestMapping("/workingProcedure/yearWorkingProcedure")
+public class yearWorkingProcedureController extends BaseController {
+
+    @Autowired
+    private IModelNodeService modelNodeService;
+    @Autowired
+    private IyearWorkingProcedure yearComprehensive;
+
+    @GetMapping("/list")
+    public AjaxResult list(DataItem dataItem) {
+        try {
+            List<ModelNode> nodeId = modelNodeService.getModelNodeByModelCode(dataItem.getIndexCode());
+            List<EnergyIndex> energyList = modelNodeService.getSettingIndex(nodeId.get(0).getNodeId());
+            List<String> indexIds = energyList.stream().map(EnergyIndex::getIndexId).collect(Collectors.toList());
+            List<yearWorkingProcedure> dataList=new ArrayList<>();
+            DateFormat df = new SimpleDateFormat("yyyy");
+            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String aa= df.format(dataItem.getBeginTime());
+            String bb="";
+            int i = 1;
+            while (i <= 12) {
+                if(i>9){
+                    bb=aa+"-"+i+"-01 00:00:00";
+                }else{
+                    bb=aa+"-0"+i+"-01 00:00:00";
+                }
+                yearWorkingProcedure report=new yearWorkingProcedure();
+                report.setDataTime(sf.parse(bb));
+                report.setValue("value"+i);
+                dataList.add(report);
+                i++;
+            }
+            List<yearWorkingProcedure> list = yearComprehensive.getYearWorkingProcedureList(indexIds, dataList,dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+            return AjaxResult.success(list);
+        } catch (Exception ex) {
+            logger.error("鑾峰彇鍑洪敊锛�", ex);
+            return AjaxResult.error("鑾峰彇鍑洪敊!");
+        }
+    }
+
+    @GetMapping("/listChart")
+    public AjaxResult listChart(DataItem dataItem){
+        List<yearWorkingProcedure> list = yearComprehensive.getListChart(dataItem.getIndexId(),dataItem.getBeginTime(),dataItem.getEndTime(), dataItem.getTimeType(),dataItem.getIndexStorageId());
+        return AjaxResult.success(list);
+    }
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/dailyWorkingProcedure.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/dailyWorkingProcedure.java
new file mode 100644
index 0000000..1735c5a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/dailyWorkingProcedure.java
@@ -0,0 +1,322 @@
+package com.dingzhuo.energy.project.workingProcedure.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class dailyWorkingProcedure implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    private String timeCode;
+    private String unitId;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    @Excel(name = "0鏃�")
+    private Double value0;
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue0() {
+        return value0;
+    }
+
+    public void setValue0(Double value0) {
+        this.value0 = value0;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/monthlyWorkingProcedure.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/monthlyWorkingProcedure.java
new file mode 100644
index 0000000..ef97ad6
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/monthlyWorkingProcedure.java
@@ -0,0 +1,415 @@
+package com.dingzhuo.energy.project.workingProcedure.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-12-31
+ */
+public class monthlyWorkingProcedure implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "1鏃�")
+    private Double value1;
+    @Excel(name = "2鏃�")
+    private Double value2;
+    @Excel(name = "3鏃�")
+    private Double value3;
+    @Excel(name = "4鏃�")
+    private Double value4;
+    @Excel(name = "5鏃�")
+    private Double value5;
+    @Excel(name = "6鏃�")
+    private Double value6;
+    @Excel(name = "7鏃�")
+    private Double value7;
+    @Excel(name = "8鏃�")
+    private Double value8;
+    @Excel(name = "9鏃�")
+    private Double value9;
+    @Excel(name = "10鏃�")
+    private Double value10;
+    @Excel(name = "11鏃�")
+    private Double value11;
+    @Excel(name = "12鏃�")
+    private Double value12;
+    @Excel(name = "13鏃�")
+    private Double value13;
+    @Excel(name = "14鏃�")
+    private Double value14;
+    @Excel(name = "15鏃�")
+    private Double value15;
+    @Excel(name = "16鏃�")
+    private Double value16;
+    @Excel(name = "17鏃�")
+    private Double value17;
+    @Excel(name = "18鏃�")
+    private Double value18;
+    @Excel(name = "19鏃�")
+    private Double value19;
+    @Excel(name = "20鏃�")
+    private Double value20;
+    @Excel(name = "21鏃�")
+    private Double value21;
+    @Excel(name = "22鏃�")
+    private Double value22;
+    @Excel(name = "23鏃�")
+    private Double value23;
+    @Excel(name = "24鏃�")
+    private Double value24;
+    @Excel(name = "25鏃�")
+    private Double value25;
+    @Excel(name = "26鏃�")
+    private Double value26;
+    @Excel(name = "27鏃�")
+    private Double value27;
+    @Excel(name = "28鏃�")
+    private Double value28;
+    @Excel(name = "29鏃�")
+    private Double value29;
+    @Excel(name = "30鏃�")
+    private Double value30;
+    @Excel(name = "31鏃�")
+    private Double value31;
+    private String timeCode;
+    private Integer count;
+    private String unitId;
+    private List<Map> tablehead =new ArrayList<>();
+    private List<monthlyWorkingProcedure> tabledata =new ArrayList<>();
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+
+    public Double getValue13() {
+        return value13;
+    }
+
+    public void setValue13(Double value13) {
+        this.value13 = value13;
+    }
+
+    public Double getValue14() {
+        return value14;
+    }
+
+    public void setValue14(Double value14) {
+        this.value14 = value14;
+    }
+
+    public Double getValue15() {
+        return value15;
+    }
+
+    public void setValue15(Double value15) {
+        this.value15 = value15;
+    }
+
+    public Double getValue16() {
+        return value16;
+    }
+
+    public void setValue16(Double value16) {
+        this.value16 = value16;
+    }
+
+    public Double getValue17() {
+        return value17;
+    }
+
+    public void setValue17(Double value17) {
+        this.value17 = value17;
+    }
+
+    public Double getValue18() {
+        return value18;
+    }
+
+    public void setValue18(Double value18) {
+        this.value18 = value18;
+    }
+
+    public Double getValue19() {
+        return value19;
+    }
+
+    public void setValue19(Double value19) {
+        this.value19 = value19;
+    }
+
+    public Double getValue20() {
+        return value20;
+    }
+
+    public void setValue20(Double value20) {
+        this.value20 = value20;
+    }
+
+    public Double getValue21() {
+        return value21;
+    }
+
+    public void setValue21(Double value21) {
+        this.value21 = value21;
+    }
+
+    public Double getValue22() {
+        return value22;
+    }
+
+    public void setValue22(Double value22) {
+        this.value22 = value22;
+    }
+
+    public Double getValue23() {
+        return value23;
+    }
+
+    public void setValue23(Double value23) {
+        this.value23 = value23;
+    }
+
+    public Double getValue24() {
+        return value24;
+    }
+
+    public void setValue24(Double value24) {
+        this.value24 = value24;
+    }
+
+    public Double getValue25() {
+        return value25;
+    }
+
+    public void setValue25(Double value25) {
+        this.value25 = value25;
+    }
+
+    public Double getValue26() {
+        return value26;
+    }
+
+    public void setValue26(Double value26) {
+        this.value26 = value26;
+    }
+
+    public Double getValue27() {
+        return value27;
+    }
+
+    public void setValue27(Double value27) {
+        this.value27 = value27;
+    }
+
+    public Double getValue28() {
+        return value28;
+    }
+
+    public void setValue28(Double value28) {
+        this.value28 = value28;
+    }
+
+    public Double getValue29() {
+        return value29;
+    }
+
+    public void setValue29(Double value29) {
+        this.value29 = value29;
+    }
+
+    public Double getValue30() {
+        return value30;
+    }
+
+    public void setValue30(Double value30) {
+        this.value30 = value30;
+    }
+
+    public Double getValue31() {
+        return value31;
+    }
+
+    public void setValue31(Double value31) {
+        this.value31 = value31;
+    }
+
+    public List<Map> getTablehead() {
+        return tablehead;
+    }
+
+    public void setTablehead(List<Map> tablehead) {
+        this.tablehead = tablehead;
+    }
+    public List<monthlyWorkingProcedure> getTabledata() {
+        return tabledata;
+    }
+
+    public void setTabledata(List<monthlyWorkingProcedure> tabledata) {
+        this.tabledata = tabledata;
+    }
+
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/yearWorkingProcedure.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/yearWorkingProcedure.java
new file mode 100644
index 0000000..22b21fc
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/domain/yearWorkingProcedure.java
@@ -0,0 +1,200 @@
+package com.dingzhuo.energy.project.workingProcedure.domain;
+
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.project.reportForm.domain.dailyReport;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public class yearWorkingProcedure implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String indexId;
+    @Excel(name = "鎸囨爣鍚嶇О")
+    private String indexName;
+    private String value;
+    private Date dataTime;
+    private String timeType;
+    @Excel(name = "1鏈�")
+    private Double value1;
+    @Excel(name = "2鏈�")
+    private Double value2;
+    @Excel(name = "3鏈�")
+    private Double value3;
+    @Excel(name = "4鏈�")
+    private Double value4;
+    @Excel(name = "5鏈�")
+    private Double value5;
+    @Excel(name = "6鏈�")
+    private Double value6;
+    @Excel(name = "7鏈�")
+    private Double value7;
+    @Excel(name = "8鏈�")
+    private Double value8;
+    @Excel(name = "9鏈�")
+    private Double value9;
+    @Excel(name = "10鏈�")
+    private Double value10;
+    @Excel(name = "11鏈�")
+    private Double value11;
+    @Excel(name = "12鏈�")
+    private Double value12;
+    private String timeCode;
+    private  String unitId;
+    public String getIndexId() {
+        return indexId;
+    }
+
+    public void setIndexId(String indexId) {
+        this.indexId = indexId;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+    public String getUnitId() {
+        return unitId;
+    }
+
+    public void setUnitId(String unitId) {
+        this.unitId = unitId;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public String getTimeType() {
+        return timeType;
+    }
+
+    public void setTimeType(String timeType) {
+        this.timeType = timeType;
+    }
+
+    public Date getDataTime() {
+        return dataTime;
+    }
+
+    public void setDataTime(Date dataTime) {
+        this.dataTime = dataTime;
+    }
+
+    public Double getValue1() {
+        return value1;
+    }
+
+    public void setValue1(Double value1) {
+        this.value1 = value1;
+    }
+
+    public Double getValue2() {
+        return value2;
+    }
+
+    public void setValue2(Double value2) {
+        this.value2 = value2;
+    }
+
+    public Double getValue3() {
+        return value3;
+    }
+
+    public void setValue3(Double value3) {
+        this.value3 = value3;
+    }
+
+    public Double getValue4() {
+        return value4;
+    }
+
+    public void setValue4(Double value4) {
+        this.value4 = value4;
+    }
+
+    public Double getValue5() {
+        return value5;
+    }
+
+    public void setValue5(Double value5) {
+        this.value5 = value5;
+    }
+
+    public Double getValue6() {
+        return value6;
+    }
+
+    public void setValue6(Double value6) {
+        this.value6 = value6;
+    }
+
+    public Double getValue7() {
+        return value7;
+    }
+
+    public void setValue7(Double value7) {
+        this.value7 = value7;
+    }
+
+    public Double getValue8() {
+        return value8;
+    }
+
+    public void setValue8(Double value8) {
+        this.value8 = value8;
+    }
+
+    public Double getValue9() {
+        return value9;
+    }
+
+    public void setValue9(Double value9) {
+        this.value9 = value9;
+    }
+
+    public Double getValue10() {
+        return value10;
+    }
+
+    public void setValue10(Double value10) {
+        this.value10 = value10;
+    }
+
+    public Double getValue11() {
+        return value11;
+    }
+
+    public void setValue11(Double value11) {
+        this.value11 = value11;
+    }
+
+    public Double getValue12() {
+        return value12;
+    }
+
+    public void setValue12(Double value12) {
+        this.value12 = value12;
+    }
+    public String getTimeCode() {
+        return timeCode;
+    }
+
+    public void setTimeCode(String timeCode) {
+        this.timeCode = timeCode;
+    }
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/dailyWorkingProcedureMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/dailyWorkingProcedureMapper.java
new file mode 100644
index 0000000..17af796
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/dailyWorkingProcedureMapper.java
@@ -0,0 +1,29 @@
+package com.dingzhuo.energy.project.workingProcedure.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.dailyWorkingProcedure;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *宸ュ簭鑳借�楃粺璁� 鏃�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface dailyWorkingProcedureMapper {
+    public List<dailyWorkingProcedure> getdailyWorkingProcedureList(@Param("indexIds") List<String> indexIds,
+                                                                @Param("dataList") List<dailyWorkingProcedure> dataList,
+                                                                @Param("beginTime") Date beginTime,
+                                                                @Param("endTime") Date endTime,
+                                                                @Param("timeType") TimeType timeType,
+                                                                @Param("indexStorageId") String indexStorageId);
+    List<dailyWorkingProcedure> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId")  String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/monthlyWorkingProcedureMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/monthlyWorkingProcedureMapper.java
new file mode 100644
index 0000000..a3aad6d
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/monthlyWorkingProcedureMapper.java
@@ -0,0 +1,29 @@
+package com.dingzhuo.energy.project.workingProcedure.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.monthlyWorkingProcedure;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 宸ュ簭缁煎悎鑳借�楃粺璁� 鏈�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface monthlyWorkingProcedureMapper {
+    public List<monthlyWorkingProcedure> getMonthlyWorkingProcedureList(@Param("indexIds") List<String> indexIds,
+                                                                @Param("dataList") List<monthlyWorkingProcedure> dataList,
+                                                                @Param("beginTime") Date beginTime,
+                                                                @Param("endTime") Date endTime,
+                                                                @Param("timeType") TimeType timeType,
+                                                                @Param("indexStorageId") String indexStorageId);
+    List<monthlyWorkingProcedure> getListChart(@Param("indexId") String indexId,
+                                               @Param("beginTime") Date beginTime,
+                                               @Param("endTime") Date endTime,
+                                               @Param("timeType") TimeType timeType,
+                                               @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/yearWorkingProcedureMapper.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/yearWorkingProcedureMapper.java
new file mode 100644
index 0000000..caeb469
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/mapper/yearWorkingProcedureMapper.java
@@ -0,0 +1,29 @@
+package com.dingzhuo.energy.project.workingProcedure.mapper;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.yearWorkingProcedure;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 宸ュ簭缁煎悎鑳借�楃粺璁� 骞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface yearWorkingProcedureMapper {
+    public List<yearWorkingProcedure> getYearWorkingProcedureList(@Param("indexIds") List<String> indexIds,
+                                                                  @Param("dataList") List<yearWorkingProcedure> dataList,
+                                                                  @Param("beginTime") Date beginTime,
+                                                                  @Param("endTime") Date endTime,
+                                                                  @Param("timeType") TimeType timeType,
+                                                                  @Param("indexStorageId") String indexStorageId);
+    List<yearWorkingProcedure> getListChart(@Param("indexId") String indexId,
+                                            @Param("beginTime") Date beginTime,
+                                            @Param("endTime") Date endTime,
+                                            @Param("timeType") TimeType timeType,
+                                            @Param("indexStorageId") String indexStorageId);
+
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IdailyWorkingProcedure.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IdailyWorkingProcedure.java
new file mode 100644
index 0000000..a147c27
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IdailyWorkingProcedure.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.project.workingProcedure.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.dailyWorkingProcedure;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏃�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IdailyWorkingProcedure {
+    public List<dailyWorkingProcedure> getdailyWorkingProcedureList(List<String> indexIds, List<dailyWorkingProcedure> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    public List<dailyWorkingProcedure> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/ImonthlyWorkingProcedure.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/ImonthlyWorkingProcedure.java
new file mode 100644
index 0000000..8d0c87f
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/ImonthlyWorkingProcedure.java
@@ -0,0 +1,19 @@
+package com.dingzhuo.energy.project.workingProcedure.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.monthlyWorkingProcedure;
+
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍏ㄥ巶缁煎悎鑳借�楃粺璁� 鏈�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface ImonthlyWorkingProcedure {
+    public List<monthlyWorkingProcedure> getMonthlyWorkingProcedureList(List<String> indexIds, List<monthlyWorkingProcedure> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    List<monthlyWorkingProcedure> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IyearWorkingProcedure.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IyearWorkingProcedure.java
new file mode 100644
index 0000000..40d89cd
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/IyearWorkingProcedure.java
@@ -0,0 +1,18 @@
+package com.dingzhuo.energy.project.workingProcedure.service;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.yearWorkingProcedure;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 宸ュ簭鑳借�楃粺璁� 骞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+public interface IyearWorkingProcedure {
+    public List<yearWorkingProcedure> getYearWorkingProcedureList(List<String> indexIds, List<yearWorkingProcedure> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+    List<yearWorkingProcedure> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId);
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/dailyWorkingProcedureServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/dailyWorkingProcedureServiceImpl.java
new file mode 100644
index 0000000..762d29a
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/dailyWorkingProcedureServiceImpl.java
@@ -0,0 +1,38 @@
+package com.dingzhuo.energy.project.workingProcedure.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.dailyWorkingProcedure;
+import com.dingzhuo.energy.project.workingProcedure.mapper.dailyWorkingProcedureMapper;
+import com.dingzhuo.energy.project.workingProcedure.service.IdailyWorkingProcedure;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class dailyWorkingProcedureServiceImpl implements IdailyWorkingProcedure {
+    @Autowired
+    private dailyWorkingProcedureMapper dailyMapper;
+
+    public List<dailyWorkingProcedure> getdailyWorkingProcedureList(List<String> indexIds, List<dailyWorkingProcedure> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return dailyMapper.getdailyWorkingProcedureList(indexIds, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<dailyWorkingProcedure> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return dailyMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/monthlyWorkingProcedureServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/monthlyWorkingProcedureServiceImpl.java
new file mode 100644
index 0000000..4a5469e
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/monthlyWorkingProcedureServiceImpl.java
@@ -0,0 +1,39 @@
+package com.dingzhuo.energy.project.workingProcedure.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.monthlyWorkingProcedure;
+import com.dingzhuo.energy.project.workingProcedure.mapper.monthlyWorkingProcedureMapper;
+import com.dingzhuo.energy.project.workingProcedure.service.ImonthlyWorkingProcedure;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class monthlyWorkingProcedureServiceImpl implements ImonthlyWorkingProcedure {
+    @Autowired
+    private monthlyWorkingProcedureMapper monthMapper;
+
+    public List<monthlyWorkingProcedure> getMonthlyWorkingProcedureList(List<String> indexIds, List<monthlyWorkingProcedure> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return monthMapper.getMonthlyWorkingProcedureList(indexIds, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<monthlyWorkingProcedure> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return monthMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/yearWorkingProcedureServiceImpl.java b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/yearWorkingProcedureServiceImpl.java
new file mode 100644
index 0000000..d34fc58
--- /dev/null
+++ b/energy_management_server/src/main/java/com/dingzhuo/energy/project/workingProcedure/service/impl/yearWorkingProcedureServiceImpl.java
@@ -0,0 +1,38 @@
+package com.dingzhuo.energy.project.workingProcedure.service.impl;
+
+import com.dingzhuo.energy.common.utils.time.TimeType;
+import com.dingzhuo.energy.project.workingProcedure.domain.yearWorkingProcedure;
+import com.dingzhuo.energy.project.workingProcedure.mapper.yearWorkingProcedureMapper;
+import com.dingzhuo.energy.project.workingProcedure.service.IyearWorkingProcedure;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 涓氬姟灞傚鐞�
+ * 
+ * @author sys
+ * @date 2020-03-25
+ */
+@Service
+public class yearWorkingProcedureServiceImpl implements IyearWorkingProcedure {
+    @Autowired
+    private yearWorkingProcedureMapper yearMapper;
+
+    public List<yearWorkingProcedure> getYearWorkingProcedureList(List<String> indexIds, List<yearWorkingProcedure> dataList, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexIds != null && !indexIds.isEmpty()) {
+            return yearMapper.getYearWorkingProcedureList(indexIds, dataList, beginTime, endTime, timeType, indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+    @Override
+    public List<yearWorkingProcedure> getListChart(String indexId, Date beginTime, Date endTime, TimeType timeType, String indexStorageId){
+        if (indexId != null && !indexId.isEmpty()) {
+            return yearMapper.getListChart(indexId,beginTime,endTime,timeType,indexStorageId);
+        }
+        return Collections.emptyList();
+    }
+}
diff --git a/energy_management_server/src/main/resources/application-prod.yml b/energy_management_server/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..3fe1be0
--- /dev/null
+++ b/energy_management_server/src/main/resources/application-prod.yml
@@ -0,0 +1,37 @@
+# 鏁版嵁婧愰厤缃�
+spring:
+  datasource:
+    url: jdbc:postgresql://localhost:5432/energy_dongli
+    username: 
+    password: 
+  redis:
+    host: localhost
+    port: 
+
+server:
+  port: 8097
+
+rtdb:
+  host: localhost
+  port: 8086
+#  host: 192.168.8.122
+#  port: 8086
+
+upload:
+  #  path: /Users/fanxinfu/Documents/MyWork/dingzhuo/upload
+  #  path: D:/workspace/energy-management/energy_management_ui/upload
+  path: D:/energy_system/upload
+
+# 琛ㄨ揪寮忎笉鑳藉寘鍚勾鐨勯儴鍒� 鏈�澶氬叚涓�
+govReport:
+  # 15鍒嗛挓鎵ц涓�娆�
+  cronDay: 0 30/15 0,1 * * *
+  # 姣忔湀浠�1鍙峰紑濮� 姣忓ぉ闆剁偣鎵ц涓�娆�
+  cronMonth: 0 0 0 1,2,3,4 * *
+
+mqtt:
+  host: tcp://localhost:30509
+  username: 
+  password: 
+  subhbt: iot-2/evt/waconn/#
+  subhbtqos: 0
diff --git a/energy_management_server/src/main/resources/application.yml b/energy_management_server/src/main/resources/application.yml
new file mode 100644
index 0000000..845816c
--- /dev/null
+++ b/energy_management_server/src/main/resources/application.yml
@@ -0,0 +1,187 @@
+# 椤圭洰鐩稿叧閰嶇疆
+ruoyi:
+  # 鍚嶇О
+  name: 涓滀附鍖荤枟
+  # 鐗堟湰
+  version: 1.0.0
+  # 鐗堟潈骞翠唤
+  copyrightYear: 2023
+  # 瀹炰緥婕旂ず寮�鍏�
+  demoEnabled: true
+  # 鏂囦欢璺緞 绀轰緥锛� Windows閰嶇疆D:/ruoyi/uploadPath锛孡inux閰嶇疆 /home/ruoyi/uploadPath锛�
+  profile: ${upload.path}
+  # 鑾峰彇ip鍦板潃寮�鍏�
+  addressEnabled: true
+
+# 寮�鍙戠幆澧冮厤缃�
+server:
+  # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
+  port: ${server.port}
+  servlet:
+    # 搴旂敤鐨勮闂矾寰�
+    context-path: /
+  undertow:
+    # 璁剧疆IO绾跨▼鏁�, 瀹冧富瑕佹墽琛岄潪闃诲鐨勪换鍔�,瀹冧滑浼氳礋璐e涓繛鎺�, 榛樿璁剧疆姣忎釜CPU鏍稿績涓�涓嚎绋�
+    io-threads: 4
+    # 闃诲浠诲姟绾跨▼姹�, 褰撴墽琛岀被浼約ervlet璇锋眰闃诲IO鎿嶄綔, undertow浼氫粠杩欎釜绾跨▼姹犱腑鍙栧緱绾跨▼
+    # 瀹冪殑鍊艰缃彇鍐充簬绯荤粺绾跨▼鎵ц浠诲姟鐨勯樆濉炵郴鏁帮紝榛樿鍊兼槸IO绾跨▼鏁�*8
+    worker-threads: 32
+    # 浠ヤ笅鐨勯厤缃細褰卞搷buffer,杩欎簺buffer浼氱敤浜庢湇鍔″櫒杩炴帴鐨処O鎿嶄綔,鏈夌偣绫讳技netty鐨勬睜鍖栧唴瀛樼鐞�
+    # 姣忓潡buffer鐨勭┖闂村ぇ灏�,瓒婂皬鐨勭┖闂磋鍒╃敤瓒婂厖鍒嗭紝涓嶈璁剧疆澶ぇ锛屼互鍏嶅奖鍝嶅叾浠栧簲鐢紝鍚堥�傚嵆鍙�
+    buffer-size: 1024
+    # 鏄惁鍒嗛厤鐨勭洿鎺ュ唴瀛�(NIO鐩存帴鍒嗛厤鐨勫爢澶栧唴瀛�)
+    direct-buffers: true
+
+# 鏃ュ織閰嶇疆
+logging:
+  level:
+    com.dingzhuo: debug
+    org.springframework: info
+
+# Spring閰嶇疆
+spring:
+  # 璧勬簮淇℃伅
+  messages:
+    # 鍥介檯鍖栬祫婧愭枃浠惰矾寰�
+    basename: i18n/messages
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: org.postgresql.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: ${spring.datasource.url}
+        username: ${spring.datasource.username}
+        password: ${spring.datasource.password}
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username:
+        login-password:
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 10000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  profiles:
+    active: prod
+  # 鏂囦欢涓婁紶
+  servlet:
+    multipart:
+      # 鍗曚釜鏂囦欢澶у皬
+      max-file-size:  10MB
+      # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
+      max-request-size:  20MB
+  # 鏈嶅姟妯″潡
+  devtools:
+    restart:
+      # 鐑儴缃插紑鍏�
+      enabled: true
+  # redis 閰嶇疆
+  redis:
+    # 鍦板潃
+    host: ${spring.redis.host}
+    # 绔彛锛岄粯璁や负6379
+    port: ${spring.redis.port}
+    # 杩炴帴瓒呮椂鏃堕棿
+    timeout: 10s
+    lettuce:
+      pool:
+        # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
+        min-idle: 0
+        # 杩炴帴姹犱腑鐨勬渶澶х┖闂茶繛鎺�
+        max-idle: 8
+        # 杩炴帴姹犵殑鏈�澶ф暟鎹簱杩炴帴鏁�
+        max-active: 8
+        # #杩炴帴姹犳渶澶ч樆濉炵瓑寰呮椂闂达紙浣跨敤璐熷�艰〃绀烘病鏈夐檺鍒讹級
+        max-wait: -1ms
+
+# token閰嶇疆
+token:
+  # 浠ょ墝鑷畾涔夋爣璇�
+  header: Authorization
+  # 浠ょ墝绉橀挜
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 浠ょ墝鏈夋晥鏈燂紙榛樿30鍒嗛挓锛�
+#  expireTime: 1440
+  expireTime: 1440
+
+# MyBatis閰嶇疆
+mybatis:
+  # 鎼滅储鎸囧畾鍖呭埆鍚�
+  typeAliasesPackage: com.dingzhuo.energy.**.domain
+  # 閰嶇疆mapper鐨勬壂鎻忥紝鎵惧埌鎵�鏈夌殑mapper.xml鏄犲皠鏂囦欢
+  mapperLocations: classpath*:mybatis/**/*Mapper.xml
+  # 鍔犺浇鍏ㄥ眬鐨勯厤缃枃浠�
+  configLocation: classpath:mybatis/mybatis-config.xml
+
+# PageHelper鍒嗛〉鎻掍欢
+pagehelper:
+  helperDialect: PostgreSQL
+  reasonable: true
+  supportMethodsArguments: true
+  params: count=countSql
+
+# 闃叉XSS鏀诲嚮
+xss:
+  # 杩囨护寮�鍏�
+  enabled: true
+  # 鎺掗櫎閾炬帴锛堝涓敤閫楀彿鍒嗛殧锛�
+  excludes: /system/notice/*
+  # 鍖归厤閾炬帴
+  urlPatterns: /system/*,/monitor/*,/tool/*,/meter/*,/facility/*
+
+# 浠g爜鐢熸垚
+gen:
+  # 浣滆��
+  author: sys
+  # 榛樿鐢熸垚鍖呰矾寰� system 闇�鏀规垚鑷繁鐨勬ā鍧楀悕绉� 濡� system monitor tool
+  packageName: com.dingzhuo.energy.project.system
+  # 鑷姩鍘婚櫎琛ㄥ墠缂�锛岄粯璁ゆ槸true
+  autoRemovePre: false
+  # 琛ㄥ墠缂�锛堢敓鎴愮被鍚嶄笉浼氬寘鍚〃鍓嶇紑锛屽涓敤閫楀彿鍒嗛殧锛�
+  tablePrefix: sys_
+
+rtdb:
+  host: ${rtdb.host}
+  port: ${rtdb.port}
+
+sysconfig:
+  indexUrl: "/indexdev"
+  #鎶ヨ〃棣栭〉   http://10.50.217.4:88/webroot/decision/view/form?viewlet=Form14.frm
diff --git a/energy_management_server/src/main/resources/banner.txt b/energy_management_server/src/main/resources/banner.txt
new file mode 100644
index 0000000..d56a2b0
--- /dev/null
+++ b/energy_management_server/src/main/resources/banner.txt
@@ -0,0 +1,2 @@
+Application Version: ${ruoyi.version}
+Application Port: ${server.port}
diff --git a/energy_management_server/src/main/resources/i18n/messages.properties b/energy_management_server/src/main/resources/i18n/messages.properties
new file mode 100644
index 0000000..d63aa1f
--- /dev/null
+++ b/energy_management_server/src/main/resources/i18n/messages.properties
@@ -0,0 +1,36 @@
+#閿欒娑堟伅
+not.null=* 蹇呴』濉啓
+user.jcaptcha.error=楠岃瘉鐮侀敊璇�
+user.jcaptcha.expire=楠岃瘉鐮佸凡澶辨晥
+user.not.exists=鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒
+user.password.not.match=鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒
+user.password.retry.limit.count=瀵嗙爜杈撳叆閿欒{0}娆�
+user.password.retry.limit.exceed=瀵嗙爜杈撳叆閿欒{0}娆★紝甯愭埛閿佸畾10鍒嗛挓
+user.password.delete=瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿宸茶鍒犻櫎
+user.blocked=鐢ㄦ埛宸插皝绂侊紝璇疯仈绯荤鐞嗗憳
+role.blocked=瑙掕壊宸插皝绂侊紝璇疯仈绯荤鐞嗗憳
+user.logout.success=閫�鍑烘垚鍔�
+
+length.not.valid=闀垮害蹇呴』鍦▄min}鍒皗max}涓瓧绗︿箣闂�
+
+user.username.not.valid=* 2鍒�20涓眽瀛椼�佸瓧姣嶃�佹暟瀛楁垨涓嬪垝绾跨粍鎴愶紝涓斿繀椤讳互闈炴暟瀛楀紑澶�
+user.password.not.valid=* 5-50涓瓧绗�
+ 
+user.email.not.valid=閭鏍煎紡閿欒
+user.mobile.phone.number.not.valid=鎵嬫満鍙锋牸寮忛敊璇�
+user.login.success=鐧诲綍鎴愬姛
+user.notfound=璇烽噸鏂扮櫥褰�
+user.forcelogout=绠$悊鍛樺己鍒堕��鍑猴紝璇烽噸鏂扮櫥褰�
+user.unknown.error=鏈煡閿欒锛岃閲嶆柊鐧诲綍
+
+##鏂囦欢涓婁紶娑堟伅
+upload.exceed.maxSize=涓婁紶鐨勬枃浠跺ぇ灏忚秴鍑洪檺鍒剁殑鏂囦欢澶у皬锛�<br/>鍏佽鐨勬枃浠舵渶澶уぇ灏忔槸锛歿0}MB锛�
+upload.filename.exceed.length=涓婁紶鐨勬枃浠跺悕鏈�闀縶0}涓瓧绗�
+
+##鏉冮檺
+no.permission=鎮ㄦ病鏈夋暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
+no.create.permission=鎮ㄦ病鏈夊垱寤烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
+no.update.permission=鎮ㄦ病鏈変慨鏀规暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
+no.delete.permission=鎮ㄦ病鏈夊垹闄ゆ暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
+no.export.permission=鎮ㄦ病鏈夊鍑烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
+no.view.permission=鎮ㄦ病鏈夋煡鐪嬫暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
diff --git a/energy_management_server/src/main/resources/logback.xml b/energy_management_server/src/main/resources/logback.xml
new file mode 100644
index 0000000..803c579
--- /dev/null
+++ b/energy_management_server/src/main/resources/logback.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 鏃ュ織瀛樻斁璺緞 -->
+	<property name="log.path" value="logs" />
+    <!-- 鏃ュ織杈撳嚭鏍煎紡 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+	<!-- 鎺у埗鍙拌緭鍑� -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+	<!-- 绯荤粺鏃ュ織杈撳嚭 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-info.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>INFO</level>
+            <!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/sys-error.log</file>
+        <!-- 寰幆鏀跨瓥锛氬熀浜庢椂闂村垱寤烘棩蹇楁枃浠� -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鏃ュ織鏂囦欢鍚嶆牸寮� -->
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 杩囨护鐨勭骇鍒� -->
+            <level>ERROR</level>
+			<!-- 鍖归厤鏃剁殑鎿嶄綔锛氭帴鏀讹紙璁板綍锛� -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 涓嶅尮閰嶆椂鐨勬搷浣滐細鎷掔粷锛堜笉璁板綍锛� -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+	<!-- 鐢ㄦ埛璁块棶鏃ュ織杈撳嚭  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 鎸夊ぉ鍥炴粴 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 鏃ュ織鏈�澶х殑鍘嗗彶 60澶� -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+	<!-- 绯荤粺妯″潡鏃ュ織绾у埆鎺у埗  -->
+	<logger name="com.dingzhuo" level="info" />
+	<!-- Spring鏃ュ織绾у埆鎺у埗  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+
+	<!--绯荤粺鎿嶄綔鏃ュ織-->
+    <root level="error">
+       <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+
+	<!--绯荤粺鐢ㄦ埛鎿嶄綔鏃ュ織-->
+    <logger name="sys-user" level="error">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration>
diff --git a/energy_management_server/src/main/resources/mybatis/EnergyConsumeInput/EnergyConsumeInputMapper.xml b/energy_management_server/src/main/resources/mybatis/EnergyConsumeInput/EnergyConsumeInputMapper.xml
new file mode 100644
index 0000000..a659193
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/EnergyConsumeInput/EnergyConsumeInputMapper.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.energyConsumeInput.mapper.EnergyConsumeInputMapper">
+
+    <resultMap type="EnergyConsumeInput" id="EnergyConsumeInputResult">
+        <result property="indexId" column="index_id"/>
+        <result property="name" column="name"/>
+        <result property="code" column="code"/>
+        <result property="unit" column="unit_name"/>
+        <result property="dataTime" column="data_time"/>
+        <result property="value" column="value"/>
+        <result property="createTime" column="create_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="categoryName" column="category_name"/>
+        <result property="energyName" column="energy_name"/>
+    </resultMap>
+
+
+    <select id="selectEnergyConsumeInputList" resultMap="EnergyConsumeInputResult">
+         select
+            ni.index_id,ei."name",ei.code,dd3.dict_label unit_name,di.data_time,di."value",
+            di.create_time,di.create_by,dd1.dict_label category_name,dd2.dict_label energy_name
+        from
+            node_index ni
+            left join energy_index ei on ni.index_id = ei.index_id
+            left join index_storage ist on ist.index_id = ei.index_id
+            left join  data_item di on ei.index_id = di.index_id and di.time_code = #{timeCode}
+            left join sys_dict_data dd1 on dd1.dict_value = ei.index_category and dd1.dict_type = 'sys_index_category'
+            left join sys_dict_data dd2 on dd2.dict_value = ei.energy_id and dd2.dict_type = 'energy_type'
+            left join sys_dict_data dd3 on dd3.dict_value = ei.unit_id and dd3.dict_type = 'sys_unit'
+        WHERE
+            ist.calc_type = 'INPUT' and ist.time_type = #{timeType}
+            AND ni.node_id = #{nodeId}
+            order by data_time DESC
+    </select>
+
+    <delete id="deleteEnergyConsumeInputByIds" parameterType="String">
+        delete from data_item where time_code = #{timeCode} and index_id in
+        <foreach item="id" collection="indexIds" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <insert id="saveEnergyConsumeInputList">
+        insert into data_item (index_id, time_code,
+        time_type,
+        begin_time,
+        end_time,
+        data_time,
+        value,
+        quality,
+        create_time,
+        create_by)
+        values
+        <foreach collection="list" item="dataItem" index="index" separator=",">
+            (#{dataItem.indexId},
+            #{dataItem.timeCode},
+            #{dataItem.timeType},
+            #{dataItem.beginTime},
+            #{dataItem.endTime},
+            #{dataItem.dataTime},
+            #{dataItem.value, jdbcType = DOUBLE},
+            #{dataItem.quality},
+            now(),
+            #{dataItem.createBy})
+        </foreach>
+    </insert>
+
+    <select id="queryReCalcIndexIdByIds" parameterType="String" resultMap="EnergyConsumeInputResult">
+        select
+        ifp.index_id
+        from
+        index_formula_param ifp
+        WHERE
+        ifp.param_value in (
+        SELECT ei.code FROM energy_index ei where ei.index_id in
+        <foreach item="id" collection="list" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+        )
+    </select>
+
+
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/basicSetup/SysEquipmentfileMapper.xml b/energy_management_server/src/main/resources/mybatis/basicSetup/SysEquipmentfileMapper.xml
new file mode 100644
index 0000000..ea0f413
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/basicSetup/SysEquipmentfileMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.basicSetup.mapper.SysEquipmentfileMapper">
+  <resultMap id="SysEquipmentFile"
+    type="com.dingzhuo.energy.project.basicSetup.domain.SysEquipmentfile">
+    <result property="nodeId" column="node_id"/>
+    <result property="filePath" column="filepath"/>
+  </resultMap>
+  <resultMap id="SysSvgInfo"
+    type="com.dingzhuo.energy.project.basicSetup.domain.SysSvgInfo">
+    <result property="id" column="id"/>
+    <result property="param" column="param"/>
+    <result property="tag" column="tag"/>
+  </resultMap>
+
+  <insert id="saveSettingInfo">
+    delete
+    from sys_svg_info
+    where node_id = #{nodeId};
+
+    <foreach collection="svgInfo" item="info" separator=";">
+      insert into sys_svg_info (id, node_id, param, tag)
+      values (#{info.id}, #{nodeId}, #{info.param}, #{info.tag});
+    </foreach>
+  </insert>
+
+  <update id="saveEquipmentFile">
+    insert into sys_equipmentfile (node_id, filepath)
+    select #{nodeId}, #{filePath}
+    on conflict
+      (node_id)
+    do update
+    set filepath = #{filePath}
+  </update>
+  <select id="getConfigure" resultMap="SysEquipmentFile">
+    select node_id, filepath
+    from sys_equipmentfile
+    where node_id = #{nodeId};
+  </select>
+  <select id="getConfigureTag" resultMap="SysSvgInfo">
+    select id, param, tag
+    from sys_svg_info
+    where node_id = #{nodeId}
+  </select>
+
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardCategoryMapper.xml b/energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardCategoryMapper.xml
new file mode 100644
index 0000000..0f50def
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardCategoryMapper.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.basicSetup.mapper.SysStandardCategoryMapper">
+    
+    <resultMap type="SysStandardCategory" id="SysStandardCategoryResult">
+        <result property="id"    column="id"    />
+        <result property="categoryName"    column="category_name"    />
+        <result property="categoryCode"    column="category_code"    />
+        <result property="dataType"    column="data_type"    />
+        <result property="showAlarm"    column="show_alarm"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectSysStandardCategoryVo">
+        select id, category_name, category_code, data_type, show_alarm, create_by, create_time, update_by, update_time, remark from sys_standard_category
+    </sql>
+
+    <select id="selectSysStandardCategoryList" parameterType="SysStandardCategory" resultMap="SysStandardCategoryResult">
+        <include refid="selectSysStandardCategoryVo"/>
+        <where>  
+            <if test="categoryName != null  and categoryName != ''"> and category_name like concat('%', #{categoryName}, '%')</if>
+            <if test="categoryCode != null  and categoryCode != ''"> and category_code like concat('%', #{categoryCode}, '%')</if>
+            <if test="dataType != null  and dataType != ''"> and data_type like concat('%', #{dataType}, '%')</if>
+            <if test="showAlarm != null  and showAlarm != ''"> and show_alarm like concat('%', #{showAlarm}, '%')</if>
+        </where>
+        order by create_time desc
+    </select>
+    
+    <select id="selectSysStandardCategoryById" parameterType="String" resultMap="SysStandardCategoryResult">
+        <include refid="selectSysStandardCategoryVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertSysStandardCategory" parameterType="SysStandardCategory">
+        insert into sys_standard_category
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="categoryName != null  and categoryName != ''">category_name,</if>
+            <if test="categoryCode != null  and categoryCode != ''">category_code,</if>
+            <if test="dataType != null  and dataType != ''">data_type,</if>
+            <if test="showAlarm != null  and showAlarm != ''">show_alarm,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="categoryName != null  and categoryName != ''">#{categoryName},</if>
+            <if test="categoryCode != null  and categoryCode != ''">#{categoryCode},</if>
+            <if test="dataType != null  and dataType != ''">#{dataType},</if>
+            <if test="showAlarm != null  and showAlarm != ''">#{showAlarm},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateSysStandardCategory" parameterType="SysStandardCategory">
+        update sys_standard_category
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="categoryName != null  and categoryName != ''">category_name = #{categoryName},</if>
+            <if test="categoryCode != null  and categoryCode != ''">category_code = #{categoryCode},</if>
+            <if test="dataType != null  and dataType != ''">data_type = #{dataType},</if>
+            <if test="showAlarm != null  and showAlarm != ''">show_alarm = #{showAlarm},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysStandardCategoryById" parameterType="String">
+        delete from sys_standard_category where id = #{id}
+    </delete>
+
+    <delete id="deleteSysStandardCategoryByIds" parameterType="String">
+        delete from sys_standard_category where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardParametersMapper.xml b/energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardParametersMapper.xml
new file mode 100644
index 0000000..59c78e7
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/basicSetup/SysStandardParametersMapper.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.basicSetup.mapper.SysStandardParametersMapper">
+
+    <resultMap type="SysStandardParameters" id="SysStandardParametersResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="configInfo"    column="config_info"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+        <result property="code"    column="code"    />
+        <result property="dataType"    column="data_type"    />
+        <result property="showAlarm"    column="show_alarm"    />
+        <result property="categoryId"    column="category_id"    />
+    </resultMap>
+    <sql id="selectSysStandardParametersVo">
+        select
+        id,
+        name,
+        config_info,
+        create_by,
+        create_time,
+        update_by,
+        update_time,
+        remark,
+        code,
+        data_type,
+        show_alarm,
+        category_id
+        from sys_standard_parameters
+    </sql>
+
+    <select id="selectSysStandardParametersList" parameterType="SysStandardParameters" resultMap="SysStandardParametersResult">
+        <include refid="selectSysStandardParametersVo"/>
+        <where>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="configInfo != null  and configInfo != ''"> and config_info like concat('%', #{configInfo}, '%')</if>
+            <if test="code != null  and code != ''"> and code like concat('%', #{code}, '%')</if>
+            <if test="dataType != null  and dataType != ''"> and data_type like concat('%', #{dataType}, '%')</if>
+            <if test="showAlarm != null  and showAlarm != ''"> and show_alarm like concat('%', #{showAlarm}, '%')</if>
+            <if test="id != null  and id != ''"> and id = #{id}</if>
+        </where>
+        order by create_time desc
+    </select>
+
+    <select id="selectSysStandardParametersById" parameterType="String" resultMap="SysStandardParametersResult">
+        <include refid="selectSysStandardParametersVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertSysStandardParameters" parameterType="SysStandardParameters">
+        insert into sys_standard_parameters
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="configInfo != null  and configInfo != ''">config_info,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+            <if test="code != null  and code != ''">code,</if>
+            <if test="dataType != null  and dataType != ''">data_type,</if>
+            <if test="showAlarm != null ">show_alarm,</if>
+            <if test="categoryId != null ">category_id,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="configInfo != null  and configInfo != ''">#{configInfo},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+            <if test="code != null  and code != ''">#{code},</if>
+            <if test="dataType != null  and dataType != ''">#{dataType},</if>
+            <if test="showAlarm != null ">#{showAlarm},</if>
+            <if test="categoryId != null ">#{categoryId},</if>
+        </trim>
+    </insert>
+
+    <update id="updateSysStandardParameters" parameterType="SysStandardParameters">
+        update sys_standard_parameters
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="configInfo != null  and configInfo != ''">config_info = #{configInfo},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+            <if test="code != null  and code != ''">code = #{code},</if>
+            <if test="dataType != null  and dataType != ''">data_type = #{dataType},</if>
+            <if test="showAlarm != null ">show_alarm = #{showAlarm},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteSysStandardParametersById" parameterType="String">
+        delete from sys_standard_parameters where id = #{id}
+    </delete>
+
+    <delete id="deleteSysStandardParametersByIds" parameterType="String">
+        delete from sys_standard_parameters where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <select id="getStandardParameters" parameterType="SysStandardParameters" resultMap="SysStandardParametersResult">
+        SELECT
+            s.ID,
+            s.NAME,
+            s.config_info
+        FROM
+            sys_standard_parameters s
+            LEFT JOIN model_node n ON s.ID = node_id
+        WHERE
+            s.id =#{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/benchmarking/BenchmarkingManagementMapper.xml b/energy_management_server/src/main/resources/mybatis/benchmarking/BenchmarkingManagementMapper.xml
new file mode 100644
index 0000000..63939e6
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/benchmarking/BenchmarkingManagementMapper.xml
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.benchmarking.mapper.BenchmarkingManagementMapper">
+    
+    <resultMap type="BenchmarkingManagement" id="BenchmarkingManagementResult">
+        <result property="indexId"    column="index_id"    />
+        <result property="indexName"    column="index_name"    />
+        <result property="indexCode"    column="index_code"    />
+        <result property="unitId"    column="unit_id"    />
+        <result property="timeType"    column="time_type"    />
+        <result property="dateTime"    column="date_time"    />
+        <result property="value"    column="value"    />
+        <result property="timeCode"    column="time_code"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="actualValue"    column="actual_value"    />
+        <result property="benchmarkingRange"    column="benchmarking_range"    />
+        <result property="benchmarkingType"    column="benchmarking_type"    />
+    </resultMap>
+
+    <sql id="selectBenchmarkingManagementVo">
+        SELECT
+            e.index_id,
+            e.name as index_name,
+            e.code as index_code,
+            e.unit_id,
+            bm.time_type,
+            bm.date_time,
+            bm."value",
+            bm.time_code,
+            bm.actual_value,
+            benchmarking_range,
+            benchmarking_type
+        FROM
+            energy_index e
+            LEFT JOIN benchmarking_management bm ON bm.index_id = e.index_id
+    </sql>
+
+    <select id="selectBenchmarkingManagementList" parameterType="BenchmarkingManagement" resultMap="BenchmarkingManagementResult">
+        <include refid="selectBenchmarkingManagementVo"/>
+        <where>
+            e.index_id in <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+            <if test="timeCode != null  and timeCode !=''"> AND bm.time_code = #{timeCode}</if>
+        </where>
+    </select>
+    <select id="selectBenchmarkingList" parameterType="BenchmarkingManagement" resultMap="BenchmarkingManagementResult">
+        SELECT
+            e.index_id,
+            e.name as index_name,
+            e.code as index_code,
+            e.unit_id
+        FROM
+            energy_index e
+         where e.index_id in <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+    </select>
+
+    <insert id="save">
+        insert into benchmarking_management (index_id,
+        time_code,
+        time_type,
+        value,
+        actual_value,
+        date_time,
+        benchmarking_range,
+        benchmarking_type,
+        create_time)
+        select #{benchmarkingManagement.indexId},
+        #{benchmarkingManagement.timeCode},
+        #{benchmarkingManagement.timeType},
+        #{benchmarkingManagement.value,jdbcType = DOUBLE},
+        #{benchmarkingManagement.actualValue,jdbcType = DOUBLE},
+        #{benchmarkingManagement.dateTime},
+        #{benchmarkingManagement.benchmarkingRange},
+        #{benchmarkingManagement.benchmarkingType},
+        now()
+        on conflict
+        (index_id,time_code)
+        do update
+        set
+        <if test="benchmarkingManagement.value != null  and benchmarkingManagement.value != ''"> value = #{benchmarkingManagement.value, jdbcType = DOUBLE},</if>
+        <if test="benchmarkingManagement.actualValue != null  and benchmarkingManagement.actualValue != ''"> actual_value = #{benchmarkingManagement.actualValue, jdbcType = DOUBLE},</if>
+        benchmarking_range=#{benchmarkingManagement.benchmarkingRange},
+        benchmarking_type=#{benchmarkingManagement.benchmarkingType},
+        update_time = now();
+    </insert>
+
+
+
+    <select id="selectBenchmarkingManagementById" parameterType="String" resultMap="BenchmarkingManagementResult">
+        SELECT
+            bm.time_type,
+            bm.date_time,
+            bm."value",
+            bm.time_code,
+            bm.actual_value,
+            benchmarking_range,
+            benchmarking_type
+        FROM
+           benchmarking_management bm
+        where bm.index_id = #{indexId}
+    </select>
+
+    <insert id="insertBenchmarkingManagement" parameterType="BenchmarkingManagement">
+        insert into benchmarking_management
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="indexId != null  and indexId != ''">index_id,</if>
+            <if test="timeType != null  and timeType != ''">time_type,</if>
+            <if test="dateTime != null ">date_time,</if>
+            <if test="value != null  and value != ''">value,</if>
+            <if test="timeCode != null  and timeCode != ''">time_code,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="actualValue != null  and actualValue != ''">actual_value,</if>
+            <if test="benchmarkingRange != null ">benchmarking_range,</if>
+            <if test="benchmarkingType != null ">benchmarking_type,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="indexId != null  and indexId != ''">#{indexId},</if>
+            <if test="timeType != null  and timeType != ''">#{timeType},</if>
+            <if test="dateTime != null ">#{dateTime},</if>
+            <if test="value != null  and value != ''">#{value},</if>
+            <if test="timeCode != null  and timeCode != ''">#{timeCode},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="actualValue != null  and actualValue != ''">#{actualValue},</if>
+            <if test="benchmarkingRange != null ">#{benchmarkingRange},</if>
+            <if test="benchmarkingType != null ">#{benchmarkingType},</if>
+        </trim>
+    </insert>
+
+    <update id="updateBenchmarkingManagement" parameterType="BenchmarkingManagement">
+        update benchmarking_management
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="timeType != null  and timeType != ''">time_type = #{timeType},</if>
+            <if test="dateTime != null ">date_time = #{dateTime},</if>
+            <if test="value != null  and value != ''">value = #{value},</if>
+            <if test="timeCode != null  and timeCode != ''">time_code = #{timeCode},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="actualValue != null  and actualValue != ''">actual_value = #{actualValue},</if>
+            <if test="benchmarkingRange != null ">benchmarking_range = #{benchmarkingRange},</if>
+            <if test="benchmarkingType != null ">benchmarking_type = #{benchmarkingType},</if>
+        </trim>
+        where index_id = #{indexId}
+    </update>
+
+    <delete id="deleteBenchmarkingManagementById" parameterType="String">
+        delete from benchmarking_management where index_id = #{indexId}
+    </delete>
+
+    <delete id="deleteBenchmarkingManagementByIds" parameterType="String">
+        delete from benchmarking_management where index_id in
+        <foreach item="indexId" collection="array" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/benchmarking/PhaseBenchmarkingMapper.xml b/energy_management_server/src/main/resources/mybatis/benchmarking/PhaseBenchmarkingMapper.xml
new file mode 100644
index 0000000..ca66b60
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/benchmarking/PhaseBenchmarkingMapper.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.benchmarking.mapper.PhaseBenchmarkingMapper">
+    
+    <resultMap type="com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement" id="PhaseBenchmarkingResult">
+        <result property="indexId"    column="index_id"    />
+        <result property="indexName"    column="index_name"    />
+        <result property="indexCode"    column="index_code"    />
+        <result property="unitId"    column="unit_id"    />
+        <result property="timeType"    column="time_type"    />
+        <result property="dateTime"    column="date_time"    />
+        <result property="value"    column="value"    />
+        <result property="timeCode"    column="time_code"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="actualValue"    column="actual_value"    />
+        <result column="begin_time" property="beginTime"/>
+        <result column="end_time" property="endTime"/>
+    </resultMap>
+
+    <sql id="selectPhaseBenchmarkingVo">
+        SELECT
+            e.index_id,
+            e.name as index_name,
+            e.code as index_code,
+            e.unit_id,
+            bm.time_type,
+            bm.date_time,
+            bm."value",
+            bm.time_code,
+            bm.actual_value
+        FROM
+            energy_index e
+            LEFT JOIN benchmarking_management bm ON bm.index_id = e.index_id
+    </sql>
+
+    <select id="selectPhaseBenchmarkingList" parameterType="com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement" resultMap="PhaseBenchmarkingResult">
+        <include refid="selectPhaseBenchmarkingVo"/>
+        <where>
+            e.index_id =#{indexId}
+            AND bm.time_type = #{timeType}
+            AND bm.date_time &gt;= #{beginTime}
+            AND bm.date_time &lt;= #{endTime}
+        </where>
+    </select>
+    <select id="selectRealTimeListrealTime" parameterType="com.dingzhuo.energy.project.benchmarking.domain.BenchmarkingManagement" resultMap="PhaseBenchmarkingResult">
+        <include refid="selectPhaseBenchmarkingVo"/>
+        <where>
+            e.index_id in <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+            <if test="timeCode != null  and timeCode !=''"> AND bm.time_code = #{timeCode}</if>
+        </where>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/comprehensiveStatisticsMapper.xml b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/comprehensiveStatisticsMapper.xml
new file mode 100644
index 0000000..38148a8
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/comprehensiveStatisticsMapper.xml
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.comprehensiveStatistics.mapper.comprehensiveStatisticsMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensiveStatistics">
+        <id column="index_id" property="indexId"/>
+        <id column="time_code" property="timeCode"/>
+        <id column="index_code" property="indexCode"/>
+        <id column="index_name" property="indexName"/>
+        <result column="begin_time" property="beginTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="data_time" property="dataTime"/>
+        <result column="value" property="value"/>
+        <result column="time_type" property="timeType"/>
+        <result column="quality" property="quality"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="remark" property="remark"/>
+        <result column="name" property="name"/>
+        <result column="index_type" property="indexType"/>
+        <result column="facility_name" property="facilityName"/>
+    </resultMap>
+    <resultMap id="comprehensiveMap" type="com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensive">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+
+    <sql id="itemHead">
+        SELECT di.index_id,
+               di.time_code,
+               di.time_type,
+               di.begin_time,
+               di.end_time,
+               di.data_time,
+               di.value,
+               di.quality,
+               di.create_time,
+               di.update_time,
+               ci.code AS "index_code",
+               ci.name AS "index_name",
+               ci.unit_id AS unitId,
+               f.facility_name AS facilityName
+        FROM data_item di
+               LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+               LEFT JOIN facility_archives f ON f."id"=ci.equipment
+    </sql>
+    <select id="getStatisticsEnergy" resultType="com.dingzhuo.energy.basic.data.enerInfoManage.domain.SysEnergy">
+        select enerid, enersno, enername,( SELECT d.dict_label FROM sys_dict_data d WHERE dict_type = 'sys_unit' AND d.dict_code	= e.muid) muidName
+        from sys_energy e
+               left join node_energy ne on e.enerid = ne.energy_id
+        where ne.node_id = #{nodeId};
+    </select>
+    <select id="getDatasByIndex" resultMap="dataItemMap">
+        SELECT
+            e.NAME,
+            e.index_code,
+            di.index_id,
+            di.time_code,
+            di.time_type,
+            di.begin_time,
+            di.end_time,
+            di.data_time,
+            di.VALUE,
+            di.quality,
+            di.create_time,
+            di.update_time
+        FROM
+            data_item di
+            LEFT JOIN energy_statistics e ON di.index_id = e.index_id
+        where di.time_code = #{timeCode}
+            AND di.index_id in
+            <foreach item="indexId" index="index" collection="indexIds" open="(" separator="," close=")">
+                #{indexId}
+            </foreach>
+    </select>
+    <select id="getEnergyByIndex" resultMap="dataItemMap">
+       select "name",index_id from  energy_statistics where index_type=#{indexType}
+    </select>
+    <select id="getFacilityArchives" resultType="com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives">
+        SELECT ID,code,facility_name AS facilityName FROM facility_archives
+    </select>
+
+    <select id="getDatasIndex" resultMap="dataItemMap">
+        SELECT di.index_id,
+        di.time_code,
+        di.time_type,
+        di.begin_time,
+        di.end_time,
+        di.data_time,
+        di.value,
+        di.quality,
+        di.create_time,
+        di.update_time,
+        ci.code AS "index_code",
+        ci.name AS "index_name",
+        ci.unit_id AS unitId,
+        f.facility_name AS "facility_name"
+        FROM data_item di
+        LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        LEFT JOIN facility_archives f ON f."id"=ci.equipment
+        where di.time_code = #{timeCode}
+        AND di.index_id in
+        <foreach item="indexId" index="index" collection="indexIds"
+                 open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+         and ci.equipment is not null
+        ORDER BY di."value" desc
+    </select>
+
+    <select id="getDatasByList" resultMap="dataItemMap">
+        SELECT
+            e.NAME,
+            e.index_code,
+            di.index_id,
+            di.time_code,
+            di.time_type,
+            di.begin_time,
+            di.end_time,
+            di.data_time,
+            di.VALUE,
+            di.quality,
+            di.create_time,
+            di.update_time
+        FROM
+            data_item di
+            LEFT JOIN energy_statistics e ON di.index_id = e.index_id
+        where di.time_type = #{timeType}
+            AND di.data_time &gt;= #{beginTime}
+            AND di.data_time &lt; #{endTime}
+            AND di.index_id in
+            <foreach item="indexId" index="index" collection="indexIds"
+                     open="(" separator="," close=")">
+                #{indexId}
+            </foreach>
+        ORDER BY di."value" desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/dailyComprehensiveMapper.xml b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/dailyComprehensiveMapper.xml
new file mode 100644
index 0000000..ee17e4c
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/dailyComprehensiveMapper.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.comprehensiveStatistics.mapper.dailyComprehensiveMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.comprehensiveStatistics.domain.dailyComprehensive">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value0" property="value0"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getdailyComprehensiveList" resultMap="dataItemMap">
+        SELECT
+            aa.index_id,
+            aa.index_name,
+            <foreach item="item" index="index" collection="dataList">
+                COALESCE ( MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ), null ) AS ${item.value},
+            </foreach>
+            aa.time_type,
+            aa.order_num orderNum
+        FROM
+            (
+            SELECT
+                ni.index_id,
+                ei."name" AS "index_name",
+                di."value",
+                di.data_time,
+                di.time_type,
+                mn.order_num
+            FROM
+                model_node mn
+                LEFT JOIN node_index ni ON ni.node_id = mn.node_id
+                LEFT JOIN energy_index ei ON ei.index_id = ni.index_id
+                LEFT JOIN data_item di ON ni.index_id = di.index_id
+            WHERE
+                mn.parent_id = #{nodeId}
+                AND di.data_time >= #{beginTime}
+                AND di.data_time &lt; #{endTime}
+                AND di.time_type = #{timeType}
+                <if test="indexStorageId !='' and indexStorageId !=null">
+                    and ei.energy_id=#{indexStorageId}
+                </if>
+            ) aa
+        GROUP BY
+            aa.index_id, aa.index_name, aa.time_type, aa.order_num
+        ORDER BY aa.order_num ASC
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+        ORDER BY data_time ASC
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/monthlyComprehensiveMapper.xml b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/monthlyComprehensiveMapper.xml
new file mode 100644
index 0000000..719b03a
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/monthlyComprehensiveMapper.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.comprehensiveStatistics.mapper.monthlyComprehensiveMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.comprehensiveStatistics.domain.monthlyComprehensive">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getMonthlyComprehensiveList" resultMap="dataItemMap">
+        SELECT
+            aa.index_id,
+            aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            COALESCE ( MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ), null ) AS ${item.value},
+        </foreach>
+            aa.time_type,
+            aa.order_num orderNum
+        FROM
+        (
+            SELECT
+                ni.index_id,
+                ei."name" AS "index_name",
+                di."value",
+                di.data_time,
+                di.time_type,
+                mn.order_num
+            FROM
+                model_node mn
+                LEFT JOIN node_index ni ON ni.node_id = mn.node_id
+                LEFT JOIN energy_index ei ON ei.index_id = ni.index_id
+                LEFT JOIN data_item di ON ni.index_id = di.index_id
+            WHERE
+                mn.parent_id = #{nodeId}
+                AND di.data_time >= #{beginTime}
+                AND di.data_time &lt;= #{endTime}
+                AND di.time_type = #{timeType}
+            <if test="indexStorageId !='' and indexStorageId !=null">
+                and ei.energy_id=#{indexStorageId}
+            </if>
+        ) aa
+        GROUP BY
+        aa.index_id, aa.index_name, aa.time_type, aa.order_num
+        ORDER BY aa.order_num ASC
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt;= #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+        ORDER BY
+            di.time_code;
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/yearComprehensiveMapper.xml b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/yearComprehensiveMapper.xml
new file mode 100644
index 0000000..6de84ef
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/comprehensiveStatistics/yearComprehensiveMapper.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.comprehensiveStatistics.mapper.yearComprehensiveMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.comprehensiveStatistics.domain.yearComperhensive">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getYearComprehensiveList" resultMap="dataItemMap">
+        SELECT
+            aa.index_id,
+            aa.index_name,
+            <foreach item="item" index="index" collection="dataList">
+                COALESCE ( MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ), null ) AS ${item.value},
+            </foreach>
+            aa.time_type,
+            aa.order_num orderNum
+        FROM
+        (
+            SELECT
+                ni.index_id,
+                ei."name" AS "index_name",
+                di."value",
+                di.data_time,
+                di.time_type,
+                mn.order_num
+            FROM
+                model_node mn
+                LEFT JOIN node_index ni ON ni.node_id = mn.node_id
+                LEFT JOIN energy_index ei ON ei.index_id = ni.index_id
+                LEFT JOIN data_item di ON ni.index_id = di.index_id
+            WHERE
+                mn.parent_id = #{nodeId}
+                AND di.data_time >= #{beginTime}
+                AND di.data_time &lt;= #{endTime}
+                AND di.time_type = #{timeType}
+            <if test="indexStorageId !='' and indexStorageId !=null">
+                and ei.energy_id=#{indexStorageId}
+            </if>
+        ) aa
+        GROUP BY aa.index_id, aa.index_name, aa.time_type, aa.order_num
+        ORDER BY aa.order_num ASC
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+        ORDER BY
+            di.time_code;
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/conglomeratepush/ConglomeratePushLogMapper.xml b/energy_management_server/src/main/resources/mybatis/conglomeratepush/ConglomeratePushLogMapper.xml
new file mode 100644
index 0000000..d477d58
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/conglomeratepush/ConglomeratePushLogMapper.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.conglomeratepush.mapper.ConglomeratePushLogMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="orderMiningSendResultMap" type="com.dingzhuo.energy.project.conglomeratepush.domain.ConglomeratePushLog">
+        <result column="id" property="id"/>
+        <result column="push_time" property="pushTime"/>
+        <result column="push_content" property="pushContent"/>
+        <result column="push_status" property="pushStatus"/>
+        <result column="push_result" property="pushResult"/>
+        <result column="push_count" property="pushCount"/>
+        <result column="error_info" property="errorInfo"/>
+    </resultMap>
+
+    <insert id="saveLog" parameterType="ConglomeratePushLog">
+        insert into conglomerate_push_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="pushTime != null ">push_time,</if>
+            <if test="pushContent != null  and pushContent != ''">push_content,</if>
+            <if test="pushStatus != null ">push_status,</if>
+            <if test="pushResult != null ">push_result,</if>
+            <if test="pushCount != null  and pushCount != ''">push_count,</if>
+            <if test="errorInfo != null  and errorInfo != ''">error_info,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="pushTime != null ">#{pushTime},</if>
+            <if test="pushContent != null  and pushContent != ''">#{pushContent},</if>
+            <if test="pushStatus != null ">#{pushStatus},</if>
+            <if test="pushResult != null ">#{pushResult},</if>
+            <if test="pushCount != null  and pushCount != ''">#{pushCount},</if>
+            <if test="errorInfo != null  and errorInfo != ''">#{errorInfo},</if>
+        </trim>
+    </insert>
+
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/dataEntry/DataItemMapper.xml b/energy_management_server/src/main/resources/mybatis/dataEntry/DataItemMapper.xml
new file mode 100644
index 0000000..7e033ae
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/dataEntry/DataItemMapper.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.dataEntry.mapper.DataItemMapper">
+    <resultMap type="stagseDataEntry" id="stagseDataEntryResult">
+        <result property="code" column="code"/>
+        <result property="name" column="name"/>
+        <result property="indexId" column="index_id"/>
+        <result property="timeType" column="time_type"/>
+        <result property="unitId" column="unit_id"/>
+        <result property="calcType" column="calc_type"/>
+        <result property="value" column="value"/>
+        <result property="timeCode" column="time_code"/>
+        <result property="dataTime" column="data_time"/>
+    </resultMap>
+
+    <select id="getSettingIndex" parameterType="stagseDataEntry" resultMap="stagseDataEntryResult">
+
+        SELECT
+        ei.index_id,
+        code,
+        NAME,
+        si.time_type,
+        ei.unit_id
+        FROM
+        energy_index ei
+        LEFT JOIN node_index ni ON ei.index_id = ni.index_id
+        LEFT JOIN index_storage si ON si.index_id = ei.index_id
+        WHERE
+        not EXISTS ( SELECT index_id FROM data_item WHERE index_id =ei.index_id and  data_time >= #{beginTime} AND data_time &lt;= #{endTime}) AND
+        ni.node_id =  #{nodeId}
+        and si.time_type = #{timeType}
+        AND si.calc_type = #{calcType}
+   </select>
+    <select id="getSettingEdit" parameterType="stagseDataEntry" resultMap="stagseDataEntryResult">
+        SELECT
+            ei.index_id,
+            code,
+            NAME,
+            si.time_type,
+            ei.unit_id,
+            di.value,
+            di.data_time
+        FROM
+            energy_index ei
+            LEFT JOIN node_index ni ON ei.index_id = ni.index_id
+            LEFT JOIN index_storage si ON si.index_id = ei.index_id
+            LEFT JOIN data_item di on di.index_id=ei.index_id
+        WHERE
+            ni.node_id = #{nodeId}
+            and si.time_type = #{timeType}
+            AND si.calc_type = #{calcType}
+            AND data_time &gt;= #{beginTime}
+            AND data_time &lt;= #{endTime}
+    </select>
+    <select id="stagseDataByCode" parameterType="stagseDataEntry" resultMap="stagseDataEntryResult">
+        SELECT
+            ei.index_id,
+            code,
+            NAME,
+            ei.unit_id,
+            di.value,
+            di.data_time,
+            di.time_type
+        FROM
+            energy_index ei
+            LEFT JOIN node_index ni ON ei.index_id = ni.index_id
+            LEFT JOIN data_item di on di.index_id=ei.index_id
+        WHERE
+            ni.node_id = #{nodeId}
+            and ei.code IN
+            <foreach item="indexCode" index="index" collection="indexCodes"
+                     open="(" separator="," close=")">
+                #{indexCode}
+            </foreach>
+            and di.time_type = #{timeType}
+            AND di.data_time &gt;= #{beginTime}
+            AND di.data_time &lt;= #{endTime}
+    </select>
+
+    <select id="getDataItemHourInforByIndexIds" resultType="com.dingzhuo.energy.dataservice.domain.DataItem">
+        SELECT
+            index_id indexId,
+            data_time dataTime,
+            "value"
+        FROM
+            "data_item"
+        WHERE
+            index_id IN
+        <foreach collection="indexIds" item="indexId" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+            AND ( begin_time BETWEEN #{beginTime} AND #{endTime} )
+            AND time_type = #{timeType}
+    </select>
+
+    <select id="getDataItemInforByIndexIds" resultType="com.dingzhuo.energy.dataservice.domain.DataItem">
+        SELECT
+            index_id indexId,
+            begin_time beginTime,
+            "value"
+        FROM
+            "data_item"
+        WHERE
+            index_id IN
+            <foreach collection="indexIds" item="indexId" open="(" separator="," close=")">
+                #{indexId}
+            </foreach>
+            AND time_code = #{timeCode}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/electricityPrice/ElectricityPriceMapper.xml b/energy_management_server/src/main/resources/mybatis/electricityPrice/ElectricityPriceMapper.xml
new file mode 100644
index 0000000..f8d0021
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/electricityPrice/ElectricityPriceMapper.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.electricity.mapper.ElectricityPriceMapper">
+
+    <resultMap type="ElectricityPrice" id="ElectricityPriceResult">
+        <result property="id"    column="id"    />
+        <result property="effectiveDate"    column="effective_date"    />
+        <result property="priceId"    column="price_id"    />
+        <result property="beginDate"    column="begin_date"    />
+        <result property="endDate"    column="end_date"    />
+        <result property="effectiveName"    column="effective_name"    />
+    </resultMap>
+
+    <sql id="selectElectricityPriceVo">
+        select id, effective_date, price_id, begin_date, end_date, effective_name from electricity_price
+    </sql>
+
+    <select id="selectElectricityPriceList" parameterType="ElectricityPrice" resultMap="ElectricityPriceResult">
+        select e.id, e.effective_date,e.price_id,
+                e.begin_date,
+                e.end_date,
+                e.effective_name,
+                t.price
+        from electricity_price e LEFT JOIN time_period_price t ON e.price_id=t.id
+        <where> 1=1
+            <if test="effectiveName != null  and effectiveName != ''"> and e.effective_name like concat('%', #{effectiveName}, '%')</if>
+            <if test="effectiveDate != null "> and e.effective_date = #{effectiveDate}</if>
+        </where>
+        order by effective_date desc
+    </select>
+
+    <select id="selectElectricityPriceById" parameterType="String" resultMap="ElectricityPriceResult">
+        <include refid="selectElectricityPriceVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertElectricityPrice" parameterType="ElectricityPrice">
+        insert into electricity_price
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="effectiveDate != null ">effective_date,</if>
+            <if test="priceId != null  and priceId != ''">price_id,</if>
+            <if test="beginDate != null ">begin_date,</if>
+            <if test="endDate != null ">end_date,</if>
+            <if test="effectiveName != null  and effectiveName != ''">effective_name,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="effectiveDate != null ">#{effectiveDate},</if>
+            <if test="priceId != null  and priceId != ''">#{priceId},</if>
+            <if test="beginDate != null ">#{beginDate},</if>
+            <if test="endDate != null ">#{endDate},</if>
+            <if test="effectiveName != null  and effectiveName != ''">#{effectiveName},</if>
+        </trim>
+    </insert>
+
+    <update id="updateElectricityPrice" parameterType="ElectricityPrice">
+        update electricity_price
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="effectiveDate != null ">effective_date = #{effectiveDate},</if>
+            <if test="priceId != null  and priceId != ''">price_id = #{priceId},</if>
+            <if test="beginDate != null ">begin_date = #{beginDate},</if>
+            <if test="endDate != null ">end_date = #{endDate},</if>
+            <if test="effectiveName != null  and effectiveName != ''">effective_name = #{effectiveName},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteElectricityPriceById" parameterType="String">
+        delete from electricity_price where id = #{id}
+    </delete>
+
+    <delete id="deleteElectricityPriceByIds" parameterType="String">
+        delete from electricity_price where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <!--鐢熸晥鏃ユ湡-->
+    <select id="selectList" parameterType="ElectricityPrice" resultMap="ElectricityPriceResult">
+        select distinct effective_date from electricity_price
+        <where>
+            <if test="effectiveName != null  and effectiveName != ''"> and effective_name like concat('%', #{effectiveName}, '%')</if>
+        </where>
+        order by effective_date desc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/electricityPrice/TimePeriodPriceMapper.xml b/energy_management_server/src/main/resources/mybatis/electricityPrice/TimePeriodPriceMapper.xml
new file mode 100644
index 0000000..9872d73
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/electricityPrice/TimePeriodPriceMapper.xml
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.electricity.mapper.TimePeriodPriceMapper">
+    
+    <resultMap type="TimePeriodPrice" id="TimePeriodPriceResult">
+        <result property="id"    column="id"    />
+        <result property="effectiveDate"    column="effective_date"    />
+        <result property="timePeriod"    column="time_period"    />
+        <result property="price"    column="price"    />
+        <result property="dictType"    column="dict_type"    />
+        <result property="dictValue"    column="dict_value"    />
+        <result property="dictLabel"    column="dict_label"    />
+    </resultMap>
+
+    <sql id="selectTimePeriodPriceVo">
+        select id, effective_date, time_period, price from time_period_price
+    </sql>
+
+    <select id="selectTimePeriodPriceList" parameterType="TimePeriodPrice" resultMap="TimePeriodPriceResult">
+        <include refid="selectTimePeriodPriceVo"/>
+        <where>
+            <if test="effectiveDate != null "> and effective_date = #{effectiveDate}</if>
+            <if test="timePeriod != null and timePeriod != '' "> and time_period = #{timePeriod}</if>
+        </where>
+    </select>
+    
+    <select id="selectTimePeriodPriceById" parameterType="String" resultMap="TimePeriodPriceResult">
+        <include refid="selectTimePeriodPriceVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertTimePeriodPrice" parameterType="TimePeriodPrice">
+        insert into time_period_price
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="effectiveDate != null ">effective_date,</if>
+            <if test="timePeriod != null  and timePeriod != ''">time_period,</if>
+            <if test="price != null  and price != ''">price,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="effectiveDate != null ">#{effectiveDate},</if>
+            <if test="timePeriod != null  and timePeriod != ''">#{timePeriod},</if>
+            <if test="price != null  and price != ''">#{price},</if>
+         </trim>
+    </insert>
+
+    <update id="updateTimePeriodPrice" parameterType="TimePeriodPrice">
+        update time_period_price
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="effectiveDate != null ">effective_date = #{effectiveDate},</if>
+            <if test="timePeriod != null  and timePeriod != ''">time_period = #{timePeriod},</if>
+            <if test="price != null  and price != ''">price = #{price},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteTimePeriodPriceById" parameterType="String">
+        delete from time_period_price where id = #{id}
+    </delete>
+
+    <delete id="deleteTimePeriodPriceByIds" parameterType="String">
+        delete from time_period_price where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <select id="selectDictType" parameterType="TimePeriodPrice" resultMap="TimePeriodPriceResult">
+        select d.dict_label, d.dict_value, d.dict_type,p.price,p.id
+		from sys_dict_data d left join time_period_price p on d.dict_value=p.time_period
+        where d.status = '0'
+        and d.dict_type = #{dictType}
+        <if test="effectiveDate != null "> and p.effective_date = #{effectiveDate}</if>
+        order by d.dict_sort asc
+    </select>
+
+    <select id="dictTypeList" parameterType="TimePeriodPrice" resultMap="TimePeriodPriceResult">
+        select dict_label, dict_value, dict_type
+        from sys_dict_data
+        where status = '0'
+        and dict_type = #{dictType}
+        order by dict_sort asc
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/electricityPrice/statisticsMapper.xml b/energy_management_server/src/main/resources/mybatis/electricityPrice/statisticsMapper.xml
new file mode 100644
index 0000000..def568a
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/electricityPrice/statisticsMapper.xml
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.electricity.mapper.statisticsMapper">
+    <resultMap type="TimePeriodPrice" id="TimePeriodPriceResult">
+        <result property="id"    column="id"    />
+        <result property="effectiveDate"    column="effective_date"    />
+        <result property="timePeriod"    column="time_period"    />
+        <result property="price"    column="price"    />
+        <result property="dictType"    column="dict_type"    />
+        <result property="dictValue"    column="dict_value"    />
+        <result property="dictLabel"    column="dict_label"    />
+    </resultMap>
+
+    <resultMap type="stagseDataEntry" id="stagseDataEntryResult">
+        <result property="code" column="code"/>
+        <result property="name" column="name"/>
+        <result property="indexId" column="index_id"/>
+        <result property="timeType" column="time_type"/>
+        <result property="unitId" column="unit_id"/>
+        <result property="calcType" column="calc_type"/>
+        <result property="value" column="value"/>
+        <result property="timeCode" column="time_code"/>
+        <result property="dataTime" column="data_time"/>
+    </resultMap>
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.electricity.domain.electricityDataItem">
+        <id column="index_id" property="indexId"/>
+        <id column="time_code" property="timeCode"/>
+        <id column="index_code" property="indexCode"/>
+        <id column="index_name" property="indexName"/>
+        <result column="begin_time" property="beginTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="data_time" property="dataTime"/>
+        <result column="value" property="value"/>
+        <result column="time_type" property="timeType"/>
+        <result column="quality" property="quality"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+    <select id="getStatisticsList" resultType="com.dingzhuo.energy.data.model.domain.EnergyIndex">
+        SELECT
+        ei.index_id indexId,
+        code,
+        NAME,
+        si.time_type timeType,
+        ei.unit_id unitId
+        FROM
+        energy_index ei
+        LEFT JOIN node_index ni ON ei.index_id = ni.index_id
+        LEFT JOIN index_storage si ON si.index_id = ei.index_id
+        WHERE
+        ni.node_id IN (
+            SELECT node_id FROM model_node WHERE address LIKE (SELECT address FROM model_node WHERE node_id = #{nodeId} )
+            <if test='eierarchyFlag=="ALL"'>
+               || '%'
+            </if>
+        )
+    </select>
+    <select id="getElectricityPriceList" parameterType="TimePeriodPrice" resultMap="TimePeriodPriceResult">
+        SELECT A.ID,
+            A.effective_date,
+            A.time_period,
+            A.price prices,
+            ( SELECT dict_label FROM sys_dict_data WHERE dict_type = 'electricity_price' AND status = '0' AND dict_value = A.time_period ) electricityName
+        FROM
+            time_period_price A
+        WHERE
+            NOT EXISTS ( SELECT 1 FROM time_period_price b WHERE b.time_period = A.time_period AND b.effective_date > A.effective_date )
+        <if test="endTime !=null ">AND A.effective_date &lt; #{endTime}</if>
+    </select>
+    <!--<select id="getElectricityPriceList" parameterType="ElectricityPrice" resultMap="ElectricityPriceResult">
+        select e.id,
+            e.effective_date,
+            e.price_id,
+            e.begin_date,
+            e.end_date,
+            e.effective_name,
+            t.price as prices,
+            (SELECT dict_label FROM sys_dict_data WHERE dict_type = 'electricity_price' AND status = '0' AND dict_value = e.effective_name) electricityName
+        from electricity_price e LEFT JOIN time_period_price t ON e.price_id=t.id
+        <where> 1=1
+            <if test="endTime !=null ">AND e.effective_date &lt; #{endTime}</if>
+        </where>
+        order by e.effective_date desc
+    </select>-->
+    <select id="getDatasByIndex" resultMap="dataItemMap">
+        SELECT
+        d.index_id,
+        i.code AS index_code,
+        i.NAME AS index_name,
+        i.unit_id,
+        sum(value) as value
+        FROM
+        data_item d
+        LEFT JOIN energy_index i ON d.index_id = i.index_id
+        WHERE
+        i.index_id IN
+        <foreach item="indexId" index="index" collection="indexIds" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+        AND time_type = #{timeType}
+        AND data_time &gt;= #{beginTime}
+        AND data_time &lt;= #{endTime}
+        GROUP BY
+        d.index_id,
+        i.code,
+        i.unit_id,
+        i.NAME
+    </select>
+    <select id="getPeriodDatasByIndex" resultMap="dataItemMap">
+        SELECT
+        d.index_id,
+        i.code AS index_code,
+        i.NAME AS index_name,
+        i.unit_id,
+        sum(value) as value,
+        to_char(d.data_time, 'YYYY-MM' ) as formatdate
+        FROM
+        data_item d
+        LEFT JOIN energy_index i ON d.index_id = i.index_id
+        WHERE
+        i.index_id IN
+        <foreach item="indexId" index="index" collection="indexIds" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+        AND time_type = #{timeType}
+        AND data_time &gt;= #{beginTime}
+        AND data_time &lt;= #{endTime}
+        GROUP BY
+        d.index_id,
+        i.code,
+        i.unit_id,
+        i.NAME,to_char(d.data_time, 'YYYY-MM' )
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/energyBalance/EnergyPicMapper.xml b/energy_management_server/src/main/resources/mybatis/energyBalance/EnergyPicMapper.xml
new file mode 100644
index 0000000..3bddbaf
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/energyBalance/EnergyPicMapper.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.energyBalance.mapper.EnergyPicMapper">
+
+    <resultMap type="EnergyPic" id="EnergyPicResult">
+        <result property="index_id"    column="index_id"    />
+        <result property="name"    column="name"    />
+        <result property="code"    column="code"    />
+        <result property="address"    column="address"    />
+        <result property="modename"    column="modename"    />
+        <result property="a1" column="a1"/>
+        <result property="a2" column="a2"/>
+        <result property="a3" column="a3"/>
+        <result property="a4" column="a4"/>
+        <result property="a5" column="a5"/>
+        <result property="a6" column="a6"/>
+        <result property="a7" column="a7"/>
+        <result property="a8" column="a8"/>
+        <result property="a9" column="a9"/>
+        <result property="a10" column="a10"/>
+        <result property="a11" column="a11"/>
+        <result property="a12" column="a12"/>
+        <result property="a13" column="a13"/>
+        <result property="a14" column="a14"/>
+        <result property="a15" column="a15"/>
+        <result property="a16" column="a16"/>
+        <result property="a17" column="a17"/>
+        <result property="a18" column="a18"/>
+        <result property="a19" column="a19"/>
+        <result property="a20" column="a20"/>
+        <result property="a21" column="a21"/>
+        <result property="a22" column="a22"/>
+        <result property="a23" column="a23"/>
+        <result property="a24" column="a24"/>
+        <result property="a25" column="a25"/>
+        <result property="a26" column="a26"/>
+        <result property="a27" column="a27"/>
+        <result property="a28" column="a28"/>
+        <result property="a29" column="a29"/>
+        <result property="a30" column="a30"/>
+        <result property="a31" column="a31"/>
+        <result property="a32" column="a32"/>
+        <result property="a33" column="a33"/>
+        <result property="a34" column="a34"/>
+        <result property="a35" column="a35"/>
+        <result property="a36" column="a36"/>
+    </resultMap>
+
+
+    <select id="selectEnergyPicList" parameterType="EnergyPic" resultMap="EnergyPicResult">
+        select * from (
+        SELECT
+        aa.index_id,
+        aa.data_time,
+        aa.name,
+        aa.code,
+        aa.address,
+        aa.modename,
+        max(value) as A1
+        FROM
+        (
+        SELECT di.index_id,
+        "value",
+        data_time,
+        ei.name,
+        ei.code,
+        mo.address,
+        mo."name" as modename
+        FROM	data_item di ,
+        energy_index ei,
+        node_index ni,
+        model_node mo
+        WHERE
+        to_char( data_time, 'YYYY-MM-DD HH24' ) = #{sqlWhereDataTime}
+        AND time_type = 'HOUR'
+        and di.index_id = ei.index_id
+        and ei.index_id = ni.index_id
+        and ni.node_id = mo.node_id
+        and ni.node_id IN ( SELECT node_id FROM model_node WHERE address LIKE ( SELECT address FROM model_node WHERE node_id = #{nodeid} ) || '%' )
+        ) aa
+        GROUP BY
+        aa.index_id,aa.data_time,aa.name,aa.code,aa.address,aa."modename") t
+        order by t.address
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/energyBalance/energyBalanceMapper.xml b/energy_management_server/src/main/resources/mybatis/energyBalance/energyBalanceMapper.xml
new file mode 100644
index 0000000..115bcf8
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/energyBalance/energyBalanceMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.energyBalance.mapper.energybalanceMapper">
+
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.dataservice.domain.DataItem">
+        <id column="index_id" property="indexId"/>
+        <id column="time_code" property="timeCode"/>
+        <id column="index_code" property="indexCode"/>
+        <id column="index_name" property="indexName"/>
+        <result column="begin_time" property="beginTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="data_time" property="dataTime"/>
+        <result column="value" property="value"/>
+        <result column="time_type" property="timeType"/>
+        <result column="quality" property="quality"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+    <sql id="itemHead">
+    SELECT di.index_id,
+           di.time_code,
+           di.time_type,
+           di.begin_time,
+           di.end_time,
+           di.data_time,
+           di.value,
+           di.quality,
+           di.create_time,
+           di.update_time,
+           ci.code AS "index_code",
+           ci.name AS "index_name"
+    FROM data_item di
+           LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+  </sql>
+    <select id="getBalanceList" resultMap="dataItemMap">
+        <include refid="itemHead"/>
+        where di.time_code = #{timeCode}
+        AND di.index_id in
+        <foreach item="indexId" index="index" collection="indexIds"
+                 open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+        ORDER BY "value" DESC
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/energyEenchmarking/EnergyBenchmarkingMapper.xml b/energy_management_server/src/main/resources/mybatis/energyEenchmarking/EnergyBenchmarkingMapper.xml
new file mode 100644
index 0000000..050f975
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/energyEenchmarking/EnergyBenchmarkingMapper.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.EnergyBenchmarking.mapper.EnergyBenchmarkingMapper">
+    
+    <resultMap type="EnergyBenchmarking" id="EnergyBenchmarkingResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="codeId"    column="code_id"    />
+        <result property="unit"    column="unit"    />
+        <result property="range"    column="range"    />
+        <result property="type"    column="type"    />
+        <result property="value"    column="value"    />
+        <result property="termValidity"    column="term_validity"    />
+        <result property="modelNode"    column="model_node"    />
+    </resultMap>
+
+    <sql id="selectEnergyBenchmarkingVo">
+        select id, name, code_id, unit, range, type, value, term_validity,model_node from energy_benchmarking
+    </sql>
+
+    <select id="selectEnergyBenchmarkingList" parameterType="EnergyBenchmarking" resultMap="EnergyBenchmarkingResult">
+        <include refid="selectEnergyBenchmarkingVo"/>
+        <where>
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="modelNode != null  and modelNode != ''"> and model_node like concat('%', #{modelNode}, '%')</if>
+            <if test="codeId != null  and codeId != ''"> and code_id like concat('%', #{codeId}, '%')</if>
+            <if test="unit != null  and unit != ''"> and unit like concat('%', #{unit}, '%')</if>
+            <if test="range != null  and range != ''"> and range like concat('%', #{range}, '%')</if>
+            <if test="type != null  and type != ''"> and type like concat('%', #{type}, '%')</if>
+            <if test="value != null  and value != ''"> and value like concat('%', #{value}, '%')</if>
+            <if test="termValidity != null "> and term_validity like concat('%', #{termValidity}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectEnergyBenchmarkingById" parameterType="String" resultMap="EnergyBenchmarkingResult">
+        <include refid="selectEnergyBenchmarkingVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertEnergyBenchmarking" parameterType="EnergyBenchmarking">
+        insert into energy_benchmarking
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="name != null  and name != ''">name,</if>
+            <if test="codeId != null  and codeId != ''">code_id,</if>
+            <if test="unit != null  and unit != ''">unit,</if>
+            <if test="range != null  and range != ''">range,</if>
+            <if test="type != null  and type != ''">type,</if>
+            <if test="value != null  and value != ''">value,</if>
+            <if test="termValidity != null ">term_validity,</if>
+            <if test="modelNode != null ">model_node,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="name != null  and name != ''">#{name},</if>
+            <if test="codeId != null  and codeId != ''">#{codeId},</if>
+            <if test="unit != null  and unit != ''">#{unit},</if>
+            <if test="range != null  and range != ''">#{range},</if>
+            <if test="type != null  and type != ''">#{type},</if>
+            <if test="value != null  and value != ''">#{value},</if>
+            <if test="termValidity != null ">#{termValidity},</if>
+            <if test="modelNode != null ">#{modelNode},</if>
+         </trim>
+    </insert>
+
+    <update id="updateEnergyBenchmarking" parameterType="EnergyBenchmarking">
+        update energy_benchmarking
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null  and name != ''">name = #{name},</if>
+            <if test="codeId != null  and codeId != ''">code_id = #{codeId},</if>
+            <if test="unit != null  and unit != ''">unit = #{unit},</if>
+            <if test="range != null  and range != ''">range = #{range},</if>
+            <if test="type != null  and type != ''">type = #{type},</if>
+            <if test="value != null  and value != ''">value = #{value},</if>
+            <if test="termValidity != null ">term_validity = #{termValidity},</if>
+            <if test="modelNode != null ">model_node= #{modelNode},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteEnergyBenchmarkingById" parameterType="String">
+        delete from energy_benchmarking where id = #{id}
+    </delete>
+
+    <delete id="deleteEnergyBenchmarkingByIds" parameterType="String">
+        delete from energy_benchmarking where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/energyStatistics/energyStatisticsMapper.xml b/energy_management_server/src/main/resources/mybatis/energyStatistics/energyStatisticsMapper.xml
new file mode 100644
index 0000000..e1ae83b
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/energyStatistics/energyStatisticsMapper.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.energyStatistics.mapper.energyStatisticsMapper">
+
+    <resultMap type="EnergyIndex" id="EnergyIndexResult">
+        <result property="indexId" column="index_id"/>
+        <result property="name" column="name"/>
+        <result property="code" column="code"/>
+        <result property="indexType" column="index_type"/>
+        <result property="indexCategory" column="index_category"/>
+        <result property="remark" column="remark"/>
+        <result property="unitId" column="unit_id"/>
+        <result property="meterId" column="meter_id"/>
+    </resultMap>
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.energyStatistics.domain.dataTimeSVG">
+        <id column="index_id" property="indexId"/>
+        <id column="time_code" property="timeCode"/>
+        <id column="index_code" property="indexCode"/>
+        <id column="index_name" property="indexName"/>
+        <result column="begin_time" property="beginTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="data_time" property="dataTime"/>
+        <result column="value" property=""/>
+        <result column="time_type" property="timeType"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="remark" property="remark"/>
+    </resultMap>
+    <select id="reportFormsvg" resultMap="dataItemMap">
+        SELECT
+            d.index_id,
+            time_code,
+            data_time,
+            i.code AS index_code,
+            i.NAME AS index_name,
+            i.unit_id,
+            VALUE
+        FROM
+            data_item d,
+            energy_index i,
+            sys_svg_info svg
+        WHERE
+            d.index_id = i.index_id
+            AND svg.tag = i.code
+            AND svg.node_id = #{nodeId}
+            AND index_type = #{indexType}
+            AND time_type = #{timeType}
+            AND data_time &gt;= #{beginTime}
+            AND data_time &lt;= #{endTime}
+            order by data_time DESC
+    </select>
+    <select id="selectDataTimelist" resultMap="dataItemMap">
+        SELECT
+            d.index_id,
+            time_code,
+            data_time,
+            i.code AS index_code,
+            i.NAME AS index_name,
+            i.unit_id,
+            m.meter_name,
+            VALUE
+        FROM
+            data_item d,
+            energy_index i,
+            meter_implement m
+        WHERE
+            d.index_id = i.index_id
+            AND m.id = i.meter_id
+            AND index_type = #{indexType}
+            AND time_type = #{timeType}
+            AND data_time &gt;= #{beginTime}
+            AND data_time &lt;= #{endTime}
+            order by data_time DESC
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/gateway/GatewayHbtLogMapper.xml b/energy_management_server/src/main/resources/mybatis/gateway/GatewayHbtLogMapper.xml
new file mode 100644
index 0000000..1e0b5b0
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/gateway/GatewayHbtLogMapper.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.gateway.mapper.GatewayHbtLogMapper">
+
+    <resultMap type="GatewayHbtLog" id="GatewayHbtLogResult">
+        <result property="id"    column="id"    />
+        <result property="gatewayNo"    column="gateway_no"    />
+        <result property="hbtTime"    column="hbt_time"    />
+        <result property="content"    column="content"    />
+    </resultMap>
+
+    <sql id="selectGatewayHbtLogVo">
+        select id, gateway_no, hbt_time, content from gateway_hbt_log
+    </sql>
+
+    <select id="selectGatewayHbtLogList" parameterType="GatewayHbtLog" resultMap="GatewayHbtLogResult">
+        <include refid="selectGatewayHbtLogVo"/>
+        <where>
+        </where>
+    </select>
+
+    <select id="selectGatewayHbtLogById" parameterType="String" resultMap="GatewayHbtLogResult">
+        <include refid="selectGatewayHbtLogVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertGatewayHbtLog" parameterType="GatewayHbtLog">
+        insert into gateway_hbt_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="gatewayNo != null  and gatewayNo != ''">gateway_no,</if>
+            <if test="hbtTime != null ">hbt_time,</if>
+            <if test="content != null  and content != ''">content,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="gatewayNo != null  and gatewayNo != ''">#{gatewayNo},</if>
+            <if test="hbtTime != null ">#{hbtTime},</if>
+            <if test="content != null  and content != ''">#{content},</if>
+         </trim>
+    </insert>
+
+    <update id="updateGatewayHbtLog" parameterType="GatewayHbtLog">
+        update gateway_hbt_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="gatewayNo != null  and gatewayNo != ''">gateway_no = #{gatewayNo},</if>
+            <if test="hbtTime != null ">hbt_time = #{hbtTime},</if>
+            <if test="content != null  and content != ''">content = #{content},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteGatewayHbtLogById" parameterType="String">
+        delete from gateway_hbt_log where id = #{id}
+    </delete>
+
+    <delete id="deleteGatewayHbtLogByIds" parameterType="String">
+        delete from gateway_hbt_log where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/gateway/GatewaySettingMapper.xml b/energy_management_server/src/main/resources/mybatis/gateway/GatewaySettingMapper.xml
new file mode 100644
index 0000000..5549068
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/gateway/GatewaySettingMapper.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.gateway.mapper.GatewaySettingMapper">
+
+    <resultMap type="GatewaySetting" id="GatewaySettingResult">
+        <result property="id"    column="id"    />
+        <result property="gatewayNum"    column="gateway_num"    />
+        <result property="plantArea"    column="plant_area"    />
+        <result property="address"    column="address"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="hbtTime"    column="hbt_time"    />
+    </resultMap>
+
+    <sql id="selectGatewaySettingVo">
+        select id, gateway_num, plant_area, address, create_by, create_time, update_by, update_time, hbt_time from gateway_setting
+    </sql>
+
+    <select id="selectGatewaySettingList" parameterType="GatewaySetting" resultMap="GatewaySettingResult">
+        <include refid="selectGatewaySettingVo"/>
+        <where>
+            <if test="gatewayNum != null  and gatewayNum != ''"> and gateway_num like concat('%', #{gatewayNum}, '%')</if>
+            <if test="address != null  and address != ''"> and address like concat('%', #{address}, '%')</if>
+        </where>
+    </select>
+
+    <select id="selectGatewaySettingById" parameterType="String" resultMap="GatewaySettingResult">
+        <include refid="selectGatewaySettingVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertGatewaySetting" parameterType="GatewaySetting">
+        insert into gateway_setting
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="gatewayNum != null  and gatewayNum != ''">gateway_num,</if>
+            <if test="plantArea != null  and plantArea != ''">plant_area,</if>
+            <if test="address != null  and address != ''">address,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="hbtTime != null ">hbt_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="gatewayNum != null  and gatewayNum != ''">#{gatewayNum},</if>
+            <if test="plantArea != null  and plantArea != ''">#{plantArea},</if>
+            <if test="address != null  and address != ''">#{address},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="hbtTime != null ">#{hbtTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateGatewaySetting" parameterType="GatewaySetting">
+        update gateway_setting
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="gatewayNum != null  and gatewayNum != ''">gateway_num = #{gatewayNum},</if>
+            <if test="plantArea != null  and plantArea != ''">plant_area = #{plantArea},</if>
+            <if test="address != null  and address != ''">address = #{address},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="hbtTime != null ">hbt_time = #{hbtTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteGatewaySettingById" parameterType="String">
+        delete from gateway_setting where id = #{id}
+    </delete>
+
+    <delete id="deleteGatewaySettingByIds" parameterType="String">
+        delete from gateway_setting where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <update id="updateGatewaySettingByNum" parameterType="GatewaySetting">
+        update gateway_setting
+        set hbt_time = #{hbtTime}
+        where gateway_num = #{gatewayNum}
+    </update>
+
+
+    <select id="selectGatewaySettingMonitorList" resultMap="GatewaySettingResult">
+        <include refid="selectGatewaySettingVo"/>
+    </select>
+
+    <select id="checkOne" parameterType="GatewaySetting" resultMap="GatewaySettingResult">
+        <include refid="selectGatewaySettingVo"/>
+        where
+        gateway_num=#{gatewayNum}
+        <if test="id != null  and id != ''">
+            and id != #{id}
+        </if>
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/govReports/DataItemPubMapper.xml b/energy_management_server/src/main/resources/mybatis/govReports/DataItemPubMapper.xml
new file mode 100644
index 0000000..843a29e
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/govReports/DataItemPubMapper.xml
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.govReports.mapper.DataItemPubMapper">
+
+    <resultMap type="DataItemPub" id="DataItemPubResult">
+        <result property="indexId" column="index_id"/>
+        <result property="timeCode" column="time_code"/>
+        <result property="beginTime" column="begin_time"/>
+        <result property="endTime" column="end_time"/>
+        <result property="value" column="value"/>
+        <result property="quality" column="quality"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="timeType" column="time_type"/>
+        <result property="dataTime" column="data_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="sendStatus" column="send_status"/>
+        <result property="sendDate" column="send_date"/>
+        <result property="sendTimes" column="send_times"/>
+        <result property="reportSetId" column="report_set_id"/>
+        <result property="reportUpperLimit" column="report_upper_limit"/>
+        <result property="reportUpperReplace" column="report_upper_replace"/>
+        <result property="reportLowerLimit" column="report_lower_limit"/>
+        <result property="reportLowerReplace" column="report_lower_replace"/>
+        <result property="originValue" column="origin_value"/>
+    </resultMap>
+
+    <resultMap type="DataItemPubVo" id="DataItemPubResultVo">
+        <result property="indexId" column="index_id"/>
+        <result property="indexCode" column="code"/>
+        <result property="indexName" column="name"/>
+        <result property="timeCode" column="time_code"/>
+        <result property="value" column="value"/>
+        <result property="originValue" column="origin_value"/>
+        <result property="reportUpperLimit" column="report_upper_limit"/>
+        <result property="reportUpperReplace" column="report_upper_replace"/>
+        <result property="reportLowerLimit" column="report_lower_limit"/>
+        <result property="reportLowerReplace" column="report_lower_replace"/>
+    </resultMap>
+
+    <sql id="selectDataItemPubVo">
+        select index_id,
+               time_code,
+               begin_time,
+               end_time,
+               value,
+               quality,
+               create_time,
+               update_time,
+               time_type,
+               data_time,
+               create_by,
+               send_status,
+               send_date,
+               send_times,
+               report_set_id,
+               report_upper_limit,
+               report_upper_replace,
+               report_lower_limit,
+               report_lower_replace,
+               origin_value
+        from data_item_pub
+    </sql>
+
+    <select id="selectDataItemPubList" parameterType="DataItemPub" resultMap="DataItemPubResult">
+        <include refid="selectDataItemPubVo"/>
+        <where>
+        </where>
+    </select>
+
+    <select id="selectDataItemPubById" parameterType="String" resultMap="DataItemPubResult">
+        <include refid="selectDataItemPubVo"/>
+        where index_id = #{indexId}
+    </select>
+
+    <insert id="insertDataItemPub" parameterType="DataItemPub">
+        insert into data_item_pub
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="indexId != null  and indexId != ''">index_id,</if>
+            <if test="timeCode != null  and timeCode != ''">time_code,</if>
+            <if test="beginTime != null ">begin_time,</if>
+            <if test="endTime != null ">end_time,</if>
+            <if test="value != null ">value,</if>
+            <if test="quality != null  and quality != ''">quality,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="timeType != null  and timeType != ''">time_type,</if>
+            <if test="dataTime != null ">data_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="sendStatus != null ">send_status,</if>
+            <if test="sendDate != null ">send_date,</if>
+            <if test="sendTimes != null ">send_times,</if>
+            <if test="reportSetId != null  and reportSetId != ''">report_set_id,</if>
+            <if test="reportUpperLimit != null ">report_upper_limit,</if>
+            <if test="reportUpperReplace != null ">report_upper_replace,</if>
+            <if test="reportLowerLimit != null ">report_lower_limit,</if>
+            <if test="reportLowerReplace != null ">report_lower_replace,</if>
+            <if test="originValue != null ">origin_value,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="indexId != null  and indexId != ''">#{indexId},</if>
+            <if test="timeCode != null  and timeCode != ''">#{timeCode},</if>
+            <if test="beginTime != null ">#{beginTime},</if>
+            <if test="endTime != null ">#{endTime},</if>
+            <if test="value != null ">#{value},</if>
+            <if test="quality != null  and quality != ''">#{quality},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="timeType != null  and timeType != ''">#{timeType},</if>
+            <if test="dataTime != null ">#{dataTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="sendStatus != null ">#{sendStatus},</if>
+            <if test="sendDate != null ">#{sendDate},</if>
+            <if test="sendTimes != null ">#{sendTimes},</if>
+            <if test="reportSetId != null  and reportSetId != ''">#{reportSetId},</if>
+            <if test="reportUpperLimit != null ">#{reportUpperLimit},</if>
+            <if test="reportUpperReplace != null ">#{reportUpperReplace},</if>
+            <if test="reportLowerLimit != null ">#{reportLowerLimit},</if>
+            <if test="reportLowerReplace != null ">#{reportLowerReplace},</if>
+            <if test="originValue != null ">#{originValue},</if>
+        </trim>
+    </insert>
+
+    <update id="updateDataItemPub" parameterType="DataItemPub">
+        update data_item_pub
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="timeCode != null  and timeCode != ''">time_code = #{timeCode},</if>
+            <if test="beginTime != null ">begin_time = #{beginTime},</if>
+            <if test="endTime != null ">end_time = #{endTime},</if>
+            <if test="value != null ">value = #{value},</if>
+            <if test="quality != null  and quality != ''">quality = #{quality},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="timeType != null  and timeType != ''">time_type = #{timeType},</if>
+            <if test="dataTime != null ">data_time = #{dataTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="sendStatus != null ">send_status = #{sendStatus},</if>
+            <if test="sendDate != null ">send_date = #{sendDate},</if>
+            <if test="sendTimes != null ">send_times = #{sendTimes},</if>
+            <if test="reportSetId != null  and reportSetId != ''">report_set_id = #{reportSetId},</if>
+            <if test="reportUpperLimit != null ">report_upper_limit = #{reportUpperLimit},</if>
+            <if test="reportUpperReplace != null ">report_upper_replace = #{reportUpperReplace},</if>
+            <if test="reportLowerLimit != null ">report_lower_limit = #{reportLowerLimit},</if>
+            <if test="reportLowerReplace != null ">report_lower_replace = #{reportLowerReplace},</if>
+            <if test="originValue != null ">origin_value = #{originValue},</if>
+        </trim>
+        where index_id = #{indexId}
+    </update>
+
+    <delete id="deleteDataItemPubById" parameterType="String">
+        delete
+        from data_item_pub
+        where index_id = #{indexId}
+    </delete>
+
+    <delete id="deleteDataItemPubByIds" parameterType="String">
+        delete from data_item_pub where index_id in
+        <foreach item="indexId" collection="array" open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+    </delete>
+
+    <select id="getReportData" resultMap="DataItemPubResult">
+        SELECT
+            dItem.index_id,
+            dItem.VALUE AS originValue,
+            dItem.VALUE,
+            dItem.begin_time,
+            dItem.end_time,
+            dItem.quality,
+            dItem.create_time,
+            dItem.update_time,
+            dItem.time_type,
+            dItem.data_time,
+            dItem.create_by,
+            dItem.time_code
+        FROM
+            data_item dItem
+        WHERE dItem.time_code = #{timeCode}
+          AND dItem.time_type = #{dateType}
+    </select>
+
+<!--    娉ㄦ剰!!!!!!!!  姝ゅ鏄疨ostGreSql鐨勫啓娉�!-->
+    <insert id="insertOrUpdateDateItemPub">
+        INSERT INTO data_item_pub (
+        index_id,
+        time_code,
+        begin_time,
+        end_time,
+        value,
+        quality,
+        create_time,
+        update_time,
+        time_type,
+        data_time,
+        create_by,
+        send_status,
+        send_date,
+        send_times,
+        report_set_id,
+        report_upper_limit,
+        report_upper_replace,
+        report_lower_limit,
+        report_lower_replace,
+        origin_value
+        )
+        VALUES
+        <foreach collection="list" separator="," item="item">
+            (
+            #{item.indexId},
+            #{item.timeCode},
+            #{item.beginTime},
+            #{item.endTime},
+            #{item.value},
+            #{item.quality},
+            #{item.createTime},
+            #{item.updateTime},
+            #{item.timeType},
+            #{item.dataTime},
+            #{item.createBy},
+            #{item.sendStatus},
+            #{item.sendDate},
+            #{item.sendTimes},
+            #{item.reportSetId},
+            #{item.reportUpperLimit},
+            #{item.reportUpperReplace},
+            #{item.reportLowerLimit},
+            #{item.reportLowerReplace},
+            #{item.originValue}
+            )
+        </foreach>
+        ON CONFLICT(index_id,time_code) DO UPDATE
+        SET index_id = EXCLUDED.index_id,
+        time_code = EXCLUDED.time_code,
+        begin_time = EXCLUDED.begin_time,
+        end_time = EXCLUDED.end_time,
+        value = EXCLUDED.value,
+        quality = EXCLUDED.quality,
+        create_time = EXCLUDED.create_time,
+        update_time = EXCLUDED.update_time,
+        time_type = EXCLUDED.time_type,
+        data_time = EXCLUDED.data_time,
+        create_by = EXCLUDED.create_by,
+        send_status = EXCLUDED.send_status,
+        send_date = EXCLUDED.send_date,
+        send_times = EXCLUDED.send_times,
+        report_set_id = EXCLUDED.report_set_id,
+        report_upper_limit = EXCLUDED.report_upper_limit,
+        report_upper_replace = EXCLUDED.report_upper_replace,
+        report_lower_limit = EXCLUDED.report_lower_limit,
+        report_lower_replace = EXCLUDED.report_lower_replace,
+        origin_value = EXCLUDED.origin_value
+    </insert>
+
+    <select id="selectDataItemPubInfoList" parameterType="DataItemPub" resultMap="DataItemPubResultVo">
+        select ei.index_id,
+            ei.code,
+            ei."name",
+            dip.time_code,
+            dip."value",
+            dip.origin_value,
+            dip.report_upper_limit,
+            dip.report_upper_replace,
+            dip.report_lower_limit,
+            dip.report_lower_replace
+        from energy_index ei,data_item_pub dip
+        where ei.index_id = dip.index_id
+        <if test="timeCode != null and timeCode != ''" >
+            and dip.time_code=#{timeCode}
+        </if>
+
+    </select>
+
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/keyEquipment/dailyKeyEquipmentMapper.xml b/energy_management_server/src/main/resources/mybatis/keyEquipment/dailyKeyEquipmentMapper.xml
new file mode 100644
index 0000000..79320a7
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/keyEquipment/dailyKeyEquipmentMapper.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.keyEquipment.mapper.dailyKeyEquipmentMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.keyEquipment.domain.dailyKeyEquipment">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value0" property="value0"/>
+    </resultMap>
+    <select id="getdailyKeyEquipmentList" resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        LEFT JOIN facility_archives f ON f."id"=ci.equipment
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.equipment=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+        order by di.data_time
+    </select>
+    <select id="getFacilityArchives" resultType="com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives">
+        SELECT ID,code,facility_name AS facilityName FROM facility_archives
+    </select>
+    <select id="getPointFacility" resultType="com.dingzhuo.energy.basic.data.facility.domain.FacilityArchives">
+        SELECT ID,code,facility_name AS facilityName FROM facility_archives where point_flag='Y'
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/keyEquipment/monthlyKeyEquipmentMapper.xml b/energy_management_server/src/main/resources/mybatis/keyEquipment/monthlyKeyEquipmentMapper.xml
new file mode 100644
index 0000000..c388649
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/keyEquipment/monthlyKeyEquipmentMapper.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.keyEquipment.mapper.monthlyKeyEquipmentMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.keyEquipment.domain.monthlyKeyEquipment">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getMonthlyKeyEquipmentList" resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        LEFT JOIN facility_archives f ON f."id"=ci.equipment
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.equipment=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time >= #{beginTime}
+            AND di.data_time &lt; #{endTime}
+            AND di.time_type = #{timeType}
+        order by di.data_time
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/keyEquipment/yearKeyEquipmentMapper.xml b/energy_management_server/src/main/resources/mybatis/keyEquipment/yearKeyEquipmentMapper.xml
new file mode 100644
index 0000000..076e749
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/keyEquipment/yearKeyEquipmentMapper.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.keyEquipment.mapper.yearKeyEquipmentMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.keyEquipment.domain.yearKeyEquipment">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getYearKeyEquipmentList" resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        LEFT JOIN facility_archives f ON f."id"=ci.equipment
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.equipment=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+        order by di.data_time
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/mybatis-config.xml b/energy_management_server/src/main/resources/mybatis/mybatis-config.xml
new file mode 100644
index 0000000..e8b52be
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/mybatis-config.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration
+PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	
+	<settings>
+		<setting name="cacheEnabled"             value="true" />  <!-- 鍏ㄥ眬鏄犲皠鍣ㄥ惎鐢ㄧ紦瀛� -->
+		<setting name="useGeneratedKeys"         value="true" />  <!-- 鍏佽 JDBC 鏀寔鑷姩鐢熸垚涓婚敭 -->
+		<setting name="defaultExecutorType"      value="REUSE" /> <!-- 閰嶇疆榛樿鐨勬墽琛屽櫒 -->
+		<setting name="logImpl"                  value="SLF4J" /> <!-- 鎸囧畾 MyBatis 鎵�鐢ㄦ棩蹇楃殑鍏蜂綋瀹炵幇 -->
+		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>  椹煎嘲寮忓懡鍚� -->
+	</settings>
+	
+</configuration>
diff --git a/energy_management_server/src/main/resources/mybatis/plannedOutput/PlanEnergyMapper.xml b/energy_management_server/src/main/resources/mybatis/plannedOutput/PlanEnergyMapper.xml
new file mode 100644
index 0000000..88eb207
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/plannedOutput/PlanEnergyMapper.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.plannedOutput.mapper.PlanEnergyMapper">
+    
+    <resultMap type="PlanEnergy" id="PlanEnergyResult">
+        <result property="productId"    column="product_id"    />
+        <result property="value"    column="value"    />
+        <result property="energyValue"    column="energy_value"    />
+        <result property="timeType"    column="time_type"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="steamEnereyValue"    column="steam_enerey_value"    />
+        <result property="waterValue"    column="water_value"    />
+        <result property="waterEnergyValue"    column="water_energy_value"    />
+        <result property="coalValue"    column="coal_value"    />
+        <result property="coalEnergyValue"    column="coal_energy_value"    />
+        <result property="steamValue"    column="steam_value"    />
+        <result property="planValue"    column="plan_value"    />
+        <result property="timeCode"    column="time_code"    />
+        <result property="dataTime"    column="data_time"    />
+        <result property="actualValue"    column="actual_value"    />
+    </resultMap>
+
+    <sql id="selectPlanEnergyVo">
+        SELECT
+            productid as product_id,
+            productsno,
+            productname,
+            P.muid,
+            po.plan_value,
+            pe."value",
+            pe.energy_value,
+            pe.water_value,
+            pe.water_energy_value,
+            pe.coal_value,
+            pe.coal_energy_value,
+            pe.steam_value,
+            pe.steam_energy_value,
+            pe.actual_value
+        FROM
+            sys_product P
+            LEFT JOIN planned_output po ON po.product_id = P.productid
+            LEFT JOIN  plan_energy pe ON pe.product_id=p.productid
+    </sql>
+
+    <select id="PlanEnergyList" parameterType="PlanEnergy" resultMap="PlanEnergyResult">
+        <include refid="selectPlanEnergyVo"/>
+        <where>
+            p.productid in
+            <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+            <if test="type != null  and type !=''"> AND pe.time_type = #{type} </if>
+            <if test="timeCode != null  and timeCode !=''"> AND pe.time_code = #{timeCode} AND po.time_code = #{timeCode}  </if>
+        </where>
+    </select>
+    <select id="selectPlanEnergyList" parameterType="PlanEnergy" resultMap="PlanEnergyResult">
+        SELECT
+            productid as product_id,
+            productsno,
+            productname,
+            P.muid,
+            po.plan_value
+        FROM
+            sys_product P
+            LEFT JOIN planned_output po ON po.product_id = P.productid
+        <where>
+            p.productid in
+            <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+            <if test="timeCode != null  and timeCode !=''"> AND po.time_code = #{timeCode} </if>
+        </where>
+    </select>
+    <insert id="save">
+        insert into plan_energy (product_id,
+                               time_code,
+                               time_type,
+                               value,
+                               actual_value,
+                               energy_value,
+                               coal_value,
+                               coal_energy_value,
+                               steam_value,
+                               steam_energy_value,
+                               water_value,
+                               water_energy_value,
+                               data_time,
+                               create_time)
+        select #{planEnergy.productId},
+               #{planEnergy.timeCode},
+               #{planEnergy.timeType},
+               #{planEnergy.value,jdbcType = DOUBLE},
+               #{planEnergy.actualValue,jdbcType = DOUBLE},
+               #{planEnergy.energyValue,jdbcType = DOUBLE},
+               #{planEnergy.coalValue,jdbcType = DOUBLE},
+               #{planEnergy.coalEnergyValue,jdbcType = DOUBLE},
+               #{planEnergy.steamValue,jdbcType = DOUBLE},
+               #{planEnergy.steamEnereyValue,jdbcType = DOUBLE},
+               #{planEnergy.waterValue,jdbcType = DOUBLE},
+               #{planEnergy.waterEnergyValue,jdbcType = DOUBLE},
+               #{planEnergy.dataTime},
+               now()
+        on conflict
+          (product_id,time_code)
+        do update
+        set <if test="planEnergy.value !='' and planEnergy.value !=null">value = #{planEnergy.value, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.actualValue !='' and planEnergy.actualValue !=null">actual_value = #{planEnergy.actualValue, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.energyValue !='' and planEnergy.energyValue !=null">energy_value = #{planEnergy.energyValue, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.coalValue !='' and planEnergy.coalValue !=null">coal_value = #{planEnergy.coalValue, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.coalEnergyValue !='' and planEnergy.coalEnergyValue !=null">coal_energy_value = #{planEnergy.coalEnergyValue, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.steamValue !='' and planEnergy.steamValue !=null">steam_value = #{planEnergy.steamValue, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.steamEnereyValue !='' and planEnergy.steamEnereyValue !=null">steam_energy_value = #{planEnergy.steamEnereyValue, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.waterValue !='' and planEnergy.waterValue !=null">water_value = #{planEnergy.waterValue, jdbcType = DOUBLE},</if>
+        <if test="planEnergy.waterEnergyValue !='' and planEnergy.waterEnergyValue !=null">water_energy_value = #{planEnergy.waterEnergyValue, jdbcType = DOUBLE},</if>
+          update_time = now();
+  </insert>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/plannedOutput/PlannedOutputMapper.xml b/energy_management_server/src/main/resources/mybatis/plannedOutput/PlannedOutputMapper.xml
new file mode 100644
index 0000000..1c00c5e
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/plannedOutput/PlannedOutputMapper.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.plannedOutput.mapper.PlannedOutputMapper">
+
+    <resultMap type="PlannedOutput" id="PlannedOutputResult">
+        <result property="palnType"    column="paln_type"    />
+        <result property="productId"    column="product_id"    />
+        <result property="planValue"    column="plan_value"    />
+        <result property="waterValue"    column="water_value"    />
+        <result property="coalValue"    column="coal_value"    />
+        <result property="value"    column="value"    />
+        <result property="steamValue"    column="steam_value"    />
+        <result property="dataTime"    column="data_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="productname"    column="productname"    />
+        <result property="productsno"    column="productsno"    />
+        <result property="muid"    column="muid"    />
+        <result property="timeCode"    column="time_code"    />
+    </resultMap>
+
+    <sql id="selectPlannedOutputVo">
+        SELECT
+            productid as product_id,
+            productsno,
+            productname,
+            p.muid,
+            po.plan_value,
+            po.paln_type,
+            po."value",
+            po.coal_value,
+            po.steam_value,
+            po.water_value
+        FROM
+            sys_product P
+          left JOIN planned_output po on po.product_id= p.productid
+    </sql>
+
+    <select id="selectPlannedOutputList" parameterType="PlannedOutput" resultMap="PlannedOutputResult">
+        <include refid="selectPlannedOutputVo"/>
+        <where>
+          p.productid in <foreach item="indexId" index="index" collection="indexIds"
+                                open="(" separator="," close=")">
+            #{indexId}
+        </foreach>
+          <if test="palnType != null  and palnType !=''"> AND po.paln_type = #{palnType} </if>
+          <if test="timeCode != null  and timeCode !=''"> AND po.time_code = #{timeCode} </if>
+        </where>
+    </select>
+    <select id="selectPlanList" parameterType="PlannedOutput" resultMap="PlannedOutputResult">
+        SELECT
+            productid as product_id,
+            productsno,
+            productname,
+            p.muid
+        FROM
+            sys_product P
+        <where>
+             p.productid in <foreach item="indexId" index="index" collection="indexIds"
+                                open="(" separator="," close=")">
+            #{indexId}
+            </foreach>
+        </where>
+    </select>
+    <insert id="insertPlannedOutput" parameterType="PlannedOutput">
+        insert into planned_output
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="palnType != null  and palnType != ''">paln_type,</if>
+            <if test="productId != null ">product_id,</if>
+            <if test="planValue != null  and planValue != ''">plan_value,</if>
+            <if test="dataTime != null ">data_time,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="updateTime != null ">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="palnType != null  and palnType != ''">#{palnType},</if>
+            <if test="productId != null ">#{productId},</if>
+            <if test="planValue != null  and planValue != ''">#{planValue},</if>
+            <if test="dataTime != null ">#{dataTime},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <insert id="save">
+        insert into planned_output (
+                               time_code,
+                               paln_type,
+                               product_id,
+                               plan_value,
+                               value,
+                               coal_value,
+                               steam_value,
+                               water_value,
+                               data_time,
+                               create_time)
+        select #{plannedOutput.timeCode},
+               #{plannedOutput.palnType},
+               #{plannedOutput.productId},
+               #{plannedOutput.planValue,jdbcType = DOUBLE},
+               #{plannedOutput.value,jdbcType = DOUBLE},
+               #{plannedOutput.coalValue,jdbcType = DOUBLE},
+               #{plannedOutput.steamValue,jdbcType = DOUBLE},
+               #{plannedOutput.waterValue,jdbcType = DOUBLE},
+               #{plannedOutput.dataTime},
+               now()
+        on conflict
+          (product_id,time_code)
+        do update
+        set plan_value = #{plannedOutput.planValue, jdbcType = DOUBLE},
+            <if test="plannedOutput.value !='' and plannedOutput.value !=null">value = #{plannedOutput.value, jdbcType = DOUBLE},</if>
+            <if test="plannedOutput.coalValue !='' and plannedOutput.coalValue !=null">coal_value = #{plannedOutput.coalValue, jdbcType = DOUBLE},</if>
+            <if test="plannedOutput.steamValue !='' and plannedOutput.steamValue !=null">steam_value = #{plannedOutput.steamValue, jdbcType = DOUBLE},</if>
+            <if test="plannedOutput.waterValue !='' and plannedOutput.waterValue !=null">water_value = #{plannedOutput.waterValue, jdbcType = DOUBLE},</if>
+            update_time = now();
+
+  </insert>
+    <insert id="saveDataList" parameterType="java.util.List">
+        <foreach item="PlannedOutput" collection="ItemVlues">
+            <if test="PlannedOutput != null">
+                insert into planned_output (
+                time_code,
+                paln_type,
+                product_id,
+                plan_value,
+                data_time,
+                create_time)
+                select #{plannedOutput.timeCode},
+                #{plannedOutput.palnType},
+                #{plannedOutput.productId},
+                #{plannedOutput.planValue,jdbcType = DOUBLE},
+                #{plannedOutput.dataTime},
+                now()
+                on conflict
+                (product_id,time_code)
+                do update
+                set plan_value = #{plannedOutput.planValue, jdbcType = DOUBLE},
+                update_time = now();
+            </if>
+        </foreach>
+    </insert>
+
+
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/plannedOutput/energyMonitoringMapper.xml b/energy_management_server/src/main/resources/mybatis/plannedOutput/energyMonitoringMapper.xml
new file mode 100644
index 0000000..538c445
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/plannedOutput/energyMonitoringMapper.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.plannedOutput.mapper.energyMonitoringMapper">
+    
+    <resultMap type="energyMonitoring" id="energyMonitoringResult">
+        <result property="peValue"    column="pe_value"    />
+        <result property="peWaterValue"    column="pe_water_value"    />
+        <result property="peCoalValue"    column="pe_coal_value"    />
+        <result property="peSteamValue"    column="pe_steam_value"    />
+        <result property="actualValue"    column="actual_value"    />
+        <result property="planValue"    column="plan_value"    />
+        <result property="poValue"    column="po_value"    />
+        <result property="poVaterValue"    column="po_water_value"    />
+        <result property="poCoalValue"    column="po_coal_value"    />
+        <result property="poSteamValue"    column="po_steam_value"    />
+        <result property="productid"    column="productid"    />
+        <result property="productname"    column="productname"    />
+        <result property="muid"    column="muid"    />
+    </resultMap>
+
+    <select id="selectEnergyMonitoringList" parameterType="energyMonitoring" resultMap="energyMonitoringResult">
+        SELECT
+            pe."value" AS pe_value,
+            pe.water_value AS pe_water_value,
+            pe.coal_value AS pe_coal_value,
+            pe.steam_value AS pe_steam_value,
+            pe.actual_value,
+            po.plan_value,
+            po."value" AS po_value,
+            po.water_value AS po_water_value,
+            po.coal_value AS po_coal_value,
+            po.steam_value AS po_steam_value,
+            p.productid,
+            P.productname,
+            P.muid
+        FROM
+            plan_energy pe
+            LEFT JOIN planned_output po ON po.product_id = pe.product_id
+            LEFT JOIN sys_product P ON P.productid = pe.product_id
+        WHERE  p.productid in  <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+            <if test="timeCode != null  and timeCode !=''"> AND pe.time_code = #{timeCode} </if>
+            <if test="timeCode != null  and timeCode !=''"> AND po.time_code = #{timeCode} </if>
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/processEnergyConsumption/processEnergyConsumptionMapper.xml b/energy_management_server/src/main/resources/mybatis/processEnergyConsumption/processEnergyConsumptionMapper.xml
new file mode 100644
index 0000000..39d3692
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/processEnergyConsumption/processEnergyConsumptionMapper.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.comprehensiveStatistics.mapper.processEnergyConsumptionMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensiveStatistics">
+        <id column="index_id" property="indexId"/>
+        <id column="time_code" property="timeCode"/>
+        <id column="index_code" property="indexCode"/>
+        <id column="index_name" property="indexName"/>
+        <result column="begin_time" property="beginTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="data_time" property="dataTime"/>
+        <result column="value" property="value"/>
+        <result column="time_type" property="timeType"/>
+        <result column="quality" property="quality"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="remark" property="remark"/>
+        <result column="name" property="name"/>
+        <result column="index_type" property="indexType"/>
+        <result column="facility_name" property="facilityName"/>
+    </resultMap>
+    <resultMap id="comprehensiveMap" type="com.dingzhuo.energy.project.comprehensiveStatistics.domain.comprehensive">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getComprehensiveSList" resultMap="comprehensiveMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id AS unitId,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/reportForm/annualReportMapper.xml b/energy_management_server/src/main/resources/mybatis/reportForm/annualReportMapper.xml
new file mode 100644
index 0000000..33e8f4f
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/reportForm/annualReportMapper.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.reportForm.mapper.annualReportMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.reportForm.domain.annualReport">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+    </resultMap>
+
+    <select id="getannualReportList"  resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            COALESCE(MAX ( CASE WHEN data_time = #{item.dataTime} THEN round(cast("value" as numeric ),2) END ), null)  AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+        and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/reportForm/consolidatedStatementsMapper.xml b/energy_management_server/src/main/resources/mybatis/reportForm/consolidatedStatementsMapper.xml
new file mode 100644
index 0000000..f8f59dd
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/reportForm/consolidatedStatementsMapper.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.reportForm.mapper.consolidatedStatementsMapper">
+
+    <resultMap type="com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements" id="consolidatedResult">
+        <result property="id"    column="id"    />
+        <result property="trRljmZb"    column="tr_rljm_zb"    />
+        <result property="trRljmSwl"    column="tr_rljm_swl"    />
+        <result property="trRljmZbzm"    column="tr_rljm_zbzm"    />
+        <result property="trDianZb"    column="tr_dian_zb"    />
+        <result property="trDianSwl"    column="tr_dian_swl"    />
+        <result property="trDianZbzm"    column="tr_dian_zbzm"    />
+        <result property="trShuiZb"    column="tr_shui_zb"    />
+        <result property="trShuiSwl"    column="tr_shui_swl"    />
+        <result property="trShuiZbzm"    column="tr_shui_zbzm"    />
+        <result property="trZqZb"    column="tr_zq_zb"    />
+        <result property="trZqSwl"    column="tr_zq_swl"    />
+        <result property="trZqZbzm"    column="tr_zq_zbzm"    />
+        <result property="ccJtZb"    column="cc_jt_zb"    />
+        <result property="ccJtSwl"    column="cc_jt_swl"    />
+        <result property="ccJtZbzm"    column="cc_jt_zbzm"    />
+        <result property="ccJyZb"    column="cc_jy_zb"    />
+        <result property="ccJySwl"    column="cc_jy_swl"    />
+        <result property="ccJyZbzm"    column="cc_jy_zbzm"    />
+        <result property="ccCbZb"    column="cc_cb_zb"    />
+        <result property="ccCbSwl"    column="cc_cb_swl"    />
+        <result property="ccCbZbzm"    column="cc_cb_zbzm"    />
+        <result property="ccMqZb"    column="cc_mq_zb"    />
+        <result property="ccMqSwl"    column="cc_mq_swl"    />
+        <result property="ccMqZbzm"    column="cc_mq_zbzm"    />
+        <result property="ccDianZb"    column="cc_dian_zb"    />
+        <result property="ccDianSwl"    column="cc_dian_swl"    />
+        <result property="ccDianZbzm"    column="cc_dian_zbzm"    />
+        <result property="ccZqZb"    column="cc_zq_zb"    />
+        <result property="ccZqSwl"    column="cc_zq_swl"    />
+        <result property="ccZqZbzm"    column="cc_zq_zbzm"    />
+        <result property="timeType"    column="time_type"    />
+        <result property="dataTime"    column="data_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="remark"    column="remark"    />
+        <result property="timeCode"    column="time_code"    />
+        <result property="trZbzm"    column="tr_zbzm"    />
+        <result property="ccZbzm"    column="cc_zbzm"    />
+        <result property="jhbm"    column="jhbm"    />
+        <result property="zhnh"    column="zhnh"    />
+    </resultMap>
+
+
+    <sql id="selectConsolidatedStatementsVo">
+        select id, tr_rljm_zb, tr_rljm_swl, tr_rljm_zbzm, tr_dian_zb, tr_dian_swl, tr_dian_zbzm, tr_shui_zb, tr_shui_swl, tr_shui_zbzm, tr_zq_zb, tr_zq_swl, tr_zq_zbzm, cc_jt_zb, cc_jt_swl, cc_jt_zbzm, cc_jy_zb, cc_jy_swl, cc_jy_zbzm, cc_cb_zb, cc_cb_swl, cc_cb_zbzm, cc_mq_zb, cc_mq_swl, cc_mq_zbzm, cc_dian_zb, cc_dian_swl, cc_dian_zbzm, cc_zq_zb, cc_zq_swl, cc_zq_zbzm, time_type, create_time, create_by, update_time, update_by, remark, time_code, data_time, tr_zbzm, cc_zbzm, jhbm, zhnh from consolidated_statements
+    </sql>
+    <select id="selectconsolidatedStatementsList" resultMap="consolidatedResult" parameterType="com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements">
+        <include refid="selectConsolidatedStatementsVo"/>
+        <where><if test="dataTime !='' and dataTime !=null">data_time= #{dataTime}</if></where>
+    </select>
+
+    <select id="selectconsolidatedStatementsById" parameterType="String" resultMap="consolidatedResult">
+        <include refid="selectConsolidatedStatementsVo"/>
+        where data_time = #{id}
+    </select>
+
+    <insert id="insertconsolidatedStatements" parameterType="com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements">
+        insert into consolidated_statements
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="trRljmZb != null  and trRljmZb != ''">tr_rljm_zb,</if>
+            <if test="trRljmSwl != null  and trRljmSwl != ''">tr_rljm_swl,</if>
+            <if test="trRljmZbzm != null  and trRljmZbzm != ''">tr_rljm_zbzm,</if>
+            <if test="trDianZb != null  and trDianZb != ''">tr_dian_zb,</if>
+            <if test="trDianSwl != null  and trDianSwl != ''">tr_dian_swl,</if>
+            <if test="trDianZbzm != null  and trDianZbzm != ''">tr_dian_zbzm,</if>
+            <if test="trShuiZb != null  and trShuiZb != ''">tr_shui_zb,</if>
+            <if test="trShuiSwl != null  and trShuiSwl != ''">tr_shui_swl,</if>
+            <if test="trShuiZbzm != null  and trShuiZbzm != ''">tr_shui_zbzm,</if>
+            <if test="trZqZb != null  and trZqZb != ''">tr_zq_zb,</if>
+            <if test="trZqSwl != null  and trZqSwl != ''">tr_zq_swl,</if>
+            <if test="trZqZbzm != null  and trZqZbzm != ''">tr_zq_zbzm,</if>
+            <if test="ccJtZb != null  and ccJtZb != ''">cc_jt_zb,</if>
+            <if test="ccJtSwl != null  and ccJtSwl != ''">cc_jt_swl,</if>
+            <if test="ccJtZbzm != null  and ccJtZbzm != ''">cc_jt_zbzm,</if>
+            <if test="ccJyZb != null  and ccJyZb != ''">cc_jy_zb,</if>
+            <if test="ccJySwl != null  and ccJySwl != ''">cc_jy_swl,</if>
+            <if test="ccJyZbzm != null  and ccJyZbzm != ''">cc_jy_zbzm,</if>
+            <if test="ccCbZb != null  and ccCbZb != ''">cc_cb_zb,</if>
+            <if test="ccCbSwl != null  and ccCbSwl != ''">cc_cb_swl,</if>
+            <if test="ccCbZbzm != null  and ccCbZbzm != ''">cc_cb_zbzm,</if>
+            <if test="ccMqZb != null  and ccMqZb != ''">cc_mq_zb,</if>
+            <if test="ccMqSwl != null  and ccMqSwl != ''">cc_mq_swl,</if>
+            <if test="ccMqZbzm != null  and ccMqZbzm != ''">cc_mq_zbzm,</if>
+            <if test="ccDianZb != null  and ccDianZb != ''">cc_dian_zb,</if>
+            <if test="ccDianSwl != null  and ccDianSwl != ''">cc_dian_swl,</if>
+            <if test="ccDianZbzm != null  and ccDianZbzm != ''">cc_dian_zbzm,</if>
+            <if test="ccZqZb != null  and ccZqZb != ''">cc_zq_zb,</if>
+            <if test="ccZqSwl != null  and ccZqSwl != ''">cc_zq_swl,</if>
+            <if test="ccZqZbzm != null  and ccZqZbzm != ''">cc_zq_zbzm,</if>
+            <if test="timeType != null  and timeType != ''">time_type,</if>
+            <if test="createTime != null ">create_time,</if>
+            <if test="createBy != null  and createBy != ''">create_by,</if>
+            <if test="updateTime != null ">update_time,</if>
+            <if test="updateBy != null  and updateBy != ''">update_by,</if>
+            <if test="remark != null  and remark != ''">remark,</if>
+            <if test="timeCode != null  and timeCode != ''">time_code,</if>
+            <if test="dataTime != null  and dataTime != ''">data_time,</if>
+            <if test="trZbzm != null  and trZbzm != ''">tr_zbzm,</if>
+            <if test="ccZbzm != null  and ccZbzm != ''">cc_zbzm,</if>
+            <if test="jhbm != null  and jhbm != ''">jhbm,</if>
+            <if test="zhnh != null  and zhnh != ''">zhnh,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="trRljmZb != null  and trRljmZb != ''">#{trRljmZb},</if>
+            <if test="trRljmSwl != null  and trRljmSwl != ''">#{trRljmSwl},</if>
+            <if test="trRljmZbzm != null  and trRljmZbzm != ''">#{trRljmZbzm},</if>
+            <if test="trDianZb != null  and trDianZb != ''">#{trDianZb},</if>
+            <if test="trDianSwl != null  and trDianSwl != ''">#{trDianSwl},</if>
+            <if test="trDianZbzm != null  and trDianZbzm != ''">#{trDianZbzm},</if>
+            <if test="trShuiZb != null  and trShuiZb != ''">#{trShuiZb},</if>
+            <if test="trShuiSwl != null  and trShuiSwl != ''">#{trShuiSwl},</if>
+            <if test="trShuiZbzm != null  and trShuiZbzm != ''">#{trShuiZbzm},</if>
+            <if test="trZqZb != null  and trZqZb != ''">#{trZqZb},</if>
+            <if test="trZqSwl != null  and trZqSwl != ''">#{trZqSwl},</if>
+            <if test="trZqZbzm != null  and trZqZbzm != ''">#{trZqZbzm},</if>
+            <if test="ccJtZb != null  and ccJtZb != ''">#{ccJtZb},</if>
+            <if test="ccJtSwl != null  and ccJtSwl != ''">#{ccJtSwl},</if>
+            <if test="ccJtZbzm != null  and ccJtZbzm != ''">#{ccJtZbzm},</if>
+            <if test="ccJyZb != null  and ccJyZb != ''">#{ccJyZb},</if>
+            <if test="ccJySwl != null  and ccJySwl != ''">#{ccJySwl},</if>
+            <if test="ccJyZbzm != null  and ccJyZbzm != ''">#{ccJyZbzm},</if>
+            <if test="ccCbZb != null  and ccCbZb != ''">#{ccCbZb},</if>
+            <if test="ccCbSwl != null  and ccCbSwl != ''">#{ccCbSwl},</if>
+            <if test="ccCbZbzm != null  and ccCbZbzm != ''">#{ccCbZbzm},</if>
+            <if test="ccMqZb != null  and ccMqZb != ''">#{ccMqZb},</if>
+            <if test="ccMqSwl != null  and ccMqSwl != ''">#{ccMqSwl},</if>
+            <if test="ccMqZbzm != null  and ccMqZbzm != ''">#{ccMqZbzm},</if>
+            <if test="ccDianZb != null  and ccDianZb != ''">#{ccDianZb},</if>
+            <if test="ccDianSwl != null  and ccDianSwl != ''">#{ccDianSwl},</if>
+            <if test="ccDianZbzm != null  and ccDianZbzm != ''">#{ccDianZbzm},</if>
+            <if test="ccZqZb != null  and ccZqZb != ''">#{ccZqZb},</if>
+            <if test="ccZqSwl != null  and ccZqSwl != ''">#{ccZqSwl},</if>
+            <if test="ccZqZbzm != null  and ccZqZbzm != ''">#{ccZqZbzm},</if>
+            <if test="timeType != null  and timeType != ''">#{timeType},</if>
+            <if test="createTime != null ">#{createTime},</if>
+            <if test="createBy != null  and createBy != ''">#{createBy},</if>
+            <if test="updateTime != null ">#{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">#{updateBy},</if>
+            <if test="remark != null  and remark != ''">#{remark},</if>
+            <if test="timeCode != null  and timeCode != ''">#{timeCode},</if>
+            <if test="dataTime != null  and dataTime != ''">#{dataTime},</if>
+            <if test="trZbzm != null  and trZbzm != ''">#{trZbzm},</if>
+            <if test="ccZbzm != null  and ccZbzm != ''">#{ccZbzm},</if>
+            <if test="jhbm != null  and jhbm != ''">#{jhbm},</if>
+            <if test="zhnh != null  and zhnh != ''">#{zhnh},</if>
+        </trim>
+    </insert>
+
+    <update id="updateconsolidatedStatements" parameterType="com.dingzhuo.energy.project.reportForm.domain.consolidatedStatements">
+        update consolidated_statements
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="trRljmZb != null  and trRljmZb != ''">tr_rljm_zb = #{trRljmZb},</if>
+            <if test="trRljmSwl != null  and trRljmSwl != ''">tr_rljm_swl = #{trRljmSwl},</if>
+            <if test="trRljmZbzm != null  and trRljmZbzm != ''">tr_rljm_zbzm = #{trRljmZbzm},</if>
+            <if test="trDianZb != null  and trDianZb != ''">tr_dian_zb = #{trDianZb},</if>
+            <if test="trDianSwl != null  and trDianSwl != ''">tr_dian_swl = #{trDianSwl},</if>
+            <if test="trDianZbzm != null  and trDianZbzm != ''">tr_dian_zbzm = #{trDianZbzm},</if>
+            <if test="trShuiZb != null  and trShuiZb != ''">tr_shui_zb = #{trShuiZb},</if>
+            <if test="trShuiSwl != null  and trShuiSwl != ''">tr_shui_swl = #{trShuiSwl},</if>
+            <if test="trShuiZbzm != null  and trShuiZbzm != ''">tr_shui_zbzm = #{trShuiZbzm},</if>
+            <if test="trZqZb != null  and trZqZb != ''">tr_zq_zb = #{trZqZb},</if>
+            <if test="trZqSwl != null  and trZqSwl != ''">tr_zq_swl = #{trZqSwl},</if>
+            <if test="trZqZbzm != null  and trZqZbzm != ''">tr_zq_zbzm = #{trZqZbzm},</if>
+            <if test="ccJtZb != null  and ccJtZb != ''">cc_jt_zb = #{ccJtZb},</if>
+            <if test="ccJtSwl != null  and ccJtSwl != ''">cc_jt_swl = #{ccJtSwl},</if>
+            <if test="ccJtZbzm != null  and ccJtZbzm != ''">cc_jt_zbzm = #{ccJtZbzm},</if>
+            <if test="ccJyZb != null  and ccJyZb != ''">cc_jy_zb = #{ccJyZb},</if>
+            <if test="ccJySwl != null  and ccJySwl != ''">cc_jy_swl = #{ccJySwl},</if>
+            <if test="ccJyZbzm != null  and ccJyZbzm != ''">cc_jy_zbzm = #{ccJyZbzm},</if>
+            <if test="ccCbZb != null  and ccCbZb != ''">cc_cb_zb = #{ccCbZb},</if>
+            <if test="ccCbSwl != null  and ccCbSwl != ''">cc_cb_swl = #{ccCbSwl},</if>
+            <if test="ccCbZbzm != null  and ccCbZbzm != ''">cc_cb_zbzm = #{ccCbZbzm},</if>
+            <if test="ccMqZb != null  and ccMqZb != ''">cc_mq_zb = #{ccMqZb},</if>
+            <if test="ccMqSwl != null  and ccMqSwl != ''">cc_mq_swl = #{ccMqSwl},</if>
+            <if test="ccMqZbzm != null  and ccMqZbzm != ''">cc_mq_zbzm = #{ccMqZbzm},</if>
+            <if test="ccDianZb != null  and ccDianZb != ''">cc_dian_zb = #{ccDianZb},</if>
+            <if test="ccDianSwl != null  and ccDianSwl != ''">cc_dian_swl = #{ccDianSwl},</if>
+            <if test="ccDianZbzm != null  and ccDianZbzm != ''">cc_dian_zbzm = #{ccDianZbzm},</if>
+            <if test="ccZqZb != null  and ccZqZb != ''">cc_zq_zb = #{ccZqZb},</if>
+            <if test="ccZqSwl != null  and ccZqSwl != ''">cc_zq_swl = #{ccZqSwl},</if>
+            <if test="ccZqZbzm != null  and ccZqZbzm != ''">cc_zq_zbzm = #{ccZqZbzm},</if>
+            <if test="timeType != null  and timeType != ''">time_type = #{timeType},</if>
+            <if test="createTime != null ">create_time = #{createTime},</if>
+            <if test="createBy != null  and createBy != ''">create_by = #{createBy},</if>
+            <if test="updateTime != null ">update_time = #{updateTime},</if>
+            <if test="updateBy != null  and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="remark != null  and remark != ''">remark = #{remark},</if>
+            <if test="timeCode != null  and timeCode != ''">time_code = #{timeCode},</if>
+            <if test="dataTime != null  and dataTime != ''">data_time=#{dataTime},</if>
+            <if test="trZbzm != null  and trZbzm != ''">tr_zbzm = #{trZbzm},</if>
+            <if test="ccZbzm != null  and ccZbzm != ''">cc_zbzm = #{ccZbzm},</if>
+            <if test="jhbm != null  and jhbm != ''">jhbm = #{jhbm},</if>
+            <if test="zhnh != null  and zhnh != ''">zhnh = #{zhnh},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteconsolidatedStatementsById" parameterType="String">
+        delete from consolidated_statements where id = #{id}
+    </delete>
+
+    <delete id="deleteconsolidatedStatementsByIds" parameterType="String">
+        delete from consolidated_statements where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/reportForm/dailyReportMapper.xml b/energy_management_server/src/main/resources/mybatis/reportForm/dailyReportMapper.xml
new file mode 100644
index 0000000..5011b14
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/reportForm/dailyReportMapper.xml
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.reportForm.mapper.dailyReportMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.reportForm.domain.dailyReport">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value0" property="value0"/>
+    </resultMap>
+    <select id="getDailyReportList"  resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            COALESCE(MAX ( CASE WHEN data_time = #{item.dataTime} THEN round(cast("value" as numeric ),2) END ), null)  AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+        and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="listDailyReportList" resultType="com.dingzhuo.energy.project.reportForm.domain.dailyReport">
+        SELECT
+            aa.index_id,
+            aa.index_name indexName,
+            <foreach item="item" index="index" collection="dataList">
+                COALESCE ( MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ), null ) AS ${item.value},
+            </foreach>
+            aa.time_type
+        FROM
+        (
+            SELECT
+                ni.index_id,
+                ei."name" AS "index_name",
+                di."value",
+                di.data_time,
+                di.time_type,
+                mn.order_num
+            FROM
+                model_node mn
+                LEFT JOIN node_index ni ON ni.node_id = mn.node_id
+                LEFT JOIN energy_index ei ON ei.index_id = ni.index_id
+                LEFT JOIN data_item di ON ni.index_id = di.index_id
+            WHERE
+                mn.parent_id = #{nodeId}
+                AND di.data_time >= #{beginTime}
+                AND di.data_time &lt; #{endTime}
+                AND di.time_type = #{timeType}
+            <if test="indexStorageId !='' and indexStorageId !=null">
+                and ei.energy_id=#{indexStorageId}
+            </if>
+        ) aa
+        GROUP BY aa.index_id, aa.index_name, aa.time_type, aa.order_num
+        ORDER BY aa.order_num ASC
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/reportForm/monthlyReportMapper.xml b/energy_management_server/src/main/resources/mybatis/reportForm/monthlyReportMapper.xml
new file mode 100644
index 0000000..0d44f4b
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/reportForm/monthlyReportMapper.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.reportForm.mapper.monthlyReportMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.reportForm.domain.monthlyReport">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+    <select id="getmonthlyReportList"  resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            COALESCE(MAX ( CASE WHEN data_time = #{item.dataTime} THEN round(cast("value" as numeric ),2) END ), null)  AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt;= #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+        and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/reportForm/reportFromMapper.xml b/energy_management_server/src/main/resources/mybatis/reportForm/reportFromMapper.xml
new file mode 100644
index 0000000..564cb09
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/reportForm/reportFromMapper.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.reportForm.mapper.reportFormMapper">
+    <resultMap type="reportForm" id="reportFormResult">
+        <result property="code" column="code"/>
+        <result property="name" column="name"/>
+        <result property="nodeId" column="node_id"/>
+        <result property="parentId" column="parent_id"/>
+        <result property="address" column="address"/>
+        <result property="modelCode" column="model_code"/>
+        <result property="nodeCategory" column="node_category"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="indexId" column="index_id"/>
+        <result property="indexType" column="index_type"/>
+        <result property="value" column="value"/>
+        <result property="dataTime" column="data_time"/>
+    </resultMap>
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.reportForm.domain.dailyReport">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+    <select id="selectReportFormList" parameterType="reportForm" resultMap="reportFormResult">
+        SELECT
+            node_id,
+            code,
+            NAME,
+            parent_id,
+            address,
+            model_code,
+            node_category,
+            order_num
+        FROM
+            model_node
+        WHERE
+            model_code =#{code}
+            AND parent_id IN ( SELECT node_id FROM model_node WHERE model_code = #{code} AND parent_id IN ( SELECT node_id FROM model_node WHERE model_code = #{code} AND parent_id IS NULL ) )
+        ORDER BY
+            order_num
+   </select>
+    <select id="selectReportFormListp" parameterType="reportForm" resultMap="reportFormResult">
+        SELECT
+            node_id,
+            code,
+            NAME,
+            parent_id,
+            address,
+            model_code,
+            node_category,
+            order_num
+        FROM
+            model_node
+        WHERE
+            model_code = #{code}
+            AND parent_id IN ( SELECT node_id FROM model_node WHERE model_code = #{code} AND parent_id IS NULL )
+        ORDER BY
+            order_num
+    </select>
+    <select id="selectList" parameterType="reportForm" resultMap="reportFormResult">
+        SELECT
+            SUM ( VALUE ) as value,
+            d.index_id,
+            n.node_id,
+            to_char( d.data_time, 'MM' ) AS timeDate,
+            to_char( d.data_time, 'YYYY-MM' ) AS timeYear
+        FROM
+            data_item d
+            LEFT JOIN energy_index i ON d.index_id = i.index_id
+            LEFT JOIN node_index ni ON i.index_id = ni.index_id
+            LEFT JOIN model_node n ON n.node_id = ni.node_id
+        WHERE
+            time_type = #{timeType}
+            and n.model_code = #{code}
+            and to_char( d.data_time, 'YYYY-MM' )>=#{timeYear}
+            and to_char( d.data_time, 'YYYY' )&lt;=#{timeDate}
+        GROUP BY
+            to_char( data_time, 'YYYY-MM' ),
+            n.node_id,
+            d.index_id,
+            to_char( d.data_time, 'MM' );
+   </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/reportForm/reportSetMapper.xml b/energy_management_server/src/main/resources/mybatis/reportForm/reportSetMapper.xml
new file mode 100644
index 0000000..d0387e4
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/reportForm/reportSetMapper.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.reportForm.mapper.reportSetMapper">
+    <resultMap type="reportSet" id="reportSetResult">
+        <result property="id" column="id"/>
+        <result property="indexId" column="index_id"/>
+        <result property="dateType" column="date_type"/>
+        <result property="nodeId" column="node_id"/>
+        <result property="enableLimitValue" column="enable_limit_value"/>
+        <result property="limitValUp" column="limit_val_up"/>
+        <result property="limitValDown" column="limit_val_down"/>
+        <result property="limitReplaceValUp" column="limit_replace_val_up"/>
+        <result property="limitReplaceValDown" column="limit_replace_val_down"/>
+    </resultMap>
+    <select id="listReportSet" parameterType="String" resultMap="reportSetResult">
+        SELECT
+            *
+        FROM
+            report_set
+        WHERE
+            index_id =#{indexId}
+            AND node_id = #{nodeId} AND del = 0
+   </select>
+
+    <select id="listNodeReportSet" parameterType="String" resultMap="reportSetResult">
+        SELECT
+            *
+        FROM
+            report_set
+        WHERE
+            node_id = #{nodeId} AND del = 0
+   </select>
+
+    <update id="deleteReportSetByNodeId" parameterType="String">
+        update report_set set del = 1 , update_time = now(),update_by=#{username} where node_id = #{nodeId} AND index_id = #{indexId} and del=0
+    </update>
+
+    <insert id="saveReportSet">
+        insert into report_set (
+        id,
+        index_id,
+        node_id,
+        date_type,
+        limit_val_up,
+        limit_val_down,
+        limit_replace_val_up,
+        limit_replace_val_down,
+        update_time,
+        update_by,
+        create_time,
+        create_by,del,enable_limit_value)
+        values
+        <foreach collection="list" item="data" index="index" separator=",">
+            (#{data.id},
+            #{data.indexId},
+            #{data.nodeId},
+            #{data.dateType},
+            #{data.limitValUp},
+            #{data.limitValDown},
+            #{data.limitReplaceValUp},
+            #{data.limitReplaceValDown},
+            now(),
+            #{data.updateBy},
+            now(),
+            #{data.createBy},0,#{data.enableLimitValue})
+        </foreach>
+    </insert>
+
+    <resultMap type="reportSetDataModel" id="reportSetDataResult">
+        <result property="indexId" column="index_id"/>
+        <result property="indexCode" column="code"/>
+        <result property="indexName" column="name"/>
+        <result property="meterName" column="meter_name"/>
+    </resultMap>
+
+    <select id="listNodeIndex" parameterType="String" resultMap="reportSetDataResult">
+        select
+            ni.index_id,ei."name",ei.code,mi.meter_name
+        from
+            node_index ni
+            left join energy_index ei on ni.index_id = ei.index_id
+						LEFT JOIN meter_implement mi on mi."id" = ei.meter_id
+					WHERE
+            ni.node_id =#{nodeId}
+            AND  ei.index_type = #{indexType}
+   </select>
+
+    <update id="updateEnableStatus" >
+        update report_set set enable_limit_value = #{enableStatus} , update_time = now(),update_by=#{username} where node_id = #{nodeId} AND index_id = #{indexId} and del=0
+    </update>
+
+    <select id="getAllEnableSetByDateType" parameterType="String" resultMap="reportSetResult">
+        SELECT
+            *
+        FROM
+            report_set
+        WHERE del = 0 AND enable_limit_value = 1 AND date_type = #{dateType}
+    </select>
+</mapper>
diff --git a/energy_management_server/src/main/resources/mybatis/statisticalData/GxdhCountMapper.xml b/energy_management_server/src/main/resources/mybatis/statisticalData/GxdhCountMapper.xml
new file mode 100644
index 0000000..0447765
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/statisticalData/GxdhCountMapper.xml
@@ -0,0 +1,236 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.statisticalData.mapper.GxdhCountMapper">
+    
+    <resultMap type="GxdhCount" id="GxdhCountResult">
+        <result property="id"    column="id"    />
+        <result property="repProductType"    column="rep_product_type"    />
+        <result property="electricIndex"    column="electric_index"    />
+        <result property="gasIndex"    column="gas_index"    />
+        <result property="steamIndex"    column="steam_index"    />
+        <result property="varietyType"    column="variety_type"    />
+    </resultMap>
+
+    <resultMap type="GxdhCountIndex" id="GxdhCountIndexResult">
+        <result property="index_id"    column="index_id"    />
+        <result property="repProductType"    column="rep_product_type"    />
+        <result property="varietyType"    column="variety_type"    />
+        <result property="FL"    column="fl"    />
+        <result property="a1" column="a1"/>
+        <result property="a2" column="a2"/>
+        <result property="a3" column="a3"/>
+        <result property="a4" column="a4"/>
+        <result property="a5" column="a5"/>
+        <result property="a6" column="a6"/>
+        <result property="a7" column="a7"/>
+        <result property="a8" column="a8"/>
+        <result property="a9" column="a9"/>
+        <result property="a10" column="a10"/>
+        <result property="a11" column="a11"/>
+        <result property="a12" column="a12"/>
+        <result property="a13" column="a13"/>
+        <result property="a14" column="a14"/>
+        <result property="a15" column="a15"/>
+        <result property="a16" column="a16"/>
+        <result property="a17" column="a17"/>
+        <result property="a18" column="a18"/>
+        <result property="a19" column="a19"/>
+        <result property="a20" column="a20"/>
+        <result property="a21" column="a21"/>
+        <result property="a22" column="a22"/>
+        <result property="a23" column="a23"/>
+        <result property="a24" column="a24"/>
+        <result property="a25" column="a25"/>
+        <result property="a26" column="a26"/>
+        <result property="a27" column="a27"/>
+        <result property="a28" column="a28"/>
+        <result property="a29" column="a29"/>
+        <result property="a30" column="a30"/>
+        <result property="a31" column="a31"/>
+        <result property="a32" column="a32"/>
+        <result property="a33" column="a33"/>
+        <result property="a34" column="a34"/>
+        <result property="a35" column="a35"/>
+        <result property="a36" column="a36"/>
+    </resultMap>
+
+    <sql id="selectGxdhCountVo">
+        select id, rep_product_type, electric_index, gas_index, steam_index, variety_type from gxdh_count
+    </sql>
+
+    <select id="selectGxdhCountList" parameterType="GxdhCount" resultMap="GxdhCountResult">
+        <include refid="selectGxdhCountVo"/>
+        <where>  
+            <if test="repProductType != null  and repProductType != ''"> and rep_product_type = #{repProductType}</if>
+            <if test="varietyType != null  and varietyType != ''"> and variety_type = #{varietyType}</if>
+        </where>
+    </select>
+    
+    <select id="selectGxdhCountById" parameterType="String" resultMap="GxdhCountResult">
+        <include refid="selectGxdhCountVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertGxdhCount" parameterType="GxdhCount">
+        insert into gxdh_count
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">id,</if>
+            <if test="repProductType != null  and repProductType != ''">rep_product_type,</if>
+            <if test="electricIndex != null  and electricIndex != ''">electric_index,</if>
+            <if test="gasIndex != null  and gasIndex != ''">gas_index,</if>
+            <if test="steamIndex != null  and steamIndex != ''">steam_index,</if>
+            <if test="varietyType != null  and varietyType != ''">variety_type,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null  and id != ''">#{id},</if>
+            <if test="repProductType != null  and repProductType != ''">#{repProductType},</if>
+            <if test="electricIndex != null  and electricIndex != ''">#{electricIndex},</if>
+            <if test="gasIndex != null  and gasIndex != ''">#{gasIndex},</if>
+            <if test="steamIndex != null  and steamIndex != ''">#{steamIndex},</if>
+            <if test="varietyType != null  and varietyType != ''">#{varietyType},</if>
+         </trim>
+    </insert>
+
+    <update id="updateGxdhCount" parameterType="GxdhCount">
+        update gxdh_count
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="repProductType != null  and repProductType != ''">rep_product_type = #{repProductType},</if>
+            <if test="electricIndex != null  and electricIndex != ''">electric_index = #{electricIndex},</if>
+            <if test="gasIndex != null  and gasIndex != ''">gas_index = #{gasIndex},</if>
+            <if test="steamIndex != null  and steamIndex != ''">steam_index = #{steamIndex},</if>
+            <if test="varietyType != null  and varietyType != ''">variety_type = #{varietyType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteGxdhCountById" parameterType="String">
+        delete from gxdh_count where id = #{id}
+    </delete>
+
+    <delete id="deleteGxdhCountByIds" parameterType="String">
+        delete from gxdh_count where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectGxdhCountIndexList" parameterType="GxdhCountIndex" resultMap="GxdhCountIndexResult">
+        <!--鑳芥簮娑堣�楅噺 鎴�  浜у搧浜ч噺鐨�  鐒︾偔鐨�  鐢�   鐓ゆ皵 钂告苯 -->
+        SELECT
+        aa.index_id,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '01'		THEN "value" END ) AS 	A1	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '02'		THEN "value" END ) AS 	A2	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '03'		THEN "value" END ) AS 	A3	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '04'		THEN "value" END ) AS 	A4	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '05'		THEN "value" END ) AS 	A5	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '06'		THEN "value" END ) AS 	A6	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '07'		THEN "value" END ) AS 	A7	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '08'		THEN "value" END ) AS 	A8	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '09'		THEN "value" END ) AS 	A9	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '10'		THEN "value" END ) AS 	A10	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '11'		THEN "value" END ) AS 	A11	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '12'		THEN "value" END ) AS 	A12	,
+        max(rep_product_type) rep_product_type,
+        max(variety_type) variety_type,
+        'DIAN' as FL
+        FROM
+        (
+        SELECT
+        a.index_id,
+        "value",
+        data_time,
+        b.rep_product_type,
+        b.variety_type
+        FROM
+        data_item a,
+        gxdh_count b
+        WHERE
+        to_char(data_time,'YYYY') = #{selectYear}
+        AND time_type = 'MONTH'
+        and b.variety_type=#{varietyType}
+        and b.rep_product_type=#{repProductType}
+        and a.index_id = b.electric_index
+        ) aa
+        GROUP BY
+        aa.index_id
+        UNION all
+        SELECT
+        aa.index_id,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '01'		THEN "value" END ) AS 	A1	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '02'		THEN "value" END ) AS 	A2	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '03'		THEN "value" END ) AS 	A3	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '04'		THEN "value" END ) AS 	A4	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '05'		THEN "value" END ) AS 	A5	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '06'		THEN "value" END ) AS 	A6	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '07'		THEN "value" END ) AS 	A7	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '08'		THEN "value" END ) AS 	A8	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '09'		THEN "value" END ) AS 	A9	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '10'		THEN "value" END ) AS 	A10	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '11'		THEN "value" END ) AS 	A11	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '12'		THEN "value" END ) AS 	A12	,
+        max(rep_product_type),
+        max(variety_type),
+        'MQ' as FL
+        FROM
+        (
+        SELECT
+        a.index_id,
+        "value",
+        data_time,
+        b.rep_product_type,
+        b.variety_type
+        FROM
+        data_item a,
+        gxdh_count b
+        WHERE
+        to_char(data_time,'YYYY') = #{selectYear}
+        AND time_type = 'MONTH'
+        and b.variety_type=#{varietyType}
+        and b.rep_product_type=#{repProductType}
+        and  a.index_id = b.gas_index
+        ) aa
+        GROUP BY
+        aa.index_id
+        UNION all
+        SELECT
+        aa.index_id,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '01'		THEN "value" END ) AS 	A1	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '02'		THEN "value" END ) AS 	A2	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '03'		THEN "value" END ) AS 	A3	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '04'		THEN "value" END ) AS 	A4	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '05'		THEN "value" END ) AS 	A5	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '06'		THEN "value" END ) AS 	A6	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '07'		THEN "value" END ) AS 	A7	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '08'		THEN "value" END ) AS 	A8	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '09'		THEN "value" END ) AS 	A9	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '10'		THEN "value" END ) AS 	A10	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '11'		THEN "value" END ) AS 	A11	,
+        MAX ( CASE WHEN to_char(data_time,'mm') = '12'		THEN "value" END ) AS 	A12	,
+        max(rep_product_type),
+        max(variety_type),
+        'ZQ' as FL
+        FROM
+        (
+        SELECT
+        a.index_id,
+        "value",
+        data_time,
+        b.rep_product_type,
+        b.variety_type
+        FROM
+        data_item a,
+        gxdh_count b
+        WHERE
+        to_char(data_time,'YYYY') = #{selectYear}
+        AND time_type = 'MONTH'
+        and b.variety_type=#{varietyType}
+        and b.rep_product_type=#{repProductType}
+        and a.index_id = b.steam_index
+        ) aa
+        GROUP BY
+        aa.index_id
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/workingProcedure/dailyWorkingProcedureMapper.xml b/energy_management_server/src/main/resources/mybatis/workingProcedure/dailyWorkingProcedureMapper.xml
new file mode 100644
index 0000000..798c6bd
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/workingProcedure/dailyWorkingProcedureMapper.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.workingProcedure.mapper.dailyWorkingProcedureMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.workingProcedure.domain.dailyWorkingProcedure">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value0" property="value0"/>
+    </resultMap>
+    <select id="getdailyWorkingProcedureList" resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/workingProcedure/monthlyWorkingProcedureMapper.xml b/energy_management_server/src/main/resources/mybatis/workingProcedure/monthlyWorkingProcedureMapper.xml
new file mode 100644
index 0000000..c27cdc6
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/workingProcedure/monthlyWorkingProcedureMapper.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.workingProcedure.mapper.monthlyWorkingProcedureMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.workingProcedure.domain.monthlyWorkingProcedure">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+        <result column="value13" property="value13"/>
+        <result column="value14" property="value14"/>
+        <result column="value15" property="value15"/>
+        <result column="value16" property="value16"/>
+        <result column="value17" property="value17"/>
+        <result column="value18" property="value18"/>
+        <result column="value19" property="value19"/>
+        <result column="value20" property="value20"/>
+        <result column="value21" property="value21"/>
+        <result column="value22" property="value22"/>
+        <result column="value23" property="value23"/>
+        <result column="value24" property="value24"/>
+        <result column="value25" property="value25"/>
+        <result column="value26" property="value26"/>
+        <result column="value27" property="value27"/>
+        <result column="value28" property="value28"/>
+        <result column="value29" property="value29"/>
+        <result column="value30" property="value30"/>
+        <result column="value31" property="value31"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getMonthlyWorkingProcedureList" resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time >= #{beginTime}
+            AND di.data_time &lt; #{endTime}
+            AND di.time_type = #{timeType}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/mybatis/workingProcedure/yearWorkingProcedureMapper.xml b/energy_management_server/src/main/resources/mybatis/workingProcedure/yearWorkingProcedureMapper.xml
new file mode 100644
index 0000000..17082d2
--- /dev/null
+++ b/energy_management_server/src/main/resources/mybatis/workingProcedure/yearWorkingProcedureMapper.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dingzhuo.energy.project.workingProcedure.mapper.yearWorkingProcedureMapper">
+    <resultMap id="dataItemMap" type="com.dingzhuo.energy.project.workingProcedure.domain.yearWorkingProcedure">
+        <result column="index_id" property="indexId"/>
+        <result column="index_name" property="indexName"/>
+        <result column="time_type" property="timeType"/>
+        <result column="time_code" property="timeCode"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="value1" property="value1"/>
+        <result column="value2" property="value2"/>
+        <result column="value3" property="value3"/>
+        <result column="value4" property="value4"/>
+        <result column="value5" property="value5"/>
+        <result column="value6" property="value6"/>
+        <result column="value7" property="value7"/>
+        <result column="value8" property="value8"/>
+        <result column="value9" property="value9"/>
+        <result column="value10" property="value10"/>
+        <result column="value11" property="value11"/>
+        <result column="value12" property="value12"/>
+    </resultMap>
+    <!--鍏ㄥ巶鑳借�楃粺璁�-->
+    <select id="getYearWorkingProcedureList" resultMap="dataItemMap">
+        SELECT
+        aa.index_id,
+        aa.index_name,
+        <foreach item="item" index="index" collection="dataList">
+            MAX ( CASE WHEN data_time = #{item.dataTime} THEN "value" END ) AS ${item.value},
+        </foreach>
+        aa.time_type
+        FROM
+        (
+        SELECT
+        ci.index_id,
+        ci.NAME  AS "index_name",
+        di."value",
+        di.data_time,
+        di.time_type
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+        di.data_time >= #{beginTime}
+        AND di.data_time &lt; #{endTime}
+        AND di.index_id IN <foreach item="indexId" index="index" collection="indexIds"  open="(" separator="," close=")">#{indexId} </foreach>
+        AND di.time_type = #{timeType}
+        <if test="indexStorageId !='' and indexStorageId !=null">
+            and ci.energy_id=#{indexStorageId}
+        </if>
+        ) aa
+        GROUP BY
+        aa.index_id,aa.index_name,aa.time_type
+    </select>
+
+    <select id="getListChart" resultMap="dataItemMap">
+        SELECT
+            di.index_id,
+            ci.name AS "index_name",
+            ci.unit_id,
+            di."value",
+            di.data_time,
+            di.time_type,
+            di.time_code
+        FROM
+        data_item di LEFT JOIN energy_index ci ON di.index_id = ci.index_id
+        WHERE
+            di.index_id =#{indexId}
+            AND di.data_time &lt; #{endTime}
+            AND di.data_time >= #{beginTime}
+            AND di.time_type = #{timeType}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/vm/java/controller.java.vm b/energy_management_server/src/main/resources/vm/java/controller.java.vm
new file mode 100644
index 0000000..bb81d62
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/java/controller.java.vm
@@ -0,0 +1,103 @@
+package ${packageName}.controller;
+
+import java.util.List;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Log;
+import com.dingzhuo.energy.framework.aspectj.lang.enums.BusinessType;
+import ${packageName}.domain.${ClassName};
+import ${packageName}.service.I${ClassName}Service;
+import com.dingzhuo.energy.framework.web.controller.BaseController;
+import com.dingzhuo.energy.framework.web.domain.AjaxResult;
+import com.dingzhuo.energy.common.utils.poi.ExcelUtil;
+import com.dingzhuo.energy.framework.web.page.TableDataInfo;
+
+/**
+ * ${functionName}Controller
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+@RestController
+@RequestMapping("/${moduleName}/${businessName}")
+public class ${ClassName}Controller extends BaseController
+{
+    @Autowired
+    private I${ClassName}Service ${className}Service;
+
+    /**
+     * 鏌ヨ${functionName}鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(${ClassName} ${className})
+    {
+        startPage();
+        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+        return getDataTable(list);
+    }
+
+    /**
+     * 瀵煎嚭${functionName}鍒楄〃
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
+    @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
+    @GetMapping("/export")
+    public AjaxResult export(${ClassName} ${className})
+    {
+        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
+        ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
+        return util.exportExcel(list, "${businessName}");
+    }
+
+    /**
+     * 鑾峰彇${functionName}璇︾粏淇℃伅
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
+    @GetMapping(value = "/{${pkColumn.javaField}}")
+    public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField})
+    {
+        return AjaxResult.success(${className}Service.select${ClassName}ById(${pkColumn.javaField}));
+    }
+
+    /**
+     * 鏂板${functionName}
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:add')")
+    @Log(title = "${functionName}", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody ${ClassName} ${className})
+    {
+        return toAjax(${className}Service.insert${ClassName}(${className}));
+    }
+
+    /**
+     * 淇敼${functionName}
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:edit')")
+    @Log(title = "${functionName}", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody ${ClassName} ${className})
+    {
+        return toAjax(${className}Service.update${ClassName}(${className}));
+    }
+
+    /**
+     * 鍒犻櫎${functionName}
+     */
+    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:remove')")
+    @Log(title = "${functionName}", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{${pkColumn.javaField}s}")
+    public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s)
+    {
+        return toAjax(${className}Service.delete${ClassName}ByIds(${pkColumn.javaField}s));
+    }
+}
diff --git a/energy_management_server/src/main/resources/vm/java/domain.java.vm b/energy_management_server/src/main/resources/vm/java/domain.java.vm
new file mode 100644
index 0000000..39424cd
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/java/domain.java.vm
@@ -0,0 +1,76 @@
+package ${packageName}.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.dingzhuo.energy.framework.aspectj.lang.annotation.Excel;
+import com.dingzhuo.energy.framework.web.domain.BaseEntity;
+#foreach ($import in $importList)
+import ${import};
+#end
+
+/**
+ * ${functionName}瀵硅薄 ${tableName}
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+#set($Entity="BaseEntity")
+public class ${ClassName} extends ${Entity}
+{
+    private static final long serialVersionUID = 1L;
+
+#foreach ($column in $columns)
+#if(!$table.isSuperColumn($column.javaField))
+    /** $column.columnComment */
+#if($column.list)
+#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#if($parentheseIndex != -1)
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+#elseif($column.javaType == 'Date')
+    @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd")
+#else
+    @Excel(name = "${comment}")
+#end
+#end
+    private $column.javaType $column.javaField;
+
+#end
+#end
+#foreach ($column in $columns)
+#if(!$table.isSuperColumn($column.javaField))
+#if($column.javaField > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+#set($AttrName=$column.javaField)
+#else
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#end
+    public void set${AttrName}($column.javaType $column.javaField) 
+    {
+        this.$column.javaField = $column.javaField;
+    }
+
+    public $column.javaType get${AttrName}() 
+    {
+        return $column.javaField;
+    }
+#end
+#end
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+#foreach ($column in $columns)
+#if($column.javaField > 2 && $column.javaField.substring(1,2).matches("[A-Z]"))
+#set($AttrName=$column.javaField)
+#else
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#end
+            .append("${column.javaField}", get${AttrName}())
+#end
+            .toString();
+    }
+}
diff --git a/energy_management_server/src/main/resources/vm/java/mapper.java.vm b/energy_management_server/src/main/resources/vm/java/mapper.java.vm
new file mode 100644
index 0000000..dc3a5df
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/java/mapper.java.vm
@@ -0,0 +1,61 @@
+package ${packageName}.mapper;
+
+import ${packageName}.domain.${ClassName};
+import java.util.List;
+
+/**
+ * ${functionName}Mapper鎺ュ彛
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public interface ${ClassName}Mapper 
+{
+    /**
+     * 鏌ヨ${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}ID
+     * @return ${functionName}
+     */
+    public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 鏌ヨ${functionName}鍒楄〃
+     * 
+     * @param ${className} ${functionName}
+     * @return ${functionName}闆嗗悎
+     */
+    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
+
+    /**
+     * 鏂板${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 缁撴灉
+     */
+    public int insert${ClassName}(${ClassName} ${className});
+
+    /**
+     * 淇敼${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 缁撴灉
+     */
+    public int update${ClassName}(${ClassName} ${className});
+
+    /**
+     * 鍒犻櫎${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}ID
+     * @return 缁撴灉
+     */
+    public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 鎵归噺鍒犻櫎${functionName}
+     * 
+     * @param ${pkColumn.javaField}s 闇�瑕佸垹闄ょ殑鏁版嵁ID
+     * @return 缁撴灉
+     */
+    public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s);
+}
diff --git a/energy_management_server/src/main/resources/vm/java/service.java.vm b/energy_management_server/src/main/resources/vm/java/service.java.vm
new file mode 100644
index 0000000..678f6dc
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/java/service.java.vm
@@ -0,0 +1,61 @@
+package ${packageName}.service;
+
+import ${packageName}.domain.${ClassName};
+import java.util.List;
+
+/**
+ * ${functionName}Service鎺ュ彛
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+public interface I${ClassName}Service 
+{
+    /**
+     * 鏌ヨ${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}ID
+     * @return ${functionName}
+     */
+    public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+
+    /**
+     * 鏌ヨ${functionName}鍒楄〃
+     * 
+     * @param ${className} ${functionName}
+     * @return ${functionName}闆嗗悎
+     */
+    public List<${ClassName}> select${ClassName}List(${ClassName} ${className});
+
+    /**
+     * 鏂板${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 缁撴灉
+     */
+    public int insert${ClassName}(${ClassName} ${className});
+
+    /**
+     * 淇敼${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 缁撴灉
+     */
+    public int update${ClassName}(${ClassName} ${className});
+
+    /**
+     * 鎵归噺鍒犻櫎${functionName}
+     * 
+     * @param ${pkColumn.javaField}s 闇�瑕佸垹闄ょ殑${functionName}ID
+     * @return 缁撴灉
+     */
+    public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s);
+
+    /**
+     * 鍒犻櫎${functionName}淇℃伅
+     * 
+     * @param ${pkColumn.javaField} ${functionName}ID
+     * @return 缁撴灉
+     */
+    public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField});
+}
diff --git a/energy_management_server/src/main/resources/vm/java/serviceImpl.java.vm b/energy_management_server/src/main/resources/vm/java/serviceImpl.java.vm
new file mode 100644
index 0000000..0ec8482
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/java/serviceImpl.java.vm
@@ -0,0 +1,109 @@
+package ${packageName}.service.impl;
+
+import java.util.List;
+#foreach ($column in $columns)
+#if($column.javaField == 'createTime' || $column.javaField == 'updateTime')
+import com.dingzhuo.energy.common.utils.DateUtils;
+#break
+#end
+#end
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import ${packageName}.mapper.${ClassName}Mapper;
+import ${packageName}.domain.${ClassName};
+import ${packageName}.service.I${ClassName}Service;
+
+/**
+ * ${functionName}Service涓氬姟灞傚鐞�
+ * 
+ * @author ${author}
+ * @date ${datetime}
+ */
+@Service
+public class ${ClassName}ServiceImpl implements I${ClassName}Service 
+{
+    @Autowired
+    private ${ClassName}Mapper ${className}Mapper;
+
+    /**
+     * 鏌ヨ${functionName}
+     * 
+     * @param ${pkColumn.javaField} ${functionName}ID
+     * @return ${functionName}
+     */
+    @Override
+    public ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField})
+    {
+        return ${className}Mapper.select${ClassName}ById(${pkColumn.javaField});
+    }
+
+    /**
+     * 鏌ヨ${functionName}鍒楄〃
+     * 
+     * @param ${className} ${functionName}
+     * @return ${functionName}
+     */
+    @Override
+    public List<${ClassName}> select${ClassName}List(${ClassName} ${className})
+    {
+        return ${className}Mapper.select${ClassName}List(${className});
+    }
+
+    /**
+     * 鏂板${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 缁撴灉
+     */
+    @Override
+    public int insert${ClassName}(${ClassName} ${className})
+    {
+#foreach ($column in $columns)
+#if($column.javaField == 'createTime')
+        ${className}.setCreateTime(DateUtils.getNowDate());
+#end
+#end
+        return ${className}Mapper.insert${ClassName}(${className});
+    }
+
+    /**
+     * 淇敼${functionName}
+     * 
+     * @param ${className} ${functionName}
+     * @return 缁撴灉
+     */
+    @Override
+    public int update${ClassName}(${ClassName} ${className})
+    {
+#foreach ($column in $columns)
+#if($column.javaField == 'updateTime')
+        ${className}.setUpdateTime(DateUtils.getNowDate());
+#end
+#end
+        return ${className}Mapper.update${ClassName}(${className});
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎${functionName}
+     * 
+     * @param ${pkColumn.javaField}s 闇�瑕佸垹闄ょ殑${functionName}ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s)
+    {
+        return ${className}Mapper.delete${ClassName}ByIds(${pkColumn.javaField}s);
+    }
+
+    /**
+     * 鍒犻櫎${functionName}淇℃伅
+     * 
+     * @param ${pkColumn.javaField} ${functionName}ID
+     * @return 缁撴灉
+     */
+    @Override
+    public int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField})
+    {
+        return ${className}Mapper.delete${ClassName}ById(${pkColumn.javaField});
+    }
+}
diff --git a/energy_management_server/src/main/resources/vm/js/api.js.vm b/energy_management_server/src/main/resources/vm/js/api.js.vm
new file mode 100644
index 0000000..296d41a
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/js/api.js.vm
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ${functionName}鍒楄〃
+export function list${BusinessName}(query) {
+  return request({
+    url: '/${moduleName}/${businessName}/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ${functionName}璇︾粏
+export function get${BusinessName}(${pkColumn.javaField}) {
+  return request({
+    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+    method: 'get'
+  })
+}
+
+// 鏂板${functionName}
+export function add${BusinessName}(data) {
+  return request({
+    url: '/${moduleName}/${businessName}',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼${functionName}
+export function update${BusinessName}(data) {
+  return request({
+    url: '/${moduleName}/${businessName}',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎${functionName}
+export function del${BusinessName}(${pkColumn.javaField}) {
+  return request({
+    url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField},
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭${functionName}
+export function export${BusinessName}(query) {
+  return request({
+    url: '/${moduleName}/${businessName}/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/vm/sql/sql.vm b/energy_management_server/src/main/resources/vm/sql/sql.vm
new file mode 100644
index 0000000..948ce97
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/sql/sql.vm
@@ -0,0 +1,22 @@
+-- 鑿滃崟 SQL
+insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('${functionName}', '3', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 'C', '0', '${permissionPrefix}:list', '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '${functionName}鑿滃崟');
+
+-- 鎸夐挳鐖惰彍鍗旾D
+SELECT @parentId := LAST_INSERT_ID();
+
+-- 鎸夐挳 SQL
+insert into sys_menu  (menu_name, parent_id, order_num, path, component, is_frame, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('${functionName}鏌ヨ', @parentId, '1',  '#', '', 1,  'F', '0', '${permissionPrefix}:query',         '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+
+insert into sys_menu  (menu_name, parent_id, order_num, path, component, is_frame, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('${functionName}鏂板', @parentId, '2',  '#', '', 1,  'F', '0', '${permissionPrefix}:add',          '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+
+insert into sys_menu  (menu_name, parent_id, order_num, path, component, is_frame, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('${functionName}淇敼', @parentId, '3',  '#', '', 1,  'F', '0', '${permissionPrefix}:edit',         '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+
+insert into sys_menu  (menu_name, parent_id, order_num, path, component, is_frame, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('${functionName}鍒犻櫎', @parentId, '4',  '#', '', 1,  'F', '0', '${permissionPrefix}:remove',       '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
+
+insert into sys_menu  (menu_name, parent_id, order_num, path, component, is_frame, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark)
+values('${functionName}瀵煎嚭', @parentId, '5',  '#', '', 1,  'F', '0', '${permissionPrefix}:export',       '#', 'admin', '2018-03-01', 'ry', '2018-03-01', '');
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/vm/vue/index.vue.vm b/energy_management_server/src/main/resources/vm/vue/index.vue.vm
new file mode 100644
index 0000000..9348194
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/vue/index.vue.vm
@@ -0,0 +1,439 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+#foreach($column in $columns)
+#if($column.query)
+#set($dictType=$column.dictType)
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#if($column.htmlType == "input")
+      <el-form-item label="${comment}" prop="${column.javaField}">
+        <el-input
+          v-model="queryParams.${column.javaField}"
+          placeholder="璇疯緭鍏�${comment}"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType)
+        <el-form-item label="${comment}" prop="${column.javaField}">
+        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable size="small">
+          <el-option
+            v-for="dict in ${column.javaField}Options"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType)
+        <el-form-item label="${comment}" prop="${column.javaField}">
+        <el-select v-model="queryParams.${column.javaField}" placeholder="璇烽�夋嫨${comment}" clearable size="small">
+          <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
+        </el-select>
+      </el-form-item>
+#elseif($column.htmlType == "datetime")
+      <el-form-item label="${comment}" prop="${column.javaField}">
+        <el-date-picker clearable size="small" style="width: 200px"
+          v-model="queryParams.${column.javaField}"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="閫夋嫨${comment}">
+        </el-date-picker>
+      </el-form-item>
+#end
+#end
+#end
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['${moduleName}:${businessName}:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['${moduleName}:${businessName}:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['${moduleName}:${businessName}:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['${moduleName}:${businessName}:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="${businessName}List" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+#foreach($column in $columns)
+#set($javaField=$column.javaField)
+#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#if($column.pk)
+      <el-table-column label="${comment}" align="center" prop="${javaField}" />
+#elseif($column.list && $column.htmlType == "datetime")
+      <el-table-column label="${comment}" align="center" prop="${javaField}" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.${javaField}) }}</span>
+        </template>
+      </el-table-column>
+#elseif($column.list && "" != $column.dictType)
+      <el-table-column label="${comment}" align="center" prop="${javaField}" :formatter="${javaField}Format" />
+#elseif($column.list && "" != $javaField)
+      <el-table-column label="${comment}" align="center" prop="${javaField}" />
+#end
+#end
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['${moduleName}:${businessName}:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['${moduleName}:${businessName}:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀�${functionName}瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+#foreach($column in $columns)
+#set($field=$column.javaField)
+#if($column.insert && !$column.pk)
+#if(($column.usableColumn) || (!$column.superColumn))
+#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#set($dictType=$column.dictType)
+#if($column.htmlType == "input")
+        <el-form-item label="${comment}" prop="${field}">
+          <el-input v-model="form.${field}" placeholder="璇疯緭鍏�${comment}" />
+        </el-form-item>
+#elseif($column.htmlType == "select" && "" != $dictType)
+        <el-form-item label="${comment}">
+          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
+            <el-option
+              v-for="dict in ${field}Options"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+#elseif($column.htmlType == "select" && $dictType)
+        <el-form-item label="${comment}">
+          <el-select v-model="form.${field}" placeholder="璇烽�夋嫨${comment}">
+            <el-option label="璇烽�夋嫨瀛楀吀鐢熸垚" value="" />
+          </el-select>
+        </el-form-item>
+#elseif($column.htmlType == "radio" && "" != $dictType)
+        <el-form-item label="${comment}">
+          <el-radio-group v-model="form.${field}">
+            <el-radio
+              v-for="dict in ${field}Options"
+              :key="dict.dictValue"
+              :label="dict.dictValue"
+            >{{dict.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+#elseif($column.htmlType == "radio" && $dictType)
+        <el-form-item label="${comment}">
+          <el-radio-group v-model="form.${field}">
+            <el-radio label="1">璇烽�夋嫨瀛楀吀鐢熸垚</el-radio>
+          </el-radio-group>
+        </el-form-item>
+#elseif($column.htmlType == "datetime")
+        <el-form-item label="${comment}" prop="${field}">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.${field}"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨${comment}">
+          </el-date-picker>
+        </el-form-item>
+#elseif($column.htmlType == "textarea")
+        <el-form-item label="${comment}" prop="${field}">
+          <el-input v-model="form.${field}" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
+        </el-form-item>
+#end
+#end
+#end
+#end
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { list${BusinessName}, get${BusinessName}, del${BusinessName}, add${BusinessName}, update${BusinessName}, export${BusinessName} } from "@/api/${moduleName}/${businessName}";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // ${functionName}琛ㄦ牸鏁版嵁
+      ${businessName}List: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+#foreach ($column in $columns)
+#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#if(${column.dictType} != '')
+      // $comment瀛楀吀
+      ${column.javaField}Options: []#if($velocityCount != $columns.size()),#end
+
+#end
+#end
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+#foreach ($column in $columns)
+#if($column.query)
+        $column.javaField: undefined#if($velocityCount != $columns.size()),#end
+
+#end
+#end
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+#foreach ($column in $columns)
+#if($column.required)
+#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+#set($comment=$column.columnComment)
+        $column.javaField: [
+          { required: true, message: "$comment涓嶈兘涓虹┖", trigger: "blur" }
+        ]#if($velocityCount != $columns.size()),#end
+#end
+#end
+      }
+    };
+  },
+  created() {
+    this.getList();
+#foreach ($column in $columns)
+#if(${column.dictType} != '')
+    this.getDicts("${column.dictType}").then(response => {
+      this.${column.javaField}Options = response.data;
+    });
+#end
+#end
+  },
+  methods: {
+    /** 鏌ヨ${functionName}鍒楄〃 */
+    getList() {
+      this.loading = true;
+      list${BusinessName}(this.queryParams).then(response => {
+        this.${businessName}List = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+#foreach ($column in $columns)
+#if(${column.dictType} != '')
+#set($parentheseIndex=$column.columnComment.indexOf("锛�"))
+#if($parentheseIndex != -1)
+#set($comment=$column.columnComment.substring(0, $parentheseIndex))
+#else
+#set($comment=$column.columnComment)
+#end
+    // $comment瀛楀吀缈昏瘧
+    ${column.javaField}Format(row, column) {
+      return this.selectDictLabel(this.${column.javaField}Options, row.${column.javaField});
+    },
+#end
+#end
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+#foreach ($column in $columns)
+#if($column.htmlType == "radio")
+        $column.javaField: "0"#if($velocityCount != $columns.size()),#end
+
+#else
+        $column.javaField: undefined#if($velocityCount != $columns.size()),#end
+
+#end
+#end
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.${pkColumn.javaField})
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞${functionName}";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const ${pkColumn.javaField} = row.${pkColumn.javaField} || this.ids
+      get${BusinessName}(${pkColumn.javaField}).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼${functionName}";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.#[[$]]#refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.${pkColumn.javaField} != undefined) {
+            update${BusinessName}(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            add${BusinessName}(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ${pkColumn.javaField}s = row.${pkColumn.javaField} || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎${functionName}缂栧彿涓�"' + ${pkColumn.javaField}s + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return del${BusinessName}(${pkColumn.javaField}s);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈�${functionName}鏁版嵁椤�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return export${BusinessName}(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
\ No newline at end of file
diff --git a/energy_management_server/src/main/resources/vm/xml/mapper.xml.vm b/energy_management_server/src/main/resources/vm/xml/mapper.xml.vm
new file mode 100644
index 0000000..7d75aa3
--- /dev/null
+++ b/energy_management_server/src/main/resources/vm/xml/mapper.xml.vm
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="${packageName}.mapper.${ClassName}Mapper">
+    
+    <resultMap type="${ClassName}" id="${ClassName}Result">
+#foreach ($column in $columns)
+        <result property="${column.javaField}"    column="${column.columnName}"    />
+#end
+    </resultMap>
+
+    <sql id="select${ClassName}Vo">
+        select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName}
+    </sql>
+
+    <select id="select${ClassName}List" parameterType="${ClassName}" resultMap="${ClassName}Result">
+        <include refid="select${ClassName}Vo"/>
+        <where>  
+#foreach($column in $columns)
+#set($queryType=$column.queryType)
+#set($javaField=$column.javaField)
+#set($javaType=$column.javaType)
+#set($columnName=$column.columnName)
+#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+#if($column.query)
+#if($column.queryType == "EQ")
+            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName = #{$javaField}</if>
+#elseif($queryType == "NE")
+            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName != #{$javaField}</if>
+#elseif($queryType == "GT")
+            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt; #{$javaField}</if>
+#elseif($queryType == "GTE")
+            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &gt;= #{$javaField}</if>
+#elseif($queryType == "LT")
+            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt; #{$javaField}</if>
+#elseif($queryType == "LTE")
+            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName &lt;= #{$javaField}</if>
+#elseif($queryType == "LIKE")
+            <if test="$javaField != null #if($javaType == 'String' ) and $javaField.trim() != ''#end"> and $columnName like concat('%', #{$javaField}, '%')</if>
+#elseif($queryType == "BETWEEN")
+            <if test="params.begin$AttrName != null and params.begin$AttrName != '' and params.end$AttrName != null and params.end$AttrName != ''"> and $columnName between #{params.begin$AttrName} and #{params.end$AttrName}</if>
+#end
+#end
+#end
+        </where>
+    </select>
+    
+    <select id="select${ClassName}ById" parameterType="${pkColumn.javaType}" resultMap="${ClassName}Result">
+        <include refid="select${ClassName}Vo"/>
+        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
+    </select>
+        
+    <insert id="insert${ClassName}" parameterType="${ClassName}"#if($pkColumn.increment) useGeneratedKeys="true" keyProperty="$pkColumn.javaField"#end>
+        insert into ${tableName}
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+#foreach($column in $columns)
+#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
+            <if test="$column.javaField != null #if($column.javaType == 'String' ) and $column.javaField != ''#end">$column.columnName,</if>
+#end
+#end
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+#foreach($column in $columns)
+#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment)
+            <if test="$column.javaField != null #if($column.javaType == 'String' ) and $column.javaField != ''#end">#{$column.javaField},</if>
+#end
+#end
+         </trim>
+    </insert>
+
+    <update id="update${ClassName}" parameterType="${ClassName}">
+        update ${tableName}
+        <trim prefix="SET" suffixOverrides=",">
+#foreach($column in $columns)
+#if($column.columnName != $pkColumn.columnName)
+            <if test="$column.javaField != null #if($column.javaType == 'String' ) and $column.javaField != ''#end">$column.columnName = #{$column.javaField},</if>
+#end
+#end
+        </trim>
+        where ${pkColumn.columnName} = #{${pkColumn.javaField}}
+    </update>
+
+    <delete id="delete${ClassName}ById" parameterType="${pkColumn.javaType}">
+        delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}}
+    </delete>
+
+    <delete id="delete${ClassName}ByIds" parameterType="String">
+        delete from ${tableName} where ${pkColumn.columnName} in 
+        <foreach item="${pkColumn.javaField}" collection="array" open="(" separator="," close=")">
+            #{${pkColumn.javaField}}
+        </foreach>
+    </delete>
+    
+</mapper>
\ No newline at end of file
diff --git a/energy_management_ui/.editorconfig b/energy_management_ui/.editorconfig
new file mode 100644
index 0000000..7034f9b
--- /dev/null
+++ b/energy_management_ui/.editorconfig
@@ -0,0 +1,22 @@
+# 鍛婅瘔EditorConfig鎻掍欢锛岃繖鏄牴鏂囦欢锛屼笉鐢ㄧ户缁線涓婃煡鎵�
+root = true
+
+# 鍖归厤鍏ㄩ儴鏂囦欢
+[*]
+# 璁剧疆瀛楃闆�
+charset = utf-8
+# 缂╄繘椋庢牸锛屽彲閫塻pace銆乼ab
+indent_style = space
+# 缂╄繘鐨勭┖鏍兼暟
+indent_size = 2
+# 缁撳熬鎹㈣绗︼紝鍙�塴f銆乧r銆乧rlf
+end_of_line = lf
+# 鍦ㄦ枃浠剁粨灏炬彃鍏ユ柊琛�
+insert_final_newline = true
+# 鍒犻櫎涓�琛屼腑鐨勫墠鍚庣┖鏍�
+trim_trailing_whitespace = true
+
+# 鍖归厤md缁撳熬鐨勬枃浠�
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/energy_management_ui/.env.development b/energy_management_ui/.env.development
new file mode 100644
index 0000000..28b97c7
--- /dev/null
+++ b/energy_management_ui/.env.development
@@ -0,0 +1,8 @@
+# 寮�鍙戠幆澧冮厤缃�
+ENV = 'development'
+
+# 鑻ヤ緷绠$悊绯荤粺/寮�鍙戠幆澧�
+VUE_APP_BASE_API = '/dev-api'
+
+# 璺敱鎳掑姞杞�
+VUE_CLI_BABEL_TRANSPILE_MODULES = true
diff --git a/energy_management_ui/.env.production b/energy_management_ui/.env.production
new file mode 100644
index 0000000..27c717e
--- /dev/null
+++ b/energy_management_ui/.env.production
@@ -0,0 +1,5 @@
+# 鐢熶骇鐜閰嶇疆
+ENV = 'production'
+
+# 鑻ヤ緷绠$悊绯荤粺/鐢熶骇鐜
+VUE_APP_BASE_API = '/prod-api'
diff --git a/energy_management_ui/.env.staging b/energy_management_ui/.env.staging
new file mode 100644
index 0000000..6195736
--- /dev/null
+++ b/energy_management_ui/.env.staging
@@ -0,0 +1,7 @@
+NODE_ENV = production
+
+# 娴嬭瘯鐜閰嶇疆
+ENV = 'staging'
+
+# 鑻ヤ緷绠$悊绯荤粺/娴嬭瘯鐜
+VUE_APP_BASE_API = '/stage-api'
diff --git a/energy_management_ui/.eslintignore b/energy_management_ui/.eslintignore
new file mode 100644
index 0000000..89be6f6
--- /dev/null
+++ b/energy_management_ui/.eslintignore
@@ -0,0 +1,10 @@
+# 蹇界暐build鐩綍涓嬬被鍨嬩负js鐨勬枃浠剁殑璇硶妫�鏌�
+build/*.js
+# 蹇界暐src/assets鐩綍涓嬫枃浠剁殑璇硶妫�鏌�
+src/assets
+# 蹇界暐public鐩綍涓嬫枃浠剁殑璇硶妫�鏌�
+public
+# 蹇界暐褰撳墠鐩綍涓嬩负js鐨勬枃浠剁殑璇硶妫�鏌�
+*.js
+# 蹇界暐褰撳墠鐩綍涓嬩负vue鐨勬枃浠剁殑璇硶妫�鏌�
+*.vue
\ No newline at end of file
diff --git a/energy_management_ui/.eslintrc.js b/energy_management_ui/.eslintrc.js
new file mode 100644
index 0000000..82bbdee
--- /dev/null
+++ b/energy_management_ui/.eslintrc.js
@@ -0,0 +1,199 @@
+// ESlint 妫�鏌ラ厤缃�
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint',
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  rules: {
+    "vue/max-attributes-per-line": [2, {
+      "singleline": 10,
+      "multiline": {
+        "max": 1,
+        "allowFirstLine": false
+      }
+    }],
+    "vue/singleline-html-element-content-newline": "off",
+    "vue/multiline-html-element-content-newline":"off",
+    "vue/name-property-casing": ["error", "PascalCase"],
+    "vue/no-v-html": "off",
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': ["error", "always", {"null": "ignore"}],
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'handle-callback-err': [2, '^(err|error)$'],
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    'new-parens': 2,
+    'no-array-constructor': 2,
+    'no-caller': 2,
+    'no-console': 'off',
+    'no-class-assign': 2,
+    'no-cond-assign': 2,
+    'no-const-assign': 2,
+    'no-control-regex': 0,
+    'no-delete-var': 2,
+    'no-dupe-args': 2,
+    'no-dupe-class-members': 2,
+    'no-dupe-keys': 2,
+    'no-duplicate-case': 2,
+    'no-empty-character-class': 2,
+    'no-empty-pattern': 2,
+    'no-eval': 2,
+    'no-ex-assign': 2,
+    'no-extend-native': 2,
+    'no-extra-bind': 2,
+    'no-extra-boolean-cast': 2,
+    'no-extra-parens': [2, 'functions'],
+    'no-fallthrough': 2,
+    'no-floating-decimal': 2,
+    'no-func-assign': 2,
+    'no-implied-eval': 2,
+    'no-inner-declarations': [2, 'functions'],
+    'no-invalid-regexp': 2,
+    'no-irregular-whitespace': 2,
+    'no-iterator': 2,
+    'no-label-var': 2,
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    'no-lone-blocks': 2,
+    'no-mixed-spaces-and-tabs': 2,
+    'no-multi-spaces': 2,
+    'no-multi-str': 2,
+    'no-multiple-empty-lines': [2, {
+      'max': 1
+    }],
+    'no-native-reassign': 2,
+    'no-negated-in-lhs': 2,
+    'no-new-object': 2,
+    'no-new-require': 2,
+    'no-new-symbol': 2,
+    'no-new-wrappers': 2,
+    'no-obj-calls': 2,
+    'no-octal': 2,
+    'no-octal-escape': 2,
+    'no-path-concat': 2,
+    'no-proto': 2,
+    'no-redeclare': 2,
+    'no-regex-spaces': 2,
+    'no-return-assign': [2, 'except-parens'],
+    'no-self-assign': 2,
+    'no-self-compare': 2,
+    'no-sequences': 2,
+    'no-shadow-restricted-names': 2,
+    'no-spaced-func': 2,
+    'no-sparse-arrays': 2,
+    'no-this-before-super': 2,
+    'no-throw-literal': 2,
+    'no-trailing-spaces': 2,
+    'no-undef': 2,
+    'no-undef-init': 2,
+    'no-unexpected-multiline': 2,
+    'no-unmodified-loop-condition': 2,
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    'no-unreachable': 2,
+    'no-unsafe-finally': 2,
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    'no-useless-call': 2,
+    'no-useless-computed-key': 2,
+    'no-useless-constructor': 2,
+    'no-useless-escape': 0,
+    'no-whitespace-before-property': 2,
+    'no-with': 2,
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    'padded-blocks': [2, 'never'],
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    'semi': [2, 'never'],
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'space-before-blocks': [2, 'always'],
+    'space-before-function-paren': [2, 'never'],
+    'space-in-parens': [2, 'never'],
+    'space-infix-ops': 2,
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    'template-curly-spacing': [2, 'never'],
+    'use-isnan': 2,
+    'valid-typeof': 2,
+    'wrap-iife': [2, 'any'],
+    'yield-star-spacing': [2, 'both'],
+    'yoda': [2, 'never'],
+    'prefer-const': 2,
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never']
+  }
+}
diff --git a/energy_management_ui/.gitignore b/energy_management_ui/.gitignore
new file mode 100644
index 0000000..78a752d
--- /dev/null
+++ b/energy_management_ui/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock
diff --git a/energy_management_ui/README.md b/energy_management_ui/README.md
new file mode 100644
index 0000000..3b5daac
--- /dev/null
+++ b/energy_management_ui/README.md
@@ -0,0 +1,30 @@
+## 开发
+
+```bash
+# 克隆项目
+git clone https://gitee.com/y_project/RuoYi-Vue
+
+# 进入项目目录
+cd ruoyi-ui
+
+# 安装依赖
+npm install
+
+# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
+npm install --registry=https://registry.npm.taobao.org
+
+# 启动服务
+npm run dev
+```
+
+浏览器访问 http://localhost:80
+
+## 发布
+
+```bash
+# 构建测试环境
+npm run build:stage
+
+# 构建生产环境
+npm run build:prod
+```
\ No newline at end of file
diff --git a/energy_management_ui/babel.config.js b/energy_management_ui/babel.config.js
new file mode 100644
index 0000000..ba17966
--- /dev/null
+++ b/energy_management_ui/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ]
+}
diff --git a/energy_management_ui/build/index.js b/energy_management_ui/build/index.js
new file mode 100644
index 0000000..0c57de2
--- /dev/null
+++ b/energy_management_ui/build/index.js
@@ -0,0 +1,35 @@
+const { run } = require('runjs')
+const chalk = require('chalk')
+const config = require('../vue.config.js')
+const rawArgv = process.argv.slice(2)
+const args = rawArgv.join(' ')
+
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
+  const report = rawArgv.includes('--report')
+
+  run(`vue-cli-service build ${args}`)
+
+  const port = 9526
+  const publicPath = config.publicPath
+
+  var connect = require('connect')
+  var serveStatic = require('serve-static')
+  const app = connect()
+
+  app.use(
+    publicPath,
+    serveStatic('./dist', {
+      index: ['index.html', '/']
+    })
+  )
+
+  app.listen(port, function () {
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
+    if (report) {
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
+    }
+
+  })
+} else {
+  run(`vue-cli-service build ${args}`)
+}
diff --git a/energy_management_ui/package.json b/energy_management_ui/package.json
new file mode 100644
index 0000000..8d91ef7
--- /dev/null
+++ b/energy_management_ui/package.json
@@ -0,0 +1,106 @@
+{
+  "name": "ruoyi",
+  "version": "2.0.0",
+  "description": "涓滀附鍖荤枟鑳芥簮绠$悊绯荤粺",
+  "author": "鑻ヤ緷",
+  "license": "MIT",
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "build:stage": "vue-cli-service build --mode staging",
+    "preview": "node build/index.js --preview",
+    "lint": "eslint --ext .js,.vue src",
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
+    "test:ci": "npm run lint && npm run test:unit",
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
+    "new": "plop"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "vue",
+    "admin",
+    "dashboard",
+    "element-ui",
+    "boilerplate",
+    "admin-template",
+    "management-system"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://gitee.com/y_project/RuoYi-Vue.git"
+  },
+  "dependencies": {
+    "@riophae/vue-treeselect": "0.4.0",
+    "axios": "0.18.1",
+    "echarts": "4.2.1",
+    "element-ui": "2.11.1",
+    "fuse.js": "3.4.4",
+    "html2pdf.js": "^0.10.1",
+    "js-cookie": "2.2.0",
+    "jsencrypt": "3.0.0-rc.1",
+    "moment": "^2.29.1",
+    "normalize.css": "7.0.0",
+    "nprogress": "0.2.0",
+    "path-to-regexp": "2.4.0",
+    "postcss-px2rem": "^0.3.0",
+    "sass": "^1.50.0",
+    "screenfull": "4.2.0",
+    "svg-sprite-loader": "^4.2.1",
+    "vue": "2.6.10",
+    "vue-count-to": "1.0.13",
+    "vue-cropper": "0.4.9",
+    "vue-quill-editor": "3.0.6",
+    "vue-router": "3.0.2",
+    "vue-splitpane": "1.0.4",
+    "vuex": "3.1.0"
+  },
+  "devDependencies": {
+    "@babel/core": "7.0.0",
+    "@babel/register": "7.0.0",
+    "@vue/cli-plugin-babel": "3.5.3",
+    "@vue/cli-plugin-eslint": "^3.9.1",
+    "@vue/cli-plugin-unit-jest": "3.5.3",
+    "@vue/cli-service": "3.5.3",
+    "@vue/test-utils": "1.0.0-beta.29",
+    "autoprefixer": "^9.5.1",
+    "babel-core": "7.0.0-bridge.0",
+    "babel-eslint": "10.0.1",
+    "babel-jest": "23.6.0",
+    "chalk": "2.4.2",
+    "chokidar": "2.1.5",
+    "connect": "3.6.6",
+    "eslint": "5.15.3",
+    "eslint-plugin-vue": "5.2.2",
+    "html-webpack-plugin": "3.2.0",
+    "http-proxy-middleware": "^0.19.1",
+    "husky": "1.3.1",
+    "lint-staged": "8.1.5",
+    "mockjs": "1.0.1-beta3",
+    "plop": "2.3.0",
+    "runjs": "^4.3.2",
+    "sass-loader": "^7.1.0",
+    "script-ext-html-webpack-plugin": "2.1.3",
+    "script-loader": "0.7.2",
+    "serve-static": "^1.13.2",
+    "svgo": "1.2.0",
+    "vue-template-compiler": "2.6.10"
+  },
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}
diff --git a/energy_management_ui/public/favicon.ico b/energy_management_ui/public/favicon.ico
new file mode 100644
index 0000000..380134d
--- /dev/null
+++ b/energy_management_ui/public/favicon.ico
Binary files differ
diff --git a/energy_management_ui/public/index.html b/energy_management_ui/public/index.html
new file mode 100644
index 0000000..46b4d78
--- /dev/null
+++ b/energy_management_ui/public/index.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+    <meta name="renderer" content="webkit" />
+    <meta
+      name="viewport"
+      content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
+    />
+    <link rel="icon" href="<%= BASE_URL %>toray_group_icon.png" />
+    <title><%= webpackConfig.name %></title>
+    <style>
+      html,
+      body,
+      #app {
+        height: 100%;
+        margin: 0px;
+        padding: 0px;
+      }
+
+      .chromeframe {
+        margin: 0.2em 0;
+        background: #ccc;
+        color: #000;
+        padding: 0.2em 0;
+      }
+
+      #loader-wrapper {
+        position: fixed;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        z-index: 999999;
+      }
+
+      #loader {
+        display: block;
+        position: relative;
+        left: 50%;
+        top: 50%;
+        width: 150px;
+        height: 150px;
+        margin: -75px 0 0 -75px;
+        border-radius: 50%;
+        border: 3px solid transparent;
+        border-top-color: #fff;
+        -webkit-animation: spin 2s linear infinite;
+        -ms-animation: spin 2s linear infinite;
+        -moz-animation: spin 2s linear infinite;
+        -o-animation: spin 2s linear infinite;
+        animation: spin 2s linear infinite;
+        z-index: 1001;
+      }
+
+      #loader:before {
+        content: "";
+        position: absolute;
+        top: 5px;
+        left: 5px;
+        right: 5px;
+        bottom: 5px;
+        border-radius: 50%;
+        border: 3px solid transparent;
+        border-top-color: #fff;
+        -webkit-animation: spin 3s linear infinite;
+        -moz-animation: spin 3s linear infinite;
+        -o-animation: spin 3s linear infinite;
+        -ms-animation: spin 3s linear infinite;
+        animation: spin 3s linear infinite;
+      }
+
+      #loader:after {
+        content: "";
+        position: absolute;
+        top: 15px;
+        left: 15px;
+        right: 15px;
+        bottom: 15px;
+        border-radius: 50%;
+        border: 3px solid transparent;
+        border-top-color: #fff;
+        -moz-animation: spin 1.5s linear infinite;
+        -o-animation: spin 1.5s linear infinite;
+        -ms-animation: spin 1.5s linear infinite;
+        -webkit-animation: spin 1.5s linear infinite;
+        animation: spin 1.5s linear infinite;
+      }
+
+      @-webkit-keyframes spin {
+        0% {
+          -webkit-transform: rotate(0deg);
+          -ms-transform: rotate(0deg);
+          transform: rotate(0deg);
+        }
+        100% {
+          -webkit-transform: rotate(360deg);
+          -ms-transform: rotate(360deg);
+          transform: rotate(360deg);
+        }
+      }
+
+      @keyframes spin {
+        0% {
+          -webkit-transform: rotate(0deg);
+          -ms-transform: rotate(0deg);
+          transform: rotate(0deg);
+        }
+        100% {
+          -webkit-transform: rotate(360deg);
+          -ms-transform: rotate(360deg);
+          transform: rotate(360deg);
+        }
+      }
+
+      #loader-wrapper .loader-section {
+        position: fixed;
+        top: 0;
+        width: 51%;
+        height: 100%;
+        /* background: rgba(43, 142, 255, 1); */
+        background: #38bcbf;
+        z-index: 1000;
+        -webkit-transform: translateX(0);
+        -ms-transform: translateX(0);
+        transform: translateX(0);
+      }
+
+      #loader-wrapper .loader-section.section-left {
+        left: 0;
+      }
+
+      #loader-wrapper .loader-section.section-right {
+        right: 0;
+      }
+
+      .loaded #loader-wrapper .loader-section.section-left {
+        -webkit-transform: translateX(-100%);
+        -ms-transform: translateX(-100%);
+        transform: translateX(-100%);
+        -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+        transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+      }
+
+      .loaded #loader-wrapper .loader-section.section-right {
+        -webkit-transform: translateX(100%);
+        -ms-transform: translateX(100%);
+        transform: translateX(100%);
+        -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+        transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
+      }
+
+      .loaded #loader {
+        opacity: 0;
+        -webkit-transition: all 0.3s ease-out;
+        transition: all 0.3s ease-out;
+      }
+
+      .loaded #loader-wrapper {
+        visibility: hidden;
+        -webkit-transform: translateY(-100%);
+        -ms-transform: translateY(-100%);
+        transform: translateY(-100%);
+        -webkit-transition: all 0.3s 1s ease-out;
+        transition: all 0.3s 1s ease-out;
+      }
+
+      .no-js #loader-wrapper {
+        display: none;
+      }
+
+      .no-js h1 {
+        color: #222222;
+      }
+
+      #loader-wrapper .load_title {
+        font-family: "Open Sans";
+        color: #fff;
+        font-size: 19px;
+        width: 100%;
+        text-align: center;
+        z-index: 9999999999999;
+        position: absolute;
+        top: 60%;
+        opacity: 1;
+        line-height: 30px;
+      }
+
+      #loader-wrapper .load_title span {
+        font-weight: normal;
+        font-style: italic;
+        font-size: 13px;
+        color: #fff;
+        opacity: 0.5;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="app">
+      <div id="loader-wrapper">
+        <div id="loader"></div>
+        <div class="loader-section section-left"></div>
+        <div class="loader-section section-right"></div>
+        <div class="load_title">姝e湪鍔犺浇绯荤粺璧勬簮锛岃鑰愬績绛夊緟</div>
+      </div>
+    </div>
+  </body>
+</html>
diff --git a/energy_management_ui/public/toray_group_icon.png b/energy_management_ui/public/toray_group_icon.png
new file mode 100644
index 0000000..6c56317
--- /dev/null
+++ b/energy_management_ui/public/toray_group_icon.png
Binary files differ
diff --git a/energy_management_ui/src/App.vue b/energy_management_ui/src/App.vue
new file mode 100644
index 0000000..e448b11
--- /dev/null
+++ b/energy_management_ui/src/App.vue
@@ -0,0 +1,11 @@
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<script>
+export default  {
+  name:  'App'
+}
+</script>
diff --git a/energy_management_ui/src/api/alarmItem/alarmItem.js b/energy_management_ui/src/api/alarmItem/alarmItem.js
new file mode 100644
index 0000000..320aa8b
--- /dev/null
+++ b/energy_management_ui/src/api/alarmItem/alarmItem.js
@@ -0,0 +1,106 @@
+import request from '@/utils/request'
+
+// 鏌ヨ棰勬姤璀﹁缃垪琛�
+export function listSet(query) {
+  return request({
+    url: '/system/alarmitem/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ棰勬姤璀﹁缃缁�
+export function getSet(id) {
+  return request({
+    url: '/system/alarmitem/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板棰勬姤璀﹁缃�
+export function addSet(data) {
+  return request({
+    url: '/system/alarmitem',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼棰勬姤璀﹁缃�
+export function updateSet(data,type) {
+  return request({
+    url: '/system/alarmitem/startstop/'+type,
+    method: 'post',
+    data: data
+  })
+}
+
+// 鍒犻櫎棰勬姤璀﹁缃�
+export function delSet(id) {
+  return request({
+    url: '/system/alarmitem/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭棰勬姤璀﹁缃�
+export function exportSet(query) {
+  return request({
+    url: '/system/alarmitem/export',
+    method: 'get',
+    params: query
+  })
+}
+
+
+//
+export function getStartStop(indexid) {
+  return request({
+    url: '/system/alarmitem/getStartStop/'+indexid,
+    async: false,
+    method: 'get'
+  })
+}
+
+// 鏌ヨ棰刬d涓嬭缃檺鍊肩殑鏁伴噺
+export function getSettingCount(id) {
+  return request({
+    url: '/system/alarmitem/getSettingCount/'+id,
+    method: 'get',
+  })
+}
+
+//寮瑰嚭绐楀彛
+// 鏌ヨ棰勬姤璀﹁缃缁�
+export function getSetting(id) {
+  return request({
+    url: '/system/alarmitem/getSettingInfo/'+id,
+    method: 'get',
+  })
+}
+// 淇敼棰勬姤璀﹁缃�
+export function updateSetting(data) {
+  return request({
+    url: '/system/alarmitem',
+    method: 'put',
+    data: data
+  })
+}
+//瀵屽伐鎺ュ彛
+export function getSettingIndex(para) {
+  // console.log("nodeId=="+para.nodeId+"index=="+para.indexType);
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/'+para.indexType+"/" + para.nodeId,
+    method: 'get'
+  })
+}
+
+
+// 淇敼琛ㄥ崟鏁版嵁
+export function updateDialogForm(data) {
+  return request({
+    url: '/system/alarmitem/editLimitVal',
+    method: 'put',
+    data: data
+  })
+}
diff --git a/energy_management_ui/src/api/basicSetup/category.js b/energy_management_ui/src/api/basicSetup/category.js
new file mode 100644
index 0000000..3d40cbb
--- /dev/null
+++ b/energy_management_ui/src/api/basicSetup/category.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨcategory鍒楄〃
+export function listCategory(query) {
+  return request({
+    url: '/basicSetup/category/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨcategory璇︾粏
+export function getCategory(id) {
+  return request({
+    url: '/basicSetup/category/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板category
+export function addCategory(data) {
+  return request({
+    url: '/basicSetup/category',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼category
+export function updateCategory(data) {
+  return request({
+    url: '/basicSetup/category',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎category
+export function delCategory(id) {
+  return request({
+    url: '/basicSetup/category/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭category
+export function exportCategory(query) {
+  return request({
+    url: '/basicSetup/category/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/basicSetup/equipmentfile.js b/energy_management_ui/src/api/basicSetup/equipmentfile.js
new file mode 100644
index 0000000..8806208
--- /dev/null
+++ b/energy_management_ui/src/api/basicSetup/equipmentfile.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 淇敼缁勬�佸浘
+export function updateEquipmentfile(data) {
+  return request({
+    url: '/basicSetup/equipmentfile',
+    method: 'put',
+    data: data
+  })
+}
+
+export function getAllCollectTag(data) {
+  return request({
+    url: '/basicsetting/energyindex/filter',
+    method: 'get',
+    params: data
+  })
+}
+
+export function saveSetting(nodeId, data) {
+  return request({
+    url: '/basicSetup/equipmentfile/setting/' + nodeId,
+    method: 'put',
+    data: data
+  })
+}
+
+export function getConfigure(nodeId) {
+  return request({
+    url: '/basicSetup/equipmentfile/configure/' + nodeId,
+    method: 'get'
+  })
+}
+
+export function getLiveData(tagCodes) {
+  return request({
+    url: '/rtdb/retrieve/' + tagCodes,
+    method: 'get'
+  })
+}
diff --git a/energy_management_ui/src/api/basicSetup/parameters.js b/energy_management_ui/src/api/basicSetup/parameters.js
new file mode 100644
index 0000000..db6e754
--- /dev/null
+++ b/energy_management_ui/src/api/basicSetup/parameters.js
@@ -0,0 +1,59 @@
+import request from '@/utils/request'
+
+// 鏌ヨbasicSetup鍒楄〃
+export function listParameters(query) {
+  return request({
+    url: '/basicSetup/parameters/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨbasicSetup璇︾粏
+export function getParameters(id) {
+  return request({
+    url: '/basicSetup/parameters/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板basicSetup
+export function addParameters(data) {
+  return request({
+    url: '/basicSetup/parameters',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼basicSetup
+export function updateParameters(data) {
+  return request({
+    url: '/basicSetup/parameters',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎basicSetup
+export function delParameters(id) {
+  return request({
+    url: '/basicSetup/parameters/' + id,
+    method: 'delete'
+  })
+}
+export function getAllCollectTag(data) {
+  return request({
+    url: '/basicsetting/energyindex/filter',
+    method: 'get',
+    params: data
+  })
+}
+
+export function getListSee(titleId) {
+  return request({
+    url: '/basicSetup/parameters/listSee/'+titleId,
+    method: 'get',
+    //params: titleId
+  })
+}
diff --git a/energy_management_ui/src/api/basicsetting/alarm.js b/energy_management_ui/src/api/basicsetting/alarm.js
new file mode 100644
index 0000000..c8cc259
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/alarm.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍒楄〃
+export function List(indexType,nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/'+indexType+"/" + nodeId,
+    method: 'get',
+  })
+}
diff --git a/energy_management_ui/src/api/basicsetting/deviceStorage.js b/energy_management_ui/src/api/basicsetting/deviceStorage.js
new file mode 100644
index 0000000..b73743c
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/deviceStorage.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function getDeviceStorage(nodeId,stateId) {
+  return request({
+    url: '/basicsetting/deviceStorage/'+nodeId+"/" + stateId,
+    method: 'GET'
+  })
+}
+
+
+export function saveDeviceStorage(nodeId,stateId, data) {
+  return request({
+    url: '/basicsetting/deviceStorage/' + nodeId+'/'+stateId,
+    method: 'post',
+    data: data
+  });
+}
+
+export function getDeviceStateByNodeIds(query) {
+  return request({
+    url: '/basicsetting/deviceStorage/getDeviceStateByNodeIds',
+    method: 'GET',
+    params: query
+  })
+}
+
+// 淇敼棰勬姤璀﹁缃�
+export function setIsEnable(nodeId,isEnbale,data) {
+  return request({
+    url: '/basicsetting/deviceStorage/setIsEnable/'+nodeId+'/'+isEnbale,
+    method: 'post',
+    data: data
+  })
+}
+
diff --git a/energy_management_ui/src/api/basicsetting/energyindex.js b/energy_management_ui/src/api/basicsetting/energyindex.js
new file mode 100644
index 0000000..9d119b9
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/energyindex.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鎸囨爣淇℃伅鍒楄〃
+export function listEnergyindex(query) {
+  return request({
+    url: '/basicsetting/energyindex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鎸囨爣淇℃伅璇︾粏
+export function getEnergyindex(indexId) {
+  return request({
+    url: '/basicsetting/energyindex/' + indexId,
+    method: 'get'
+  })
+}
+
+// 鏂板鎸囨爣淇℃伅
+export function addEnergyindex(nodeId, data) {
+  return request({
+    url: '/basicsetting/energyindex/' + nodeId,
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鎸囨爣淇℃伅
+export function updateEnergyindex(data) {
+  return request({
+    url: '/basicsetting/energyindex',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鎸囨爣淇℃伅
+export function delEnergyindex(nodeId, indexId) {
+  return request({
+    url: '/basicsetting/energyindex/' + nodeId + '/' + indexId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鎸囨爣淇℃伅
+export function exportEnergyindex(query) {
+  return request({
+    url: '/basicsetting/energyindex/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listCollectIndex(query) {
+  return request({
+    url: '/basicsetting/energyindex/collectIndex',
+    method: 'get',
+    params: query
+  })
+}
+
+// 涓嬭浇瀵煎叆妯℃澘
+export function importTemplate() {
+  return request({
+    url: '/basicsetting/energyindex/importTemplate',
+    method: 'get'
+  })
+}
diff --git a/energy_management_ui/src/api/basicsetting/function.js b/energy_management_ui/src/api/basicsetting/function.js
new file mode 100644
index 0000000..e34d318
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/function.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁$畻鍑芥暟鍒楄〃
+export function listFunction(query) {
+  return request({
+    url: '/basicsetting/function/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁$畻鍑芥暟璇︾粏
+export function getFunction(info) {
+  return request({
+    url: '/basicsetting/function/' + info,
+    method: 'get'
+  })
+}
+
+// 鏂板璁$畻鍑芥暟
+export function addFunction(data) {
+  return request({
+    url: '/basicsetting/function',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁$畻鍑芥暟
+export function updateFunction(data) {
+  return request({
+    url: '/basicsetting/function',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁$畻鍑芥暟
+export function delFunction(info) {
+  return request({
+    url: '/basicsetting/function/' + info,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁$畻鍑芥暟
+export function exportFunction(query) {
+  return request({
+    url: '/basicsetting/function/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/basicsetting/historyAlarm.js b/energy_management_ui/src/api/basicsetting/historyAlarm.js
new file mode 100644
index 0000000..2bfbbcc
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/historyAlarm.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍒楄〃
+export function listHistoryAlarm(query) {
+  return request({
+    url: 'energyAlarm/historicalAlarm/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 瀵煎嚭璁惧妗f
+export function exportHistoricalAlarm(query) {
+  return request({
+    url: 'energyAlarm/historicalAlarm/export',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 鏌ヨ鍒楄〃
+export function listHistoryAlarmNote(query) {
+  return request({
+    url: 'energyAlarm/historicalAlarm/listNote',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+
+
+
diff --git a/energy_management_ui/src/api/basicsetting/indexStorage.js b/energy_management_ui/src/api/basicsetting/indexStorage.js
new file mode 100644
index 0000000..6b0814e
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/indexStorage.js
@@ -0,0 +1,38 @@
+import request from '@/utils/request'
+
+export function parseFormula(data) {
+  return request({
+    url: '/basicsetting/indexStorage/parseFormula',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getNodeIndex(nodeId) {
+  return request({
+    url: '/basicsetting/energyindex/includeChildrenNode/' + nodeId,
+    method: 'GET'
+  })
+}
+
+export function getCalcPeriod() {
+  return request({
+    url: '/basicsetting/indexStorage/calcPeriod/',
+    method: 'GET'
+  })
+}
+
+export function saveIndexStorage(indexId, data) {
+  return request({
+    url: '/basicsetting/indexStorage/' + indexId,
+    method: 'post',
+    data: data
+  });
+}
+
+export function getIndexStorage(indexId) {
+  return request({
+    url: '/basicsetting/indexStorage/' + indexId,
+    method: 'GET'
+  })
+}
diff --git a/energy_management_ui/src/api/basicsetting/limitType.js b/energy_management_ui/src/api/basicsetting/limitType.js
new file mode 100644
index 0000000..3954bbc
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/limitType.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛�
+export function listLimitType(query) {
+  return request({
+    url: '/basicsetting/limitType/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶よ缁�
+export function getLimitType(id) {
+  return request({
+    url: '/basicsetting/limitType/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鎶ヨ闄愬�肩被鍨嬬淮鎶�
+export function addLimitType(data) {
+  return request({
+    url: '/basicsetting/limitType',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鎶ヨ闄愬�肩被鍨嬬淮鎶�
+export function updateLimitType(data) {
+  return request({
+    url: '/basicsetting/limitType',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶�
+export function delLimitType(id) {
+  return request({
+    url: '/basicsetting/limitType/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鎶ヨ闄愬�肩被鍨嬬淮鎶�
+export function exportLimitType(query) {
+  return request({
+    url: '/basicsetting/limitType/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/basicsetting/model.js b/energy_management_ui/src/api/basicsetting/model.js
new file mode 100644
index 0000000..da23492
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/model.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ妯″瀷淇℃伅鍒楄〃
+export function listModel(query) {
+  return request({
+    url: '/basicsetting/model/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ妯″瀷淇℃伅璇︾粏
+export function getModel(id) {
+  return request({
+    url: '/basicsetting/model/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板妯″瀷淇℃伅
+export function addModel(data) {
+  return request({
+    url: '/basicsetting/model',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼妯″瀷淇℃伅
+export function updateModel(data) {
+  return request({
+    url: '/basicsetting/model',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎妯″瀷淇℃伅
+export function delModel(id) {
+  return request({
+    url: '/basicsetting/model/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭妯″瀷淇℃伅
+export function exportModel(query) {
+  return request({
+    url: '/basicsetting/model/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/basicsetting/modelNode.js b/energy_management_ui/src/api/basicsetting/modelNode.js
new file mode 100644
index 0000000..a3675f4
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/modelNode.js
@@ -0,0 +1,185 @@
+import request from '@/utils/request'
+
+// 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+export function modelNodeTree(query, withAuth) {
+  if (withAuth) {
+    return request({
+      url: '/basicsetting/modelnode/treelist/withAuth',
+      method: 'get',
+      params: query
+    })
+  } else {
+    return request({
+      url: '/basicsetting/modelnode/treelist',
+      method: 'get',
+      params: query
+    })
+  }
+}
+
+// 鏌ヨ妯″瀷鑺傜偣鍒楄〃
+export function listModelNode(query) {
+  return request({
+    url: '/basicsetting/modelnode/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ妯″瀷鑺傜偣璇︾粏
+export function getModelNode(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/' + nodeId,
+    method: 'get'
+  })
+}
+
+// 鏂板妯″瀷鑺傜偣
+export function addModelNode(data) {
+  return request({
+    url: '/basicsetting/modelnode',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼妯″瀷鑺傜偣
+export function updateModelNode(data) {
+  return request({
+    url: '/basicsetting/modelnode',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎妯″瀷鑺傜偣
+export function delModelNode(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/' + nodeId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭妯″瀷鑺傜偣
+export function exportModelNode(query) {
+  return request({
+    url: '/basicsetting/modelnode/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function updateModelNodeOrder(param) {
+  return request({
+    url: '/basicsetting/modelnode/order',
+    method: 'put',
+    data: param
+  })
+}
+
+export function hasEnergyIndex(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/hasEnergyIndex',
+    method: 'get',
+    params: {nodeId: nodeId}
+  })
+}
+
+export function getSettingDevice(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/device/' + nodeId,
+    method: 'get'
+  })
+}
+
+export function setDevice(nodeId, deviceIds) {
+  return request({
+    url: '/basicsetting/modelnode/device/' + nodeId,
+    method: 'post',
+    data: deviceIds
+  })
+}
+
+export function delDevice(nodeId, deviceId) {
+  return request({
+    url: '/basicsetting/modelnode/device/' + nodeId,
+    method: 'delete',
+    data: [deviceId]
+  })
+}
+//鑾峰彇妯″瀷涓嬬殑鑳芥簮鍝佺
+export function getSettingEnergy(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energy/' + nodeId,
+    method: 'get'
+  })
+}
+
+export function setEnergy(nodeId, energyIds) {
+  return request({
+    url: '/basicsetting/modelnode/energy/' + nodeId,
+    method: 'post',
+    data: energyIds
+  })
+}
+
+export function delEnergy(nodeId, energyId) {
+  return request({
+    url: '/basicsetting/modelnode/energy/' + nodeId,
+    method: 'delete',
+    data: [energyId]
+  })
+}
+
+export function getSettingProduct(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/product/' + nodeId,
+    method: 'get'
+  })
+}
+
+export function setProduct(nodeId, productIds) {
+  return request({
+    url: '/basicsetting/modelnode/product/' + nodeId,
+    method: 'post',
+    data: productIds
+  })
+}
+
+export function delProduct(nodeId, productId) {
+  return request({
+    url: '/basicsetting/modelnode/product/' + nodeId,
+    method: 'delete',
+    data: [productId]
+  })
+}
+//鑾峰彇妯″瀷涓嬬殑鎸囨爣
+export function getSettingIndex(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/' + nodeId,
+    method: 'get'
+  })
+}
+
+export function getSettingCollectIndex(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/COLLECT/' + nodeId,
+    method: 'get'
+  })
+}
+
+export function setNodeToIndex(nodeId, indexIds, indexType) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/' + nodeId + "/" + indexType,
+    method: 'post',
+    data: indexIds
+  })
+}
+
+export function delIndex(nodeId, indexId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/' + nodeId,
+    method: 'delete',
+    data: [indexId]
+  })
+}
diff --git a/energy_management_ui/src/api/basicsetting/state.js b/energy_management_ui/src/api/basicsetting/state.js
new file mode 100644
index 0000000..030e34b
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/state.js
@@ -0,0 +1,12 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍒楄〃
+export function List(indexType,nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/'+indexType+"/" + nodeId,
+    method: 'get',
+  })
+
+
+
+}
diff --git a/energy_management_ui/src/api/basicsetting/statetype.js b/energy_management_ui/src/api/basicsetting/statetype.js
new file mode 100644
index 0000000..f38de5e
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/statetype.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ绯荤粺鐘舵�佺淮鎶ゅ垪琛�
+export function listStatetype(query) {
+  return request({
+    url: '/basicsetting/statetype/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ绯荤粺鐘舵�佺淮鎶よ缁�
+export function getStatetype(stateId) {
+  return request({
+    url: '/basicsetting/statetype/' + stateId,
+    method: 'get'
+  })
+}
+
+// 鏂板绯荤粺鐘舵�佺淮鎶�
+export function addStatetype(data) {
+  return request({
+    url: '/basicsetting/statetype',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼绯荤粺鐘舵�佺淮鎶�
+export function updateStatetype(data) {
+  return request({
+    url: '/basicsetting/statetype',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎绯荤粺鐘舵�佺淮鎶�
+export function delStatetype(stateId) {
+  return request({
+    url: '/basicsetting/statetype/' + stateId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭绯荤粺鐘舵�佺淮鎶�
+export function exportStatetype(query) {
+  return request({
+    url: '/basicsetting/statetype/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/basicsetting/template.js b/energy_management_ui/src/api/basicsetting/template.js
new file mode 100644
index 0000000..3be4dcc
--- /dev/null
+++ b/energy_management_ui/src/api/basicsetting/template.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ閲囬泦鍙傛暟妯℃澘鍒楄〃
+export function listTemplate(query) {
+  return request({
+    url: '/system/template/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ閲囬泦鍙傛暟妯℃澘璇︾粏
+export function getTemplate(id) {
+  return request({
+    url: '/system/template/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板閲囬泦鍙傛暟妯℃澘
+export function addTemplate(data) {
+  return request({
+    url: '/system/template',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼閲囬泦鍙傛暟妯℃澘
+export function updateTemplate(data) {
+  return request({
+    url: '/system/template',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎閲囬泦鍙傛暟妯℃澘
+export function delTemplate(id) {
+  return request({
+    url: '/system/template/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭閲囬泦鍙傛暟妯℃澘
+export function exportTemplate(query) {
+  return request({
+    url: '/system/template/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/benchmarking/BenchmarkingManagement.js b/energy_management_ui/src/api/benchmarking/BenchmarkingManagement.js
new file mode 100644
index 0000000..2e65b96
--- /dev/null
+++ b/energy_management_ui/src/api/benchmarking/BenchmarkingManagement.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鏍囨潌绠$悊鍒楄〃
+export function listBenchmarkingManagement(query) {
+  return request({
+    url: '/benchmarking/BenchmarkingManagement/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鏍囨潌绠$悊璇︾粏
+export function getBenchmarkingManagement(indexId) {
+  return request({
+    url: '/benchmarking/BenchmarkingManagement/' + indexId,
+    method: 'get'
+  })
+}
+
+// 鏂板鏍囨潌绠$悊
+export function addBenchmarkingManagement(data) {
+  return request({
+    url: '/benchmarking/BenchmarkingManagement',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鏍囨潌绠$悊
+export function updateBenchmarkingManagement(data) {
+  return request({
+    url: '/benchmarking/BenchmarkingManagement',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鏍囨潌绠$悊
+export function delBenchmarkingManagement(indexId) {
+  return request({
+    url: '/benchmarking/BenchmarkingManagement/' + indexId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鏍囨潌绠$悊
+export function exportBenchmarkingManagement(query) {
+  return request({
+    url: '/benchmarking/BenchmarkingManagement/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/benchmarking/phaseBenchmarking.js b/energy_management_ui/src/api/benchmarking/phaseBenchmarking.js
new file mode 100644
index 0000000..52e2c32
--- /dev/null
+++ b/energy_management_ui/src/api/benchmarking/phaseBenchmarking.js
@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 鏌ヨ瀵规爣鍒楄〃
+export function listPhaseBenchmarking(query) {
+  return request({
+    url: '/benchmarking/phaseBenchmarking/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ瀵规爣璇︾粏
+export function listRealTimeListrealTime(query) {
+  return request({
+    url: '/benchmarking/phaseBenchmarking/realTimeListrealTime',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/comprehensiveStatistics/comprehensive.js b/energy_management_ui/src/api/comprehensiveStatistics/comprehensive.js
new file mode 100644
index 0000000..bd8dbb5
--- /dev/null
+++ b/energy_management_ui/src/api/comprehensiveStatistics/comprehensive.js
@@ -0,0 +1,70 @@
+import request from '@/utils/request'
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁�
+export function getDataList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+export function getlistChart(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/listChart',
+    method: 'get',
+    params: query
+  })
+}
+export function exportList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/export',
+    method: 'get',
+    params: query
+  })
+}
+export function getEnergyList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getList',
+    method: 'get',
+    params: query
+  })
+}
+//閲嶇偣璁惧鑳借�楁帓鍚�
+export function energyList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/energyList',
+    method: 'get',
+    params: query
+  })
+}
+//璁惧
+export function getFacilityArchives() {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getFacilityArchives',
+    method: 'get'
+  })
+}
+//閲嶇偣璁惧
+export function getPointFacility() {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getPointFacility',
+    method: 'get'
+  })
+}
+export function getDeviceList(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/getDeviceList',
+    method: 'get',
+    params: query
+  })
+}
+//鑾峰彇妯″瀷涓嬬殑鑳芥簮鍝佺
+export function energyDevice(query) {
+  return request({
+    url: '/statisticalData/comprehensiveStatistics/energyDevice',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js b/energy_management_ui/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js
new file mode 100644
index 0000000..11bd93c
--- /dev/null
+++ b/energy_management_ui/src/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+ //鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/comprehensive/dailyComprehensive/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/comprehensive/dailyComprehensive/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js b/energy_management_ui/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js
new file mode 100644
index 0000000..b3a5668
--- /dev/null
+++ b/energy_management_ui/src/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/comprehensive/monthlyComprehensive/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/comprehensive/monthlyComprehensive/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/comprehensiveStatistics/processEnergyConsumption.js b/energy_management_ui/src/api/comprehensiveStatistics/processEnergyConsumption.js
new file mode 100644
index 0000000..38858e5
--- /dev/null
+++ b/energy_management_ui/src/api/comprehensiveStatistics/processEnergyConsumption.js
@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁�
+export function getDataList(query) {
+  return request({
+    url: '/statisticalData/processEnergyConsumption/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//鍏ㄥ巶缁煎悎鑳借�楃粺璁″浘
+export function getlistChart(query) {
+  return request({
+    url: '/statisticalData/processEnergyConsumption/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js b/energy_management_ui/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js
new file mode 100644
index 0000000..03cb827
--- /dev/null
+++ b/energy_management_ui/src/api/comprehensiveStatistics/yearComprehensive/yearComprehensive.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/comprehensive/yearComprehensive/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/comprehensive/yearComprehensive/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/dataAuth/authSetting.js b/energy_management_ui/src/api/dataAuth/authSetting.js
new file mode 100644
index 0000000..5c4fadd
--- /dev/null
+++ b/energy_management_ui/src/api/dataAuth/authSetting.js
@@ -0,0 +1,16 @@
+import request from '@/utils/request'
+
+export function selectSettingAuth(id, modelCode, authType) {
+  return request({
+    url: '/data/auth/' + authType + '/' + modelCode + '/' + id,
+    method: 'GET',
+  })
+}
+
+export function setDataAuth(id, modelCode, authType, authIds) {
+  return request({
+    url: '/data/auth/' + authType + '/' + modelCode + '/' + id,
+    method: 'post',
+    data: authIds
+  })
+}
diff --git a/energy_management_ui/src/api/dataEntry/stagseDataEntry.js b/energy_management_ui/src/api/dataEntry/stagseDataEntry.js
new file mode 100644
index 0000000..50c9174
--- /dev/null
+++ b/energy_management_ui/src/api/dataEntry/stagseDataEntry.js
@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+//鑾峰彇妯″瀷涓嬬殑鎸囨爣
+export function getSettingIndex(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/' + nodeId,
+    method: 'get',
+  })
+}
+// 鏌ヨ闃舵鏁版嵁褰曞叆鍒楄〃
+export function listStagseDataEntry(query) {
+  return request({
+    url: '/dataEntry/stagseDataEntry/list',
+    method: 'get',
+    params: query
+  })
+}
+export function listStagseDataEdit(query) {
+  return request({
+    url: '/dataEntry/stagseDataEntry/edit',
+    method: 'get',
+    params: query
+  })
+}
+// 鏂板闃舵鏁版嵁
+export function addStagseDataEntry(data) {
+  return request({
+    url: '/dataEntry/stagseDataEntry',
+    method: 'post',
+    data: data
+  })
+}
+// 鏌ヨ闃舵鏁版嵁褰曞叆鍒楄〃
+export function stagseDataEntryEdit(query) {
+  return request({
+    url: '/dataEntry/stagseDataEntry/listEdit',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/dataMonitoring/energyPercent/index.js b/energy_management_ui/src/api/dataMonitoring/energyPercent/index.js
new file mode 100644
index 0000000..6e07fb3
--- /dev/null
+++ b/energy_management_ui/src/api/dataMonitoring/energyPercent/index.js
@@ -0,0 +1,10 @@
+import request from "@/utils/request";
+
+//鍒楄〃鎺ュ彛
+export function getElectricityShareAnalysis(query) {
+  return request({
+    url: "/energyShareAnalysis/getElectricityShareAnalysis",
+    method: "get",
+    params: query
+  });
+}
diff --git a/energy_management_ui/src/api/dataMonitoring/historyDataTrend/historyDataTrend.js b/energy_management_ui/src/api/dataMonitoring/historyDataTrend/historyDataTrend.js
new file mode 100644
index 0000000..5557b88
--- /dev/null
+++ b/energy_management_ui/src/api/dataMonitoring/historyDataTrend/historyDataTrend.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+//鍒楄〃鎺ュ彛
+export function getCodeList(query) {
+  return request({
+    url: '/dataMonitoring/historyDataTrend/getHistoricalDataByIndexId',
+    method: 'get',
+    params: query
+  })
+}
+
+//鑾峰彇鐐逛綅鍒楄〃鎺ュ彛
+export function getIndexList(id) {
+  return request({
+    url: '/basicsetting/model/getEnergyIndexByModelId',
+    method: 'get',
+    params: {
+      modelId: id
+    }
+  })
+}
+
+export function exportHistoryDataTrend(query) {
+  return request({
+    url: '/dataMonitoring/historyDataTrend/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// // 瀹炴椂鐩戞祴-瀵煎嚭Excel  get
+// dataMonitoring/realTimeTrend/export?nodeId=ca900cb2-70d9-4bd7-8ff1-f93e5808f2d1
+
+// // 鍘嗗彶鏁版嵁-瀵煎嚭Excel  get
+// dataMonitoring/historyDataTrend/export?nodeId=b7a014a7-a994-457d-ad10-31654f003efa&indexId=2a026b78-3a1d-4f28-8f62-23bd34b1b118&pickerType=datetime&dataTime=2023-03-16+14:50:43&timeType=HOUR
diff --git a/energy_management_ui/src/api/dataMonitoring/realTimeTrend/realTimeTrend.js b/energy_management_ui/src/api/dataMonitoring/realTimeTrend/realTimeTrend.js
new file mode 100644
index 0000000..e938361
--- /dev/null
+++ b/energy_management_ui/src/api/dataMonitoring/realTimeTrend/realTimeTrend.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+//鍒楄〃鎺ュ彛
+export function getTrendSettingIndex(query) {
+  return request({
+    url: '/dataMonitoring/realTimeTrend/energyIndex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//鎶樼嚎鍥炬暟鎹帴鍙�
+export function getTrendSettingIndexLineData(codes, minute, count) {
+  return request({
+    url: '/dataMonitoring/realTimeTrend/energyIndex/lineList/' + codes + "/" + minute + "/" + count,
+    method: 'get',
+  })
+}
+
+//瓒嬪娍鍥惧垪琛ㄦ帴鍙�
+export function getSvgTrendSettingIndex(query) {
+  return request({
+    url: '/dataMonitoring/realTimeTrend/svgTrendView/energyIndex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//daochu
+export function exportRealTimeTrend(query) {
+  return request({
+    url: '/dataMonitoring/realTimeTrend/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/dataMonitoring/svgTrend/svgTrendView.js b/energy_management_ui/src/api/dataMonitoring/svgTrend/svgTrendView.js
new file mode 100644
index 0000000..7744453
--- /dev/null
+++ b/energy_management_ui/src/api/dataMonitoring/svgTrend/svgTrendView.js
@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+//鍒楄〃鎺ュ彛
+export function getSvgTrendSettingIndex(query) {
+  return request({
+    url: '/dataMonitoring/svgTrendView/energyIndex/list',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/demo/demo.js b/energy_management_ui/src/api/demo/demo.js
new file mode 100644
index 0000000..834794c
--- /dev/null
+++ b/energy_management_ui/src/api/demo/demo.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
+export function listDemo(query) {
+  return request({
+    url: '/system/demo/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戣缁�
+export function getDemo(id) {
+  return request({
+    url: '/system/demo/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
+export function addDemo(data) {
+  return request({
+    url: '/system/demo',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼銆愯濉啓鍔熻兘鍚嶇О銆�
+export function updateDemo(data) {
+  return request({
+    url: '/system/demo',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎銆愯濉啓鍔熻兘鍚嶇О銆�
+export function delDemo(id) {
+  return request({
+    url: '/system/demo/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭銆愯濉啓鍔熻兘鍚嶇О銆�
+export function exportDemo(query) {
+  return request({
+    url: '/system/demo/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/electricityPrice/electricity.js b/energy_management_ui/src/api/electricityPrice/electricity.js
new file mode 100644
index 0000000..849e7b3
--- /dev/null
+++ b/energy_management_ui/src/api/electricityPrice/electricity.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+
+// 鏌ヨelectricityPrice鍒楄〃
+export function listElectricity(query) {
+  return request({
+    url: '/electricityPrice/electricity/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鍘嗗彶鍒楄〃
+export function listHistory(query) {
+  return request({
+    url: '/electricityPrice/electricity/listHistory',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨ鐢熸晥鏃ユ湡鍒楄〃
+export function listDate(query) {
+  return request({
+    url: '/electricityPrice/electricity/listDate',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨelectricityPrice璇︾粏
+export function getElectricity(id) {
+  return request({
+    url: '/electricityPrice/electricity/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板electricityPrice
+export function addElectricity(data) {
+  return request({
+    url: '/electricityPrice/electricity',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼electricityPrice
+export function updateElectricity(data) {
+  return request({
+    url: '/electricityPrice/electricity',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎electricityPrice
+export function delElectricity(id) {
+  return request({
+    url: '/electricityPrice/electricity/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭electricityPrice
+export function exportElectricity(query) {
+  return request({
+    url: '/electricityPrice/electricity/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/electricityPrice/price.js b/energy_management_ui/src/api/electricityPrice/price.js
new file mode 100644
index 0000000..d915ba7
--- /dev/null
+++ b/energy_management_ui/src/api/electricityPrice/price.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+
+// 鏌ヨelectricity鍒楄〃
+export function listPrice(query) {
+  return request({
+    url: '/electricityPrice/price/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨelectricity璇︾粏
+export function getPrice(id) {
+  return request({
+    url: '/electricityPrice/price/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板electricity
+export function addPrice(data) {
+  return request({
+    url: '/electricityPrice/price',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼electricity
+export function updatePrice(data) {
+  return request({
+    url: '/electricityPrice/price',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎electricity
+export function delPrice(id) {
+  return request({
+    url: '/electricityPrice/price/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭electricity
+export function exportPrice(query) {
+  return request({
+    url: '/electricityPrice/price/export',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨ瀛楀吀椤硅缁�
+// 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
+export function EdictType(query) {
+  return request({
+    url: '/electricityPrice/price/dictType',
+    method: 'get',
+    params: query
+  })
+}
+export function dictTypeList(query) {
+  return request({
+    url: '/electricityPrice/price/dictTypeList',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/electricityPrice/statistics.js b/energy_management_ui/src/api/electricityPrice/statistics.js
new file mode 100644
index 0000000..5457ad3
--- /dev/null
+++ b/energy_management_ui/src/api/electricityPrice/statistics.js
@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+// 鏌ヨelectricity鍒楄〃
+export function getStatisticsList(query) {
+  /*if(query.timeType=='MONTH'){
+    query.timeType="DAY"
+  }
+  if(query.timeType=='YEAR'){
+    query.timeType="MONTH"
+  }*/
+  query.timeType="HOUR"
+  return request({
+    url: '/electricityPrice/statistics/getStatisticsList',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨelectricity鍒楄〃
+export function getDataStatistics(query) {
+  return request({
+    url: '/electricityPrice/statistics/getDataStatistics',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/enerInfoManage/enerclass.js b/energy_management_ui/src/api/enerInfoManage/enerclass.js
new file mode 100644
index 0000000..79348c3
--- /dev/null
+++ b/energy_management_ui/src/api/enerInfoManage/enerclass.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鑳芥簮鍝佺璁剧疆鍒楄〃
+export function listEnerclass(query) {
+  return request({
+    url: '/enerInfoManage/enerclass/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑳芥簮鍝佺璁剧疆璇︾粏
+export function getEnerclass(enerclassid) {
+  return request({
+    url: '/enerInfoManage/enerclass/' + enerclassid,
+    method: 'get'
+  })
+}
+
+// 鏂板鑳芥簮鍝佺璁剧疆
+export function addEnerclass(data) {
+  return request({
+    url: '/enerInfoManage/enerclass',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鑳芥簮鍝佺璁剧疆
+export function updateEnerclass(data) {
+  return request({
+    url: '/enerInfoManage/enerclass',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鑳芥簮鍝佺璁剧疆
+export function delEnerclass(enerclassid) {
+  return request({
+    url: '/enerInfoManage/enerclass/' + enerclassid,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鑳芥簮鍝佺璁剧疆
+export function exportEnerclass(query) {
+  return request({
+    url: '/enerInfoManage/enerclass/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/enerInfoManage/enercoefficient.js b/energy_management_ui/src/api/enerInfoManage/enercoefficient.js
new file mode 100644
index 0000000..a62bdca
--- /dev/null
+++ b/energy_management_ui/src/api/enerInfoManage/enercoefficient.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鑳芥簮鎶樻爣绯绘暟鍒楄〃
+export function listEnercoefficient(query) {
+  return request({
+    url: '/enerInfoManage/enercoefficient/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑳芥簮鎶樻爣绯绘暟璇︾粏
+export function getEnercoefficient(ecid) {
+  return request({
+    url: '/enerInfoManage/enercoefficient/' + ecid,
+    method: 'get'
+  })
+}
+
+// 鏂板鑳芥簮鎶樻爣绯绘暟
+export function addEnercoefficient(data) {
+  return request({
+    url: '/enerInfoManage/enercoefficient',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鑳芥簮鎶樻爣绯绘暟
+export function updateEnercoefficient(data) {
+  return request({
+    url: '/enerInfoManage/enercoefficient',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鑳芥簮鎶樻爣绯绘暟
+export function delEnercoefficient(ecid) {
+  return request({
+    url: '/enerInfoManage/enercoefficient/' + ecid,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鑳芥簮鎶樻爣绯绘暟
+export function exportEnercoefficient(query) {
+  return request({
+    url: '/enerInfoManage/enercoefficient/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/enerInfoManage/energy.js b/energy_management_ui/src/api/enerInfoManage/energy.js
new file mode 100644
index 0000000..d5774d8
--- /dev/null
+++ b/energy_management_ui/src/api/enerInfoManage/energy.js
@@ -0,0 +1,74 @@
+import request from '@/utils/request'
+
+// 鏌ヨenergy鍒楄〃
+export function listEnergy(query) {
+  return request({
+    url: '/enerInfoManage/energy/list',
+    method: 'get',
+    params: query
+  })
+}
+export function classselect() {
+  return request({
+    url: '/enerInfoManage/energy/getenerclassname',
+    method: 'get',
+  })
+}
+
+// 鏌ヨenergy璇︾粏
+export function getEnergy(enerid) {
+  return request({
+    url: '/enerInfoManage/energy/' + enerid,
+    method: 'get'
+  })
+}
+// 淇濆瓨鍗曚环璁剧疆
+export function updateEnergyPrice(data){
+  return request({
+    url: '/enerInfoManage/energy/updateEnergyPrice',
+    method: 'put',
+    data: data
+  })
+}
+export function updateEnergyCoefficient(data) {
+  return request({
+    url: '/enerInfoManage/energy/updateEnergyCoefficient',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鏂板energy
+export function addEnergy(data) {
+  return request({
+    url: '/enerInfoManage/energy',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼energy
+export function updateEnergy(data) {
+  return request({
+    url: '/enerInfoManage/energy',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎energy
+export function delEnergy(enerid) {
+  return request({
+    url: '/enerInfoManage/energy/' + enerid,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭energy
+export function exportEnergy(query) {
+  return request({
+    url: '/enerInfoManage/energy/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/enerInfoManage/price.js b/energy_management_ui/src/api/enerInfoManage/price.js
new file mode 100644
index 0000000..3b12c49
--- /dev/null
+++ b/energy_management_ui/src/api/enerInfoManage/price.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍗曚环璁剧疆鍒楄〃
+export function listPrice(query) {
+  return request({
+    url: '/price/price/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鍗曚环璁剧疆璇︾粏
+export function getPrice(priceid) {
+  return request({
+    url: '/price/price/' + priceid,
+    method: 'get'
+  })
+}
+
+// 鏂板鍗曚环璁剧疆
+export function addPrice(data) {
+  return request({
+    url: '/price/price',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鍗曚环璁剧疆
+export function updatePrice(data) {
+  return request({
+    url: '/price/price',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鍗曚环璁剧疆
+export function delPrice(priceid) {
+  return request({
+    url: '/price/price/' + priceid,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鍗曚环璁剧疆
+export function exportPrice(query) {
+  return request({
+    url: '/price/price/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/enerInfoManage/product.js b/energy_management_ui/src/api/enerInfoManage/product.js
new file mode 100644
index 0000000..7eb288e
--- /dev/null
+++ b/energy_management_ui/src/api/enerInfoManage/product.js
@@ -0,0 +1,59 @@
+import request from '@/utils/request'
+
+// 鏌ヨ浜у搧鍒楄〃
+export function listProduct(query) {
+  return request({
+    url: '/enerInfoManage/product/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ浜у搧璇︾粏
+export function getProduct(productid) {
+  return request({
+    url: '/enerInfoManage/product/' + productid,
+    method: 'get'
+  })
+}
+
+// 鏂板浜у搧
+export function addProduct(data) {
+  return request({
+    url: '/enerInfoManage/product',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼浜у搧
+export function updateProduct(data) {
+  return request({
+    url: '/enerInfoManage/product',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎浜у搧
+export function delProduct(productid) {
+  return request({
+    url: '/enerInfoManage/product/' + productid,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭浜у搧
+export function exportProduct(query) {
+  return request({
+    url: '/enerInfoManage/product/export',
+    method: 'get',
+    params: query
+  })
+}
+export function getFatherCP() {
+  return request({
+    url: '/enerInfoManage/product/getFatherCP',
+    method: 'get',
+  })
+}
diff --git a/energy_management_ui/src/api/energy/energyAnnex.js b/energy_management_ui/src/api/energy/energyAnnex.js
new file mode 100644
index 0000000..a476ac3
--- /dev/null
+++ b/energy_management_ui/src/api/energy/energyAnnex.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃
+export function listEnergyAnnex(query) {
+  return request({
+    url: '/energy/energyAnnex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢璇︾粏
+export function getEnergyAnnex(id) {
+  return request({
+    url: '/energy/energyAnnex/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鑺傝兘椤圭洰绠$悊闄勪欢
+export function addEnergyAnnex(data) {
+  return request({
+    url: '/energy/energyAnnex',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鑺傝兘椤圭洰绠$悊闄勪欢
+export function updateEnergyAnnex(data) {
+  return request({
+    url: '/energy/energyAnnex',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢
+export function delEnergyAnnex(id) {
+  return request({
+    url: '/energy/energyAnnex/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鑺傝兘椤圭洰绠$悊闄勪欢
+export function exportEnergyAnnex(query) {
+  return request({
+    url: '/energy/energyAnnex/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/energy/energyProject.js b/energy_management_ui/src/api/energy/energyProject.js
new file mode 100644
index 0000000..a600220
--- /dev/null
+++ b/energy_management_ui/src/api/energy/energyProject.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鑺傝兘椤圭洰绠$悊鍒楄〃
+export function listEnergyProject(query) {
+  return request({
+    url: '/energy/energyProject/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑺傝兘椤圭洰绠$悊璇︾粏
+export function getEnergyProject(id) {
+  return request({
+    url: '/energy/energyProject/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鑺傝兘椤圭洰绠$悊
+export function addEnergyProject(data) {
+  return request({
+    url: '/energy/energyProject',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鑺傝兘椤圭洰绠$悊
+export function updateEnergyProject(data) {
+  return request({
+    url: '/energy/energyProject',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鑺傝兘椤圭洰绠$悊
+export function delEnergyProject(id) {
+  return request({
+    url: '/energy/energyProject/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鑺傝兘椤圭洰绠$悊
+export function exportEnergyProject(query) {
+  return request({
+    url: '/energy/energyProject/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/energy/report.js b/energy_management_ui/src/api/energy/report.js
new file mode 100644
index 0000000..b70e171
--- /dev/null
+++ b/energy_management_ui/src/api/energy/report.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊鍒楄〃
+export function listReport(query) {
+  return request({
+    url: '/energy/report/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊璇︾粏
+export function getReport(id) {
+  return request({
+    url: '/energy/report/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+export function addReport(data) {
+  return request({
+    url: '/energy/report',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+export function updateReport(data) {
+  return request({
+    url: '/energy/report',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+export function delReport(id) {
+  return request({
+    url: '/energy/report/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鑺傝兘鍒嗘瀽鎶ュ憡绠$悊
+export function exportReport(query) {
+  return request({
+    url: '/energy/report/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/energy/reportAnnex.js b/energy_management_ui/src/api/energy/reportAnnex.js
new file mode 100644
index 0000000..f0edae2
--- /dev/null
+++ b/energy_management_ui/src/api/energy/reportAnnex.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢鍒楄〃
+export function listReportAnnex(query) {
+  return request({
+    url: '/energy/reportAnnex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢璇︾粏
+export function getReportAnnex(id) {
+  return request({
+    url: '/energy/reportAnnex/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+export function addReportAnnex(data) {
+  return request({
+    url: '/energy/reportAnnex',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+export function updateReportAnnex(data) {
+  return request({
+    url: '/energy/reportAnnex',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+export function delReportAnnex(id) {
+  return request({
+    url: '/energy/reportAnnex/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鑺傝兘鍒嗘瀽鎶ュ憡绠$悊闄勪欢
+export function exportReportAnnex(query) {
+  return request({
+    url: '/energy/reportAnnex/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/energyAlarm/realTimeAlarm/liveHistoryAssembly.js b/energy_management_ui/src/api/energyAlarm/realTimeAlarm/liveHistoryAssembly.js
new file mode 100644
index 0000000..153a410
--- /dev/null
+++ b/energy_management_ui/src/api/energyAlarm/realTimeAlarm/liveHistoryAssembly.js
@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+
+// 鏌ヨ瀹炴椂椤甸潰鏁版嵁
+export function getRealTimeData(code, minute, pointCount) {
+    return request({
+        url: '/energyAlarm/realTimeAlarm/liveHistoryData/' + code + "/" + minute + "/" + pointCount,
+        method: 'get'
+    })
+}
+
+// 鏌ヨ瀹炴椂琛ㄦ牸椤甸潰鏁版嵁
+export function getRealTimeTableData(code, dataTime) {
+    return request({
+        url: '/dataMonitoring/realTimeTrend/svgTrendView/energyIndex/history/' + code + '/' + dataTime,
+        method: 'get'
+    })
+}
+
+// 鏌ヨ鍘嗗彶椤甸潰鏁版嵁
+export function getHistoryData(code, start, end, pointCount) {
+    return request({
+        url: '/energyAlarm/historicalAlarm/historyData/' + code + "/" + start + "/" + end + "/" + pointCount,
+        method: 'get'
+    })
+}
+
+// 瀵煎嚭鍘嗗彶琛ㄦ牸鏁版嵁
+export function exportHistoryTable(code, start, end, pointCount, indexName, indexUnit) {
+    return request({
+        url: '/energyAlarm/historicalAlarm/historyDataExcel/' + code + "/" + start + "/" + end + "/" + pointCount + "/" + indexName + "/" + indexUnit,
+        method: 'get'
+    })
+}
diff --git a/energy_management_ui/src/api/energyAlarm/realTimeAlarm/realTimeAlarm.js b/energy_management_ui/src/api/energyAlarm/realTimeAlarm/realTimeAlarm.js
new file mode 100644
index 0000000..ed29f20
--- /dev/null
+++ b/energy_management_ui/src/api/energyAlarm/realTimeAlarm/realTimeAlarm.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛�
+export function getRealTimeAlarmList(query) {
+  return request({
+    url: '/energyAlarm/realTimeAlarm/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// // 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶よ缁�
+// export function getLimitType(id) {
+//   return request({
+//     url: '/basicsetting/limitType/' + id,
+//     method: 'get'
+//   })
+// }
+//
+// // 鏂板鎶ヨ闄愬�肩被鍨嬬淮鎶�
+// export function addLimitType(data) {
+//   return request({
+//     url: '/basicsetting/limitType',
+//     method: 'post',
+//     data: data
+//   })
+// }
+//
+// // 淇敼鎶ヨ闄愬�肩被鍨嬬淮鎶�
+// export function updateLimitType(data) {
+//   return request({
+//     url: '/basicsetting/limitType',
+//     method: 'put',
+//     data: data
+//   })
+// }
+//
+// // 鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶�
+// export function delLimitType(id) {
+//   return request({
+//     url: '/basicsetting/limitType/' + id,
+//     method: 'delete'
+//   })
+// }
+//
+// // 瀵煎嚭鎶ヨ闄愬�肩被鍨嬬淮鎶�
+// export function exportLimitType(query) {
+//   return request({
+//     url: '/basicsetting/limitType/export',
+//     method: 'get',
+//     params: query
+//   })
+// }
diff --git a/energy_management_ui/src/api/energyAssistInput/energyDayConsumeInput.js b/energy_management_ui/src/api/energyAssistInput/energyDayConsumeInput.js
new file mode 100644
index 0000000..bceba71
--- /dev/null
+++ b/energy_management_ui/src/api/energyAssistInput/energyDayConsumeInput.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+// 鏌ヨ鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+export function selectConsumeInputList(query) {
+  return request({
+    url: '/energyAssistInput/energyDayConsumeInput/listEnergyConsumeInputIndex',
+    method: 'get',
+    params: query
+  })
+}
+
+// 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+export function saveConsumeInput(data) {
+  return request({
+    url: '/energyAssistInput/energyDayConsumeInput/saveEnergyConsumeInput',
+    method: 'post',
+    data: data
+  })
+}
diff --git a/energy_management_ui/src/api/energyAssistInput/energyMonthConsumeInput.js b/energy_management_ui/src/api/energyAssistInput/energyMonthConsumeInput.js
new file mode 100644
index 0000000..2287865
--- /dev/null
+++ b/energy_management_ui/src/api/energyAssistInput/energyMonthConsumeInput.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+// 鏌ヨ鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+export function selectConsumeInputList(query) {
+  return request({
+    url: '/energyAssistInput/energyMonthConsumeInput/listEnergyConsumeInputIndex',
+    method: 'get',
+    params: query
+  })
+}
+
+// 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+export function saveConsumeInput(data) {
+  return request({
+    url: '/energyAssistInput/energyMonthConsumeInput/saveEnergyConsumeInput',
+    method: 'post',
+    data: data
+  })
+}
diff --git a/energy_management_ui/src/api/energyAssistInput/energyYearConsumeInput.js b/energy_management_ui/src/api/energyAssistInput/energyYearConsumeInput.js
new file mode 100644
index 0000000..3183276
--- /dev/null
+++ b/energy_management_ui/src/api/energyAssistInput/energyYearConsumeInput.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+// 鏌ヨ鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+export function selectConsumeInputList(query) {
+  return request({
+    url: '/energyAssistInput/energyYearConsumeInput/listEnergyConsumeInputIndex',
+    method: 'get',
+    params: query
+  })
+}
+
+// 淇濆瓨鑳借�楁墜鍔ㄨ緭鍏ヤ俊鎭�
+export function saveConsumeInput(data) {
+  return request({
+    url: '/energyAssistInput/energyYearConsumeInput/saveEnergyConsumeInput',
+    method: 'post',
+    data: data
+  })
+}
diff --git a/energy_management_ui/src/api/energyBalance/energyBalance.js b/energy_management_ui/src/api/energyBalance/energyBalance.js
new file mode 100644
index 0000000..6db2816
--- /dev/null
+++ b/energy_management_ui/src/api/energyBalance/energyBalance.js
@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+
+// 鑳芥簮鎹熷け鍒嗘瀽
+export function lossAnalysisList(query) {
+  return request({
+    url: '/balance/energyBalance/lossAnalysisList',
+    method: 'get',
+    params: query
+  })
+}
+export function energyLossTable(query) {
+  return request({
+    url: '/balance/energyBalance/lossTableList',
+    method: 'get',
+    params: query
+  })
+}
+// 鑳芥簮骞宠 鍒嗘瀽
+export function energyBalanceList(query) {
+  return request({
+    url: '/balance/energyBalance/list',
+    method: 'get',
+    params: query
+  })
+}
+// 鑳芥簮骞宠 鍒嗘瀽
+export function energyBalanceTable(query) {
+  return request({
+    url: '/balance/energyBalance/tableList',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/energyBalance/energyPic.js b/energy_management_ui/src/api/energyBalance/energyPic.js
new file mode 100644
index 0000000..6f8718f
--- /dev/null
+++ b/energy_management_ui/src/api/energyBalance/energyPic.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+// 鏌ヨ宸ュ簭鍗曡�楃粺璁� 鎶ヨ〃 鎸囨爣灞曠ず鍐呭
+export function selectEnergyPicList(query) {
+  return request({
+    url: '/balance/energyBalance/listEnergyPicIndex',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/energyEenchmarking/energyEenchmarking.js b/energy_management_ui/src/api/energyEenchmarking/energyEenchmarking.js
new file mode 100644
index 0000000..ca7a7c9
--- /dev/null
+++ b/energy_management_ui/src/api/energyEenchmarking/energyEenchmarking.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨenergy_benchmarking鍒楄〃
+export function listEnergyEenchmarking(query) {
+  return request({
+    url: '/energyEenchmarking/energyEenchmarking/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨenergy_benchmarking璇︾粏
+export function getEnergyEenchmarking(id) {
+  return request({
+    url: '/energyEenchmarking/energyEenchmarking/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板energy_benchmarking
+export function addEnergyEenchmarking(data) {
+  return request({
+    url: '/energyEenchmarking/energyEenchmarking',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼energy_benchmarking
+export function updateEnergyEenchmarking(data) {
+  return request({
+    url: '/energyEenchmarking/energyEenchmarking',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎energy_benchmarking
+export function delEnergyEenchmarking(id) {
+  return request({
+    url: '/energyEenchmarking/energyEenchmarking/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭energy_benchmarking
+export function exportEnergyEenchmarking(query) {
+  return request({
+    url: '/energyEenchmarking/energyEenchmarking/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/energyExamine/addIndex.js b/energy_management_ui/src/api/energyExamine/addIndex.js
new file mode 100644
index 0000000..cf7899b
--- /dev/null
+++ b/energy_management_ui/src/api/energyExamine/addIndex.js
@@ -0,0 +1,29 @@
+import request from '@/utils/request'
+
+
+//  鏍规嵁鎸囨爣绫诲瀷鍜屾ā鍨嬭妭鐐筰d鑾峰彇妯″瀷涓嬬殑鎸囨爣鍒楄〃
+export function listIndex(indexType,nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/'+indexType+'/'+nodeId,
+    method: 'get'
+  })
+}
+
+
+// 鏍规嵁璁¢噺鍣ㄥ叿ID鐢熸垚鎴栭噸鏂扮敓鎴愭寚鏍�
+export function addIndex(data,modeNodeId) {
+  return request({
+    url: '/energyExamine/assessmentIndex/addIndex/'+modeNodeId,
+    method: 'post',
+    data:data
+  })
+}
+
+//
+// 鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+export function delIndex(id) {
+  return request({
+    url: '/basicsetting/energyindex/' + id,
+    method: 'delete'
+  })
+}
diff --git a/energy_management_ui/src/api/energyExamine/assessmentIndex.js b/energy_management_ui/src/api/energyExamine/assessmentIndex.js
new file mode 100644
index 0000000..1422228
--- /dev/null
+++ b/energy_management_ui/src/api/energyExamine/assessmentIndex.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃
+export function listAssessmentIndex(query) {
+  return request({
+    url: '/energyExamine/assessmentIndex/list',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃
+export function listAssessmentIndexModel(modeNodeId,query) {
+  return request({
+    url: '/energyExamine/assessmentIndex/list/'+modeNodeId,
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯璇︾粏
+export function getAssessmentIndex(id) {
+  return request({
+    url: '/energyExamine/assessmentIndex/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鐢ㄨ兘鑰冩牳鏍囧噯
+export function addAssessmentIndex(data) {
+  return request({
+    url: '/energyExamine/assessmentIndex',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鐢ㄨ兘鑰冩牳鏍囧噯
+export function updateAssessmentIndex(data) {
+  return request({
+    url: '/energyExamine/assessmentIndex',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鐢ㄨ兘鑰冩牳鏍囧噯
+export function delAssessmentIndex(id) {
+  return request({
+    url: '/energyExamine/assessmentIndex/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鐢ㄨ兘鑰冩牳鏍囧噯
+export function exportAssessmentIndex(query) {
+  return request({
+    url: '/energyExamine/assessmentIndex/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/energyStatistics/statistics.js b/energy_management_ui/src/api/energyStatistics/statistics.js
new file mode 100644
index 0000000..88ceb60
--- /dev/null
+++ b/energy_management_ui/src/api/energyStatistics/statistics.js
@@ -0,0 +1,127 @@
+import request from '@/utils/request'
+//鑾峰彇妯″瀷涓嬬殑鎸囨爣
+export function getSettingIndex(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energyIndex/' + nodeId,
+    method: 'get',
+  })
+}
+//鑾峰彇妯″瀷涓嬬殑鑳芥簮鍝佺
+export function getSettingEnergy(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/energy/' + nodeId,
+    method: 'get'
+  })
+}
+//鑾峰彇妯″瀷涓嬬殑璁惧
+export function getSettingDevice(nodeId) {
+  return request({
+    url: '/basicsetting/modelnode/device/' + nodeId,
+    method: 'get'
+  })
+}
+// 鑳借�楁寚鏍囪秼鍔垮垎鏋�
+export function getEnergyStatisticsTrend(query) {
+  return request({
+    url: '/energyStatistics/getEnergyStatisticsTrend',
+    method: 'get',
+    params: query,
+  })
+}
+// 鑳借�楁寚鏍囪秼鍔垮垎鏋�
+export function getEnergyCurveTrend(query) {
+  return request({
+    url: '/energyCurve/getEnergyCurveTrend',
+    method: 'get',
+    params: query,
+  })
+}
+// 鑳借�楁寚鏍囪秼鍔垮垎鏋愬鍑�
+export function exportEnergyindex(query) {
+  return request({
+    url: '/energyStatistics/export',
+    method: 'get',
+    params: query
+  })
+}
+// 鑳借�楁寚鏍囪秼鍔垮垎鏋愬鍑�
+export function exportEnergyCurveindex(query) {
+  return request({
+    url: '/energyCurve/export',
+    method: 'get',
+    params: query
+  })
+}
+//鑳芥簮娑堣垂鎴愭湰鏋勬垚
+export function getEnergyConstitute(query) {
+  return request({
+    url: 'energyStatistics/getEnergyConstitute',
+    method: 'get',
+    params: query,
+  })
+}
+//鑳芥簮娑堣垂鎴愭湰鍒嗘瀽
+export function getEnergyConsumption(query) {
+  return request({
+    url: 'energyStatistics/getEnergyConsumption',
+    method: 'get',
+    params: query,
+  })
+}
+// 鑳芥簮鎴愭湰瀵煎嚭
+export function energyConsumptionExport(query) {
+  return request({
+    url: '/energyStatistics/energyConsumptionExport',
+    method: 'get',
+    params: query
+  })
+}
+//鑳芥簮娑堣垂鎴愭湰鍒嗘椂鍒嗘瀽鎶ヨ〃
+export function listEnergyConsumption(query) {
+  return request({
+    url: '/energyStatistics/listEnergyConsumption',
+    method: 'get',
+    params: query,
+  })
+}
+//鐢ㄨ兘鍗曞厓鑳借�楀垎鏋�
+export function getEnergyUnit(query) {
+  return request({
+    url: '/energyStatistics/getEnergyUnit',
+    method: 'get',
+    params: query
+  })
+}
+// 瀹炴椂妫�娴嬬粍鎬佸浘鍔熻兘鐨勫sheet椤垫姤琛�
+export function reportFormsvg(query) {
+  return request({
+    url: '/energyStatistics/reportFormsvg',
+    method: 'get',
+    params: query
+  })
+}
+//瀹炴椂妫�娴嬬粍鎬佸浘鍔熻兘鐨勫sheet椤垫姤琛ㄥ鍑�
+export function reportFormsvgExport(query) {
+  return request({
+    url: '/energyStatistics/reportFormsvgExport',
+    method: 'get',
+    params: query
+  })
+}
+
+//鑳借�楃粺璁�
+export function getEnergyAnalysis(query) {
+  return request ({
+    url: '/energyAnalysis/getEnergyAnalysis',
+    method: 'get',
+    params: query
+  })
+}
+//瀵煎嚭鑳借�楃粺璁�
+export function exportDemo(query) {
+  return request({
+    url: '/energyAnalysis/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/equipmentMonitor/historyMonitoring/historyMonitoring.js b/energy_management_ui/src/api/equipmentMonitor/historyMonitoring/historyMonitoring.js
new file mode 100644
index 0000000..2ad7e44
--- /dev/null
+++ b/energy_management_ui/src/api/equipmentMonitor/historyMonitoring/historyMonitoring.js
@@ -0,0 +1,71 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃
+export function listHistoryMonitoring(query) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴璇︾粏
+export function getHistoryMonitoring(id) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板璁惧鍚仠鍘嗗彶鐩戞祴
+export function addHistoryMonitoring(data) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁惧鍚仠鍘嗗彶鐩戞祴
+export function updateHistoryMonitoring(data) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁惧鍚仠鍘嗗彶鐩戞祴
+export function delHistoryMonitoring(id) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁惧鍚仠鍘嗗彶鐩戞祴
+export function exportHistoryMonitoring(query) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁惧鍚仠鍘嗗彶鐩戞祴鍒楄〃(鏂板姞)
+export function listHistoryMonitoringNew(query) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring/history/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 瀵煎嚭璁惧鍚仠鍘嗗彶鐩戞祴(鏂板姞)
+export function exportHistoryMonitoringTableList(query) {
+  return request({
+    url: '/historyMonitoring/historyMonitoring/export/tableList',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/equipmentMonitor/realTimeMonitoring/realTimeMonitoring.js b/energy_management_ui/src/api/equipmentMonitor/realTimeMonitoring/realTimeMonitoring.js
new file mode 100644
index 0000000..a028034
--- /dev/null
+++ b/energy_management_ui/src/api/equipmentMonitor/realTimeMonitoring/realTimeMonitoring.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴鍒楄〃
+export function listRealTimeMonitoring(query) {
+  return request({
+    url: '/realTimeMonitoring/realTimeMonitoring/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁惧鍚仠瀹炴椂鐩戞祴璇︾粏
+export function getRealTimeMonitoring(id) {
+  return request({
+    url: '/realTimeMonitoring/realTimeMonitoring/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板璁惧鍚仠瀹炴椂鐩戞祴
+export function addRealTimeMonitoring(data) {
+  return request({
+    url: '/realTimeMonitoring/realTimeMonitoring',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁惧鍚仠瀹炴椂鐩戞祴
+export function updateRealTimeMonitoring(data) {
+  return request({
+    url: '/realTimeMonitoring/realTimeMonitoring',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁惧鍚仠瀹炴椂鐩戞祴
+export function delRealTimeMonitoring(id) {
+  return request({
+    url: '/realTimeMonitoring/realTimeMonitoring/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁惧鍚仠瀹炴椂鐩戞祴
+export function exportRealTimeMonitoring(query) {
+  return request({
+    url: '/realTimeMonitoring/realTimeMonitoring/export',
+    method: 'get',
+    params: query
+  })
+}
+
+//瀵屽伐鎺ュ彛
+export function getSettingIndex(query) {
+  return request({
+    url: '/realTimeMonitoring/realTimeMonitoring/energyIndex/list',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/facility/annex.js b/energy_management_ui/src/api/facility/annex.js
new file mode 100644
index 0000000..c029387
--- /dev/null
+++ b/energy_management_ui/src/api/facility/annex.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁惧妗f闄勪欢鍒楄〃
+export function listAnnex(query) {
+  return request({
+    url: '/facility/annex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁惧妗f闄勪欢璇︾粏
+export function getAnnex(createTime) {
+  return request({
+    url: '/facility/annex/' + createTime,
+    method: 'get'
+  })
+}
+
+// 鏂板璁惧妗f闄勪欢
+export function addAnnex(data) {
+  return request({
+    url: '/facility/annex',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁惧妗f闄勪欢
+export function updateAnnex(data) {
+  return request({
+    url: '/facility/annex',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁惧妗f闄勪欢
+export function delAnnex(createTime) {
+  return request({
+    url: '/facility/annex/' + createTime,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁惧妗f闄勪欢
+export function exportAnnex(query) {
+  return request({
+    url: '/facility/annex/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/facility/archives.js b/energy_management_ui/src/api/facility/archives.js
new file mode 100644
index 0000000..6fec0f0
--- /dev/null
+++ b/energy_management_ui/src/api/facility/archives.js
@@ -0,0 +1,69 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁惧妗f鍒楄〃
+export function listArchives(query) {
+  return request({
+    url: '/facility/archives/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁惧妗f璇︾粏
+export function getArchives(id) {
+  return request({
+    url: '/facility/archives/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板璁惧妗f
+export function addArchives(data) {
+  return request({
+    url: '/facility/archives',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁惧妗f
+export function updateArchives(data) {
+  return request({
+    url: '/facility/archives',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁惧妗f
+export function delArchives(id) {
+  return request({
+    url: '/facility/archives/' + id,
+    method: 'delete'
+  })
+}
+
+// 妫�瀹氭仮澶嶈澶囨。妗�
+export function resetArchives(id) {
+  return request({
+    url: '/facility/archives/' + id,
+    method: 'post'
+  })
+}
+
+// 瀵煎嚭璁惧妗f
+export function exportArchives(query) {
+  return request({
+    url: '/facility/archives/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 涓嬭浇璁惧妗f缁存姢瀵煎叆妯℃澘
+export function importTemplate() {
+  return request({
+    url: '/facility/archives/importTemplate',
+    method: 'get'
+  })
+}
diff --git a/energy_management_ui/src/api/home/home.js b/energy_management_ui/src/api/home/home.js
new file mode 100644
index 0000000..3a3755a
--- /dev/null
+++ b/energy_management_ui/src/api/home/home.js
@@ -0,0 +1,73 @@
+import request from "@/utils/request";
+
+// 鑾峰彇鍏ㄥ巶缁煎悎鑳借��
+export function getEnergyConsumptionSummation(timeType) {
+  return request({
+    url: "/home/getHomeEnergyConsumptionSummation",
+    method: "get",
+    params: {
+      timeType
+    }
+  });
+}
+
+// 缁煎悎鑳借�楀崰姣斿垎鏋愮幆褰㈠浘鏁版嵁
+export function getEnergyConsumptionRatio(timeType) {
+  return request({
+    url: "/home/getHomeEnergyConsumptionRatio",
+    method: "get",
+    params: {
+      timeType
+    }
+  });
+}
+
+// 鑳芥簮璁惧鑳借�楃幆褰㈠浘鏁版嵁
+export function getHomeEnergyUnitConsumptionRatio(timeType) {
+  return request({
+    url: "/home/getHomeEnergyUnitConsumptionRatio",
+    method: "get",
+    params: {
+      timeType
+    }
+  });
+}
+
+// 鍒嗙被鑳芥簮缁熻
+export function getEnergyStatistic(timeType) {
+  return request({
+    url: "/home/getHomeEnergyStatistic",
+    method: "get",
+    params: {
+      timeType
+    }
+  });
+}
+
+// 鑳芥簮鐩戞祴鏌辩姸鍥炬暟鎹�
+export function getHomeEnergyMonitoring(timeType, energyType) {
+  return request({
+    url: "/home/getHomeEnergyMonitoring",
+    method: "get",
+    params: {
+      timeType,
+      energyType
+    }
+  });
+}
+
+// 鑾峰彇鑳芥簮绫诲瀷
+export function listEnergyType() {
+  return request({
+    url: "/home/listEnergyType",
+    method: "get"
+  });
+}
+
+// getHomeOutdoorTemperature
+export function getHomeOutdoorTemperature() {
+  return request({
+    url: "/home/getHomeOutdoorTemperature",
+    method: "get"
+  });
+}
diff --git a/energy_management_ui/src/api/index.js b/energy_management_ui/src/api/index.js
new file mode 100644
index 0000000..895d57a
--- /dev/null
+++ b/energy_management_ui/src/api/index.js
@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+
+// 棣栭〉IFrame鍔犺浇鍦板潃
+export function getIndexIframeUrl() {
+  return request({
+    url: '/HomePage/indexIframeUrl',
+    method: 'get',
+  })
+}
diff --git a/energy_management_ui/src/api/keyEquipment/dailykeyEquipment/dailykeyEquipment.js b/energy_management_ui/src/api/keyEquipment/dailykeyEquipment/dailykeyEquipment.js
new file mode 100644
index 0000000..ebfa882
--- /dev/null
+++ b/energy_management_ui/src/api/keyEquipment/dailykeyEquipment/dailykeyEquipment.js
@@ -0,0 +1,32 @@
+import request from '@/utils/request'
+
+ //鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/keyEquipment/dailyKeyEquipment/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/keyEquipment/dailyKeyEquipment/listChart',
+    method: 'get',
+    params: query
+  })
+}
+export function getFacilityArchives(query) {
+  return request({
+    url: '/keyEquipment/dailyKeyEquipment/getFacilityArchives',
+    method: 'get',
+    params: query
+  })
+}
+
+export function getPointFacility(query) {
+  return request({
+    url: '/keyEquipment/dailyKeyEquipment/getPointFacility',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/keyEquipment/monthlykeyEquipment/monthlykeyEquipment.js b/energy_management_ui/src/api/keyEquipment/monthlykeyEquipment/monthlykeyEquipment.js
new file mode 100644
index 0000000..54d2b3f
--- /dev/null
+++ b/energy_management_ui/src/api/keyEquipment/monthlykeyEquipment/monthlykeyEquipment.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/keyEquipment/monthlyKeyEquipment/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/keyEquipment/monthlyKeyEquipment/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/keyEquipment/yearkeyEquipment/yearkeyEquipment.js b/energy_management_ui/src/api/keyEquipment/yearkeyEquipment/yearkeyEquipment.js
new file mode 100644
index 0000000..ab234e2
--- /dev/null
+++ b/energy_management_ui/src/api/keyEquipment/yearkeyEquipment/yearkeyEquipment.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/keyEquipment/yearKeyEquipment/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/keyEquipment/yearKeyEquipment/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/login.js b/energy_management_ui/src/api/login.js
new file mode 100644
index 0000000..1e84761
--- /dev/null
+++ b/energy_management_ui/src/api/login.js
@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+// 鐧诲綍鏂规硶
+export function login(username, password, code, uuid) {
+  const data = {
+    username,
+    password,
+    code,
+    uuid
+  }
+  return request({
+    url: '/login',
+    method: 'post',
+    params: data
+  })
+}
+
+// 鑾峰彇鐢ㄦ埛璇︾粏淇℃伅
+export function getInfo() {
+  return request({
+    url: '/getInfo',
+    method: 'get'
+  })
+}
+
+// 閫�鍑烘柟娉�
+export function logout() {
+  return request({
+    url: '/logout',
+    method: 'post'
+  })
+}
+
+// 鑾峰彇楠岃瘉鐮�
+export function getCodeImg() {
+  return request({
+    url: '/captchaImage',
+    method: 'get'
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/menu.js b/energy_management_ui/src/api/menu.js
new file mode 100644
index 0000000..faef101
--- /dev/null
+++ b/energy_management_ui/src/api/menu.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 鑾峰彇璺敱
+export const getRouters = () => {
+  return request({
+    url: '/getRouters',
+    method: 'get'
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/meter/annex.js b/energy_management_ui/src/api/meter/annex.js
new file mode 100644
index 0000000..63646c6
--- /dev/null
+++ b/energy_management_ui/src/api/meter/annex.js
@@ -0,0 +1,63 @@
+import request from '@/utils/request'
+
+
+// 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢鍒楄〃
+export function listAnnex(query) {
+  return request({
+    url: '/meter/annex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁¢噺鍣ㄥ叿妗f闄勪欢璇︾粏
+export function getAnnex(id) {
+  return request({
+    url: '/meter/annex/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板璁¢噺鍣ㄥ叿妗f闄勪欢
+export function addAnnex(data) {
+  return request({
+    url: '/meter/annex',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁¢噺鍣ㄥ叿妗f闄勪欢
+export function updateAnnex(data) {
+  return request({
+    url: '/meter/annex',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+export function delAnnex(id) {
+  return request({
+    url: '/meter/annex/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁¢噺鍣ㄥ叿妗f闄勪欢
+export function exportAnnex(query) {
+  return request({
+    url: '/meter/annex/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 涓嬭浇閲忓櫒鍏锋。妗堢淮鎶ゅ鍏ユā鏉�
+export function seeFile(data) {
+  return request({
+    url: '/meter/annex/assignDownload',
+    method: 'post',
+    params: data
+  })
+}
diff --git a/energy_management_ui/src/api/meter/implement.js b/energy_management_ui/src/api/meter/implement.js
new file mode 100644
index 0000000..ff088b1
--- /dev/null
+++ b/energy_management_ui/src/api/meter/implement.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃
+export function listImplement(query) {
+  return request({
+    url: '/meter/implement/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢璇︾粏
+export function getImplement(id) {
+  return request({
+    url: '/meter/implement/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板璁¢噺鍣ㄥ叿妗f缁存姢
+export function addImplement(data) {
+  return request({
+    url: '/meter/implement',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁¢噺鍣ㄥ叿妗f缁存姢
+export function updateImplement(data) {
+  return request({
+    url: '/meter/implement',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢
+export function delImplement(id) {
+  return request({
+    url: '/meter/implement/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁¢噺鍣ㄥ叿妗f缁存姢
+export function exportImplement(query) {
+  return request({
+    url: '/meter/implement/export',
+    method: 'get',
+    params: query
+  })
+}
+// 涓嬭浇閲忓櫒鍏锋。妗堢淮鎶ゅ鍏ユā鏉�
+export function importTemplate() {
+  return request({
+    url: '/meter/implement/importTemplate',
+    method: 'get'
+  })
+}
diff --git a/energy_management_ui/src/api/meter/implementCount.js b/energy_management_ui/src/api/meter/implementCount.js
new file mode 100644
index 0000000..48ed8cf
--- /dev/null
+++ b/energy_management_ui/src/api/meter/implementCount.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ鍒楄〃
+export function listImplementCount(query) {
+  return request({
+    url: '/meter/implementCount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ璇︾粏
+export function getImplementCount(code) {
+  return request({
+    url: '/meter/implementCount/' + code,
+    method: 'get'
+  })
+}
+
+// 鏂板璁¢噺鍣ㄥ叿缁熻鏌ヨ
+export function addImplementCount(data) {
+  return request({
+    url: '/meter/implementCount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁¢噺鍣ㄥ叿缁熻鏌ヨ
+export function updateImplementCount(data) {
+  return request({
+    url: '/meter/implementCount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁¢噺鍣ㄥ叿缁熻鏌ヨ
+export function delImplementCount(code) {
+  return request({
+    url: '/meter/implementCount/' + code,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁¢噺鍣ㄥ叿缁熻鏌ヨ
+export function exportImplementCount(query) {
+  return request({
+    url: '/meter/implementCount/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/meter/index.js b/energy_management_ui/src/api/meter/index.js
new file mode 100644
index 0000000..15de4da
--- /dev/null
+++ b/energy_management_ui/src/api/meter/index.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+
+//  鏍规嵁璁¢噺鍣ㄥ叿ID鑾峰彇鎸囨爣淇℃伅z
+export function listIndex(id) {
+  return request({
+    url: '/basicsetting/energyindex/meterIndex/'+id,
+    method: 'get'
+  })
+}
+
+
+// 鏍规嵁璁¢噺鍣ㄥ叿ID鐢熸垚鎴栭噸鏂扮敓鎴愭寚鏍�
+export function addIndex(id) {
+  return request({
+    url: '/basicsetting/energyindex/meterIndex/'+id,
+    method: 'post'
+  })
+}
+
+// // 淇敼璁¢噺鍣ㄥ叿妗f闄勪欢
+// export function updateAnnex(data) {
+//   return request({
+//     url: '/meter/annex',
+//     method: 'put',
+//     data: data
+//   })
+// }
+//
+// 鍒犻櫎璁¢噺鍣ㄥ叿妗f闄勪欢
+export function delIndex(id) {
+  return request({
+    url: '/basicsetting/energyindex/' + id,
+    method: 'delete'
+  })
+}
diff --git a/energy_management_ui/src/api/monitor/logininfor.js b/energy_management_ui/src/api/monitor/logininfor.js
new file mode 100644
index 0000000..383d61f
--- /dev/null
+++ b/energy_management_ui/src/api/monitor/logininfor.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鐧诲綍鏃ュ織鍒楄〃
+export function list(query) {
+  return request({
+    url: '/monitor/logininfor/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鍒犻櫎鐧诲綍鏃ュ織
+export function delLogininfor(infoId) {
+  return request({
+    url: '/monitor/logininfor/' + infoId,
+    method: 'delete'
+  })
+}
+
+// 娓呯┖鐧诲綍鏃ュ織
+export function cleanLogininfor() {
+  return request({
+    url: '/monitor/logininfor/clean',
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鐧诲綍鏃ュ織
+export function exportLogininfor(query) {
+  return request({
+    url: '/monitor/logininfor/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/monitor/online.js b/energy_management_ui/src/api/monitor/online.js
new file mode 100644
index 0000000..bd22137
--- /dev/null
+++ b/energy_management_ui/src/api/monitor/online.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍦ㄧ嚎鐢ㄦ埛鍒楄〃
+export function list(query) {
+  return request({
+    url: '/monitor/online/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 寮洪��鐢ㄦ埛
+export function forceLogout(tokenId) {
+  return request({
+    url: '/monitor/online/' + tokenId,
+    method: 'delete'
+  })
+}
diff --git a/energy_management_ui/src/api/monitor/operlog.js b/energy_management_ui/src/api/monitor/operlog.js
new file mode 100644
index 0000000..f09b8ed
--- /dev/null
+++ b/energy_management_ui/src/api/monitor/operlog.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鎿嶄綔鏃ュ織鍒楄〃
+export function list(query) {
+  return request({
+    url: '/monitor/operlog/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鍒犻櫎鎿嶄綔鏃ュ織
+export function delOperlog(operId) {
+  return request({
+    url: '/monitor/operlog/' + operId,
+    method: 'delete'
+  })
+}
+
+// 娓呯┖鎿嶄綔鏃ュ織
+export function cleanOperlog() {
+  return request({
+    url: '/monitor/operlog/clean',
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鎿嶄綔鏃ュ織
+export function exportOperlog(query) {
+  return request({
+    url: '/monitor/operlog/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/monitor/server.js b/energy_management_ui/src/api/monitor/server.js
new file mode 100644
index 0000000..feed783
--- /dev/null
+++ b/energy_management_ui/src/api/monitor/server.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鏈嶅姟鍣ㄨ缁�
+export function getServer() {
+  return request({
+    url: '/monitor/server',
+    method: 'get'
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/onlineMonitoring/index.js b/energy_management_ui/src/api/onlineMonitoring/index.js
new file mode 100644
index 0000000..c3c8522
--- /dev/null
+++ b/energy_management_ui/src/api/onlineMonitoring/index.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 鏌ヨ璁惧妗f闄勪欢鍒楄〃
+export function listArchives(query) {
+  return request({
+    url: '/gateway/gatewaysetting/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ璁惧妗f闄勪欢鍒楄〃
+export function getlist(query) {
+    return request({
+      url: '/gateway/gatewaysetting/monitor',
+      method: 'get',
+    
+    })
+  }
+// 鏌ヨ璁惧妗f闄勪欢璇︾粏
+export function getArchives(createTime) {
+  return request({
+    url: '/gateway/gatewaysetting/' + createTime,
+    method: 'get'
+  })
+}
+
+// 鏂板璁惧妗f闄勪欢
+export function addArchives(data) {
+  return request({
+    url: '/gateway/gatewaysetting/',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼璁惧妗f闄勪欢
+export function updateArchives(data) {
+  return request({
+    url: '/gateway/gatewaysetting',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎璁惧妗f闄勪欢
+export function delArchives(createTime) {
+  return request({
+    url: '/gateway/gatewaysetting/' + createTime,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭璁惧妗f闄勪欢
+export function exportAnnex(query) {
+  return request({
+    url: '/facility/annex/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/plannedOutput/energyMonitoring.js b/energy_management_ui/src/api/plannedOutput/energyMonitoring.js
new file mode 100644
index 0000000..85053c8
--- /dev/null
+++ b/energy_management_ui/src/api/plannedOutput/energyMonitoring.js
@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 鏌ヨplannedOutput鍒楄〃
+export function listEnergyMonitoring(query) {
+  return request({
+    url: '/energyMonitoring/list',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/plannedOutput/planEnergy.js b/energy_management_ui/src/api/plannedOutput/planEnergy.js
new file mode 100644
index 0000000..be7636c
--- /dev/null
+++ b/energy_management_ui/src/api/plannedOutput/planEnergy.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+// 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
+export function listEnergy(query) {
+  return request({
+    url: '/PlanEnergy/list',
+    method: 'get',
+    params: query
+  })
+}
+// 鏂板銆愯濉啓鍔熻兘鍚嶇О銆�
+export function addEnergy(data) {
+  return request({
+    url: '/PlanEnergy',
+    method: 'post',
+    data: data
+  })
+}
diff --git a/energy_management_ui/src/api/plannedOutput/plannedOutput.js b/energy_management_ui/src/api/plannedOutput/plannedOutput.js
new file mode 100644
index 0000000..9a97849
--- /dev/null
+++ b/energy_management_ui/src/api/plannedOutput/plannedOutput.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨplannedOutput鍒楄〃
+export function listPlannedOutput(query) {
+  return request({
+    url: '/planned/plannedOutput/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨplannedOutput璇︾粏
+export function getPlannedOutput(id) {
+  return request({
+    url: '/planned/plannedOutput/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板plannedOutput
+export function addPlannedOutput(data) {
+  return request({
+    url: '/planned/plannedOutput',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼plannedOutput
+export function updatePlannedOutput(data) {
+  return request({
+    url: '/planned/plannedOutput',
+    method: 'put',
+    params: data
+  })
+}
+
+// 鍒犻櫎plannedOutput
+export function delPlannedOutput(id) {
+  return request({
+    url: '/planned/plannedOutput/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭plannedOutput
+export function exportPlannedOutput(query) {
+  return request({
+    url: '/planned/plannedOutput/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/policy/annex.js b/energy_management_ui/src/api/policy/annex.js
new file mode 100644
index 0000000..561370f
--- /dev/null
+++ b/energy_management_ui/src/api/policy/annex.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鏀跨瓥娉曡闄勪欢鍒楄〃
+export function listAnnex(query) {
+  return request({
+    url: '/policy/annex/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鏀跨瓥娉曡闄勪欢璇︾粏
+export function getAnnex(filePath) {
+  return request({
+    url: '/policy/annex/' + filePath,
+    method: 'get'
+  })
+}
+
+// 鏂板鏀跨瓥娉曡闄勪欢
+export function addAnnex(data) {
+  return request({
+    url: '/policy/annex',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鏀跨瓥娉曡闄勪欢
+export function updateAnnex(data) {
+  return request({
+    url: '/policy/annex',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鏀跨瓥娉曡闄勪欢
+export function delAnnex(filePath) {
+  return request({
+    url: '/policy/annex/' + filePath,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鏀跨瓥娉曡闄勪欢
+export function exportAnnex(query) {
+  return request({
+    url: '/policy/annex/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/policy/policyInsert.js b/energy_management_ui/src/api/policy/policyInsert.js
new file mode 100644
index 0000000..bc618dd
--- /dev/null
+++ b/energy_management_ui/src/api/policy/policyInsert.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鏀跨瓥娉曡缁存姢鍒楄〃
+export function listPolicyInsert(query) {
+  return request({
+    url: '/policy/policyInsert/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鏀跨瓥娉曡缁存姢璇︾粏
+export function getPolicyInsert(id) {
+  return request({
+    url: '/policy/policyInsert/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鏀跨瓥娉曡缁存姢
+export function addPolicyInsert(data) {
+  return request({
+    url: '/policy/policyInsert',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鏀跨瓥娉曡缁存姢
+export function updatePolicyInsert(data) {
+  return request({
+    url: '/policy/policyInsert',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鏀跨瓥娉曡缁存姢
+export function delPolicyInsert(id) {
+  return request({
+    url: '/policy/policyInsert/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鏀跨瓥娉曡缁存姢
+export function exportPolicyInsert(query) {
+  return request({
+    url: '/policy/policyInsert/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/policy/policySelete.js b/energy_management_ui/src/api/policy/policySelete.js
new file mode 100644
index 0000000..3896392
--- /dev/null
+++ b/energy_management_ui/src/api/policy/policySelete.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鏀跨瓥娉曡鏌ヨ鍒楄〃
+export function listPolicyselete(query) {
+  return request({
+    url: '/policy/policyselete/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鏀跨瓥娉曡鏌ヨ璇︾粏
+export function getPolicyselete(id) {
+  return request({
+    url: '/policy/policyselete/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鏀跨瓥娉曡鏌ヨ
+export function addPolicyselete(data) {
+  return request({
+    url: '/policy/policyselete',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鏀跨瓥娉曡鏌ヨ
+export function updatePolicyselete(data) {
+  return request({
+    url: '/policy/policyselete',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鏀跨瓥娉曡鏌ヨ
+export function delPolicyselete(id) {
+  return request({
+    url: '/policy/policyselete/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鏀跨瓥娉曡鏌ヨ
+export function exportPolicyselete(query) {
+  return request({
+    url: '/policy/policyselete/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/powerAnalyse/index.js b/energy_management_ui/src/api/powerAnalyse/index.js
new file mode 100644
index 0000000..805707b
--- /dev/null
+++ b/energy_management_ui/src/api/powerAnalyse/index.js
@@ -0,0 +1,88 @@
+import request from '@/utils/request'
+
+/**
+ * 鏌ヨ鍚岀幆姣斿垪琛�
+ * @param {*} query 
+ * @param {*} energyType electric/water
+ * @param {*} type 1鍚屾瘮 2鐜瘮
+ * @returns 
+ */
+export function queryDataComparison(query, energyType, type) {
+  if (energyType == 'electric') {
+    if (type === 1) {
+      // 鐢靛悓姣�
+      return request({
+        url: '/statisticalAnalysis/getElectricDataComparisonYoY',
+        method: 'post',
+        data: query
+      })
+    } else {
+      // 鐢电幆姣�
+      return request({
+        url: '/statisticalAnalysis/getElectricDataComparisonMoM',
+        method: 'post',
+        data: query
+      })
+    }
+  } else {
+    if (type === 1) {
+      // 姘村悓姣�
+      return request({
+        url: '/statisticalAnalysis/getWaterDataComparisonYoY',
+        method: 'post',
+        data: query
+      })
+    } else {
+      // 姘寸幆姣�
+      return request({
+        url: '/statisticalAnalysis/getWaterDataComparisonMoM',
+        method: 'post',
+        data: query
+      })
+    }
+  }
+}
+
+// 瀵煎嚭
+export function exportDataComparison(query, energyType, type) {
+  if (energyType == 'electric') {
+    if (type === 1) {
+      // 鐢靛悓姣�
+      return request({
+        url: '/statisticalAnalysis/exportElectricYoY',
+        method: 'post',
+        data: query
+      })
+    } else {
+      // 鐢电幆姣�
+      return request({
+        url: '/statisticalAnalysis/exportElectricMoM',
+        method: 'post',
+        data: query
+      })
+    }
+  } else {
+    if (type === 1) {
+      // 姘村悓姣�
+      return request({
+        url: '/statisticalAnalysis/exportWaterYoY',
+        method: 'post',
+        data: query
+      })
+    } else {
+      // 姘寸幆姣�
+      return request({
+        url: '/statisticalAnalysis/exportWaterMoM',
+        method: 'post',
+        data: query
+      })
+    }
+  }
+}
+export function exportListMonth(query) {
+  return request({
+    url: '/comprehensive/monthlyComprehensive/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/reportForm/annualReport/annualReport.js b/energy_management_ui/src/api/reportForm/annualReport/annualReport.js
new file mode 100644
index 0000000..335e599
--- /dev/null
+++ b/energy_management_ui/src/api/reportForm/annualReport/annualReport.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+ //鏌ヨ鏃ユ姤琛�
+export function reportStatisticsList(query) {
+  return request({
+    url: '/report/annualReport/list',
+    method: 'get',
+    params: query
+  })
+}
+// 瀵煎嚭缁煎悎鎶ヨ〃
+export function exportList(query) {
+  return request({
+    url: '/report/annualReport/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/reportForm/consolidatedStatements.js b/energy_management_ui/src/api/reportForm/consolidatedStatements.js
new file mode 100644
index 0000000..139449f
--- /dev/null
+++ b/energy_management_ui/src/api/reportForm/consolidatedStatements.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃鍒楄〃
+export function listConsolidatedStatements(query) {
+  return request({
+    url: '/reportForm/consolidatedStatements/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃璇︾粏
+export function getConsolidatedStatements(id) {
+  return request({
+    url: '/reportForm/consolidatedStatements/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+export function addConsolidatedStatements(data) {
+  return request({
+    url: '/reportForm/consolidatedStatements',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+export function updateConsolidatedStatements(data) {
+  return request({
+    url: '/reportForm/consolidatedStatements',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+export function delConsolidatedStatements(id) {
+  return request({
+    url: '/reportForm/consolidatedStatements/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鐒﹀寲宸ュ簭缁煎悎鎶ヨ〃
+export function exportConsolidatedStatements(query) {
+  return request({
+    url: '/reportForm/consolidatedStatements/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/reportForm/dailyReport/dailyReport.js b/energy_management_ui/src/api/reportForm/dailyReport/dailyReport.js
new file mode 100644
index 0000000..71f3aad
--- /dev/null
+++ b/energy_management_ui/src/api/reportForm/dailyReport/dailyReport.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+ //鏌ヨ鏃ユ姤琛�
+export function reportStatisticsList(query) {
+  return request({
+    url: '/report/dailyReport/list',
+    method: 'get',
+    params: query
+  })
+}
+// 瀵煎嚭缁煎悎鎶ヨ〃
+export function exportList(query) {
+  return request({
+    url: '/report/dailyReport/export',
+    method: 'get',
+    params: query
+  })
+}
+// 缁煎悎骞存姤琛ㄥ鍑�
+export function exportListYear(query) {
+  return request({
+    url: '/comprehensive/yearComprehensive/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 缁煎悎骞存姤琛ㄥ鍑�
+export function exportListMonth(query) {
+  return request({
+    url: '/comprehensive/monthlyComprehensive/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/reportForm/monthlyReport/monthlyReport.js b/energy_management_ui/src/api/reportForm/monthlyReport/monthlyReport.js
new file mode 100644
index 0000000..c3eb7d5
--- /dev/null
+++ b/energy_management_ui/src/api/reportForm/monthlyReport/monthlyReport.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+ //鏌ヨ鏃ユ姤琛�
+export function reportStatisticsList(query) {
+  return request({
+    url: '/report/monthlyReport/list',
+    method: 'get',
+    params: query
+  })
+}
+// 瀵煎嚭缁煎悎鎶ヨ〃
+export function exportList(query) {
+  return request({
+    url: '/report/monthlyReport/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/reportForm/reportForm.js b/energy_management_ui/src/api/reportForm/reportForm.js
new file mode 100644
index 0000000..07a5680
--- /dev/null
+++ b/energy_management_ui/src/api/reportForm/reportForm.js
@@ -0,0 +1,28 @@
+import request from '@/utils/request'
+import { praseStrEmpty } from "@/utils/ruoyi";
+
+//
+export function reportFormList(query) {
+  return request({
+    url: '/reportForm/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鏃ユ姤琛�
+export function reportStatisticsList(query) {
+  return request({
+    url: '/report/reportStatistics/list',
+    method: 'get',
+    params: query
+  })
+}
+// 瀵煎嚭缁煎悎鎶ヨ〃
+export function exportList(query) {
+  return request({
+    url: '/report/reportStatistics/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/reportInfo/index.js b/energy_management_ui/src/api/reportInfo/index.js
new file mode 100644
index 0000000..479de41
--- /dev/null
+++ b/energy_management_ui/src/api/reportInfo/index.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+export function govReportList(query) {
+  return request({
+    url: '/govReports/govReports/list',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/reportSet/index.js b/energy_management_ui/src/api/reportSet/index.js
new file mode 100644
index 0000000..4d5796e
--- /dev/null
+++ b/energy_management_ui/src/api/reportSet/index.js
@@ -0,0 +1,37 @@
+import request from '@/utils/request'
+
+// 鏌ヨ棰勬姤璀﹁缃垪琛�
+export function listSet(query) {
+  return request({
+    url: '/system/report/list',
+    method: 'get',
+    params: query
+  })
+}
+
+//瀵屽伐鎺ュ彛
+export function getSettingIndex(para) {
+  return request({
+    url: '/system/report/listNodeEnergyIndex',
+    method: 'get',
+    params: para
+  })
+}
+
+// 淇敼琛ㄥ崟鏁版嵁
+export function updateDialogForm(data) {
+  return request({
+    url: '/system/report/save',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鏌ヨ棰勬姤璀﹁缃垪琛�
+export function updateEnableStatus(query) {
+  return request({
+    url: '/system/report/updateEnableStatus',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/statement/index.js b/energy_management_ui/src/api/statement/index.js
new file mode 100644
index 0000000..a3bbac9
--- /dev/null
+++ b/energy_management_ui/src/api/statement/index.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+// 鏌ヨMC鐢ㄧ數閲忋�佺患鍚堣兘鑰�  
+export function queryComprehensiveList(query) {
+  return request({
+    url: '/report/comprehensive/list',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨMC鐢ㄧ數閲忋�佺患鍚堣兘鑰�  
+export function queryComprehensiveUnitChart(query) {
+  return request({
+    url: '/report/comprehensive/listEnergyUnitChart',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑳借�楀崰姣斾俊鎭�   GET璇锋眰,鍙傛暟涓庝笂闈竴鑷�
+export function getEnergyConsumptionRatio(query) {
+  return request({
+    url: '/report/comprehensive/getEnergyConsumptionRatio',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑳借�楄澶囧崰姣斾俊鎭�  GET璇锋眰,鍙傛暟涓庝笂闈竴鑷�
+export function getEnergyUnitConsumptionRatio(query) {
+  return request({
+    url: '/report/comprehensive/getEnergyUnitConsumptionRatio',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/statisticalData/gxdhcount.js b/energy_management_ui/src/api/statisticalData/gxdhcount.js
new file mode 100644
index 0000000..eaab1da
--- /dev/null
+++ b/energy_management_ui/src/api/statisticalData/gxdhcount.js
@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳藉垪琛�
+export function listGxdhcount(query) {
+  return request({
+    url: '/statisticalData/gxdhcount/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳借缁�
+export function getGxdhcount(id) {
+  return request({
+    url: '/statisticalData/gxdhcount/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板宸ュ簭鍗曡�楃粺璁″姛鑳�
+export function addGxdhcount(data) {
+  return request({
+    url: '/statisticalData/gxdhcount',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼宸ュ簭鍗曡�楃粺璁″姛鑳�
+export function updateGxdhcount(data) {
+  return request({
+    url: '/statisticalData/gxdhcount',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳�
+export function delGxdhcount(id) {
+  return request({
+    url: '/statisticalData/gxdhcount/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭宸ュ簭鍗曡�楃粺璁″姛鑳�
+export function exportGxdhcount(query) {
+  return request({
+    url: '/statisticalData/gxdhcount/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ宸ュ簭鍗曡�楃粺璁� 鎶ヨ〃 鎸囨爣灞曠ず鍐呭
+export function listGxdhcountIndex(query) {
+  return request({
+    url: '/statisticalData/gxdhcount/listReportIndex',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/system/config.js b/energy_management_ui/src/api/system/config.js
new file mode 100644
index 0000000..f2e792c
--- /dev/null
+++ b/energy_management_ui/src/api/system/config.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍙傛暟鍒楄〃
+export function listConfig(query) {
+  return request({
+    url: '/system/config/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鍙傛暟璇︾粏
+export function getConfig(configId) {
+  return request({
+    url: '/system/config/' + configId,
+    method: 'get'
+  })
+}
+
+// 鏍规嵁鍙傛暟閿悕鏌ヨ鍙傛暟鍊�
+export function getConfigKey(configKey) {
+  return request({
+    url: '/system/config/configKey/' + configKey,
+    method: 'get'
+  })
+}
+
+// 鏂板鍙傛暟閰嶇疆
+export function addConfig(data) {
+  return request({
+    url: '/system/config',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鍙傛暟閰嶇疆
+export function updateConfig(data) {
+  return request({
+    url: '/system/config',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鍙傛暟閰嶇疆
+export function delConfig(configId) {
+  return request({
+    url: '/system/config/' + configId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鍙傛暟
+export function exportConfig(query) {
+  return request({
+    url: '/system/config/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/dept.js b/energy_management_ui/src/api/system/dept.js
new file mode 100644
index 0000000..c26894c
--- /dev/null
+++ b/energy_management_ui/src/api/system/dept.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 鏌ヨ閮ㄩ棬鍒楄〃
+export function listDept(query) {
+  return request({
+    url: '/system/dept/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ閮ㄩ棬璇︾粏
+export function getDept(deptId) {
+  return request({
+    url: '/system/dept/' + deptId,
+    method: 'get'
+  })
+}
+
+// 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋�
+export function treeselect() {
+  return request({
+    url: '/system/dept/treeselect',
+    method: 'get'
+  })
+}
+
+// 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戠粨鏋�
+export function roleDeptTreeselect(roleId) {
+  return request({
+    url: '/system/dept/roleDeptTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 鏂板閮ㄩ棬
+export function addDept(data) {
+  return request({
+    url: '/system/dept',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼閮ㄩ棬
+export function updateDept(data) {
+  return request({
+    url: '/system/dept',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎閮ㄩ棬
+export function delDept(deptId) {
+  return request({
+    url: '/system/dept/' + deptId,
+    method: 'delete'
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/dict/data.js b/energy_management_ui/src/api/system/dict/data.js
new file mode 100644
index 0000000..5597204
--- /dev/null
+++ b/energy_management_ui/src/api/system/dict/data.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 鏌ヨ瀛楀吀鏁版嵁鍒楄〃
+export function listData(query) {
+  return request({
+    url: '/system/dict/data/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ瀛楀吀鏁版嵁璇︾粏
+export function getData(dictCode) {
+  return request({
+    url: '/system/dict/data/' + dictCode,
+    method: 'get'
+  })
+}
+
+// 鏍规嵁瀛楀吀绫诲瀷鏌ヨ瀛楀吀鏁版嵁淇℃伅
+export function getDicts(dictType) {
+  return request({
+    url: '/system/dict/data/dictType/' + dictType,
+    method: 'get'
+  })
+}
+
+// 鏂板瀛楀吀鏁版嵁
+export function addData(data) {
+  return request({
+    url: '/system/dict/data',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼瀛楀吀鏁版嵁
+export function updateData(data) {
+  return request({
+    url: '/system/dict/data',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎瀛楀吀鏁版嵁
+export function delData(dictCode) {
+  return request({
+    url: '/system/dict/data/' + dictCode,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭瀛楀吀鏁版嵁
+export function exportData(query) {
+  return request({
+    url: '/system/dict/data/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/dict/type.js b/energy_management_ui/src/api/system/dict/type.js
new file mode 100644
index 0000000..b8d974e
--- /dev/null
+++ b/energy_management_ui/src/api/system/dict/type.js
@@ -0,0 +1,61 @@
+import request from '@/utils/request'
+
+// 鏌ヨ瀛楀吀绫诲瀷鍒楄〃
+export function listType(query) {
+  return request({
+    url: '/system/dict/type/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ瀛楀吀绫诲瀷璇︾粏
+export function getType(dictId) {
+  return request({
+    url: '/system/dict/type/' + dictId,
+    method: 'get'
+  })
+}
+
+// 鏂板瀛楀吀绫诲瀷
+export function addType(data) {
+  return request({
+    url: '/system/dict/type',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼瀛楀吀绫诲瀷
+export function updateType(data) {
+  return request({
+    url: '/system/dict/type',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎瀛楀吀绫诲瀷
+export function delType(dictId) {
+  return request({
+    url: '/system/dict/type/' + dictId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭瀛楀吀绫诲瀷
+export function exportType(query) {
+  return request({
+    url: '/system/dict/type/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鑾峰彇瀛楀吀閫夋嫨妗嗗垪琛�
+export function optionselect() {
+  return request({
+    url: '/system/dict/type/optionselect',
+    method: 'get'
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/menu.js b/energy_management_ui/src/api/system/menu.js
new file mode 100644
index 0000000..f6415c6
--- /dev/null
+++ b/energy_management_ui/src/api/system/menu.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鑿滃崟鍒楄〃
+export function listMenu(query) {
+  return request({
+    url: '/system/menu/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鑿滃崟璇︾粏
+export function getMenu(menuId) {
+  return request({
+    url: '/system/menu/' + menuId,
+    method: 'get'
+  })
+}
+
+// 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋�
+export function treeselect() {
+  return request({
+    url: '/system/menu/treeselect',
+    method: 'get'
+  })
+}
+
+// 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋�
+export function roleMenuTreeselect(roleId) {
+  return request({
+    url: '/system/menu/roleMenuTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 鏂板鑿滃崟
+export function addMenu(data) {
+  return request({
+    url: '/system/menu',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鑿滃崟
+export function updateMenu(data) {
+  return request({
+    url: '/system/menu',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鑿滃崟
+export function delMenu(menuId) {
+  return request({
+    url: '/system/menu/' + menuId,
+    method: 'delete'
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/notice.js b/energy_management_ui/src/api/system/notice.js
new file mode 100644
index 0000000..c274ea5
--- /dev/null
+++ b/energy_management_ui/src/api/system/notice.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鍏憡鍒楄〃
+export function listNotice(query) {
+  return request({
+    url: '/system/notice/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鍏憡璇︾粏
+export function getNotice(noticeId) {
+  return request({
+    url: '/system/notice/' + noticeId,
+    method: 'get'
+  })
+}
+
+// 鏂板鍏憡
+export function addNotice(data) {
+  return request({
+    url: '/system/notice',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鍏憡
+export function updateNotice(data) {
+  return request({
+    url: '/system/notice',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鍏憡
+export function delNotice(noticeId) {
+  return request({
+    url: '/system/notice/' + noticeId,
+    method: 'delete'
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/post.js b/energy_management_ui/src/api/system/post.js
new file mode 100644
index 0000000..434cd35
--- /dev/null
+++ b/energy_management_ui/src/api/system/post.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ宀椾綅鍒楄〃
+export function listPost(query) {
+  return request({
+    url: '/system/post/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ宀椾綅璇︾粏
+export function getPost(postId) {
+  return request({
+    url: '/system/post/' + postId,
+    method: 'get'
+  })
+}
+
+// 鏂板宀椾綅
+export function addPost(data) {
+  return request({
+    url: '/system/post',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼宀椾綅
+export function updatePost(data) {
+  return request({
+    url: '/system/post',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎宀椾綅
+export function delPost(postId) {
+  return request({
+    url: '/system/post/' + postId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭宀椾綅
+export function exportPost(query) {
+  return request({
+    url: '/system/post/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/role.js b/energy_management_ui/src/api/system/role.js
new file mode 100644
index 0000000..463501c
--- /dev/null
+++ b/energy_management_ui/src/api/system/role.js
@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+
+// 鏌ヨ瑙掕壊鍒楄〃
+export function listRole(query) {
+  return request({
+    url: '/system/role/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ瑙掕壊璇︾粏
+export function getRole(roleId) {
+  return request({
+    url: '/system/role/' + roleId,
+    method: 'get'
+  })
+}
+
+// 鏂板瑙掕壊
+export function addRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼瑙掕壊
+export function updateRole(data) {
+  return request({
+    url: '/system/role',
+    method: 'put',
+    data: data
+  })
+}
+
+// 瑙掕壊鏁版嵁鏉冮檺
+export function dataScope(data) {
+  return request({
+    url: '/system/role/dataScope',
+    method: 'put',
+    data: data
+  })
+}
+
+// 瑙掕壊鐘舵�佷慨鏀�
+export function changeRoleStatus(roleId, status) {
+  const data = {
+    roleId,
+    status
+  }
+  return request({
+    url: '/system/role/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎瑙掕壊
+export function delRole(roleId) {
+  return request({
+    url: '/system/role/' + roleId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭瑙掕壊
+export function exportRole(query) {
+  return request({
+    url: '/system/role/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/system/user.js b/energy_management_ui/src/api/system/user.js
new file mode 100644
index 0000000..3b9a776
--- /dev/null
+++ b/energy_management_ui/src/api/system/user.js
@@ -0,0 +1,127 @@
+import request from '@/utils/request'
+import { praseStrEmpty } from "@/utils/ruoyi";
+
+// 鏌ヨ鐢ㄦ埛鍒楄〃
+export function listUser(query) {
+  return request({
+    url: '/system/user/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鐢ㄦ埛璇︾粏
+export function getUser(userId) {
+  return request({
+    url: '/system/user/' + praseStrEmpty(userId),
+    method: 'get'
+  })
+}
+
+// 鏂板鐢ㄦ埛
+export function addUser(data) {
+  return request({
+    url: '/system/user',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鐢ㄦ埛
+export function updateUser(data) {
+  return request({
+    url: '/system/user',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鐢ㄦ埛
+export function delUser(userId) {
+  return request({
+    url: '/system/user/' + userId,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鐢ㄦ埛
+export function exportUser(query) {
+  return request({
+    url: '/system/user/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鐢ㄦ埛瀵嗙爜閲嶇疆
+export function resetUserPwd(userId, password) {
+  const data = {
+    userId,
+    password
+  }
+  return request({
+    url: '/system/user/resetPwd',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鐢ㄦ埛鐘舵�佷慨鏀�
+export function changeUserStatus(userId, status) {
+  const data = {
+    userId,
+    status
+  }
+  return request({
+    url: '/system/user/changeStatus',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鏌ヨ鐢ㄦ埛涓汉淇℃伅
+export function getUserProfile() {
+  return request({
+    url: '/system/user/profile',
+    method: 'get'
+  })
+}
+
+// 淇敼鐢ㄦ埛涓汉淇℃伅
+export function updateUserProfile(data) {
+  return request({
+    url: '/system/user/profile',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鐢ㄦ埛瀵嗙爜閲嶇疆
+export function updateUserPwd(oldPassword, newPassword) {
+  const data = {
+    oldPassword,
+    newPassword
+  }
+  return request({
+    url: '/system/user/profile/updatePwd',
+    method: 'put',
+    params: data
+  })
+}
+
+// 鐢ㄦ埛澶村儚涓婁紶
+export function uploadAvatar(data) {
+  return request({
+    url: '/system/user/profile/avatar',
+    method: 'post',
+    data: data
+  })
+}
+
+// 涓嬭浇鐢ㄦ埛瀵煎叆妯℃澘
+export function importTemplate() {
+  return request({
+    url: '/system/user/importTemplate',
+    method: 'get'
+  })
+}
diff --git a/energy_management_ui/src/api/tool/gen.js b/energy_management_ui/src/api/tool/gen.js
new file mode 100644
index 0000000..09a0b6f
--- /dev/null
+++ b/energy_management_ui/src/api/tool/gen.js
@@ -0,0 +1,59 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鐢熸垚琛ㄦ暟鎹�
+export function listTable(query) {
+  return request({
+    url: '/tool/gen/list',
+    method: 'get',
+    params: query
+  })
+}
+// 鏌ヨdb鏁版嵁搴撳垪琛�
+export function listDbTable(query) {
+  return request({
+    url: '/tool/gen/db/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ琛ㄨ缁嗕俊鎭�
+export function getGenTable(tableId) {
+  return request({
+    url: '/tool/gen/' + tableId,
+    method: 'get'
+  })
+}
+
+// 淇敼浠g爜鐢熸垚淇℃伅
+export function updateGenTable(data) {
+  return request({
+    url: '/tool/gen',
+    method: 'put',
+    data: data
+  })
+}
+
+// 瀵煎叆琛�
+export function importTable(data) {
+  return request({
+    url: '/tool/gen/importTable',
+    method: 'post',
+    params: data
+  })
+}
+// 棰勮鐢熸垚浠g爜
+export function previewTable(tableId) {
+  return request({
+    url: '/tool/gen/preview/' + tableId,
+    method: 'get'
+  })
+}
+// 鍒犻櫎琛ㄦ暟鎹�
+export function delTable(tableId) {
+  return request({
+    url: '/tool/gen/' + tableId,
+    method: 'delete'
+  })
+}
+
diff --git a/energy_management_ui/src/api/workforce/duty_management.js b/energy_management_ui/src/api/workforce/duty_management.js
new file mode 100644
index 0000000..93a2a05
--- /dev/null
+++ b/energy_management_ui/src/api/workforce/duty_management.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鎺掔彮绠$悊鍒楄〃
+export function listManagement(query) {
+  return request({
+    url: '/workforce/dutyManagement/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鎺掔彮绠$悊璇︾粏
+export function getManagement(id) {
+  return request({
+    url: '/workforce/dutyManagement/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鎺掔彮绠$悊
+export function addManagement(data) {
+  return request({
+    url: '/workforce/dutyManagement',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鎺掔彮绠$悊
+export function updateManagement(data) {
+  return request({
+    url: '/workforce/dutyManagement',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鎺掔彮绠$悊
+export function delManagement(id) {
+  return request({
+    url: '/workforce/dutyManagement/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鎺掔彮绠$悊
+export function exportManagement(query) {
+  return request({
+    url: '/workforce/dutyManagement/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/workforce/management.js b/energy_management_ui/src/api/workforce/management.js
new file mode 100644
index 0000000..03070d8
--- /dev/null
+++ b/energy_management_ui/src/api/workforce/management.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鎺掔彮绠$悊璁剧疆鍒楄〃
+export function listManagement(query) {
+  return request({
+    url: '/workforce/shiftManagement/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鎺掔彮绠$悊璁剧疆璇︾粏
+export function getManagement(id) {
+  return request({
+    url: '/workforce/shiftManagement/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鎺掔彮绠$悊璁剧疆
+export function addManagement(data) {
+  return request({
+    url: '/workforce/shiftManagement',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鎺掔彮绠$悊璁剧疆
+export function updateManagement(data) {
+  return request({
+    url: '/workforce/shiftManagement',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鎺掔彮绠$悊璁剧疆
+export function delManagement(id) {
+  return request({
+    url: '/workforce/shiftManagement/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鎺掔彮绠$悊璁剧疆
+export function exportManagement(query) {
+  return request({
+    url: '/workforce/shiftManagement/export',
+    method: 'get',
+    params: query
+  })
+}
+export function treeList(query) {
+  return request({
+    url: '/workforce/shiftManagement/treeList',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/workforce/rosteringManagement.js b/energy_management_ui/src/api/workforce/rosteringManagement.js
new file mode 100644
index 0000000..55ecc12
--- /dev/null
+++ b/energy_management_ui/src/api/workforce/rosteringManagement.js
@@ -0,0 +1,64 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鎺掔彮鏂规鍒楄〃
+export function getschemeNameList(query) {
+  return request({
+    url: '/workforce/rosteringManagement/schemeNamelist',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 鏌ヨ鎺掔彮琛ㄦ煡璇㈠垪琛�
+export function listRosteringManagement(query) {
+  return request({
+    url: '/workforce/rosteringManagement/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鎺掔彮琛ㄦ煡璇㈣缁�
+export function getRosteringManagement(id) {
+  return request({
+    url: '/workforce/rosteringManagement/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鎺掔彮琛ㄦ煡璇�
+export function addRosteringManagement(data) {
+  console.log(data);
+  return request({
+    url: '/workforce/rosteringManagement',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鎺掔彮琛ㄦ煡璇�
+export function updateRosteringManagement(data) {
+  return request({
+    url: '/workforce/rosteringManagement',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鎺掔彮琛ㄦ煡璇�
+export function delRosteringManagement(id) {
+  return request({
+    url: '/workforce/rosteringManagement/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭鎺掔彮琛ㄦ煡璇�
+export function exportRosteringManagement(query) {
+  return request({
+    url: '/workforce/rosteringManagement/export',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/workforce/scheme.js b/energy_management_ui/src/api/workforce/scheme.js
new file mode 100644
index 0000000..c5f867c
--- /dev/null
+++ b/energy_management_ui/src/api/workforce/scheme.js
@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 鏌ヨ杞�兼柟妗堝垪琛�
+export function listScheme(query) {
+  return request({
+    url: '/rosteringSrcheme/scheme/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ杞�兼柟妗堣缁�
+export function getScheme(id) {
+  return request({
+    url: '/rosteringSrcheme/scheme/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板杞�兼柟妗�
+export function addScheme(data) {
+  return request({
+    url: '/rosteringSrcheme/scheme',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼杞�兼柟妗�
+export function updateScheme(data) {
+  return request({
+    url: '/rosteringSrcheme/scheme',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎杞�兼柟妗�
+export function delScheme(id) {
+  return request({
+    url: '/rosteringSrcheme/scheme/' + id,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭杞�兼柟妗�
+export function exportScheme(query) {
+  return request({
+    url: '/rosteringSrcheme/scheme/export',
+    method: 'get',
+    params: query
+  })
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/api/workforce/schemeItem.js b/energy_management_ui/src/api/workforce/schemeItem.js
new file mode 100644
index 0000000..000b2aa
--- /dev/null
+++ b/energy_management_ui/src/api/workforce/schemeItem.js
@@ -0,0 +1,60 @@
+import request from '@/utils/request'
+
+// 鏌ヨ杞�兼柟妗堝垪琛�
+export function listSchemeItem(query) {
+  return request({
+    url: '/rosteringSchemeitem/schemeItem/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ杞�兼柟妗堣缁�
+export function getSchemeItem(description) {
+  return request({
+    url: '/rosteringSchemeitem/schemeItem/' + description,
+    method: 'get'
+  })
+}
+
+// 鏂板杞�兼柟妗�
+export function addSchemeItem(data) {
+  return request({
+    url: '/rosteringSchemeitem/schemeItem',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼杞�兼柟妗�
+export function updateSchemeItem(data) {
+  return request({
+    url: '/rosteringSchemeitem/schemeItem',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎杞�兼柟妗�
+export function delSchemeItem(description) {
+  return request({
+    url: '/rosteringSchemeitem/schemeItem/' + description,
+    method: 'delete'
+  })
+}
+
+// 瀵煎嚭杞�兼柟妗�
+export function exportSchemeItem(query) {
+  return request({
+    url: '/rosteringSchemeitem/schemeItem/export',
+    method: 'get',
+    params: query
+  })
+}
+export function listDutyManagement(query) {
+  return request({
+    url: '/workforce/dutyManagement/list',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/workingProcedure/dailyComprehensive/dailyComprehensive.js b/energy_management_ui/src/api/workingProcedure/dailyComprehensive/dailyComprehensive.js
new file mode 100644
index 0000000..865769d
--- /dev/null
+++ b/energy_management_ui/src/api/workingProcedure/dailyComprehensive/dailyComprehensive.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+ //鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/workingProcedure/dailyWorkingProcedure/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/workingProcedure/dailyWorkingProcedure/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/workingProcedure/monthlyComprehensive/monthlyComprehensive.js b/energy_management_ui/src/api/workingProcedure/monthlyComprehensive/monthlyComprehensive.js
new file mode 100644
index 0000000..4880d31
--- /dev/null
+++ b/energy_management_ui/src/api/workingProcedure/monthlyComprehensive/monthlyComprehensive.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  return request({
+    url: '/workingProcedure/monthlyWorkingProcedure/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/workingProcedure/monthlyWorkingProcedure/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/api/workingProcedure/yearComprehensive/yearComprehensive.js b/energy_management_ui/src/api/workingProcedure/yearComprehensive/yearComprehensive.js
new file mode 100644
index 0000000..4fcd35b
--- /dev/null
+++ b/energy_management_ui/src/api/workingProcedure/yearComprehensive/yearComprehensive.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+//鏌ヨ鏃ユ姤琛�
+export function getDataList(query) {
+  console.log(query)
+  return request({
+    url: '/workingProcedure/yearWorkingProcedure/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getlistChart(query) {
+  return request({
+    url: '/workingProcedure/yearWorkingProcedure/listChart',
+    method: 'get',
+    params: query
+  })
+}
diff --git a/energy_management_ui/src/assets/401_images/401.gif b/energy_management_ui/src/assets/401_images/401.gif
new file mode 100644
index 0000000..cd6e0d9
--- /dev/null
+++ b/energy_management_ui/src/assets/401_images/401.gif
Binary files differ
diff --git a/energy_management_ui/src/assets/404_images/404.png b/energy_management_ui/src/assets/404_images/404.png
new file mode 100644
index 0000000..3d8e230
--- /dev/null
+++ b/energy_management_ui/src/assets/404_images/404.png
Binary files differ
diff --git a/energy_management_ui/src/assets/404_images/404_cloud.png b/energy_management_ui/src/assets/404_images/404_cloud.png
new file mode 100644
index 0000000..c6281d0
--- /dev/null
+++ b/energy_management_ui/src/assets/404_images/404_cloud.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/cost.png b/energy_management_ui/src/assets/home/cost.png
new file mode 100644
index 0000000..ed7d3a2
--- /dev/null
+++ b/energy_management_ui/src/assets/home/cost.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/count.png b/energy_management_ui/src/assets/home/count.png
new file mode 100644
index 0000000..fa08aac
--- /dev/null
+++ b/energy_management_ui/src/assets/home/count.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/electric01.png b/energy_management_ui/src/assets/home/electric01.png
new file mode 100644
index 0000000..2ad4206
--- /dev/null
+++ b/energy_management_ui/src/assets/home/electric01.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/electric02.png b/energy_management_ui/src/assets/home/electric02.png
new file mode 100644
index 0000000..3c7954a
--- /dev/null
+++ b/energy_management_ui/src/assets/home/electric02.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/electric03.png b/energy_management_ui/src/assets/home/electric03.png
new file mode 100644
index 0000000..2b7225e
--- /dev/null
+++ b/energy_management_ui/src/assets/home/electric03.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/electric04.png b/energy_management_ui/src/assets/home/electric04.png
new file mode 100644
index 0000000..521a5f8
--- /dev/null
+++ b/energy_management_ui/src/assets/home/electric04.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/electric05.png b/energy_management_ui/src/assets/home/electric05.png
new file mode 100644
index 0000000..eefde94
--- /dev/null
+++ b/energy_management_ui/src/assets/home/electric05.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/electric06.png b/energy_management_ui/src/assets/home/electric06.png
new file mode 100644
index 0000000..d77935e
--- /dev/null
+++ b/energy_management_ui/src/assets/home/electric06.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/haodian.svg b/energy_management_ui/src/assets/home/haodian.svg
new file mode 100644
index 0000000..64ca324
--- /dev/null
+++ b/energy_management_ui/src/assets/home/haodian.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>鑰楁皵閲�</title>
+    <defs>
+        <linearGradient x1="15.5954832%" y1="17.9558225%" x2="79.6918238%" y2="77.5510976%" id="linearGradient-1">
+            <stop stop-color="#53DBDD" offset="0%"></stop>
+            <stop stop-color="#51C6D8" offset="100%"></stop>
+        </linearGradient>
+    </defs>
+    <g id="椤甸潰-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="棣栭〉" transform="translate(-247.000000, -701.000000)">
+            <g id="1" transform="translate(224.000000, 623.000000)">
+                <g id="鑰楁皵閲�" transform="translate(23.000000, 78.000000)">
+                    <circle id="妞渾褰�" fill="url(#linearGradient-1)" cx="10" cy="10" r="10"></circle>
+                    <path d="M10.2132025,11.3611714 L10.2132025,11.5368764 C10.2115497,11.6275763 10.1982731,11.7174915 10.173806,11.8036876 L9.65602283,15.5 L13.5,8.34164857 L10.6859611,8.34164857 C10.3905615,8.2944645 10.1782668,7.98905354 10.2019464,7.64533623 L10.2019464,7.46963124 C10.2027605,7.37192021 10.2179872,7.27508608 10.246971,7.18329721 L10.7647542,3.5 L6.95454545,10.664859 L9.76858437,10.664859 C10.0481503,10.7328446 10.2393164,11.032228 10.2132025,11.3611714 L10.2132025,11.3611714 Z" id="璺緞" fill="#FFFFFF" fill-rule="nonzero"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/home/haoqi.svg b/energy_management_ui/src/assets/home/haoqi.svg
new file mode 100644
index 0000000..6c7fee1
--- /dev/null
+++ b/energy_management_ui/src/assets/home/haoqi.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>鑰楃數閲�</title>
+    <defs>
+        <linearGradient x1="15.5954832%" y1="17.9558225%" x2="80.8468413%" y2="78.6250058%" id="linearGradient-1">
+            <stop stop-color="#FF944A" offset="0%"></stop>
+            <stop stop-color="#FF674A" offset="98.2298951%"></stop>
+        </linearGradient>
+    </defs>
+    <g id="椤甸潰-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="棣栭〉" transform="translate(-437.000000, -701.000000)">
+            <g id="1" transform="translate(224.000000, 623.000000)">
+                <g id="鑰楃數閲�" transform="translate(213.000000, 78.000000)">
+                    <circle id="妞渾褰�" fill="url(#linearGradient-1)" cx="10" cy="10" r="10"></circle>
+                    <g id="鐕冩皵" transform="translate(6.973425, 5.709341)" fill="#FFFFFF" fill-rule="nonzero">
+                        <path d="M4.96464814,2.32197096 C5.01669441,2.58543535 5.00081589,2.85592953 4.91652249,3.13335162 C4.79027842,3.54851689 4.71284611,3.54851689 4.5787608,4.00005369 C4.55102239,3.96011632 4.37341816,3.67668325 4.52504826,3.13284222 C4.64158879,2.50362487 4.34175913,1.87155485 3.92538895,1.22308198 C3.52205484,0.593864627 2.92700226,0.119404588 2.36586307,0 L2.33802665,0 L2.34773019,0.0294436228 C2.53043123,0.989672497 2.0105566,1.49001032 1.39737113,2.04862411 C0.784185668,2.6077473 0.113857122,3.25163552 0.0114308414,4.50405924 C-0.120400113,6.15157766 0.918761058,7.31047458 1.54674687,7.84494255 C1.58409081,7.87438617 1.62202284,7.88437052 1.66377748,7.88437052 C1.72944791,7.88437052 1.78041602,7.85502877 1.81825003,7.80510706 C1.85331131,7.75072346 1.85699548,7.68077713 1.82785556,7.62273999 C1.33179871,6.27617818 2.34773019,5.40957799 2.67078954,5.17260267 C2.4037951,6.81197061 3.71504752,8.10076586 4.00742799,7.99379076 C5.20890296,7.55692483 5.98499032,6.67432931 6.1773949,5.48435868 C6.38283555,4.20829855 5.863451,2.79714416 5.00199207,2.33205718 L4.96464814,2.32197096 Z" id="璺緞"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/home/haoshui.svg b/energy_management_ui/src/assets/home/haoshui.svg
new file mode 100644
index 0000000..e88e591
--- /dev/null
+++ b/energy_management_ui/src/assets/home/haoshui.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>鑰楁按閲�</title>
+    <defs>
+        <linearGradient x1="15.5954832%" y1="17.9558225%" x2="79.6918238%" y2="77.5510976%" id="linearGradient-1">
+            <stop stop-color="#4AD8FF" offset="0%"></stop>
+            <stop stop-color="#6CB6FF" offset="100%"></stop>
+        </linearGradient>
+    </defs>
+    <g id="椤甸潰-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="棣栭〉" transform="translate(-635.000000, -701.000000)">
+            <g id="1" transform="translate(224.000000, 623.000000)">
+                <g id="鑰楁按閲�" transform="translate(411.000000, 78.000000)">
+                    <circle id="妞渾褰�" fill="url(#linearGradient-1)" cx="10" cy="10" r="10"></circle>
+                    <g id="姘存淮" transform="translate(7.000000, 6.000000)" fill="#FFFFFF" fill-rule="nonzero">
+                        <path d="M3,0 C3,0 0,2.8491931 0,5.21758487 C0,6.90038954 1.34210527,8 3,8 C4.65789473,8 6,6.90038954 6,5.21758487 C5.99561403,2.8491931 3,0 3,0 Z M1.97368421,3.95325543 C1.81578947,4.34501948 1.72807017,4.71007234 1.71052632,5.04396216 C1.69298246,5.39120757 1.74561404,5.71619366 1.86403509,6.01892042 L1.86403509,6.02337229 C1.91228071,6.14357262 1.82456141,6.27267669 1.69736842,6.26822482 L1.60964913,6.26377296 C1.53947369,6.25932109 1.47807018,6.21480245 1.45175438,6.14802448 C1.3245614,5.8096828 1.2631579,5.43572621 1.28070176,5.0261547 C1.29824562,4.62993879 1.40350878,4.22481915 1.56140351,3.8196995 C1.5877193,3.74846967 1.65789474,3.70395103 1.73245614,3.7084029 L1.81578947,3.71285476 C1.93859649,3.71285476 2.01754386,3.84195882 1.97368421,3.95325543 L1.97368421,3.95325543 Z" id="褰㈢姸"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/home/haozhengqi.svg b/energy_management_ui/src/assets/home/haozhengqi.svg
new file mode 100644
index 0000000..4d8a4d0
--- /dev/null
+++ b/energy_management_ui/src/assets/home/haozhengqi.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>鑰楄捀姹介噺</title>
+    <defs>
+        <linearGradient x1="15.5954832%" y1="17.9558225%" x2="79.2208361%" y2="77.1131843%" id="linearGradient-1">
+            <stop stop-color="#6B99FF" offset="0%"></stop>
+            <stop stop-color="#6D89FF" offset="100%"></stop>
+        </linearGradient>
+    </defs>
+    <g id="椤甸潰-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="棣栭〉" transform="translate(-832.000000, -701.000000)">
+            <g id="1" transform="translate(224.000000, 623.000000)">
+                <g id="鑰楄捀姹介噺" transform="translate(608.000000, 78.000000)">
+                    <circle id="妞渾褰�" fill="url(#linearGradient-1)" cx="10" cy="10" r="10"></circle>
+                    <g id="姘斾綋" transform="translate(6.106927, 5.398503)" fill="#FFFFFF" fill-rule="nonzero">
+                        <path d="M2.27786563,9.16994331 C2.13345487,9.16103093 2.0171181,9.07272815 2,8.9590357 L2,6.22545296 C2.00860326,6.1093024 2.12077865,6.01452001 2.2668246,6 C2.41376964,6.00680032 2.53368126,6.09546772 2.55205089,6.21090761 L2.55205089,8.94449034 C2.57009543,9.00490189 2.54546784,9.06830713 2.48764496,9.11030735 C2.42918259,9.14963795 2.35462796,9.1708323 2.27786563,9.16994331 Z M3.90503866,9.71592943 C3.80111255,9.68539156 3.72721405,9.61178628 3.71319795,9.52484991 L3.73159965,7.65235205 C3.7283125,7.57440374 3.7778852,7.50099036 3.8616442,7.45976603 C3.94540321,7.4185417 4.05062352,7.41576937 4.13766966,7.45249336 C4.22471581,7.48921734 4.28036341,7.55985839 4.28365056,7.6378067 L4.26708903,9.51030456 C4.29188342,9.5681206 4.26836516,9.63202258 4.2082036,9.67030344 C4.12574622,9.72889182 4.00896478,9.7464673 3.90503866,9.71592943 Z M5.71714273,8.82230938 C5.57049753,8.81619797 5.45040259,8.72800746 5.43191642,8.6128563 L5.43191642,7.55489819 C5.42830055,7.47694988 5.47756951,7.40339789 5.56116415,7.36194854 C5.6447588,7.32049919 5.74997911,7.31744963 5.83718961,7.35394859 C5.92440012,7.39044756 5.98035147,7.46094999 5.98396733,7.5388983 L5.98396733,8.59685641 C6.01909693,8.65569859 5.99491276,8.72599623 5.92692207,8.76267343 C5.86928553,8.80311705 5.79416526,8.8244722 5.71714273,8.82230938 Z" id="褰㈢姸"></path>
+                        <path d="M7.54185035,5.02432027 C7.28573857,5.22634846 6.95117926,5.33643064 6.60553849,5.33240094 C6.54876587,5.49156066 6.44000758,5.63290802 6.29252328,5.73921015 C5.98291655,5.98186669 5.548068,6.06235166 5.15178089,5.95034715 C4.75549377,5.83834263 4.45797353,5.55086478 4.37129317,5.19620373 C4.28461281,4.84154268 4.42194113,4.47357988 4.73154788,4.23092336 C4.87238127,4.11374088 5.0505351,4.03622336 5.24276049,4.00848674 C5.26312599,3.79784436 5.35176128,3.59655557 5.49836679,3.42801043 C5.42988837,3.38542849 5.36788516,3.33546818 5.31383818,3.27932285 C5.20496021,3.17452623 5.11840595,3.05368842 5.05823187,2.92247266 C4.6639692,3.09613486 4.21225467,3.14411447 3.78156723,3.05807573 C3.70778905,3.41322606 3.49709282,3.73587957 3.18424127,3.97280172 C2.99464081,4.1208752 2.77297386,4.23451321 2.53224016,4.30705139 C2.72608417,4.80341101 2.49437032,5.35011234 1.97658393,5.61805635 C1.45879755,5.88600036 0.796179548,5.80209771 0.387607587,5.41685548 C-0.0662442323,4.95909675 -0.0221358152,4.27080436 0.48738973,3.85979916 C0.150500324,3.53696421 -0.0240331592,3.11028934 0.00266877486,2.67482165 C0.0293707089,2.23935395 0.255090082,1.83126528 0.629545109,1.54146243 C1.13038907,1.14950944 1.83036752,1.01414428 2.47483126,1.18461224 C2.56518568,0.885547306 2.75263272,0.615466353 3.01474832,0.406678833 C3.36526826,0.126943993 3.83001903,-0.0188365672 4.3050167,0.0019542813 C4.78001437,0.0227451298 5.22561052,0.208371959 5.54210691,0.517302385 C5.74603072,0.712876532 5.88742535,0.951585833 5.9521705,1.20959175 C6.49917216,1.04523848 7.10605746,1.18644988 7.48580832,1.56644194 C7.9821946,2.03404182 7.9939805,2.75199426 7.51314589,3.23174283 L7.59925925,3.30668136 C7.86539183,3.53577891 8.01031181,3.85072896 7.99942833,4.17635622 C7.98854484,4.50198349 7.8228344,4.80907103 7.54185035,5.02432027 Z" id="璺緞"></path>
+                    </g>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/home/shi.png b/energy_management_ui/src/assets/home/shi.png
new file mode 100644
index 0000000..ac007e6
--- /dev/null
+++ b/energy_management_ui/src/assets/home/shi.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/statistic.png b/energy_management_ui/src/assets/home/statistic.png
new file mode 100644
index 0000000..1d1def1
--- /dev/null
+++ b/energy_management_ui/src/assets/home/statistic.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/tan.svg b/energy_management_ui/src/assets/home/tan.svg
new file mode 100644
index 0000000..66c21e8
--- /dev/null
+++ b/energy_management_ui/src/assets/home/tan.svg
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="83px" height="83px"
+     viewBox="0 0 83 83" enable-background="new 0 0 83 83" xml:space="preserve">  <image id="image0" width="83"
+                                                                                         height="83" x="0" y="0"
+                                                                                         href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFMAAABTCAYAAADjsjsAAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
+AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA
+CXBIWXMAAC4jAAAuIwF4pT92AAARv0lEQVR42s2da28b15mAn5khqQspibIsybLTRIqtJIqZRt4u
+tt0CRVxgv8f5BbF/wLZ2sAgWiwKNsdiiMBZ1sh/81c4vSPIHtgqw2y6yF6utcrOjWI5t+aYLdaPE
+y8zph/eMODOcIYfk0NsXICTOnDmXZ95z3ve858zQOH36NL2Ql95dipXOGmAemEcxDbyhDPLAfGhi
+x/dtEdhCsQDcBRadCouAareut64UEmlzKpFctMQBaA0wDZwF3tR/87Ga7zQcmdfXvQGgFBhpihru
+J8CCqrGSZPtaSaIwo8TKkgfO4fA2ArAuHpDKiMjACTnmvU4dHpNy4JwygBQLwIfAx9Qo9rqdZi8z
+t7JMW1muAndwuE5vQYalOQtcB+6Q4iom071sb09gaojSCLiIQ74pkDCQijpIFfg0yYvwJHkcLgJ3
+MLneK6iJwrSy5K0s7wE3gfNAa80yQs65IIPwAlBVCNwYw+954CYm72GG3OQuJDGYc5eXzmqIv4Qm
+lWwFMsZ1EAEy/lCR1/W8iRkYeroQIwnXaO7y0lXgYstGRIFU8a+DEJCGzi/sZoT1jMY07wOXb10p
+FLvh0BXMuctL08BHhPmF3YJUHnBE53WYnwKMiLyaST3NIvDWrSuFlU55dNzNPd16vkkFGxof2RW9
+1+nxUDmEj5kE8guz6O2BRLfj5uy7S2c7ZdIRzLnLS+eB3xI2NrYD0gvB1hCdkG4cNEiuAQoC9KZt
+D6R7aR747ey7S+efCUwN8nrcCkaCDGl8VJdWwQ9NxsjOZlPBy653ArQtmG2DdMc9IyK9an5dpPZ5
+y1Mh1zWT1iDddNdn/6E9oLFhJgpSNV532LU1ZFcLm2qf969Da5jxQbrSFtBYMLWxSQZknOuCoDyf
+VJST30raB+l+vz77Tjyj1BKmx/1pC0ikhHRtrwY2gAyIZbYoI2YALhbIunw0+87SdKs842jmR8Sx
+2oEaxp2NhFruCDEMqDnx0jYtM0aawLE8UQrlkaYw9cxmPlbBnUSAvCDdMbJJi5U3TRPtbVZmByDd
+C+dnLy1dbVZUJEw9Tl5MFGTYtDDYwrhjYBxJDqQrF2cvRY+foTDnLi/lCTM4SWlkyPWqWfduBa3z
+OXkn112fvbSUDzsRpZkXIUbML+40MU7jXTGaJ1etrjGIZ7njgmwscJqwHksITG29f96yoHbn24Hr
+vJqokurWEUASBImSCNXPT4VY9zDNbIxHJgyy0zHRMELAN4tAkSxIj+Q1J5/4YGqtPB8LCF2AbGMJ
+wlfZYHnPGGSgvedPXfRrZ1Az/d07SZBRyw0q3MAYLcbOVidiKX/nIMEBFeB1CFNb8PNNC+oEpLeC
+hqeuwVmPRwyjEXBDkQbhF0fxcFp8bx8kwPmTF+uW3btufg53rOxivp3LwMwoTOXgyCBMZuWTH4Ca
+DY924OEOPN2DxzuwugNPd+Gg5m+ME2iYZcHxIXg+D+NZGMtJGRM56EtBcR8ebMPjXXiyC6vbUtbm
+fs9AonmdA24EYb7dLciBNDw/AqfH4cQwjPTBkQEYG4S0JckG0zDcD5M5OJYT+NWaNBzqWulb4jEk
+7dwknBqD0QEY6YfxHAz3SZrRQcj2SVlTQ3IjUyaUylB2/PVMCKSb19s+mNrwnO0UpKEgY8GpI/DD
+EzA/JRAtE6zAdfkBGNFaelCDY0NyvGrDeknXUZdpAKYpGvnD5+EHz8ELo5A25bg3a0sDn8iCreDF
+XRjKQLkGd9Yl/3YMXkuQdTl78mdL08v/VlhxNfNsRxEgDXK4D6bz8DcnYP6YaJ1XtsuwW4b+tEA2
+EE1NW/DSOFQdqNjwv/dhv1a/ri8FM0fg9ePwgxPSxV0NB9gpw0ZJgh/9acj3QzYDFnBiRNLYemxe
+Xgfbxq/23YD08zoL3EjpE282A9lsmmiaMNoPhQn4/qQfpKPg3pY0ZOtAuvSpMZgckiHBQLr93LiA
+ub8F323KchDAYAZeOwZ/+4IMG65rVLFhfQ9urcnYWLMF5vFhOHVUxlFDA1XIeLq2B5sl7UlEzJI6
+BAmKN+swu9gDZBkyfh3X45Q3i7US3FyF392Fg6oA/K4If3UCXp0QzQPI9cELeflslqB4oI9n4PlR
+P0jbgXtF+MNDWFwVqI6SIeU5rY3ZtOQJMozMHIFv12G/AvtV6svCrTYxxAN5yC8198ulebwznjYD
+F5YpY9P4oD8KflAVcF8+Ec10s96rCPSXj/qzHOkXTVrZhK2y+GyjA9J1vc561REN/uNDydv21KVU
+helRmD4i3d0wxAhNDcsQ8WhbwwyRLkAC5E/+/dK8iTde2UEEaFCPVUezOgqupXgAdzbg0a4nayVd
+bms/EORFtHYiJwYqZda/ZzP+dLYjXfbRjh+kewOLB7B94M//6KBouKuth2J0AbJR5k3c6FCHEaCR
+PtGq/sBOz50y3N8WP8+7FFG25VzZ9qfPZsR/HOoTmNk+uUF9gXyVkuu3D8Lrs18V7ffCHOoT7cxl
+GtN3DDIkmpQC3uhmmjiUgYFUY977VXF1div+47YjgO8XRftM7VdWbTEsjpLuOZgWwF7rDWKdyzX5
+hEnFlnO2p0JpS3pPJnhj4kCLA1LSvJHSu207AgmiRWbIYF51YKdCqPuxtgf/tyqWGE8kaOtAZkZK
+iS+ZMhunkVVbPlEuo+3IJxhdOqxn1DTUCTkcHyRAPoUeMzuKACGa5IS0zFYys2mogB43/7gKX6Xk
+WqWkoQrR5poj3x3VWPeyLTeqXXFUoBkmjGRkAjGQFt9UIWXvlmG7BHvlQPnN/e75VDcgoUlgN2wT
+gf5/ryqzH9+yriEAbUe6uRlRp3Kt0XjFEW9ZCvGHX5+CwjHtl+qb6ThwbxMWH8AXD8VYttxVoiXV
+dgQoCDJu/DEQWa8Fr1N1Z93ScINhOFuJxe4EptsDLFNcszMnZDLwyoT0/PWSDAXjObH8A2koV+Hu
+JqztxGCjmj1tEWdjftyIeSBdk+hZU7H1tNPuEKatBNLpSfjJDMyOy4350yp8/kiM6Y+m4Xuj8Npx
+GY76UiEwo+xHUiBDwUTNfeMSSHBtyFHShQfT8OIYvHpMburKOvznHfh8VSJOQ30wPCBRqLlJufZ3
+37YGGQ4zSY10xWPt3a7bahEtbPSxDHFzrE636Oqhw7a1Y2/DracCdG1X6vRgS6a0w/0CdMIbtGnR
+I/wwO9HIdpZ4NSSnBciooI5pyuQg1QFMUxu1vbIESBTibTzcrnsdrmeitBa7blgcNn6YcR9eCoJs
+AibqVK5PIk3ZjAByEx/UYGNfZjCuVQ/eiFYwozqOach8f68CXz2BB0VQjhwr1+T8cL8ERvIDUq/N
+kkTt44Yn3RBcPJCqdYatxFHilvx4GmbHxCCAwFvdlgjTF4/F0ITdwL4WML1+eQNMU8rfKEGxJO22
+dJ0GMxJ4PnlUoFZqsLoF9zbigRSYDosEN2fFiEi7Xy2zPiUMa1iYZDMSTC4cawS19KiukWH5pi2J
+6luGf8rolmcZUqegVrszIPcG2Y7AtBHHvXAMfjQD02MC9+4GfPUIVtbigQQWUxB4QDPMKW9iuasR
+rkrarGvdYUv1hY4Sl6Rq1+fetiPTyVK1PnbVQoIOpiHQM6nwcFomJeeDyyU+l8qziWwsC98/AT85
+Ke5Q2oI7a/DZHYH52OsWNe+JRRP4tFOQIGPc1kGjlvSnJR7ZH+J8KR3M8Bqi/apEgw5q0ujdiuRb
+CQQ0DA2zL8JDTltSptfil6qyAnoYGNYy3A9//Tz83ctQmBKN39yDP9yHz+7C421P+a2HtE9N0M9k
+xwEZ0m839mUM2g3MY3MZHfZyY4ieRbJcn/hz3ohQ1dVMbXy2D2QMLQW0zzJkBjM22FiXTEpu4HB/
+ILa6DysbsL1fr0t/Cl6agB/PCMiUKcHjz1bgf+7C3XXR5pggAVZMYDE2yJBMK1WB8GTPHxYb7pOo
+90TWf93kkCxPjA36p5ulqgR8N/ZFY6t6jb247y8vY0nUfPaoPz5pIEu806MSB3XzVohWfrepY6C6
+q8+MyWznpQn5/ngHfv8t/PvX8M1Tb8NjgQRYTH31z4XFV36xVEQvXbQDEgewBOaDLVmDcbv1oN6M
+MH9cGlZzBMSLR+DVSQkoe2WnLJp4GFhA8n20I13eBWeZsnD2+pQMCY+2pRpDffDKuMAc9IzVu2XR
+yrsbovVpS7T3tSk4PQUDGbHaN++JRi4/lZ5xGLKjcagJkeLytcKiO/IsAOfaBolA2tiHO5uycJXv
+r2vQcyNiuecmJECRtiSaPjrYuGR7vyja4Q2vlarwzbrAm5us36iRfjh9TDRwc18an83IbMXb/UsV
+uP0UvnoMq0XR9tEByev0lPQS25FyH2zK+eN5PcvSTn7VFsAtZAHqTvsnSnGuXZCuJu+U4faaNGQg
+Bc/l62vjE7nAlCx4S/fh88ey0rgR6NKVGnyzJlpiK3h5XDQQRFNzY/K/rRqt935VFtz+Y1m6bVlv
+Qshl4NQ4vHCkPq6OZ+HVKfjeEe126aB0qSL2IAbMTw5hKsVCJyBdKddkfTx1vx7NnsjWd3R4fT43
+ZlhzBOSXT+C/voMvH8tSrNexrDmyL6lUFWNQsaEwKTcp5UbiDSnDzbfqSC9YXoffr8B/35MppFt4
+xqov0tmOjM9Hc5DXGm1Qr+9mCe5vtgQJXs38+l8KKy//09ICev23k2e3aw58tyWaWqnJWvdARiqe
+y4jP6Vrp3Yr8fbAFX6/JeLZdrjfGV6SSrvynh9IDltelm+f7xarnB8Sn3a3IkkdRexd312F5DXYP
+dFN03R0dSb9f1K6vjnGmLb9BNA3R7qilYS/I5WvyWLXXW/sQONvNQ/DligQOMqas8wxpF2hkQIxC
+TS+mbZX0otqWDP7ulphmMZMtPZQ83ZMtNkezMnwczYq2bR/ILrj1PbHeT3Zk05YK1L2sjVbNrmum
+YTRuVHWHgN0DWsmH7j9emB8rg6veBbZ2QLqyV4Evnsgn1j7JmFEnpSTvvYpodPCc/FP//3CpIbBs
+sroFq2Fdt7PYaRH42P1yeEO+/lWhiJKtcR2B7PSZG6+0Gc6LAuJbswn+7XCDWoTcWL5WfxVFULs/
+aKvxEenaAplUND342h4dyPBpZ7IgIcDLB/PWrwor6I2bPQcZIzIVS7ywmkFLHuQN1/C4EhYZvIwT
+81VfST1O1+T6pj0/7g1JHmQRuBw82ABTa+cHLbPr9nG6MI0KEdNsDtT3cBb0eox05YOgVkL0437v
+Q5M3/CX9FJgHbHBKmzajVz5VSB4+oL0BuaL5NEgozFu/LhSBC88EZDMgyrOgFUzT4iaEvmYiGWN3
+wWvBW8LUQBcI3oEeP5fo7aIuG3cTlvIci3rm3Peej2AZyYB8f/laYSHqZMs3br30j0s3gfmegfSs
+gCmjDVfTq5XBXW9BlygZkIvL1wpnmiWIswL9Vph1j1W/OBrp7dqEj4NRH/etXA0gvRklA7IIvNUq
+UUuYt35dWAlmFMsFaufhJS886oBUFERHPkSBdJqX14G8FWa924YJcOtKYQFtkBIHGdwp5wR6qNP4
+cSGqsDKTB3mh2TjZNkwN9IYKs/BJP5fo9RudEMVUhI/VUYane5A34iZua9fO7SuFG3iBxnHc2wHp
+pnfn1a3yctNG7YnpTtoCCR28WO8QaHtvXfEfjvuEQzMD5OAPZrQos9cgocNXPmqgP8W7GyRpkG4e
+YREgr0bGKLMNKQI/7QQkdPEy0tv/WlgAzgCLPQHZLK/eTBMXgTNxjU2YJPLO4dl3PO8cThJkWH69
+Afn+8rXCpW4zSeRt2Ld/U7iEdPuVsPN/wSBXkG7dNUhI8NXit39TWEBxBonzFQ/b+pcJsqjr2VW3
+DkqiL72/fbVQvH218B4ylt4IA9kgzx7kDeCMleM9K5fs71305OcYjDQrRpoLwAwSeSom8DhddJrW
+UtT1mLFyXLByvfk1lp7+UIiZYsVMcQmHGeCC0jsfuoLUHsgFZJIxY+W41CuIrjyTn7AxMxSR7nXD
+rjCNw1m8vwcUBSmmy+WRItR/D6jX8IKSiGvUjZz82dI8innkufc3QP9SVWuQiwi8TxGrvLh8rbD4
+/9mWPwNJmgw8gGnkQAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wOC0wNVQwOTo0MjoxOSswMjow
+MJG2S3AAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDgtMDVUMDk6NDI6MTkrMDI6MDDg6/PMAAAA
+AElFTkSuQmCC"/>
+</svg>
diff --git a/energy_management_ui/src/assets/home/wen.png b/energy_management_ui/src/assets/home/wen.png
new file mode 100644
index 0000000..6d6033b
--- /dev/null
+++ b/energy_management_ui/src/assets/home/wen.png
Binary files differ
diff --git a/energy_management_ui/src/assets/home/zonghe.svg b/energy_management_ui/src/assets/home/zonghe.svg
new file mode 100644
index 0000000..4feaf72
--- /dev/null
+++ b/energy_management_ui/src/assets/home/zonghe.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>缁煎悎</title>
+    <defs>
+        <linearGradient x1="15.5954832%" y1="17.9558225%" x2="80.8468413%" y2="78.6250058%" id="linearGradient-1">
+            <stop stop-color="#FF944A" offset="0%"></stop>
+            <stop stop-color="#FF674A" offset="98.2298951%"></stop>
+        </linearGradient>
+    </defs>
+    <g id="椤甸潰-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="棣栭〉" transform="translate(-295.000000, -273.000000)">
+            <g id="1" transform="translate(224.000000, 190.000000)">
+                <g id="缁煎悎" transform="translate(71.000000, 83.000000)">
+                    <circle id="妞渾褰�" fill="url(#linearGradient-1)" cx="12" cy="12" r="12"></circle>
+                    <path d="M16.0896819,15.464859 L16.0896819,15.5937093 C16.0884698,15.6602227 16.0787336,15.7261604 16.0607911,15.7893709 L15.6810834,18.5 L18.5,13.2505423 L16.4363715,13.2505423 C16.2197451,13.2159406 16.0640623,12.9919726 16.0814274,12.7399132 L16.0814274,12.6110629 C16.0820244,12.5394082 16.0931906,12.4683965 16.1144454,12.4010846 L16.494153,9.7 L13.7,14.9542299 L15.7636285,14.9542299 C15.9686436,15.004086 16.108832,15.2236338 16.0896819,15.464859 L16.0896819,15.464859 Z" id="璺緞" fill="#FFFFFF" fill-rule="nonzero"></path>
+                    <path d="M12.5510395,17 C12.8137542,17.0374383 13,17.1827663 13,17.3503249 C13,17.5178834 12.8137542,17.6632114 12.5510395,17.7006497 C11.1849262,17.8953283 10.4916854,17.9959799 10,18.0050985 C9.42346464,18.0157908 9.0720413,17.9028178 7.4611281,17.7006497 C7.19289028,17.6669861 7,17.5204449 7,17.3503249 C7,17.1802048 7.19289028,17.0336636 7.4611281,17 L12.5510395,17 Z M11.4384557,13.6311719 C11.7219018,13.6846056 11.9228447,13.8920245 11.9228447,14.1311719 C11.9228447,14.3703194 11.7219018,14.5777383 11.4384557,14.6311719 L7.42036146,14.6311719 C7.13095637,14.5831257 6.92284466,14.3739753 6.92284466,14.1311719 C6.92284466,13.8883686 7.13095637,13.6792181 7.42036146,13.6311719 L11.4384557,13.6311719 Z M12.5,10.2088204 C12.7627147,10.2622541 12.9489605,10.469673 12.9489605,10.7088204 C12.9489605,10.9479678 12.7627147,11.1553868 12.5,11.2088204 L7.41008858,11.2088204 C7.14185076,11.1607742 6.94896049,10.9516237 6.94896049,10.7088204 C6.94896049,10.4660171 7.14185076,10.2568667 7.41008858,10.2088204 L12.5,10.2088204 Z M17.5578514,7 C17.8279395,7.02868384 18.0234118,7.25026389 17.9976676,7.49855907 C18.0236088,7.74645479 17.8302833,7.96845368 17.5609929,8 L7.44521854,8 C7.17339855,7.97130701 6.9765258,7.74844143 7.00226072,7.49855907 C6.97833442,7.24974502 7.17473188,7.02869523 7.44521854,7 L17.5578514,7 Z" id="褰㈢姸缁撳悎" fill="#FFFFFF"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/index.js b/energy_management_ui/src/assets/icons/index.js
new file mode 100644
index 0000000..2c6b309
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/index.js
@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
diff --git a/energy_management_ui/src/assets/icons/svg/2020-03-23-a204691ac2cdafde1a9a405f9b5cf8ca.svg b/energy_management_ui/src/assets/icons/svg/2020-03-23-a204691ac2cdafde1a9a405f9b5cf8ca.svg
new file mode 100644
index 0000000..bdcf765
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/2020-03-23-a204691ac2cdafde1a9a405f9b5cf8ca.svg
@@ -0,0 +1,1204 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="鍥惧眰_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1330.6 650.3" style="enable-background:new 0 0 1330.6 650.3;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#F0EEED;}
+	.st1{font-family:'SimHei';}
+	.st2{font-size:36px;}
+	.st3{fill:none;stroke:#993333;stroke-width:3;stroke-miterlimit:10;}
+	.st4{fill:none;stroke:#663333;stroke-width:1.5;}
+	.st5{fill:#FFFFFF;stroke:#663333;stroke-width:1.5;}
+	.st6{fill:none;stroke:#663333;stroke-miterlimit:10;}
+	.st7{stroke:#663333;stroke-miterlimit:10;}
+	.st8{fill:#FFFFFF;}
+	.st9{font-size:10.6699px;}
+	.st10{font-family:'TimesNewRomanPSMT';}
+	.st11{font-size:9.1456px;}
+	.st12{font-size:16.0048px;}
+	.st13{fill:none;stroke:#CA9B33;stroke-width:5;stroke-miterlimit:10;}
+	.st14{font-size:13.7184px;}
+	.st15{fill:#FB5C5C;}
+	.st16{font-size:18px;}
+	.st17{font-size:17.0812px;}
+	.st18{fill:#8B0000;stroke:#8B0000;stroke-miterlimit:10;}
+	.st19{fill:#3A1BF4;}
+	.st20{font-size:12.8951px;}
+	.st21{fill:none;stroke:#99CC99;stroke-miterlimit:10;}
+	.st22{fill:none;stroke:#666666;stroke-miterlimit:10;}
+	.st23{fill:none;stroke:#663333;}
+	.st24{fill:#FFFFFF;stroke:#663333;stroke-width:0.5;stroke-miterlimit:10;}
+	.st25{font-size:2.5668px;}
+	.st26{fill:none;stroke:#663333;stroke-width:0.5;stroke-miterlimit:10;}
+	.st27{stroke:#663333;stroke-width:1.5;}
+	.st28{fill:none;stroke:#663333;stroke-width:0.5;}
+	.st29{fill:none;stroke:#037400;stroke-width:1.5;}
+	.st30{stroke:#663333;stroke-width:0.5;stroke-miterlimit:10;}
+	.st31{fill:none;stroke:#663333;stroke-width:2;stroke-miterlimit:10;}
+	.st32{font-size:3.0882px;}
+	.st33{fill:none;stroke:#28B400;stroke-miterlimit:10;}
+	.st34{fill:#FFFFFF;stroke:#0A26FF;stroke-miterlimit:10;}
+	.st35{fill:#FFFFFF;stroke:#999966;stroke-miterlimit:10;}
+	.st36{fill:none;}
+	.st37{font-size:14.0625px;}
+	.st38{font-size:13.3828px;}
+	.st39{font-size:13.1666px;}
+	.st40{font-size:12.1669px;}
+	.st41{font-size:14.1138px;}
+	.st42{font-size:11.6694px;}
+	.st43{font-size:12px;}
+	.st44{font-size:13.72px;}
+	.st45{fill:#037400;stroke:#037400;stroke-miterlimit:10;}
+	.st46{fill:none;stroke:#0E5500;stroke-width:1.5;}
+	.st47{fill:none;stroke:#8B0000;stroke-width:1.5;}
+	.st48{fill:none;stroke:#025F00;stroke-width:1.5;}
+	.st49{fill:#FFAD3F;stroke:#FFAD5B;stroke-miterlimit:10;}
+	.st50{fill:#FFAD5B;stroke:#FFAD5B;stroke-miterlimit:10;}
+	.st51{fill:#00FF00;stroke:#00FF00;stroke-miterlimit:10;}
+	.st52{fill:none;stroke:#0A26FF;stroke-width:0.5;stroke-miterlimit:10;}
+</style>
+<polyline class="st0" points="0,-2.2 1330.6,-2.2 1330.6,647.8 0,647.8 "/>
+<text transform="matrix(0.8161 0 0 1 19.0127 37.5732)" class="st1 st2">鐢靛姏绯荤粺鑳芥祦鍥�</text>
+<line class="st3" x1="58.5" y1="342.8" x2="854.8" y2="342.8"/>
+<line class="st4" x1="193.6" y1="400.2" x2="193.6" y2="410.1"/>
+<line class="st4" x1="193.6" y1="371.5" x2="193.6" y2="381.9"/>
+<line class="st4" x1="193.6" y1="343.8" x2="193.6" y2="367.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="193.6" y1="375.2" x2="188.4" y2="382.4"/>
+	<line class="st4" x1="199.2" y1="382.4" x2="193.3" y2="375.2"/>
+	<line class="st4" x1="193.6" y1="380" x2="188.4" y2="387.2"/>
+	<line class="st4" x1="199.2" y1="387.2" x2="193.3" y2="380.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="193.3" y1="424.4" x2="198.6" y2="417.1"/>
+	<line class="st4" x1="187.8" y1="417.1" x2="193.6" y2="424.3"/>
+	<line class="st4" x1="193.3" y1="419.5" x2="198.6" y2="412.3"/>
+	<line class="st4" x1="187.8" y1="412.3" x2="193.6" y2="419.5"/>
+</g>
+<rect x="170" y="434.4" class="st5" width="10.1" height="18.2"/>
+<line class="st6" x1="174.7" y1="435.1" x2="171.4" y2="444.9"/>
+<line class="st6" x1="171.4" y1="444.9" x2="178.3" y2="444.9"/>
+<line class="st6" x1="178.3" y1="444.9" x2="174.7" y2="435.1"/>
+<line class="st6" x1="174.7" y1="440.5" x2="174.8" y2="462.9"/>
+<line class="st6" x1="174.8" y1="422.1" x2="174.8" y2="433.7"/>
+<line class="st6" x1="171.4" y1="462.9" x2="178.3" y2="462.9"/>
+<line class="st6" x1="172.3" y1="465" x2="177.5" y2="465"/>
+<line class="st6" x1="173.6" y1="467.4" x2="175.7" y2="467.4"/>
+<path class="st7" d="M212.4,422.1"/>
+<path class="st7" d="M203.8,442.1"/>
+<line class="st4" x1="431.4" y1="370.6" x2="431.4" y2="409.6"/>
+<line class="st4" x1="431.4" y1="343" x2="431.4" y2="366.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="431.4" y1="374.3" x2="426.1" y2="381.5"/>
+	<line class="st4" x1="437" y1="381.5" x2="431.1" y2="374.4"/>
+	<line class="st4" x1="431.4" y1="379.1" x2="426.1" y2="386.4"/>
+	<line class="st4" x1="437" y1="386.4" x2="431.1" y2="379.2"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="431.1" y1="423.5" x2="436.3" y2="416.3"/>
+	<line class="st4" x1="425.5" y1="416.3" x2="431.4" y2="423.4"/>
+	<line class="st4" x1="431.1" y1="418.7" x2="436.3" y2="411.4"/>
+	<line class="st4" x1="425.5" y1="411.4" x2="431.4" y2="418.6"/>
+</g>
+<line class="st4" x1="492.6" y1="342.9" x2="492.6" y2="366.2"/>
+<line class="st6" x1="480.1" y1="421.2" x2="510.3" y2="421.2"/>
+<line class="st4" x1="683.7" y1="342.7" x2="683.7" y2="366"/>
+<line class="st4" x1="790.8" y1="343.1" x2="790.8" y2="366.4"/>
+<line class="st4" x1="1038.8" y1="343" x2="1038.7" y2="368.6"/>
+<text transform="matrix(1 0 0 1 189.0005 334.0032)" class="st8 st1 st9">36</text>
+<text transform="matrix(1 0 0 1 189.0005 334.0032)" class="st6 st10 st9">36</text>
+<text transform="matrix(1 0 0 1 274.8379 334.0032)" class="st8 st1 st9">34</text>
+<text transform="matrix(1 0 0 1 274.8379 334.0032)" class="st6 st10 st9">34</text>
+<text transform="matrix(1 0 0 1 350.3413 334.0032)" class="st8 st1 st9"> 浜�03</text>
+<text transform="matrix(1 0 0 1 350.3413 334.0032)" class="st6 st10 st9"> </text>
+<text transform="matrix(1 0 0 1 353.0413 334.2049)" class="st6 st1 st9">浜�</text>
+<text transform="matrix(1 0 0 1 363.6413 334.0032)" class="st6 st10 st9">03</text>
+<text transform="matrix(1 0 0 1 420.9443 334.0032)" class="st8 st1 st9"> 30</text>
+<text transform="matrix(1 0 0 1 420.9443 334.0032)" class="st6 st10 st9"> 30</text>
+<text transform="matrix(1 0 0 1 491.1338 334.0032)" class="st8 st1 st9">35</text>
+<text transform="matrix(1 0 0 1 491.1338 334.0032)" class="st6 st10 st9">35</text>
+<text transform="matrix(1 0 0 1 559.7627 334.0032)" class="st8 st1 st9">39</text>
+<text transform="matrix(1 0 0 1 559.7627 334.0032)" class="st6 st10 st9">39</text>
+<text transform="matrix(1 0 0 1 783.3477 334.0032)" class="st8 st1 st9">37</text>
+<text transform="matrix(1 0 0 1 783.3477 334.0032)" class="st6 st10 st9">37</text>
+<text transform="matrix(1 0 0 1 680.668 334.0032)" class="st8 st1 st9">31</text>
+<text transform="matrix(1 0 0 1 680.668 334.0032)" class="st6 st10 st9">31</text>
+<text transform="matrix(1 0 0 1 933.835 334.6379)" class="st8 st1 st9">233</text>
+<text transform="matrix(1 0 0 1 933.835 334.6379)" class="st6 st10 st9">233</text>
+<text transform="matrix(1 0 0 1 1031.54 334.6379)" class="st8 st1 st9">237</text>
+<text transform="matrix(1 0 0 1 1031.54 334.6379)" class="st6 st10 st9">237</text>
+<text transform="matrix(1 0 0 1 1108.1162 335.0032)" class="st8 st1 st9">234</text>
+<text transform="matrix(1 0 0 1 1108.1162 335.0032)" class="st6 st10 st9">234</text>
+<text transform="matrix(1 0 0 1 1182.043 334.5217)" class="st8 st1 st9">236</text>
+<text transform="matrix(1 0 0 1 1182.043 334.5217)" class="st6 st10 st9">236</text>
+<text transform="matrix(1 0 0 1 44.874 46.3831)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 44.874 46.3831)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 339.957 60.4106)" class="st1 st12"> 110kv</text>
+<text transform="matrix(1 0 0 1 402.9 60.4109)" class="st1 st12">姣嶇嚎</text>
+<line class="st13" x1="241.6" y1="41.6" x2="759.4" y2="41.6"/>
+<text transform="matrix(1 0 0 1 58.0015 74.5823)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 58.0015 74.5823)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 63.0835 74.5823)" class="st8 st1 st12">                   </text>
+<text transform="matrix(1 0 0 1 63.0835 74.5823)" class="st6 st1 st12">                   </text>
+<text transform="matrix(1 0 0 1 147.5703 75.5823)" class="st1 st14">110kv</text>
+<text transform="matrix(1 0 0 1 184.1768 75.9338)" class="st1 st14">渚х數鍘�</text>
+<text transform="matrix(1 0 0 1 159.7 92.7003)" class="st1 st14"> Ua</text>
+<text transform="matrix(1 0 0 1 163.0015 108.5061)" class="st1 st14">Ub</text>
+<text transform="matrix(1 0 0 1 163.0015 123.9702)" class="st1 st14">Uc</text>
+<text transform="matrix(1 0 0 1 279.7454 231.0806)" class="st1 st14"> Uab</text>
+<text transform="matrix(1 0 0 1 279.7454 248.5416)" class="st1 st14"> Ubc</text>
+<text transform="matrix(1 0 0 1 279.7454 266.0045)" class="st1 st14"> Uac</text>
+<text transform="matrix(1 0 0 1 616.3359 70.7708)" class="st1 st14">110kv</text>
+<text transform="matrix(1 0 0 1 652.9424 70.1233)" class="st1 st14">渚х數娴佸強鍔熺巼</text>
+<text transform="matrix(1 0 0 1 620.6699 91.3489)" class="st1 st14">Ia   </text>
+<text transform="matrix(1 0 0 1 620.6699 105.8303)" class="st1 st14">Ib   </text>
+<text transform="matrix(1 0 0 1 621.6699 121.5969)" class="st1 st14">Ic     </text>
+<text transform="matrix(1 0 0 1 627.6699 137.0774)" class="st1 st14">P   </text>
+<text transform="matrix(1 0 0 1 627.6699 153.5393)" class="st1 st14">Q    </text>
+<text transform="matrix(1 0 0 1 617.6699 169.0502)" class="st1 st14">cos   </text>
+<text transform="matrix(1 0 0 1 562.7197 217.1656)" class="st1 st14">涓诲彉娌归潰娓╁害</text>
+<text id="ZB_wd" transform="matrix(1 0 0 1 645.0308 217.4094)" class="st15 st1 st14">15###.##</text>
+<text transform="matrix(1 0 0 1 707.1167 217.1656)" class="st1 st14">搴�</text>
+<text transform="matrix(1 0 0 1 562.7197 233.6276)" class="st1 st14">涓诲彉缁曠粍娓╁害</text>
+<text transform="matrix(1 0 0 1 632.0308 233.8713)" class="st15 st1 st14">  16###.##    </text>
+<text transform="matrix(1 0 0 1 707.1167 233.6276)" class="st1 st14">搴�</text>
+<text transform="matrix(1 0 0 1 588 251.0002)" class="st1 st14">涓诲彉妗d綅</text>
+<text id="ZB_dw" transform="matrix(1 0 0 1 644.5938 251.3342)" class="st15 st1 st14">17###.##</text>
+<text transform="matrix(1 0 0 1 707.3607 251.0905)" class="st1 st14">妗�</text>
+<text transform="matrix(0.7963 0 0 1 271.8271 30.6133)" class="st1 st16">褰撴棩绱鐢ㄧ數閲�</text>
+<text id="ZD_ds" transform="matrix(1.0741 0 0 1 389.3999 30.6133)" class="st15 st1 st17">1######.##</text>
+<line class="st6" x1="462.1" y1="90.3" x2="469.8" y2="90.3"/>
+<line class="st6" x1="463.1" y1="92.7" x2="468.9" y2="92.7"/>
+<line class="st6" x1="464.6" y1="95.4" x2="466.9" y2="95.4"/>
+<line class="st6" x1="505" y1="64.6" x2="487.8" y2="64.6"/>
+<line class="st6" x1="496.4" y1="84.1" x2="479.2" y2="84.1"/>
+<line class="st4" x1="496" y1="43.6" x2="496" y2="306.8"/>
+<line class="st6" x1="479.4" y1="90.4" x2="479.4" y2="77.9"/>
+<line class="st6" x1="473.3" y1="84.3" x2="476.8" y2="77.9"/>
+<line class="st6" x1="465.9" y1="84.2" x2="473.3" y2="84.3"/>
+<line class="st6" x1="465.9" y1="90.5" x2="465.9" y2="84.3"/>
+<rect x="490.4" y="101.2" class="st18" width="11.8" height="21.4"/>
+<text transform="matrix(0.8166 0 0 1 144.4053 550.6924)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 144.4053 566.9219)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 144.4053 583.6611)" class="st19 st10 st20">Ic</text>
+<text id="AH00_ia" transform="matrix(0.8166 0 0 1 156.0889 551.6924)" class="st19 st10 st20">30A###.##</text>
+<text id="AH00_ib" transform="matrix(0.8166 0 0 1 156.0889 567.3301)" class="st19 st10 st20">31B###.##</text>
+<text id="AH00_ic" transform="matrix(0.8166 0 0 1 156.0889 583.6611)" class="st19 st10 st20">32C###.##</text>
+<line class="st4" x1="101.2" y1="416.6" x2="101.5" y2="505.2"/>
+<line class="st4" x1="101.2" y1="372.8" x2="101.2" y2="411.9"/>
+<line class="st4" x1="101.2" y1="345.1" x2="101.2" y2="368.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="101.2" y1="376.5" x2="95.9" y2="383.7"/>
+	<line class="st4" x1="106.7" y1="383.7" x2="100.9" y2="376.6"/>
+	<line class="st4" x1="101.2" y1="381.3" x2="95.9" y2="388.6"/>
+	<line class="st4" x1="106.7" y1="388.6" x2="100.9" y2="381.4"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="100.9" y1="425.7" x2="106.1" y2="418.5"/>
+	<line class="st4" x1="95.3" y1="418.5" x2="101.2" y2="425.6"/>
+	<line class="st4" x1="100.9" y1="420.9" x2="106.1" y2="413.6"/>
+	<line class="st4" x1="95.3" y1="413.6" x2="101.2" y2="420.8"/>
+</g>
+<rect x="79.2" y="432.7" class="st5" width="10.1" height="18.2"/>
+<line class="st6" x1="84.3" y1="436.4" x2="80.9" y2="446.2"/>
+<line class="st6" x1="80.9" y1="446.2" x2="87.8" y2="446.2"/>
+<line class="st6" x1="87.8" y1="446.2" x2="84.3" y2="436.4"/>
+<line class="st6" x1="84.3" y1="441.9" x2="84.4" y2="464.2"/>
+<line class="st6" x1="84.4" y1="423.4" x2="84.4" y2="432.7"/>
+<line class="st6" x1="80.9" y1="464.2" x2="87.8" y2="464.2"/>
+<line class="st6" x1="81.9" y1="466.3" x2="87" y2="466.3"/>
+<line class="st6" x1="83.2" y1="468.7" x2="85.3" y2="468.7"/>
+<line class="st6" x1="95.3" y1="456.2" x2="107.6" y2="456.2"/>
+<line class="st6" x1="95.3" y1="456.2" x2="101.2" y2="465.2"/>
+<line class="st6" x1="101.2" y1="465.2" x2="107.6" y2="456.2"/>
+<path class="st7" d="M119.9,423.4"/>
+<path class="st7" d="M111.4,443.5"/>
+<text transform="matrix(1 0 0 1 80.9502 334.0032)" class="st8 st1 st9">鎵�03</text>
+<text transform="matrix(1 0 0 1 80.9502 334.2049)" class="st6 st1 st9">鎵�</text>
+<text transform="matrix(1 0 0 1 91.6502 334.0032)" class="st6 st10 st9">03</text>
+<line class="st6" x1="116.5" y1="464.1" x2="123.4" y2="464.1"/>
+<line class="st6" x1="117.4" y1="466.2" x2="122.6" y2="466.2"/>
+<line class="st6" x1="118.7" y1="468.6" x2="120.8" y2="468.6"/>
+<g>
+	<line class="st21" x1="119.9" y1="423.2" x2="119.9" y2="442.1"/>
+</g>
+<g>
+	<line class="st21" x1="123.2" y1="442" x2="117.4" y2="442"/>
+</g>
+<g>
+	<line class="st21" x1="117.3" y1="443.9" x2="120.1" y2="448.9"/>
+</g>
+<g>
+	<line class="st21" x1="119.9" y1="448.7" x2="119.9" y2="463.8"/>
+</g>
+<rect x="189" y="381.6" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="193.6" y1="415.2" x2="193.9" y2="506.2"/>
+<line class="st6" x1="187.8" y1="454.8" x2="200.1" y2="454.8"/>
+<line class="st6" x1="187.8" y1="454.8" x2="193.6" y2="463.8"/>
+<line class="st6" x1="193.6" y1="463.8" x2="200.1" y2="454.8"/>
+<g>
+	<line class="st21" x1="212.4" y1="421.8" x2="212.4" y2="440.7"/>
+</g>
+<g>
+	<line class="st21" x1="215.7" y1="440.6" x2="209.8" y2="440.6"/>
+</g>
+<g>
+	<line class="st21" x1="209.8" y1="442.5" x2="212.6" y2="447.5"/>
+</g>
+<g>
+	<line class="st21" x1="212.4" y1="447.3" x2="212.4" y2="462.3"/>
+</g>
+<line class="st22" x1="84.4" y1="423.4" x2="119.9" y2="423.4"/>
+<line class="st6" x1="174.8" y1="422.1" x2="212.4" y2="422.1"/>
+<line class="st4" x1="280.3" y1="399.2" x2="280.3" y2="409.1"/>
+<line class="st4" x1="280.3" y1="370.5" x2="280.3" y2="380.9"/>
+<line class="st4" x1="280.3" y1="342.8" x2="280.3" y2="366.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="280.3" y1="374.2" x2="275" y2="381.4"/>
+	<line class="st4" x1="285.9" y1="381.4" x2="280" y2="374.2"/>
+	<line class="st4" x1="280.3" y1="379" x2="275" y2="386.2"/>
+	<line class="st4" x1="285.9" y1="386.2" x2="280" y2="379.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="280" y1="423.4" x2="285.3" y2="416.1"/>
+	<line class="st4" x1="274.4" y1="416.1" x2="280.3" y2="423.3"/>
+	<line class="st4" x1="280" y1="418.5" x2="285.3" y2="411.3"/>
+	<line class="st4" x1="274.4" y1="411.3" x2="280.3" y2="418.5"/>
+</g>
+<rect x="258.3" y="430.4" class="st5" width="10.1" height="18.2"/>
+<line class="st6" x1="263.4" y1="434.1" x2="260.1" y2="443.9"/>
+<line class="st6" x1="260.1" y1="443.9" x2="266.9" y2="443.9"/>
+<line class="st6" x1="266.9" y1="443.9" x2="263.4" y2="434.1"/>
+<line class="st6" x1="263.4" y1="439.5" x2="263.5" y2="461.9"/>
+<line class="st6" x1="263.5" y1="421.1" x2="263.5" y2="430.4"/>
+<line class="st6" x1="260.1" y1="461.9" x2="266.9" y2="461.9"/>
+<line class="st6" x1="261" y1="464" x2="266.2" y2="464"/>
+<line class="st6" x1="262.3" y1="466.4" x2="264.4" y2="466.4"/>
+<path class="st7" d="M299.1,421.1"/>
+<path class="st7" d="M290.5,441.1"/>
+<rect x="275.7" y="380.6" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="280.3" y1="414.2" x2="280.6" y2="505.2"/>
+<line class="st6" x1="274.4" y1="453.8" x2="286.7" y2="453.8"/>
+<line class="st6" x1="274.4" y1="453.8" x2="280.3" y2="462.8"/>
+<line class="st6" x1="280.3" y1="462.8" x2="286.7" y2="453.8"/>
+<g>
+	<line class="st21" x1="299.1" y1="420.8" x2="299.1" y2="439.7"/>
+</g>
+<g>
+	<line class="st21" x1="302.3" y1="439.6" x2="296.5" y2="439.6"/>
+</g>
+<g>
+	<line class="st21" x1="296.4" y1="441.5" x2="299.2" y2="446.5"/>
+</g>
+<g>
+	<line class="st21" x1="299.1" y1="446.3" x2="299.1" y2="461.3"/>
+</g>
+<line class="st6" x1="263.5" y1="421.1" x2="299.1" y2="421.1"/>
+<line class="st4" x1="363.4" y1="343.8" x2="363.4" y2="367.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="363.9" y1="375.8" x2="361.2" y2="378.5"/>
+	<line class="st4" x1="365.9" y1="378.5" x2="362.8" y2="375.8"/>
+	<line class="st4" x1="363.9" y1="378.9" x2="361.2" y2="381.6"/>
+	<line class="st4" x1="365.9" y1="381.6" x2="362.8" y2="378.9"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="363" y1="390.1" x2="365.8" y2="387.4"/>
+	<line class="st4" x1="361.1" y1="387.4" x2="364.2" y2="390.1"/>
+	<line class="st4" x1="363" y1="387" x2="365.8" y2="384.4"/>
+	<line class="st4" x1="361.1" y1="384.4" x2="364.2" y2="387"/>
+</g>
+<line class="st23" x1="363.4" y1="370.3" x2="363.4" y2="376.5"/>
+<line class="st23" x1="364" y1="384" x2="350.8" y2="384"/>
+<line class="st23" x1="363.4" y1="380.9" x2="363.4" y2="384"/>
+<line class="st23" x1="365.2" y1="390" x2="365.2" y2="405.1"/>
+<line class="st23" x1="361.4" y1="390.2" x2="361.4" y2="405.3"/>
+<line class="st23" x1="361.6" y1="405" x2="365.5" y2="405"/>
+<line class="st23" x1="361.1" y1="390.2" x2="365" y2="390.2"/>
+<line class="st23" x1="363" y1="384.5" x2="363" y2="420.8"/>
+<path class="st24" d="M367.4,424.3c-1.3,0-2.3-1-2.3-2.2s1.1-2.2,2.3-2.2c1.3,0,2.4,1,2.4,2.2S368.7,424.3,367.4,424.3"/>
+<text transform="matrix(1 0 0 1 366.1143 422.8147)" class="st8 st1 st25">Q</text>
+<text transform="matrix(1 0 0 1 366.1143 422.8147)" class="st6 st1 st25">Q</text>
+<path class="st24" d="M363,422.4c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5S364.5,422.4,363,422.4"/>
+<line class="st6" x1="363.1" y1="418.2" x2="363.1" y2="419.9"/>
+<line class="st6" x1="363.1" y1="419.7" x2="364.1" y2="421"/>
+<line class="st6" x1="363" y1="420" x2="362" y2="421.3"/>
+<path class="st24" d="M363.1,424.9c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5C365.8,423.8,364.6,424.9,363.1,424.9"/>
+<line class="st26" x1="363.2" y1="420.7" x2="363.2" y2="422.4"/>
+<line class="st26" x1="363.2" y1="422.2" x2="364.2" y2="423.5"/>
+<line class="st26" x1="363.1" y1="422.4" x2="362.1" y2="423.8"/>
+<line class="st4" x1="431.4" y1="413.7" x2="431.4" y2="508"/>
+<line class="st23" x1="412.2" y1="419.2" x2="431" y2="419.2"/>
+<line class="st23" x1="410.2" y1="419.2" x2="431" y2="419.2"/>
+<line class="st4" x1="494.3" y1="413.8" x2="494.3" y2="468"/>
+<path class="st7" d="M502.2,434.1"/>
+<line class="st6" x1="488.2" y1="454.1" x2="500.5" y2="454.1"/>
+<line class="st6" x1="488.2" y1="454.1" x2="494" y2="463.1"/>
+<line class="st6" x1="494" y1="463.1" x2="500.5" y2="454.1"/>
+<g>
+	<line class="st21" x1="509.7" y1="421.2" x2="509.7" y2="437"/>
+</g>
+<g>
+	<line class="st21" x1="512.9" y1="427.8" x2="507.1" y2="427.8"/>
+</g>
+<g>
+	<line class="st21" x1="507.1" y1="438.4" x2="509.9" y2="442.6"/>
+</g>
+<g>
+	<line class="st21" x1="509.7" y1="442.4" x2="509.7" y2="455"/>
+</g>
+<line class="st6" x1="506.3" y1="454.5" x2="513.2" y2="454.5"/>
+<line class="st6" x1="507.2" y1="456.3" x2="512.4" y2="456.3"/>
+<line class="st6" x1="508.5" y1="458.2" x2="510.6" y2="458.2"/>
+<line class="st4" x1="431.4" y1="508" x2="928.5" y2="508"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="492.9" y1="374" x2="487.6" y2="381.3"/>
+	<line class="st4" x1="498.4" y1="381.3" x2="492.6" y2="374.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="493.8" y1="423.1" x2="499" y2="415.9"/>
+	<line class="st4" x1="488.2" y1="415.9" x2="494.1" y2="423"/>
+</g>
+<line class="st4" x1="564" y1="343.2" x2="564" y2="366.5"/>
+<line class="st6" x1="550.5" y1="421.5" x2="580.7" y2="421.5"/>
+<line class="st4" x1="564.7" y1="414.1" x2="564.7" y2="468.3"/>
+<path class="st7" d="M572.5,434.4"/>
+<line class="st6" x1="558.6" y1="454.3" x2="570.9" y2="454.3"/>
+<line class="st6" x1="558.6" y1="454.3" x2="564.4" y2="463.4"/>
+<line class="st6" x1="564.4" y1="463.4" x2="570.9" y2="454.3"/>
+<g>
+	<line class="st21" x1="580.1" y1="421.5" x2="580.1" y2="437.3"/>
+</g>
+<g>
+	<line class="st21" x1="583.3" y1="428.1" x2="577.5" y2="428.1"/>
+</g>
+<g>
+	<line class="st21" x1="577.5" y1="438.7" x2="580.3" y2="442.9"/>
+</g>
+<g>
+	<line class="st21" x1="580.1" y1="442.7" x2="580.1" y2="455.3"/>
+</g>
+<line class="st6" x1="576.7" y1="454.8" x2="583.5" y2="454.8"/>
+<line class="st6" x1="577.6" y1="456.6" x2="582.8" y2="456.6"/>
+<line class="st6" x1="578.9" y1="458.5" x2="581" y2="458.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M581.1,384.8"/>
+	<path class="st27" d="M580.8,384.8"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="564.2" y1="376.3" x2="559" y2="383.6"/>
+	<line class="st4" x1="569.8" y1="383.6" x2="564" y2="376.4"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="564.2" y1="423.4" x2="569.4" y2="416.2"/>
+	<line class="st4" x1="558.6" y1="416.2" x2="564.4" y2="423.3"/>
+</g>
+<line class="st23" x1="350.9" y1="383.7" x2="350.9" y2="399.1"/>
+<line class="st23" x1="353.7" y1="395.5" x2="353.7" y2="410.1"/>
+<line class="st23" x1="347.6" y1="395.7" x2="347.6" y2="410.3"/>
+<line class="st28" x1="347.6" y1="410.1" x2="353.7" y2="410.1"/>
+<line class="st28" x1="347.6" y1="395.7" x2="353.7" y2="395.7"/>
+<line class="st28" x1="350.6" y1="410.1" x2="350.6" y2="414.7"/>
+<line class="st6" x1="347.1" y1="414.8" x2="353.8" y2="414.8"/>
+<line class="st6" x1="348" y1="417" x2="353.1" y2="417"/>
+<line class="st6" x1="349.3" y1="419.3" x2="351.3" y2="419.3"/>
+<line class="st23" x1="410.2" y1="419.2" x2="410.2" y2="433"/>
+<line class="st23" x1="413.2" y1="429.3" x2="413.2" y2="444"/>
+<line class="st23" x1="406.7" y1="429.5" x2="406.7" y2="444.2"/>
+<line class="st23" x1="406.7" y1="444" x2="413.2" y2="444"/>
+<line class="st23" x1="406.7" y1="429.5" x2="413.2" y2="429.5"/>
+<line class="st23" x1="409.9" y1="444" x2="409.9" y2="448.6"/>
+<line class="st6" x1="406.2" y1="448.7" x2="413.3" y2="448.7"/>
+<line class="st6" x1="407.1" y1="450.9" x2="412.5" y2="450.9"/>
+<line class="st6" x1="408.5" y1="453.2" x2="410.7" y2="453.2"/>
+<line class="st23" x1="480.2" y1="420.5" x2="480.2" y2="436.1"/>
+<path class="st6" d="M456,436.3"/>
+<path class="st6" d="M455.9,436.1"/>
+<line class="st23" x1="483.2" y1="432.4" x2="483.2" y2="447.1"/>
+<line class="st23" x1="476.7" y1="432.6" x2="476.7" y2="447.3"/>
+<line class="st23" x1="476.7" y1="447.1" x2="483.2" y2="447.1"/>
+<line class="st23" x1="476.7" y1="432.6" x2="483.2" y2="432.6"/>
+<line class="st28" x1="479.9" y1="447.1" x2="479.9" y2="451.7"/>
+<line class="st6" x1="476.2" y1="451.9" x2="483.3" y2="451.9"/>
+<line class="st6" x1="477.1" y1="454" x2="482.5" y2="454"/>
+<line class="st6" x1="478.5" y1="456.3" x2="480.7" y2="456.3"/>
+<line class="st23" x1="550.8" y1="421.7" x2="550.8" y2="437.3"/>
+<line class="st23" x1="553.5" y1="433.4" x2="553.5" y2="448.1"/>
+<line class="st23" x1="546.9" y1="433.6" x2="546.9" y2="448.3"/>
+<line class="st23" x1="546.9" y1="448.1" x2="553.5" y2="448.1"/>
+<line class="st23" x1="546.9" y1="433.6" x2="553.4" y2="433.6"/>
+<line class="st23" x1="550.1" y1="448.1" x2="550.1" y2="452.7"/>
+<line class="st6" x1="546.4" y1="452.9" x2="553.6" y2="452.9"/>
+<line class="st6" x1="547.3" y1="455" x2="552.8" y2="455"/>
+<line class="st6" x1="548.7" y1="457.3" x2="550.9" y2="457.3"/>
+<line class="st4" x1="683.6" y1="398.4" x2="683.6" y2="408.4"/>
+<line class="st4" x1="683.6" y1="369.7" x2="683.6" y2="380.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="683.6" y1="373.4" x2="678.3" y2="380.6"/>
+	<line class="st4" x1="689.1" y1="380.6" x2="683.3" y2="373.5"/>
+	<line class="st4" x1="683.6" y1="378.2" x2="678.3" y2="385.5"/>
+	<line class="st4" x1="689.1" y1="385.5" x2="683.3" y2="378.3"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="683.3" y1="422.6" x2="688.5" y2="415.4"/>
+	<line class="st4" x1="677.7" y1="415.4" x2="683.6" y2="422.5"/>
+	<line class="st4" x1="683.3" y1="417.8" x2="688.5" y2="410.5"/>
+	<line class="st4" x1="677.7" y1="410.5" x2="683.6" y2="417.7"/>
+</g>
+<path class="st7" d="M702.3,420.4"/>
+<path class="st7" d="M693.8,440.4"/>
+<rect x="679" y="379.8" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="683.6" y1="413.4" x2="683.9" y2="494.9"/>
+<line class="st6" x1="677.7" y1="452.5" x2="690" y2="452.5"/>
+<line class="st6" x1="677.7" y1="452.5" x2="683.6" y2="442.1"/>
+<line class="st6" x1="683.6" y1="442.1" x2="690" y2="452.5"/>
+<line class="st6" x1="666.8" y1="420.4" x2="683.6" y2="420.4"/>
+<line class="st23" x1="666.9" y1="420" x2="666.9" y2="435.6"/>
+<line class="st23" x1="669.9" y1="431.9" x2="669.9" y2="446.6"/>
+<line class="st23" x1="663.4" y1="432.1" x2="663.4" y2="446.8"/>
+<line class="st23" x1="663.4" y1="446.6" x2="669.9" y2="446.6"/>
+<line class="st23" x1="663.4" y1="432.1" x2="669.9" y2="432.1"/>
+<line class="st23" x1="666.6" y1="446.6" x2="666.6" y2="451.2"/>
+<line class="st6" x1="662.9" y1="451.3" x2="670" y2="451.3"/>
+<line class="st6" x1="663.8" y1="453.5" x2="669.2" y2="453.5"/>
+<line class="st6" x1="665.2" y1="455.8" x2="667.4" y2="455.8"/>
+<line class="st4" x1="791.1" y1="400.3" x2="791.1" y2="410.3"/>
+<line class="st4" x1="791.1" y1="371.6" x2="791.1" y2="382"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="791.1" y1="375.3" x2="785.9" y2="382.5"/>
+	<line class="st4" x1="796.7" y1="382.5" x2="790.9" y2="375.3"/>
+	<line class="st4" x1="791.1" y1="380.1" x2="785.9" y2="387.3"/>
+	<line class="st4" x1="796.7" y1="387.3" x2="790.9" y2="380.2"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="790.9" y1="424.5" x2="796.1" y2="417.2"/>
+	<line class="st4" x1="785.3" y1="417.2" x2="791.1" y2="424.4"/>
+	<line class="st4" x1="790.9" y1="419.6" x2="796.1" y2="412.4"/>
+	<line class="st4" x1="785.3" y1="412.4" x2="791.1" y2="419.6"/>
+</g>
+<path class="st7" d="M801.3,442.2"/>
+<rect x="786.5" y="381.7" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="791.1" y1="415.3" x2="791.5" y2="468"/>
+<line class="st6" x1="785.3" y1="454.3" x2="797.6" y2="454.3"/>
+<line class="st6" x1="785.3" y1="454.3" x2="791.1" y2="464.6"/>
+<line class="st6" x1="791.1" y1="464.6" x2="797.6" y2="454.3"/>
+<line class="st6" x1="774.4" y1="422.2" x2="809" y2="422.2"/>
+<line class="st23" x1="774.5" y1="421.9" x2="774.5" y2="437.4"/>
+<line class="st23" x1="777.5" y1="433.8" x2="777.5" y2="448.5"/>
+<line class="st23" x1="771" y1="434" x2="771" y2="448.7"/>
+<line class="st23" x1="771" y1="448.4" x2="777.5" y2="448.4"/>
+<line class="st23" x1="771" y1="434" x2="777.4" y2="434"/>
+<line class="st23" x1="774.2" y1="448.5" x2="774.2" y2="453.1"/>
+<line class="st6" x1="770.4" y1="453.2" x2="777.6" y2="453.2"/>
+<line class="st6" x1="771.4" y1="455.4" x2="776.8" y2="455.4"/>
+<line class="st6" x1="772.7" y1="457.7" x2="774.9" y2="457.7"/>
+<g>
+	<line class="st21" x1="809" y1="421.5" x2="809" y2="435.7"/>
+</g>
+<g>
+	<line class="st21" x1="812.2" y1="435.6" x2="806.4" y2="435.6"/>
+</g>
+<g>
+	<line class="st21" x1="806.4" y1="437" x2="809.1" y2="440.7"/>
+</g>
+<g>
+	<line class="st21" x1="809" y1="440.6" x2="809" y2="451.9"/>
+</g>
+<line class="st6" x1="805.6" y1="451.9" x2="812.4" y2="451.9"/>
+<line class="st6" x1="806.5" y1="454.4" x2="811.7" y2="454.4"/>
+<line class="st6" x1="807.8" y1="456.2" x2="809.9" y2="456.2"/>
+<line class="st4" x1="650.1" y1="494.8" x2="684.3" y2="494.5"/>
+<line class="st4" x1="650" y1="305.8" x2="650.3" y2="494.8"/>
+<line class="st4" x1="928.2" y1="420.8" x2="928.5" y2="508.1"/>
+<path class="st27" d="M943.8,401.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M948.7,413.4"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="927.7" y1="383.8" x2="922.5" y2="391"/>
+	<line class="st4" x1="933.3" y1="391" x2="927.4" y2="383.8"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="927.9" y1="429.8" x2="933.1" y2="422.6"/>
+	<line class="st4" x1="922.3" y1="422.6" x2="928.2" y2="429.8"/>
+</g>
+<line class="st4" x1="927.2" y1="342.7" x2="927.5" y2="375.2"/>
+<line class="st6" x1="1025.3" y1="424.7" x2="1055.5" y2="424.7"/>
+<line class="st4" x1="1039.5" y1="417.3" x2="1039.5" y2="471.5"/>
+<path class="st7" d="M1047.4,437.7"/>
+<line class="st6" x1="1033.4" y1="457.6" x2="1045.7" y2="457.6"/>
+<line class="st6" x1="1033.4" y1="457.6" x2="1039.2" y2="466.6"/>
+<line class="st6" x1="1039.2" y1="466.6" x2="1045.7" y2="457.6"/>
+<g>
+	<line class="st21" x1="1054.9" y1="424.7" x2="1054.9" y2="440.5"/>
+</g>
+<g>
+	<line class="st21" x1="1058.1" y1="431.3" x2="1052.3" y2="431.3"/>
+</g>
+<g>
+	<line class="st21" x1="1052.3" y1="441.9" x2="1055.1" y2="446.1"/>
+</g>
+<g>
+	<line class="st21" x1="1054.9" y1="445.9" x2="1054.9" y2="458.5"/>
+</g>
+<line class="st6" x1="1051.5" y1="458" x2="1058.4" y2="458"/>
+<line class="st6" x1="1052.4" y1="459.8" x2="1057.6" y2="459.8"/>
+<line class="st6" x1="1053.7" y1="461.8" x2="1055.8" y2="461.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M1050.6,414"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1039.1" y1="377.6" x2="1033.8" y2="384.8"/>
+	<line class="st4" x1="1044.6" y1="384.8" x2="1038.8" y2="377.6"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1039" y1="426.6" x2="1044.2" y2="419.4"/>
+	<line class="st4" x1="1033.4" y1="419.4" x2="1039.3" y2="426.6"/>
+</g>
+<line class="st23" x1="1025.4" y1="424.3" x2="1025.4" y2="439.9"/>
+<line class="st23" x1="1028.4" y1="436.2" x2="1028.4" y2="450.9"/>
+<line class="st23" x1="1021.9" y1="436.4" x2="1021.9" y2="451.1"/>
+<line class="st23" x1="1021.9" y1="450.9" x2="1028.4" y2="450.9"/>
+<line class="st23" x1="1021.9" y1="436.4" x2="1028.4" y2="436.4"/>
+<line class="st23" x1="1025.1" y1="450.9" x2="1025.1" y2="455.5"/>
+<line class="st6" x1="1021.4" y1="455.6" x2="1028.5" y2="455.6"/>
+<line class="st6" x1="1022.3" y1="457.8" x2="1027.7" y2="457.8"/>
+<line class="st6" x1="1023.7" y1="460.1" x2="1025.9" y2="460.1"/>
+<line class="st4" x1="1116.4" y1="344" x2="1116.3" y2="369.6"/>
+<line class="st6" x1="1104.9" y1="425.7" x2="1135.1" y2="425.7"/>
+<line class="st4" x1="1119.1" y1="418.4" x2="1119.1" y2="472.5"/>
+<path class="st7" d="M1126.9,438.7"/>
+<line class="st6" x1="1113" y1="458.6" x2="1125.3" y2="458.6"/>
+<line class="st6" x1="1113" y1="458.6" x2="1118.8" y2="467.6"/>
+<line class="st6" x1="1118.8" y1="467.6" x2="1125.3" y2="458.6"/>
+<g>
+	<line class="st21" x1="1134.5" y1="425.7" x2="1134.5" y2="441.5"/>
+</g>
+<g>
+	<line class="st21" x1="1137.7" y1="432.4" x2="1131.9" y2="432.4"/>
+</g>
+<g>
+	<line class="st21" x1="1131.9" y1="443" x2="1134.7" y2="447.2"/>
+</g>
+<g>
+	<line class="st21" x1="1134.5" y1="447" x2="1134.5" y2="459.6"/>
+</g>
+<line class="st6" x1="1131.1" y1="459.1" x2="1137.9" y2="459.1"/>
+<line class="st6" x1="1132" y1="460.8" x2="1137.2" y2="460.8"/>
+<line class="st6" x1="1133.3" y1="462.8" x2="1135.4" y2="462.8"/>
+<line class="st29" x1="1118.1" y1="403.4" x2="1118.1" y2="411.3"/>
+<line class="st29" x1="1117.1" y1="380.8" x2="1117.1" y2="389.1"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1117.5" y1="389" x2="1112.3" y2="394.7"/>
+	<line class="st4" x1="1123.1" y1="394.7" x2="1117.2" y2="389.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1117.7" y1="420.8" x2="1123" y2="415"/>
+	<line class="st4" x1="1112.1" y1="415" x2="1118" y2="420.7"/>
+</g>
+<rect x="1113.2" y="388.7" class="st18" width="9.7" height="14.7"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1116.6" y1="381.6" x2="1111.4" y2="388.8"/>
+	<line class="st4" x1="1122.2" y1="388.8" x2="1116.4" y2="381.6"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1118.6" y1="427.6" x2="1123.8" y2="420.4"/>
+	<line class="st4" x1="1113" y1="420.4" x2="1118.8" y2="427.6"/>
+</g>
+<line class="st23" x1="1105" y1="425.4" x2="1105" y2="440.9"/>
+<line class="st23" x1="1108" y1="437.2" x2="1108" y2="452"/>
+<line class="st23" x1="1101.5" y1="437.4" x2="1101.5" y2="452.2"/>
+<line class="st23" x1="1101.5" y1="451.9" x2="1108" y2="451.9"/>
+<line class="st23" x1="1101.5" y1="437.4" x2="1108" y2="437.4"/>
+<line class="st23" x1="1104.7" y1="452" x2="1104.7" y2="456.5"/>
+<line class="st6" x1="1101" y1="456.7" x2="1108.1" y2="456.7"/>
+<line class="st6" x1="1101.9" y1="458.8" x2="1107.3" y2="458.8"/>
+<line class="st6" x1="1103.3" y1="461.1" x2="1105.5" y2="461.1"/>
+<line class="st4" x1="1189" y1="344.5" x2="1189" y2="370.1"/>
+<line class="st6" x1="1175.6" y1="426.2" x2="1205.8" y2="426.2"/>
+<line class="st4" x1="1189.8" y1="418.9" x2="1189.8" y2="473"/>
+<path class="st7" d="M1197.6,439.2"/>
+<line class="st6" x1="1183.6" y1="459.1" x2="1195.9" y2="459.1"/>
+<line class="st6" x1="1183.6" y1="459.1" x2="1189.5" y2="468.1"/>
+<line class="st6" x1="1189.5" y1="468.1" x2="1195.9" y2="459.1"/>
+<g>
+	<line class="st21" x1="1205.2" y1="426.2" x2="1205.2" y2="442"/>
+</g>
+<g>
+	<line class="st21" x1="1208.4" y1="432.9" x2="1202.5" y2="432.9"/>
+</g>
+<g>
+	<line class="st21" x1="1202.6" y1="443.5" x2="1205.3" y2="447.7"/>
+</g>
+<g>
+	<line class="st21" x1="1205.2" y1="447.5" x2="1205.2" y2="460"/>
+</g>
+<line class="st6" x1="1201.8" y1="459.6" x2="1208.6" y2="459.6"/>
+<line class="st6" x1="1202.7" y1="461.3" x2="1207.9" y2="461.3"/>
+<line class="st6" x1="1204" y1="463.3" x2="1206.1" y2="463.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M1200.8,415.5"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1189.3" y1="380.1" x2="1184.1" y2="387.3"/>
+	<line class="st4" x1="1194.9" y1="387.3" x2="1189" y2="380.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1189.2" y1="428.1" x2="1194.5" y2="420.9"/>
+	<line class="st4" x1="1183.7" y1="420.9" x2="1189.5" y2="428.1"/>
+</g>
+<line class="st23" x1="1175.7" y1="425.8" x2="1175.7" y2="441.4"/>
+<line class="st23" x1="1178.7" y1="437.7" x2="1178.7" y2="452.4"/>
+<line class="st23" x1="1172.2" y1="437.9" x2="1172.2" y2="452.6"/>
+<line class="st28" x1="1172.2" y1="452.4" x2="1178.7" y2="452.4"/>
+<line class="st23" x1="1172.2" y1="437.9" x2="1178.7" y2="437.9"/>
+<line class="st23" x1="1175.4" y1="452.4" x2="1175.4" y2="457"/>
+<line class="st6" x1="1171.6" y1="457.2" x2="1178.8" y2="457.2"/>
+<line class="st6" x1="1172.6" y1="459.3" x2="1178" y2="459.3"/>
+<line class="st6" x1="1173.9" y1="461.6" x2="1176.1" y2="461.6"/>
+<path class="st30" d="M1277.7,435"/>
+<path class="st30" d="M1277.7,435"/>
+<path class="st30" d="M1276.7,433.8"/>
+<path class="st30" d="M1261.7,424.9"/>
+<path class="st30" d="M1262.6,426"/>
+<line class="st4" x1="1277.7" y1="344.2" x2="1277.7" y2="367.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1277.5" y1="375" x2="1272.3" y2="382.3"/>
+	<line class="st4" x1="1283.1" y1="382.3" x2="1277.2" y2="375.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M1295,378.7"/>
+</g>
+<path class="st27" d="M1295.3,370.7"/>
+<line class="st6" x1="1230.2" y1="304.6" x2="1244.7" y2="304.6"/>
+<line class="st4" x1="1244.4" y1="297.2" x2="1244.4" y2="342.7"/>
+<path class="st7" d="M1252.3,317.6"/>
+<line class="st6" x1="1239.1" y1="318.6" x2="1250.3" y2="318.6"/>
+<line class="st6" x1="1239.1" y1="318.6" x2="1244.4" y2="325.1"/>
+<line class="st6" x1="1244.4" y1="325.1" x2="1250.3" y2="318.6"/>
+<line class="st23" x1="1230.2" y1="304.2" x2="1230.2" y2="314.7"/>
+<line class="st23" x1="1232" y1="315" x2="1232" y2="328.4"/>
+<line class="st23" x1="1227.2" y1="315.2" x2="1227.2" y2="328.5"/>
+<line class="st23" x1="1227.4" y1="328.3" x2="1232.4" y2="328.3"/>
+<line class="st23" x1="1226.7" y1="315.2" x2="1231.7" y2="315.2"/>
+<line class="st28" x1="1229.9" y1="328.4" x2="1229.9" y2="332.5"/>
+<line class="st6" x1="1227.9" y1="332.6" x2="1231.9" y2="332.6"/>
+<line class="st6" x1="1228.5" y1="335" x2="1231.5" y2="335"/>
+<line class="st6" x1="1229.2" y1="336.6" x2="1230.5" y2="336.6"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1244" y1="263.5" x2="1238.7" y2="270.7"/>
+	<line class="st4" x1="1249.5" y1="270.7" x2="1243.7" y2="263.5"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1243.9" y1="306.5" x2="1249.1" y2="299.3"/>
+	<line class="st4" x1="1238.3" y1="299.3" x2="1244.2" y2="306.5"/>
+</g>
+<line class="st4" x1="1243.7" y1="233.6" x2="1243.7" y2="257"/>
+<line class="st3" x1="926.2" y1="344.1" x2="1290.1" y2="344.1"/>
+<line class="st31" x1="651" y1="305.8" x2="495.5" y2="305.8"/>
+<line class="st6" x1="530.8" y1="157.3" x2="522.9" y2="157.3"/>
+<line class="st6" x1="529.7" y1="159.6" x2="523.7" y2="159.6"/>
+<line class="st6" x1="528.2" y1="162.3" x2="525.8" y2="162.3"/>
+<line class="st6" x1="495.5" y1="151" x2="513.2" y2="151"/>
+<line class="st6" x1="519" y1="157.5" x2="519" y2="145"/>
+<line class="st6" x1="526.8" y1="151.1" x2="519.3" y2="151.2"/>
+<line class="st6" x1="526.8" y1="157.4" x2="526.8" y2="151.2"/>
+<line class="st6" x1="426.1" y1="162.3" x2="494.1" y2="162.3"/>
+<line class="st6" x1="426.1" y1="175.3" x2="426.1" y2="162.8"/>
+<path class="st24" d="M430.6,178c-1.3,0-2.4-1.2-2.4-2.6c0-1.4,1.1-2.6,2.4-2.6s2.4,1.2,2.4,2.6S431.9,178,430.6,178"/>
+<text transform="matrix(0.8602 0 0 1 429.249 176.1934)" class="st8 st1 st32">Q</text>
+<text transform="matrix(0.8602 0 0 1 429.249 176.1934)" class="st6 st1 st32">Q</text>
+<line class="st6" x1="426.1" y1="170.6" x2="426.1" y2="172.7"/>
+<line class="st6" x1="426.1" y1="172.4" x2="427.2" y2="174.1"/>
+<line class="st6" x1="426.1" y1="172.7" x2="425" y2="174.4"/>
+<path class="st24" d="M426.1,178.8c-1.5,0-2.8-1.3-2.8-3s1.3-3,2.8-3s2.8,1.3,2.8,3C428.9,177.4,427.7,178.8,426.1,178.8"/>
+<line class="st26" x1="426.2" y1="173.6" x2="426.2" y2="175.7"/>
+<line class="st26" x1="426.2" y1="175.4" x2="427.3" y2="177.1"/>
+<line class="st26" x1="426.1" y1="175.8" x2="425.1" y2="177.4"/>
+<line class="st6" x1="413.3" y1="179.3" x2="421.9" y2="179.3"/>
+<line class="st6" x1="414.4" y1="181.7" x2="420.9" y2="181.7"/>
+<line class="st6" x1="417.6" y1="173.1" x2="425.8" y2="173.3"/>
+<line class="st6" x1="416" y1="184.4" x2="418.7" y2="184.4"/>
+<line class="st6" x1="417.6" y1="179.5" x2="417.6" y2="173.2"/>
+<path class="st24" d="M426.1,175.7c-1.5,0-2.8-1.3-2.8-3s1.3-3,2.8-3s2.8,1.3,2.8,3S427.6,175.7,426.1,175.7"/>
+<line class="st33" x1="505" y1="170" x2="487.8" y2="170"/>
+<line class="st6" x1="512.4" y1="151.4" x2="516" y2="145"/>
+<line class="st6" x1="417.8" y1="238.1" x2="411" y2="230.1"/>
+<line class="st6" x1="527.7" y1="197.3" x2="519.6" y2="197.3"/>
+<line class="st6" x1="526.7" y1="199.6" x2="520.5" y2="199.6"/>
+<line class="st6" x1="525.1" y1="202.3" x2="522.6" y2="202.3"/>
+<line class="st6" x1="495.8" y1="191.1" x2="509.6" y2="191.1"/>
+<line class="st6" x1="515.9" y1="197.5" x2="515.9" y2="185"/>
+<line class="st6" x1="523.6" y1="191.1" x2="515.9" y2="191.3"/>
+<line class="st6" x1="523.6" y1="197.4" x2="523.6" y2="191.2"/>
+<line class="st6" x1="509.8" y1="191.4" x2="513.3" y2="185"/>
+<path class="st34" d="M496,225.7c-5.6,0-10.2-4.5-10.2-9.9c0-5.5,4.6-9.9,10.2-9.9s10.2,4.5,10.2,9.9
+	C506.3,221.2,501.7,225.7,496,225.7"/>
+<path class="st35" d="M496.4,239.7c-5.9,0-10.6-4.6-10.6-10.3s4.8-10.3,10.6-10.3c5.9,0,10.6,4.6,10.6,10.3
+	C507,235.1,502.2,239.7,496.4,239.7"/>
+<line class="st36" x1="503.2" y1="233.9" x2="496.5" y2="222.6"/>
+<line class="st26" x1="496.6" y1="222.5" x2="489.2" y2="234.5"/>
+<line class="st26" x1="503.6" y1="234.1" x2="489.2" y2="233.9"/>
+<line class="st6" x1="428.1" y1="215.4" x2="496.1" y2="215.4"/>
+<line class="st6" x1="433.9" y1="241.9" x2="428.3" y2="236.6"/>
+<line class="st6" x1="428" y1="236.2" x2="423.2" y2="242"/>
+<line class="st6" x1="428.3" y1="236.9" x2="428.3" y2="262.3"/>
+<line class="st6" x1="423.2" y1="225.6" x2="427.9" y2="232"/>
+<line class="st6" x1="427.8" y1="232.3" x2="431.3" y2="225.3"/>
+<line class="st6" x1="427.9" y1="231.7" x2="427.9" y2="215"/>
+<line class="st23" x1="441.4" y1="223.3" x2="441.4" y2="238.3"/>
+<line class="st23" x1="443.1" y1="234.7" x2="443.1" y2="248.9"/>
+<line class="st23" x1="439.3" y1="234.9" x2="439.3" y2="249.1"/>
+<line class="st23" x1="439.3" y1="248.9" x2="443.1" y2="248.9"/>
+<line class="st23" x1="439.3" y1="234.9" x2="443.1" y2="234.9"/>
+<line class="st6" x1="410.7" y1="223" x2="441.3" y2="223"/>
+<line class="st6" x1="410.7" y1="223.3" x2="410.7" y2="231.2"/>
+<line class="st6" x1="417.9" y1="241" x2="404.1" y2="241"/>
+<line class="st6" x1="410.7" y1="240.9" x2="410.7" y2="253.5"/>
+<line class="st6" x1="409.6" y1="253.5" x2="441.8" y2="253.5"/>
+<line class="st6" x1="441.8" y1="248.5" x2="441.8" y2="253.5"/>
+<line class="st6" x1="424.5" y1="262.5" x2="431.4" y2="262.5"/>
+<line class="st6" x1="425.4" y1="264.2" x2="430.6" y2="264.2"/>
+<line class="st6" x1="426.7" y1="266.2" x2="428.8" y2="266.2"/>
+<text transform="matrix(0.907 0 0 1 922.7803 77.8848)" class="st10 st37">10KV</text>
+<text transform="matrix(0.907 0 0 1 953.9805 77.5923)" class="st1 st37">涓讳緵瀹�</text>
+<text transform="matrix(0.907 0 0 1 915.7803 105.8301)" class="st1 st37">  </text>
+<text transform="matrix(0.907 0 0 1 924.8545 105.5376)" class="st1 st37">浜屾ゼ</text>
+<text transform="matrix(0.907 0 0 1 953.9805 105.5376)" class="st1 st37">涓讳緵瀹�</text>
+<text transform="matrix(0.907 0 0 1 923.7803 137.0771)" class="st10 st37">10KV</text>
+<text transform="matrix(0.907 0 0 1 954.9805 136.7847)" class="st1 st37">澶囦緵瀹�</text>
+<text transform="matrix(0.9726 0 0 1 1020.0811 77.8848)" class="st1 st38">娓╁害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1020.0811 107.5059)" class="st1 st38">娓╁害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1020.0811 137.0771)" class="st1 st38">娓╁害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1152.7803 75.582)" class="st1 st38">婀垮害锛�</text>
+<text id="_x31_0KVWD_x5F_wd" transform="matrix(1 0 0 1 1056.5176 77.885)" class="st19 st10 st14">18###.## </text>
+<text id="_x32_ZK_x5F_WD_x5F_wd" transform="matrix(1 0 0 1 1056.5176 107.5061)" class="st19 st10 st14">19###.## </text>
+<text id="_x31_0KVB_x5F_wd" transform="matrix(1 0 0 1 1056.5176 137.0774)" class="st19 st10 st14">20###.## </text>
+<text id="_x31_0KVSD_x5F_sd" transform="matrix(1 0 0 1 1195.9385 77.885)" class="st19 st10 st14">21###.## </text>
+<text transform="matrix(0.9726 0 0 1 1152.7803 107.5059)" class="st1 st38">婀垮害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1152.7803 137.0771)" class="st1 st38">婀垮害锛�</text>
+<text id="_x32_ZKSD_x5F_sd" transform="matrix(1 0 0 1 1195.9385 107.5061)" class="st19 st10 st14">22###.## </text>
+<text id="_x31_0KVB_x5F_sd" transform="matrix(1 0 0 1 1195.9385 137.4309)" class="st19 st10 st14">23###.## </text>
+<text transform="matrix(1 0 0 1 1266.791 77.885)" class="st19 st1 st14">% </text>
+<text transform="matrix(1 0 0 1 1266.791 107.5061)" class="st19 st1 st14">% </text>
+<text transform="matrix(1 0 0 1 1265.4297 137.0774)" class="st19 st1 st14">% </text>
+<text transform="matrix(0.9434 0 0 1 977.8799 187.1885)" class="st1 st39">杩涚嚎</text>
+<text transform="matrix(0.9434 0 0 1 1002.6914 187.354)" class="st1 st39">(</text>
+<text transform="matrix(0.9434 0 0 1 1006.8418 187.1885)" class="st1 st39">澶囦緵</text>
+<text transform="matrix(0.9434 0 0 1 1031.748 187.354)" class="st1 st39">)</text>
+<text id="_x31_0KVB_x5F_ia" transform="matrix(1.0507 0 0 1 1126.9375 216.0146)" class="st15 st10 st40">     27###.##  </text>
+<text id="_x31_0KVB_x5F_ib" transform="matrix(1.0507 0 0 1 1126.9375 230.8584)" class="st15 st10 st40">     28###.## </text>
+<text id="_x31_0KVB_x5F_ic" transform="matrix(1.0507 0 0 1 1126.9375 245.7285)" class="st15 st10 st40">     29###.##</text>
+<text transform="matrix(1.0507 0 0 1 1011.9727 211.7891)" class="st19 st10 st40">Va</text>
+<text id="_x31_10KV_x5F_ua" transform="matrix(1.0507 0 0 1 1029.3936 211.7891)" class="st19 st10 st40">  24###.##</text>
+<text transform="matrix(1.0507 0 0 1 1011.9727 230.7861)" class="st19 st10 st40">Vb</text>
+<text id="_x31_10KV_x5F_ub" transform="matrix(1.0507 0 0 1 1028.3936 230.7861)" class="st19 st10 st40">  25###.##</text>
+<text transform="matrix(1.0507 0 0 1 1011.2891 248.8857)" class="st19 st10 st40">Vc</text>
+<text id="_x31_10KV_x5F_uc" transform="matrix(1.0507 0 0 1 1022.9922 248.8857)" class="st19 st1 st40">  26###.##</text>
+<text transform="matrix(0.9013 0 0 1 1267.2754 335.7031)" class="st8 st1 st41">浜�</text>
+<text transform="matrix(0.9013 0 0 1 1267.2754 335.7031)" class="st6 st1 st41">浜�</text>
+<text transform="matrix(1 0 0 1 53.0977 297.6213)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 53.0977 297.6213)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 53.0977 297.135)" class="st10 st12">10kV1</text>
+<text transform="matrix(1 0 0 1 98.4787 296.567)" class="st1 st12">娈垫瘝绾�</text>
+<text transform="matrix(1 0 0 1 874.0977 309.76)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 874.0977 309.76)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 891.0977 309.1272)" class="st10 st12">10kV2</text>
+<text transform="matrix(1 0 0 1 936.4788 308.5591)" class="st1 st12">娈垫瘝绾�</text>
+<text transform="matrix(1.0185 0 0 1 208.7949 551.6924)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 208.1299 567.3301)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 208.1299 583.6611)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 207.4277 608.6523)" class="st19 st10 st42">MW </text>
+<text transform="matrix(1 0 0 1 1204.7803 523.635)" class="st19 st1 st43">鍗楀巶</text>
+<text transform="matrix(1 0 0 1 1228.7803 523.635)" class="st19 st1 st43">3#</text>
+<text transform="matrix(1 0 0 1 1110.6484 523.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 1134.6484 523.635)" class="st19 st10 st43">201</text>
+<text transform="matrix(1 0 0 1 1022.9727 523.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 1046.9727 523.635)" class="st19 st10 st43">303</text>
+<text transform="matrix(1 0 0 1 1207.7803 538.635)" class="st19 st10 st43">AH04</text>
+<text transform="matrix(1 0 0 1 1107.6484 538.635)" class="st19 st10 st43">1#HT220</text>
+<text transform="matrix(1 0 0 1 1022.2891 538.635)" class="st19 st10 st43">6#HT219</text>
+<text transform="matrix(1 0 0 1 907.7803 525.635)" class="st19 st1 st43">鑱旂粶</text>
+<text transform="matrix(1 0 0 1 768.7803 523.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 792.7803 523.635)" class="st19 st10 st43">303</text>
+<text transform="matrix(1 0 0 1 767.7803 536.635)" class="st19 st10 st43">6#AH001</text>
+<text transform="matrix(1 0 0 1 650.9629 523.635)" class="st19 st1 st43">涓讳緵杩涚嚎</text>
+<text transform="matrix(1 0 0 1 548.7109 523.635)" class="st19 st1 st43">澶囩敤</text>
+<text transform="matrix(1 0 0 1 477.1221 523.635)" class="st19 st1 st43">澶囩敤</text>
+<text transform="matrix(1 0 0 1 417.8154 523.635)" class="st19 st1 st43">闅旂</text>
+<text transform="matrix(1 0 0 1 258.3271 520.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 282.3271 520.635)" class="st19 st10 st43">201</text>
+<text transform="matrix(1 0 0 1 256.4434 533.635)" class="st19 st10 st43">1#HT001</text>
+<text transform="matrix(1 0 0 1 178.4912 520.635)" class="st19 st1 st43">鍗楀巶</text>
+<text transform="matrix(1 0 0 1 202.4912 520.635)" class="st19 st10 st43">3#</text>
+<text transform="matrix(1 0 0 1 87.0479 519.635)" class="st19 st1 st43">鎵�鐢ㄥ彉</text>
+<text transform="matrix(0.8166 0 0 1 247.1797 551.6924)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 247.1797 568.9219)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 247.1797 583.6611)" class="st19 st10 st20">Ic</text>
+<text id="HT001_ia" transform="matrix(0.8166 0 0 1 258.8633 551.6924)" class="st19 st10 st20">33A###.##</text>
+<text id="HT001_ib" transform="matrix(0.8166 0 0 1 258.8633 567.3301)" class="st19 st10 st20">34B###.##</text>
+<text id="HT001_ic" transform="matrix(0.8166 0 0 1 258.8633 583.6611)" class="st19 st10 st20">35C###.##</text>
+<text transform="matrix(1.0185 0 0 1 311.5693 551.6924)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 310.9043 567.3301)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 310.9043 583.6611)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 310.2021 608.6523)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 432.8813 551.3145)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 432.8813 568.5439)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 432.8813 583.2832)" class="st19 st10 st20">Ic</text>
+<text id="BY35_ia" transform="matrix(0.8166 0 0 1 444.5645 551.3145)" class="st19 st10 st20">40A###.##</text>
+<text id="BY35_ib" transform="matrix(0.8166 0 0 1 444.5645 566.9521)" class="st19 st10 st20">41B###.##</text>
+<text id="BY35_ic" transform="matrix(0.8166 0 0 1 444.5645 583.2832)" class="st19 st10 st20">42C###.##</text>
+<text transform="matrix(1.0185 0 0 1 497.271 551.3145)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 496.6064 566.9521)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 496.6064 583.2832)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 495.9038 609.2744)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 539.5176 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 539.5176 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 539.5176 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="BY39_ia" transform="matrix(0.8166 0 0 1 551.2002 551.3135)" class="st19 st10 st20">45A###.##</text>
+<text id="BY39_ib" transform="matrix(0.8166 0 0 1 551.2002 566.9512)" class="st19 st10 st20">46B###.##</text>
+<text id="BY39_ic" transform="matrix(0.8166 0 0 1 551.2002 583.2822)" class="st19 st10 st20">47C###.##</text>
+<text transform="matrix(1.0185 0 0 1 603.9067 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 603.2417 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 603.2417 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 602.54 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 642.752 551.3145)" class="st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 642.752 568.5439)" class="st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 642.752 583.2832)" class="st10 st20">Ic</text>
+<text id="ZB10KV31_ia" transform="matrix(0.8166 0 0 1 654.4355 551.3145)" class="st15 st10 st20">50A###.##</text>
+<text id="ZB10KV31_ib" transform="matrix(0.8166 0 0 1 654.4355 566.9521)" class="st15 st10 st20">51B###.##</text>
+<text id="ZB10KV31_iC" transform="matrix(0.8166 0 0 1 654.4355 583.2832)" class="st15 st10 st20">52C###.##</text>
+<text transform="matrix(1.0185 0 0 1 707.1416 551.3145)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 706.4766 566.9521)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 706.4766 583.2832)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 705.7744 609.2744)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 750.3291 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 750.3291 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 750.3291 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="AH1_ia" transform="matrix(0.8166 0 0 1 762.0127 551.3135)" class="st19 st10 st20">55A###.##</text>
+<text id="AH1_ib" transform="matrix(0.8166 0 0 1 762.0127 566.9512)" class="st19 st10 st20">56B###.##</text>
+<text id="AH1_ic" transform="matrix(0.8166 0 0 1 762.0127 583.2822)" class="st19 st10 st20">57C###.##</text>
+<text transform="matrix(1.0185 0 0 1 814.7188 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 814.0537 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 814.0537 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 812.3516 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 884.3525 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 884.3525 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 884.3525 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="_x31_0KVL233_x5F_ia" transform="matrix(0.8166 0 0 1 896.0361 551.3135)" class="st19 st10 st20">60A###.##</text>
+<text id="_x31_0KVL233_x5F_ib" transform="matrix(0.8166 0 0 1 896.0361 566.9512)" class="st19 st10 st20">61B###.##</text>
+<text id="_x31_0KVL233_x5F_ic" transform="matrix(0.8166 0 0 1 896.0361 583.2822)" class="st19 st10 st20">62C###.##</text>
+<text transform="matrix(1.0185 0 0 1 948.7422 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 948.0771 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 948.0771 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 950.375 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 1000.4854 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 1000.4854 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 1000.4854 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="HT219_ia" transform="matrix(0.8166 0 0 1 1012.1689 551.3135)" class="st19 st10 st20">65A###.##</text>
+<text id="HT219_ib" transform="matrix(0.8166 0 0 1 1012.1689 566.9512)" class="st19 st10 st20">66B###.##</text>
+<text id="HT219_ic" transform="matrix(0.8166 0 0 1 1012.1689 583.2822)" class="st19 st10 st20">67C###.##</text>
+<text transform="matrix(1.0185 0 0 1 1064.875 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1064.21 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1064.21 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1062.5078 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 1107.085 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 1107.085 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 1107.085 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="HT220_ia" transform="matrix(0.8166 0 0 1 1118.7686 551.3135)" class="st19 st10 st20">70A###.##</text>
+<text id="HT220_ib" transform="matrix(0.8166 0 0 1 1118.7686 566.9512)" class="st19 st10 st20">71B###.##</text>
+<text id="HT220_ic" transform="matrix(0.8166 0 0 1 1118.7686 583.2822)" class="st19 st10 st20">72C###.##</text>
+<text transform="matrix(1.0185 0 0 1 1171.4746 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1170.8096 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1170.8096 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1170.1074 610.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 1206.4639 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 1206.4639 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 1206.4639 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="AH04_ia" transform="matrix(0.8166 0 0 1 1218.1475 551.3135)" class="st19 st10 st20">75A###.##</text>
+<text id="AH04_ib" transform="matrix(0.8166 0 0 1 1218.1475 566.9512)" class="st19 st10 st20">76B###.##</text>
+<text id="AH04_ic" transform="matrix(0.8166 0 0 1 1218.1475 583.2822)" class="st19 st10 st20">77C###.##</text>
+<text transform="matrix(1.0185 0 0 1 .8535 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1270.1885 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1270.1885 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1271.4863 608.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.9119 0 0 1 158.1772 137.4312)" class="st1 st14">Uab </text>
+<text id="_x31_10KV10_x5F_ua" transform="matrix(0.8166 0 0 1 185.0889 92.7002)" class="st15 st1 st44">2 ###.##</text>
+<text id="_x31_10KV10_x5F_ub" transform="matrix(0.8166 0 0 1 185.4277 107.8999)" class="st15 st1 st44">3 ###.##</text>
+<text id="_x31_10KV10_x5F_uc" transform="matrix(0.8166 0 0 1 185.0889 122.5972)" class="st15 st1 st44">4 ###.##</text>
+<text id="_x31_10KV10_x5F_uab" transform="matrix(0.8166 0 0 1 185.0889 137.4316)" class="st15 st1 st44">5 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 227.9004 94.3999)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.4004 107.8994)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.4004 123.6001)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 227.4004 138.7852)" class="st1 st14">   KV</text>
+<text id="ZBD_uab" transform="matrix(0.8166 0 0 1 312.5029 231.1113)" class="st15 st1 st44">6 ###.##</text>
+<text id="ZBD_ubc" transform="matrix(0.8166 0 0 1 312.5029 248.8115)" class="st15 st1 st44">7 ###.##</text>
+<text id="ZBD_uca" transform="matrix(0.8166 0 0 1 312.7754 266.7119)" class="st15 st1 st44">8 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 352.4756 230.1113)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 352.4756 267.1123)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 351.9746 248.8115)" class="st1 st14">   KV</text>
+<text id="_x31_10KV10_x5F_ia" transform="matrix(0.8166 0 0 1 650 90.2998)" class="st15 st1 st44">9 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 92.2998)" class="st1 st14">   A</text>
+<text id="_x31_10KV10_x5F_ib_x5F_" transform="matrix(0.8166 0 0 1 645.9004 105.5376)" class="st15 st1 st44">10 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 107.5376)" class="st1 st14">   A</text>
+<text id="_x31_10KV10_x5F_ic" transform="matrix(0.8166 0 0 1 645.9004 119.8711)" class="st15 st1 st44">11 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 123.5972)" class="st1 st14">   A</text>
+<text id="_x31_10KV10_x5F_yg" transform="matrix(0.8166 0 0 1 645.9004 136.7847)" class="st15 st1 st44">12 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 138.7847)" class="st1 st14">   A</text>
+<text transform="matrix(0.7564 0 0 1 693.3008 153.3999)" class="st1 st14">   Mvar</text>
+<text id="_x31_10KV10_x5F_wg" transform="matrix(0.8166 0 0 1 645.9004 153.3999)" class="st15 st1 st44">13 ###.##</text>
+<text id="_x31_10KV10_x5F_ys" transform="matrix(0.8166 0 0 1 646.9004 169.6001)" class="st15 st1 st44">14 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 1087.5078 212.4863)" class="st19 st10 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 1087.5078 230.5)" class="st19 st10 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 1087.5078 249.1528)" class="st19 st10 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 1201.8008 217.5005)" class="st19 st10 st14">   A</text>
+<text transform="matrix(0.7564 0 0 1 1201.9004 230.8716)" class="st19 st10 st14">   A</text>
+<text transform="matrix(0.7564 0 0 1 1202.5 246.1001)" class="st19 st10 st14">   A</text>
+<text transform="matrix(1 0 0 1 1125.3 246.3002)" class="st19 st1 st14">Ic     </text>
+<text transform="matrix(1 0 0 1 1125.3 230.8586)" class="st19 st1 st14">Ib   </text>
+<text transform="matrix(1 0 0 1 1125.3 215.2502)" class="st19 st1 st14">Ia   </text>
+<text transform="matrix(1 0 0 1 1207.1477 609.574)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 1106.0629 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 997.9319 610.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 884.114 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 749.7756 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 641.1979 609.8794)" class="st10 st44">P</text>
+<text transform="matrix(1 0 0 1 536.563 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 431.3273 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 245.0628 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 143.0887 608.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 132.0605 625.9822)" class="st19 st10 st44">cos</text>
+<text id="AH00_ys" transform="matrix(0.8166 0 0 1 155.7002 626.875)" class="st19 st10 st44">37###.##</text>
+<text id="HT001_ys" transform="matrix(0.8166 0 0 1 257.7002 627.208)" class="st19 st10 st44">39###.##</text>
+<text transform="matrix(1 0 0 1 233.3957 626.9365)" class="st19 st10 st44">cos</text>
+<text id="AH00_yg" transform="matrix(0.8166 0 0 1 155.7002 608.6523)" class="st19 st10 st44">36###.##</text>
+<text id="HT001_yg" transform="matrix(0.8166 0 0 1 257.3496 609.6523)" class="st19 st10 st44">38###.##</text>
+<text id="BY35_ys" transform="matrix(0.8166 0 0 1 444.1006 626.4961)" class="st19 st10 st44">44###.##</text>
+<text transform="matrix(1 0 0 1 418.6331 625.9822)" class="st19 st10 st44">cos</text>
+<text id="BY35_yg" transform="matrix(0.8166 0 0 1 444.1006 609.6523)" class="st19 st10 st44">43###.##</text>
+<text transform="matrix(1 0 0 1 525.3333 627.5737)" class="st19 st10 st44">cos</text>
+<text id="BY39_ys" transform="matrix(0.8166 0 0 1 549.2002 627.8301)" class="st19 st10 st44">49###.##</text>
+<text id="BY39_yg" transform="matrix(0.8166 0 0 1 549.2002 608.6533)" class="st19 st10 st44">48###.##</text>
+<text transform="matrix(1 0 0 1 630.2756 628.6738)" class="st10 st44">cos</text>
+<text id="ZB10KV31_ys" transform="matrix(0.8166 0 0 1 654.2998 629.5664)" class="st15 st10 st44">54###.##</text>
+<text id="ZB10KV31_yg" transform="matrix(0.8166 0 0 1 654.2998 609.6523)" class="st15 st10 st44">53###.##</text>
+<text transform="matrix(1 0 0 1 736.3459 627.5737)" class="st19 st10 st44">cos</text>
+<text transform="matrix(0.8166 0 0 1 761.5996 628.208)" class="st19 st10 st44">59###.##</text>
+<text id="AH1_yg" transform="matrix(0.8166 0 0 1 761.7998 609.6523)" class="st19 st10 st44">58###.##</text>
+<text id="_x31_0KVL233_x5F_ys" transform="matrix(0.8166 0 0 1 896.5996 627.875)" class="st19 st10 st44">64###.##</text>
+<text transform="matrix(1 0 0 1 872.6741 627.6738)" class="st19 st10 st44">cos</text>
+<text id="_x31_0KVL233_x5F_yg" transform="matrix(0.8166 0 0 1 895.6006 609.6523)" class="st19 st10 st44">63###.##</text>
+<text id="HT219_ys" transform="matrix(0.8166 0 0 1 1011.7002 629.5664)" class="st19 st10 st44">69###.##</text>
+<text id="HT219_yg" transform="matrix(0.8166 0 0 1 1010.5 610.6523)" class="st19 st10 st44">68###.##</text>
+<text transform="matrix(1 0 0 1 985.5021 628.6738)" class="st19 st10 st44">cos</text>
+<text id="HT220_yg" transform="matrix(0.8166 0 0 1 1118.9375 609.6006)" class="st19 st10 st44">73###.##</text>
+<text id="HT220_ys" transform="matrix(0.8166 0 0 1 1120.0996 629.875)" class="st19 st10 st44">74###.##</text>
+<text transform="matrix(1 0 0 1 1095.7832 628.6738)" class="st19 st10 st44">cos</text>
+<text transform="matrix(1 0 0 1 1195.4807 627.6738)" class="st19 st10 st44">cos</text>
+<text id="AH04_yg" transform="matrix(0.8166 0 0 1 1218.7998 608.2734)" class="st19 st10 st44">78###.##</text>
+<text id="AH04_ys" transform="matrix(0.8166 0 0 1 1218.7002 629.208)" class="st19 st10 st44">79###.##</text>
+<path class="st27" d="M564,377.9"/>
+<path class="st27" d="M563.8,377.9"/>
+<path class="st27" d="M1039.1,407.9"/>
+<line class="st29" x1="928.6" y1="403.5" x2="928.6" y2="411.5"/>
+<line class="st29" x1="927.6" y1="381" x2="927.6" y2="389.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st29" x1="928.1" y1="389.2" x2="922.8" y2="394.9"/>
+	<line class="st29" x1="933.6" y1="394.9" x2="927.8" y2="389.3"/>
+</g>
+<line class="st29" x1="928.3" y1="412" x2="933.5" y2="406.2"/>
+<line class="st29" x1="922.8" y1="406.2" x2="928.5" y2="411.9"/>
+<rect x="923.8" y="388.9" class="st45" width="9.7" height="14.7"/>
+<line class="st46" x1="1189.9" y1="403.8" x2="1189.9" y2="411.7"/>
+<line class="st47" x1="1188.9" y1="381.2" x2="1188.9" y2="389.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1189.4" y1="389.4" x2="1184.1" y2="395.1"/>
+	<line class="st4" x1="1195" y1="395.1" x2="1189.1" y2="389.4"/>
+</g>
+<line class="st48" x1="1189.6" y1="412.1" x2="1194.8" y2="406.4"/>
+<line class="st47" x1="1184" y1="406.4" x2="1189.9" y2="412.1"/>
+<rect x="1185.1" y="389.1" class="st18" width="9.7" height="14.7"/>
+<line class="st23" x1="1279.1" y1="410.1" x2="1265.9" y2="410.1"/>
+<line class="st23" x1="1278.5" y1="407.1" x2="1278.5" y2="410.1"/>
+<line class="st23" x1="1280.3" y1="416.1" x2="1280.3" y2="431.2"/>
+<line class="st23" x1="1276.5" y1="416.4" x2="1276.5" y2="431.4"/>
+<line class="st23" x1="1276.7" y1="431.1" x2="1280.6" y2="431.1"/>
+<line class="st23" x1="1276.2" y1="416.4" x2="1280.1" y2="416.4"/>
+<line class="st23" x1="1278.1" y1="410.7" x2="1278.1" y2="446.9"/>
+<path class="st24" d="M1282.5,450.4c-1.3,0-2.3-1-2.3-2.2s1.1-2.2,2.3-2.2c1.3,0,2.3,1,2.3,2.2S1283.8,450.4,1282.5,450.4"/>
+<text transform="matrix(1 0 0 1 1281.1855 448.9528)" class="st8 st1 st25">Q</text>
+<text transform="matrix(1 0 0 1 1281.1855 448.9528)" class="st6 st1 st25">Q</text>
+<path class="st24" d="M1278.1,448.6c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5
+	C1280.8,447.5,1279.6,448.6,1278.1,448.6"/>
+<line class="st6" x1="1278.2" y1="444.3" x2="1278.2" y2="446"/>
+<line class="st6" x1="1278.2" y1="445.8" x2="1279.2" y2="447.2"/>
+<line class="st6" x1="1278.1" y1="446.1" x2="1277.1" y2="447.4"/>
+<path class="st24" d="M1278.2,451.1c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5C1280.9,450,1279.7,451.1,1278.2,451.1"
+	/>
+<line class="st26" x1="1278.2" y1="446.8" x2="1278.3" y2="448.5"/>
+<line class="st26" x1="1278.2" y1="448.3" x2="1279.3" y2="449.7"/>
+<line class="st26" x1="1278.2" y1="448.6" x2="1277.2" y2="449.9"/>
+<line class="st23" x1="1266" y1="409.8" x2="1266" y2="425.3"/>
+<line class="st23" x1="1268.8" y1="421.6" x2="1268.8" y2="436.3"/>
+<line class="st23" x1="1262.7" y1="421.8" x2="1262.7" y2="436.5"/>
+<line class="st28" x1="1262.7" y1="436.2" x2="1268.8" y2="436.2"/>
+<line class="st23" x1="1262.7" y1="421.8" x2="1268.8" y2="421.8"/>
+<line class="st23" x1="1265.7" y1="436.3" x2="1265.7" y2="440.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1277.9" y1="417.1" x2="1283.1" y2="409.9"/>
+	<line class="st4" x1="1272.3" y1="409.9" x2="1278.2" y2="417.1"/>
+</g>
+<line class="st4" x1="1277.6" y1="376.8" x2="1272.3" y2="384"/>
+<line class="st4" x1="1283.3" y1="384" x2="1277.3" y2="376.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1277.6" y1="405.2" x2="1282.9" y2="397.8"/>
+	<line class="st4" x1="1272.1" y1="397.8" x2="1277.9" y2="405"/>
+</g>
+<line class="st4" x1="1277.9" y1="394" x2="1277.9" y2="377.8"/>
+<line class="st4" x1="1245" y1="282.3" x2="1245" y2="289"/>
+<line class="st4" x1="1244.2" y1="263.3" x2="1244.2" y2="270.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1244.6" y1="271.5" x2="1240.6" y2="276.5"/>
+	<line class="st4" x1="1248.9" y1="276.5" x2="1244.4" y2="271.5"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1244.8" y1="298.5" x2="1248.8" y2="293.6"/>
+	<line class="st4" x1="1240.5" y1="293.6" x2="1245" y2="298.5"/>
+</g>
+<rect x="1241.3" y="270" class="st49" width="7.4" height="12.4"/>
+<text transform="matrix(1 0 0 1 149.7948 207.7999)" class="st1 st14">10kv</text>
+<text transform="matrix(1 0 0 1 178.0629 207.7997)" class="st1 st14">渚х浉鐢靛帇</text>
+<text transform="matrix(1 0 0 1 153.1999 233.2303)" class="st1 st14"> Ua</text>
+<text transform="matrix(1 0 0 1 157.5013 248.0361)" class="st1 st14">Ub</text>
+<text transform="matrix(1 0 0 1 157.5013 264.5)" class="st1 st14">Uc</text>
+<text transform="matrix(1 0 0 1 161.8553 264.2563)" class="st8 st1 st14"> :</text>
+<text id="_x31_10KV10_x5F_ua_1_" transform="matrix(0.8166 0 0 1 179.5889 233.2305)" class="st15 st1 st44">82 ###.##</text>
+<text id="_x31_10KV10_x5F_ub_1_" transform="matrix(0.8166 0 0 1 179.9277 249.4297)" class="st15 st1 st44">83 ###.##</text>
+<text id="_x31_10KV10_x5F_uc_1_" transform="matrix(0.8166 0 0 1 179.5889 266.127)" class="st15 st1 st44">84 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 229.4004 233.9297)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.9004 248.4297)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.9004 266.127)" class="st1 st14">   KV</text>
+<line class="st36" x1="496.5" y1="207.6" x2="496.5" y2="212.3"/>
+<line class="st36" x1="496.5" y1="212.3" x2="503.8" y2="217.4"/>
+<line class="st36" x1="496.5" y1="212.3" x2="490.7" y2="217.3"/>
+<text transform="matrix(0.7564 0 0 1 484 30.6133)" class="st1 st14">   kwh</text>
+<text transform="matrix(1 0 0 1 1018.0886 264.7607)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 1006.8799 280.1998)" class="st19 st10 st44">cos</text>
+<text id="_x31_10KV_x5F_uc_1_" transform="matrix(1.0507 0 0 1 1035.6426 264.8711)" class="st15 st10 st40">80###.##</text>
+<text transform="matrix(0.7564 0 0 1 1086.1582 265.1382)" class="st19 st10 st14">   MW</text>
+<text id="_x31_10KV_x5F_uc_2_" transform="matrix(1.0507 0 0 1 1031.9922 280.833)" class="st19 st10 st40"> 81###.##</text>
+<text transform="matrix(0.7564 0 0 1 1073.5078 281.1001)" class="st19 st1 st14">   </text>
+<text transform="matrix(1 0 0 1 180.1768 532.6353)" class="st19 st10 st43">AH00</text>
+<text transform="matrix(1 0 0 1 437 100)" class="st10 st43">105</text>
+<text transform="matrix(1 0 0 1 511.55 69)" class="st10 st43">101</text>
+<text transform="matrix(1 0 0 1 505 123.9702)" class="st10 st43">10</text>
+<text transform="matrix(1 0 0 1 522 148.2)" class="st10 st43">108</text>
+<text transform="matrix(1 0 0 1 460 187)" class="st10 st43">106</text>
+<text transform="matrix(1 0 0 1 525.8 187.354)" class="st10 st43">109</text>
+<line class="st4" x1="1058.8" y1="399.5" x2="1058.8" y2="407.5"/>
+<line class="st4" x1="1057.8" y1="377" x2="1057.8" y2="385.4"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1058.3" y1="385.2" x2="1053" y2="391"/>
+	<line class="st4" x1="1063.8" y1="391" x2="1058" y2="385.2"/>
+</g>
+<line class="st4" x1="1058.5" y1="408" x2="1063.8" y2="402.2"/>
+<line class="st4" x1="1053" y1="402.2" x2="1058.8" y2="408"/>
+<rect x="1054" y="384.9" class="st50" width="9.7" height="14.7"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="510.5" y1="381.7" x2="505.3" y2="387.4"/>
+	<line class="st4" x1="516" y1="387.4" x2="510.3" y2="381.7"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="510.7" y1="414.4" x2="516" y2="408.7"/>
+	<line class="st4" x1="505.2" y1="408.7" x2="511" y2="414.4"/>
+</g>
+<rect x="506.2" y="381.3" class="st49" width="9.7" height="14.7"/>
+<line class="st4" x1="510.5" y1="373.7" x2="510.5" y2="381.9"/>
+<line class="st4" x1="511" y1="395.1" x2="511" y2="403.3"/>
+<line class="st4" x1="591.5" y1="393.9" x2="591.5" y2="401.8"/>
+<line class="st4" x1="589.5" y1="375.4" x2="589.5" y2="383.6"/>
+<line class="st4" x1="589.8" y1="374.6" x2="584.7" y2="380.3"/>
+<line class="st4" x1="595.5" y1="380.3" x2="589.6" y2="374.6"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="590.1" y1="415.3" x2="595.3" y2="409.6"/>
+	<line class="st4" x1="584.6" y1="409.6" x2="590.3" y2="415.3"/>
+</g>
+<rect x="585.6" y="383.2" class="st49" width="9.7" height="14.7"/>
+<text transform="matrix(1 0 0 1 521.3335 92)" class="st1 st43">L</text>
+<path class="st51" d="M523.6,93.4c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8C529.5,90.8,526.9,93.4,523.6,93.4"/>
+<text transform="matrix(1 0 0 1 520.5 90.2998)" class="st1 st43">L</text>
+<path class="st51" d="M215.8,368.4c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s5.9,2.6,5.9,5.8S219,368.4,215.8,368.4"/>
+<path class="st51" d="M299.1,367.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,5.9,2.6,5.9,5.8S302.4,367.8,299.1,367.8"/>
+<path class="st51" d="M506.2,365.9c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S509.5,365.9,506.2,365.9"/>
+<path class="st51" d="M578.9,365.9c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S582.2,365.9,578.9,365.9"/>
+<text transform="matrix(1 0 0 1 211.75 365.3)" class="st1 st43">R</text>
+<text transform="matrix(1 0 0 1 295.5 365.3)" class="st1 st43">R</text>
+<text transform="matrix(1 0 0 1 503.8 362.667)" class="st1 st43">L</text>
+<text transform="matrix(1 0 0 1 576.7 362.667)" class="st1 st43">L</text>
+<line class="st36" x1="496.5" y1="222.6" x2="503.2" y2="233.9"/>
+<line class="st36" x1="496" y1="225.7" x2="503.2" y2="233.9"/>
+<path class="st51" d="M706.5,367.8c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S709.7,367.8,706.5,367.8"/>
+<text transform="matrix(1 0 0 1 702.8766 365.3)" class="st1 st43">R</text>
+<path class="st51" d="M812.2,367.8c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S815.5,367.8,812.2,367.8"/>
+<text transform="matrix(1 0 0 1 808.6 365.3)" class="st1 st43">R</text>
+<path class="st51" d="M941.1,366.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S944.4,366.8,941.1,366.8"/>
+<text transform="matrix(1 0 0 1 936.5 365.3)" class="st1 st43">R</text>
+<path class="st51" d="M1050.1,364.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S1053.4,364.8,1050.1,364.8"/>
+<text transform="matrix(1 0 0 1 1045.5 363.3)" class="st1 st43">R</text>
+<path class="st51" d="M1133.1,364.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S1136.4,364.8,1133.1,364.8"/>
+<text transform="matrix(1 0 0 1 1128.5 363.3)" class="st1 st43">R</text>
+<path class="st51" d="M1205.1,366.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S1208.4,366.8,1205.1,366.8"/>
+<text transform="matrix(1 0 0 1 1201.5 364.3)" class="st1 st43">R</text>
+<line class="st36" x1="496" y1="225.7" x2="501.5" y2="232"/>
+<line class="st36" x1="300.5" y1="171.6" x2="305.8" y2="176.6"/>
+<line class="st36" x1="503.1" y1="233.2" x2="496.6" y2="223.3"/>
+<line class="st26" x1="503.3" y1="234.8" x2="496.5" y2="222.6"/>
+<line class="st52" x1="496.3" y1="213.9" x2="492.7" y2="218.9"/>
+<line class="st52" x1="496.3" y1="213.9" x2="499.6" y2="219"/>
+<line class="st52" x1="496.3" y1="209.3" x2="496.3" y2="214.3"/>
+<text transform="matrix(1 0 0 1 390.5 233.5)" class="st1 st43">闆�</text>
+<text transform="matrix(1 0 0 1 402.5 233.5)" class="st10 st43">1</text>
+<line class="st6" x1="413.5" y1="433.7" x2="405.9" y2="433.7"/>
+<line class="st6" x1="413.6" y1="433.6" x2="410" y2="436.1"/>
+<line class="st6" x1="410.8" y1="436.6" x2="406.8" y2="434.1"/>
+<line class="st6" x1="670.7" y1="435.4" x2="663" y2="435.4"/>
+<line class="st6" x1="670.4" y1="436" x2="666.8" y2="438.6"/>
+<line class="st6" x1="667" y1="438.3" x2="662.9" y2="435.7"/>
+<line class="st6" x1="778.3" y1="437.5" x2="770.6" y2="437.5"/>
+<line class="st6" x1="778.4" y1="437.4" x2="774.7" y2="440"/>
+<line class="st6" x1="774.6" y1="440" x2="770.6" y2="437.4"/>
+<line class="st6" x1="1179.4" y1="441.2" x2="1171.7" y2="441.2"/>
+<line class="st6" x1="1178.5" y1="442" x2="1174.8" y2="444.7"/>
+<line class="st6" x1="1175.7" y1="444.8" x2="1171.7" y2="442.1"/>
+<line class="st6" x1="1263.2" y1="426.3" x2="1268.8" y2="426.3"/>
+<line class="st6" x1="1263.5" y1="426.4" x2="1266.2" y2="429"/>
+<line class="st6" x1="1265.5" y1="429.3" x2="1268.5" y2="426.7"/>
+<line class="st6" x1="1108.9" y1="440.8" x2="1101.2" y2="440.8"/>
+<line class="st6" x1="1107.8" y1="441.5" x2="1104.2" y2="444.1"/>
+<line class="st6" x1="1105" y1="443.3" x2="1100.9" y2="440.7"/>
+<line class="st6" x1="1029.1" y1="440" x2="1021.5" y2="440"/>
+<line class="st6" x1="1029.1" y1="440.4" x2="1025.5" y2="443"/>
+<line class="st6" x1="1025.5" y1="442.8" x2="1021.5" y2="440.1"/>
+<line class="st6" x1="208.3" y1="462.8" x2="215.2" y2="462.8"/>
+<line class="st6" x1="209.2" y1="464.9" x2="214.4" y2="464.9"/>
+<line class="st6" x1="210.5" y1="467.3" x2="212.6" y2="467.3"/>
+<line class="st6" x1="295.6" y1="461.5" x2="302.6" y2="461.5"/>
+<line class="st6" x1="296.6" y1="463.6" x2="301.8" y2="463.6"/>
+<line class="st6" x1="297.9" y1="466" x2="300" y2="466"/>
+<line class="st6" x1="1262.5" y1="441.2" x2="1269.3" y2="441.2"/>
+<line class="st6" x1="1263.4" y1="442.9" x2="1268.6" y2="442.9"/>
+<line class="st6" x1="1264.7" y1="444.9" x2="1266.8" y2="444.9"/>
+<line class="st6" x1="483.6" y1="436.1" x2="476" y2="436.1"/>
+<line class="st6" x1="483.5" y1="435.9" x2="479.9" y2="438.5"/>
+<line class="st6" x1="480" y1="438.7" x2="476" y2="436.1"/>
+<line class="st6" x1="554.3" y1="437.8" x2="546.7" y2="437.8"/>
+<line class="st6" x1="554.1" y1="437.6" x2="550.4" y2="440.2"/>
+<line class="st6" x1="550.7" y1="440.4" x2="546.7" y2="437.8"/>
+<line class="st6" x1="347.7" y1="398.8" x2="353.3" y2="398.8"/>
+<line class="st6" x1="347.6" y1="399" x2="350.4" y2="401.6"/>
+<line class="st6" x1="350.7" y1="401.6" x2="353.6" y2="399"/>
+<text transform="matrix(0.9013 0 0 1 1282.9004 335.7031)" class="st6 st10 st41">203</text>
+<text transform="matrix(0.9013 0 0 1 1267.2754 315.2007)" class="st6 st10 st41">231</text>
+<line class="st6" x1="1227.9" y1="317.3" x2="1231.4" y2="317.3"/>
+<line class="st6" x1="1227.8" y1="317.5" x2="1229.5" y2="319.9"/>
+<line class="st6" x1="1229.5" y1="319.9" x2="1231.3" y2="317.5"/>
+</svg>
diff --git a/energy_management_ui/src/assets/icons/svg/404.svg b/energy_management_ui/src/assets/icons/svg/404.svg
new file mode 100644
index 0000000..6df5019
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/404.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/bug.svg b/energy_management_ui/src/assets/icons/svg/bug.svg
new file mode 100644
index 0000000..05a150d
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/bug.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/build.svg b/energy_management_ui/src/assets/icons/svg/build.svg
new file mode 100644
index 0000000..97c4688
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/build.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1568899741379" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960 591.424V368.96c0-0.288 0.16-0.512 0.16-0.768S960 367.68 960 367.424V192a32 32 0 0 0-32-32H96a32 32 0 0 0-32 32v175.424c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768v222.464c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768V864a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32v-271.04c0-0.288 0.16-0.512 0.16-0.768S960 591.68 960 591.424z m-560-31.232v-160H608v160h-208z m208 64V832h-208v-207.808H608z m-480-224h208v160H128v-160z m544 0h224v160h-224v-160zM896 224v112.192H128V224h768zM128 624.192h208V832H128v-207.808zM672 832v-207.808h224V832h-224z" p-id="2055"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/chart.svg b/energy_management_ui/src/assets/icons/svg/chart.svg
new file mode 100644
index 0000000..27728fb
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/chart.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/clipboard.svg b/energy_management_ui/src/assets/icons/svg/clipboard.svg
new file mode 100644
index 0000000..90923ff
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/code.svg b/energy_management_ui/src/assets/icons/svg/code.svg
new file mode 100644
index 0000000..ed4d23c
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/code.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" fill="#bfbfbf" p-id="2423"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/component.svg b/energy_management_ui/src/assets/icons/svg/component.svg
new file mode 100644
index 0000000..207ada3
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/component.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h54.857v54.857H0V0zm0 73.143h54.857V128H0V73.143zm73.143 0H128V128H73.143V73.143zm27.428-18.286C115.72 54.857 128 42.577 128 27.43 128 12.28 115.72 0 100.571 0 85.423 0 73.143 12.28 73.143 27.429c0 15.148 12.28 27.428 27.428 27.428z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/dashboard.svg b/energy_management_ui/src/assets/icons/svg/dashboard.svg
new file mode 100644
index 0000000..5317d37
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/date.svg b/energy_management_ui/src/assets/icons/svg/date.svg
new file mode 100644
index 0000000..2a28112
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/date.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1567417179372" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1155" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M947.2 1024 76.8 1024C38.4 1024 0 992 0 953.6L0 172.8c0-38.4 38.4-70.4 76.8-70.4l38.4 0 0 102.4c0 38.4 38.4 70.4 76.8 70.4l76.8 0c44.8 0 76.8-32 76.8-70.4L345.6 102.4l313.6 0 0 102.4c0 38.4 38.4 70.4 76.8 70.4l76.8 0c44.8 0 76.8-32 76.8-70.4L889.6 102.4l38.4 0c44.8 0 76.8 32 76.8 70.4l0 787.2C1024 992 985.6 1024 947.2 1024zM352 339.2 115.2 339.2 115.2 512l236.8 0L352 339.2zM352 544 115.2 544l0 172.8 236.8 0L352 544zM352 748.8 115.2 748.8l0 172.8 236.8 0L352 748.8zM627.2 339.2 396.8 339.2 396.8 512l236.8 0L633.6 339.2zM627.2 544 396.8 544l0 172.8 236.8 0L633.6 544zM627.2 748.8 396.8 748.8l0 172.8 236.8 0L633.6 748.8zM908.8 339.2l-236.8 0L672 512l236.8 0L908.8 339.2zM908.8 544l-236.8 0 0 172.8 236.8 0L908.8 544zM908.8 748.8l-236.8 0 0 172.8 236.8 0L908.8 748.8zM787.2 236.8c-44.8 0-76.8-32-76.8-70.4L710.4 70.4c0-38.4 38.4-70.4 76.8-70.4s76.8 32 76.8 70.4l0 102.4C864 211.2 832 236.8 787.2 236.8zM236.8 236.8C192 236.8 160 211.2 160 172.8L160 70.4C160 32 192 0 236.8 0s76.8 32 76.8 70.4l0 102.4C313.6 211.2 281.6 236.8 236.8 236.8z" p-id="1156"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/dian.svg b/energy_management_ui/src/assets/icons/svg/dian.svg
new file mode 100644
index 0000000..021ca51
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/dian.svg
@@ -0,0 +1,1204 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="鍥惧眰_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1330.6 650.3" style="enable-background:new 0 0 1330.6 650.3;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#F0EEED;}
+	.st1{font-family:'SimHei';}
+	.st2{font-size:36px;}
+	.st3{fill:none;stroke:#993333;stroke-width:3;stroke-miterlimit:10;}
+	.st4{fill:none;stroke:#663333;stroke-width:1.5;}
+	.st5{fill:#FFFFFF;stroke:#663333;stroke-width:1.5;}
+	.st6{fill:none;stroke:#663333;stroke-miterlimit:10;}
+	.st7{stroke:#663333;stroke-miterlimit:10;}
+	.st8{fill:#FFFFFF;}
+	.st9{font-size:10.6699px;}
+	.st10{font-family:'TimesNewRomanPSMT';}
+	.st11{font-size:9.1456px;}
+	.st12{font-size:16.0048px;}
+	.st13{fill:none;stroke:#CA9B33;stroke-width:5;stroke-miterlimit:10;}
+	.st14{font-size:13.7184px;}
+	.st15{fill:#FB5C5C;}
+	.st16{font-size:18px;}
+	.st17{font-size:17.0812px;}
+	.st18{fill:#8B0000;stroke:#8B0000;stroke-miterlimit:10;}
+	.st19{fill:#3A1BF4;}
+	.st20{font-size:12.8951px;}
+	.st21{fill:none;stroke:#99CC99;stroke-miterlimit:10;}
+	.st22{fill:none;stroke:#666666;stroke-miterlimit:10;}
+	.st23{fill:none;stroke:#663333;}
+	.st24{fill:#FFFFFF;stroke:#663333;stroke-width:0.5;stroke-miterlimit:10;}
+	.st25{font-size:2.5668px;}
+	.st26{fill:none;stroke:#663333;stroke-width:0.5;stroke-miterlimit:10;}
+	.st27{stroke:#663333;stroke-width:1.5;}
+	.st28{fill:none;stroke:#663333;stroke-width:0.5;}
+	.st29{fill:none;stroke:#037400;stroke-width:1.5;}
+	.st30{stroke:#663333;stroke-width:0.5;stroke-miterlimit:10;}
+	.st31{fill:none;stroke:#663333;stroke-width:2;stroke-miterlimit:10;}
+	.st32{font-size:3.0882px;}
+	.st33{fill:none;stroke:#28B400;stroke-miterlimit:10;}
+	.st34{fill:#FFFFFF;stroke:#0A26FF;stroke-miterlimit:10;}
+	.st35{fill:#FFFFFF;stroke:#999966;stroke-miterlimit:10;}
+	.st36{fill:none;}
+	.st37{font-size:14.0625px;}
+	.st38{font-size:13.3828px;}
+	.st39{font-size:13.1666px;}
+	.st40{font-size:12.1669px;}
+	.st41{font-size:14.1138px;}
+	.st42{font-size:11.6694px;}
+	.st43{font-size:12px;}
+	.st44{font-size:13.72px;}
+	.st45{fill:#037400;stroke:#037400;stroke-miterlimit:10;}
+	.st46{fill:none;stroke:#0E5500;stroke-width:1.5;}
+	.st47{fill:none;stroke:#8B0000;stroke-width:1.5;}
+	.st48{fill:none;stroke:#025F00;stroke-width:1.5;}
+	.st49{fill:#FFAD3F;stroke:#FFAD5B;stroke-miterlimit:10;}
+	.st50{fill:#FFAD5B;stroke:#FFAD5B;stroke-miterlimit:10;}
+	.st51{fill:#00FF00;stroke:#00FF00;stroke-miterlimit:10;}
+	.st52{fill:none;stroke:#0A26FF;stroke-width:0.5;stroke-miterlimit:10;}
+</style>
+<polyline class="st0" points="0,-2.2 1330.6,-2.2 1330.6,647.8 0,647.8 "/>
+<text transform="matrix(0.8161 0 0 1 19.0127 37.5732)" class="st1 st2">鐢靛姏绯荤粺鑳芥祦鍥�</text>
+<line class="st3" x1="58.5" y1="342.8" x2="854.8" y2="342.8"/>
+<line class="st4" x1="193.6" y1="400.2" x2="193.6" y2="410.1"/>
+<line class="st4" x1="193.6" y1="371.5" x2="193.6" y2="381.9"/>
+<line class="st4" x1="193.6" y1="343.8" x2="193.6" y2="367.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="193.6" y1="375.2" x2="188.4" y2="382.4"/>
+	<line class="st4" x1="199.2" y1="382.4" x2="193.3" y2="375.2"/>
+	<line class="st4" x1="193.6" y1="380" x2="188.4" y2="387.2"/>
+	<line class="st4" x1="199.2" y1="387.2" x2="193.3" y2="380.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="193.3" y1="424.4" x2="198.6" y2="417.1"/>
+	<line class="st4" x1="187.8" y1="417.1" x2="193.6" y2="424.3"/>
+	<line class="st4" x1="193.3" y1="419.5" x2="198.6" y2="412.3"/>
+	<line class="st4" x1="187.8" y1="412.3" x2="193.6" y2="419.5"/>
+</g>
+<rect x="170" y="434.4" class="st5" width="10.1" height="18.2"/>
+<line class="st6" x1="174.7" y1="435.1" x2="171.4" y2="444.9"/>
+<line class="st6" x1="171.4" y1="444.9" x2="178.3" y2="444.9"/>
+<line class="st6" x1="178.3" y1="444.9" x2="174.7" y2="435.1"/>
+<line class="st6" x1="174.7" y1="440.5" x2="174.8" y2="462.9"/>
+<line class="st6" x1="174.8" y1="422.1" x2="174.8" y2="433.7"/>
+<line class="st6" x1="171.4" y1="462.9" x2="178.3" y2="462.9"/>
+<line class="st6" x1="172.3" y1="465" x2="177.5" y2="465"/>
+<line class="st6" x1="173.6" y1="467.4" x2="175.7" y2="467.4"/>
+<path class="st7" d="M212.4,422.1"/>
+<path class="st7" d="M203.8,442.1"/>
+<line class="st4" x1="431.4" y1="370.6" x2="431.4" y2="409.6"/>
+<line class="st4" x1="431.4" y1="343" x2="431.4" y2="366.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="431.4" y1="374.3" x2="426.1" y2="381.5"/>
+	<line class="st4" x1="437" y1="381.5" x2="431.1" y2="374.4"/>
+	<line class="st4" x1="431.4" y1="379.1" x2="426.1" y2="386.4"/>
+	<line class="st4" x1="437" y1="386.4" x2="431.1" y2="379.2"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="431.1" y1="423.5" x2="436.3" y2="416.3"/>
+	<line class="st4" x1="425.5" y1="416.3" x2="431.4" y2="423.4"/>
+	<line class="st4" x1="431.1" y1="418.7" x2="436.3" y2="411.4"/>
+	<line class="st4" x1="425.5" y1="411.4" x2="431.4" y2="418.6"/>
+</g>
+<line class="st4" x1="492.6" y1="342.9" x2="492.6" y2="366.2"/>
+<line class="st6" x1="480.1" y1="421.2" x2="510.3" y2="421.2"/>
+<line class="st4" x1="683.7" y1="342.7" x2="683.7" y2="366"/>
+<line class="st4" x1="790.8" y1="343.1" x2="790.8" y2="366.4"/>
+<line class="st4" x1="1038.8" y1="343" x2="1038.7" y2="368.6"/>
+<text transform="matrix(1 0 0 1 189.0005 334.0032)" class="st8 st1 st9">36</text>
+<text transform="matrix(1 0 0 1 189.0005 334.0032)" class="st6 st10 st9">36</text>
+<text transform="matrix(1 0 0 1 274.8379 334.0032)" class="st8 st1 st9">34</text>
+<text transform="matrix(1 0 0 1 274.8379 334.0032)" class="st6 st10 st9">34</text>
+<text transform="matrix(1 0 0 1 350.3413 334.0032)" class="st8 st1 st9"> 浜�03</text>
+<text transform="matrix(1 0 0 1 350.3413 334.0032)" class="st6 st10 st9"> </text>
+<text transform="matrix(1 0 0 1 353.0413 334.2049)" class="st6 st1 st9">浜�</text>
+<text transform="matrix(1 0 0 1 363.6413 334.0032)" class="st6 st10 st9">03</text>
+<text transform="matrix(1 0 0 1 420.9443 334.0032)" class="st8 st1 st9"> 30</text>
+<text transform="matrix(1 0 0 1 420.9443 334.0032)" class="st6 st10 st9"> 30</text>
+<text transform="matrix(1 0 0 1 491.1338 334.0032)" class="st8 st1 st9">35</text>
+<text transform="matrix(1 0 0 1 491.1338 334.0032)" class="st6 st10 st9">35</text>
+<text transform="matrix(1 0 0 1 559.7627 334.0032)" class="st8 st1 st9">39</text>
+<text transform="matrix(1 0 0 1 559.7627 334.0032)" class="st6 st10 st9">39</text>
+<text transform="matrix(1 0 0 1 783.3477 334.0032)" class="st8 st1 st9">37</text>
+<text transform="matrix(1 0 0 1 783.3477 334.0032)" class="st6 st10 st9">37</text>
+<text transform="matrix(1 0 0 1 680.668 334.0032)" class="st8 st1 st9">31</text>
+<text transform="matrix(1 0 0 1 680.668 334.0032)" class="st6 st10 st9">31</text>
+<text transform="matrix(1 0 0 1 933.835 334.6379)" class="st8 st1 st9">233</text>
+<text transform="matrix(1 0 0 1 933.835 334.6379)" class="st6 st10 st9">233</text>
+<text transform="matrix(1 0 0 1 1031.54 334.6379)" class="st8 st1 st9">237</text>
+<text transform="matrix(1 0 0 1 1031.54 334.6379)" class="st6 st10 st9">237</text>
+<text transform="matrix(1 0 0 1 1108.1162 335.0032)" class="st8 st1 st9">234</text>
+<text transform="matrix(1 0 0 1 1108.1162 335.0032)" class="st6 st10 st9">234</text>
+<text transform="matrix(1 0 0 1 1182.043 334.5217)" class="st8 st1 st9">236</text>
+<text transform="matrix(1 0 0 1 1182.043 334.5217)" class="st6 st10 st9">236</text>
+<text transform="matrix(1 0 0 1 44.874 46.3831)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 44.874 46.3831)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 339.957 60.4106)" class="st1 st12"> 110kv</text>
+<text transform="matrix(1 0 0 1 402.9 60.4109)" class="st1 st12">姣嶇嚎</text>
+<line class="st13" x1="241.6" y1="41.6" x2="759.4" y2="41.6"/>
+<text transform="matrix(1 0 0 1 58.0015 74.5823)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 58.0015 74.5823)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 63.0835 74.5823)" class="st8 st1 st12">                   </text>
+<text transform="matrix(1 0 0 1 63.0835 74.5823)" class="st6 st1 st12">                   </text>
+<text transform="matrix(1 0 0 1 147.5703 75.5823)" class="st1 st14">110kv</text>
+<text transform="matrix(1 0 0 1 184.1768 75.9338)" class="st1 st14">渚х數鍘�</text>
+<text transform="matrix(1 0 0 1 159.7 92.7003)" class="st1 st14"> Ua</text>
+<text transform="matrix(1 0 0 1 163.0015 108.5061)" class="st1 st14">Ub</text>
+<text transform="matrix(1 0 0 1 163.0015 123.9702)" class="st1 st14">Uc</text>
+<text transform="matrix(1 0 0 1 279.7454 231.0806)" class="st1 st14"> Uab</text>
+<text transform="matrix(1 0 0 1 279.7454 248.5416)" class="st1 st14"> Ubc</text>
+<text transform="matrix(1 0 0 1 279.7454 266.0045)" class="st1 st14"> Uac</text>
+<text transform="matrix(1 0 0 1 616.3359 70.7708)" class="st1 st14">110kv</text>
+<text transform="matrix(1 0 0 1 652.9424 70.1233)" class="st1 st14">渚х數娴佸強鍔熺巼</text>
+<text transform="matrix(1 0 0 1 620.6699 91.3489)" class="st1 st14">Ia   </text>
+<text transform="matrix(1 0 0 1 620.6699 105.8303)" class="st1 st14">Ib   </text>
+<text transform="matrix(1 0 0 1 621.6699 121.5969)" class="st1 st14">Ic     </text>
+<text transform="matrix(1 0 0 1 627.6699 137.0774)" class="st1 st14">P   </text>
+<text transform="matrix(1 0 0 1 627.6699 153.5393)" class="st1 st14">Q    </text>
+<text transform="matrix(1 0 0 1 617.6699 169.0502)" class="st1 st14">cos   </text>
+<text transform="matrix(1 0 0 1 562.7197 217.1656)" class="st1 st14">涓诲彉娌归潰娓╁害</text>
+<text id="ZB_wd" transform="matrix(1 0 0 1 645.0308 217.4094)" class="st15 st1 st14">15###.##</text>
+<text transform="matrix(1 0 0 1 707.1167 217.1656)" class="st1 st14">搴�</text>
+<text transform="matrix(1 0 0 1 562.7197 233.6276)" class="st1 st14">涓诲彉缁曠粍娓╁害</text>
+<text transform="matrix(1 0 0 1 632.0308 233.8713)" class="st15 st1 st14">  16###.##    </text>
+<text transform="matrix(1 0 0 1 707.1167 233.6276)" class="st1 st14">搴�</text>
+<text transform="matrix(1 0 0 1 588 251.0002)" class="st1 st14">涓诲彉妗d綅</text>
+<text id="ZB_dw" transform="matrix(1 0 0 1 644.5938 251.3342)" class="st15 st1 st14">17###.##</text>
+<text transform="matrix(1 0 0 1 707.3607 251.0905)" class="st1 st14">妗�</text>
+<text transform="matrix(0.7963 0 0 1 271.8271 30.6133)" class="st1 st16">褰撴棩绱鐢ㄧ數閲�</text>
+<text id="ZD_ds" transform="matrix(1.0741 0 0 1 389.3999 30.6133)" class="st15 st1 st17">1######.##</text>
+<line class="st6" x1="462.1" y1="90.3" x2="469.8" y2="90.3"/>
+<line class="st6" x1="463.1" y1="92.7" x2="468.9" y2="92.7"/>
+<line class="st6" x1="464.6" y1="95.4" x2="466.9" y2="95.4"/>
+<line class="st6" x1="505" y1="64.6" x2="487.8" y2="64.6"/>
+<line class="st6" x1="496.4" y1="84.1" x2="479.2" y2="84.1"/>
+<line class="st4" x1="496" y1="43.6" x2="496" y2="306.8"/>
+<line class="st6" x1="479.4" y1="90.4" x2="479.4" y2="77.9"/>
+<line class="st6" x1="473.3" y1="84.3" x2="476.8" y2="77.9"/>
+<line class="st6" x1="465.9" y1="84.2" x2="473.3" y2="84.3"/>
+<line class="st6" x1="465.9" y1="90.5" x2="465.9" y2="84.3"/>
+<rect x="490.4" y="101.2" class="st18" width="11.8" height="21.4"/>
+<text transform="matrix(0.8166 0 0 1 144.4053 550.6924)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 144.4053 566.9219)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 144.4053 583.6611)" class="st19 st10 st20">Ic</text>
+<text id="AH00_ia" transform="matrix(0.8166 0 0 1 156.0889 551.6924)" class="st19 st10 st20">30A###.##</text>
+<text id="AH00_ib" transform="matrix(0.8166 0 0 1 156.0889 567.3301)" class="st19 st10 st20">31B###.##</text>
+<text id="AH00_ic" transform="matrix(0.8166 0 0 1 156.0889 583.6611)" class="st19 st10 st20">32C###.##</text>
+<line class="st4" x1="101.2" y1="416.6" x2="101.5" y2="505.2"/>
+<line class="st4" x1="101.2" y1="372.8" x2="101.2" y2="411.9"/>
+<line class="st4" x1="101.2" y1="345.1" x2="101.2" y2="368.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="101.2" y1="376.5" x2="95.9" y2="383.7"/>
+	<line class="st4" x1="106.7" y1="383.7" x2="100.9" y2="376.6"/>
+	<line class="st4" x1="101.2" y1="381.3" x2="95.9" y2="388.6"/>
+	<line class="st4" x1="106.7" y1="388.6" x2="100.9" y2="381.4"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="100.9" y1="425.7" x2="106.1" y2="418.5"/>
+	<line class="st4" x1="95.3" y1="418.5" x2="101.2" y2="425.6"/>
+	<line class="st4" x1="100.9" y1="420.9" x2="106.1" y2="413.6"/>
+	<line class="st4" x1="95.3" y1="413.6" x2="101.2" y2="420.8"/>
+</g>
+<rect x="79.2" y="432.7" class="st5" width="10.1" height="18.2"/>
+<line class="st6" x1="84.3" y1="436.4" x2="80.9" y2="446.2"/>
+<line class="st6" x1="80.9" y1="446.2" x2="87.8" y2="446.2"/>
+<line class="st6" x1="87.8" y1="446.2" x2="84.3" y2="436.4"/>
+<line class="st6" x1="84.3" y1="441.9" x2="84.4" y2="464.2"/>
+<line class="st6" x1="84.4" y1="423.4" x2="84.4" y2="432.7"/>
+<line class="st6" x1="80.9" y1="464.2" x2="87.8" y2="464.2"/>
+<line class="st6" x1="81.9" y1="466.3" x2="87" y2="466.3"/>
+<line class="st6" x1="83.2" y1="468.7" x2="85.3" y2="468.7"/>
+<line class="st6" x1="95.3" y1="456.2" x2="107.6" y2="456.2"/>
+<line class="st6" x1="95.3" y1="456.2" x2="101.2" y2="465.2"/>
+<line class="st6" x1="101.2" y1="465.2" x2="107.6" y2="456.2"/>
+<path class="st7" d="M119.9,423.4"/>
+<path class="st7" d="M111.4,443.5"/>
+<text transform="matrix(1 0 0 1 80.9502 334.0032)" class="st8 st1 st9">鎵�03</text>
+<text transform="matrix(1 0 0 1 80.9502 334.2049)" class="st6 st1 st9">鎵�</text>
+<text transform="matrix(1 0 0 1 91.6502 334.0032)" class="st6 st10 st9">03</text>
+<line class="st6" x1="116.5" y1="464.1" x2="123.4" y2="464.1"/>
+<line class="st6" x1="117.4" y1="466.2" x2="122.6" y2="466.2"/>
+<line class="st6" x1="118.7" y1="468.6" x2="120.8" y2="468.6"/>
+<g>
+	<line class="st21" x1="119.9" y1="423.2" x2="119.9" y2="442.1"/>
+</g>
+<g>
+	<line class="st21" x1="123.2" y1="442" x2="117.4" y2="442"/>
+</g>
+<g>
+	<line class="st21" x1="117.3" y1="443.9" x2="120.1" y2="448.9"/>
+</g>
+<g>
+	<line class="st21" x1="119.9" y1="448.7" x2="119.9" y2="463.8"/>
+</g>
+<rect x="189" y="381.6" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="193.6" y1="415.2" x2="193.9" y2="506.2"/>
+<line class="st6" x1="187.8" y1="454.8" x2="200.1" y2="454.8"/>
+<line class="st6" x1="187.8" y1="454.8" x2="193.6" y2="463.8"/>
+<line class="st6" x1="193.6" y1="463.8" x2="200.1" y2="454.8"/>
+<g>
+	<line class="st21" x1="212.4" y1="421.8" x2="212.4" y2="440.7"/>
+</g>
+<g>
+	<line class="st21" x1="215.7" y1="440.6" x2="209.8" y2="440.6"/>
+</g>
+<g>
+	<line class="st21" x1="209.8" y1="442.5" x2="212.6" y2="447.5"/>
+</g>
+<g>
+	<line class="st21" x1="212.4" y1="447.3" x2="212.4" y2="462.3"/>
+</g>
+<line class="st22" x1="84.4" y1="423.4" x2="119.9" y2="423.4"/>
+<line class="st6" x1="174.8" y1="422.1" x2="212.4" y2="422.1"/>
+<line class="st4" x1="280.3" y1="399.2" x2="280.3" y2="409.1"/>
+<line class="st4" x1="280.3" y1="370.5" x2="280.3" y2="380.9"/>
+<line class="st4" x1="280.3" y1="342.8" x2="280.3" y2="366.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="280.3" y1="374.2" x2="275" y2="381.4"/>
+	<line class="st4" x1="285.9" y1="381.4" x2="280" y2="374.2"/>
+	<line class="st4" x1="280.3" y1="379" x2="275" y2="386.2"/>
+	<line class="st4" x1="285.9" y1="386.2" x2="280" y2="379.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="280" y1="423.4" x2="285.3" y2="416.1"/>
+	<line class="st4" x1="274.4" y1="416.1" x2="280.3" y2="423.3"/>
+	<line class="st4" x1="280" y1="418.5" x2="285.3" y2="411.3"/>
+	<line class="st4" x1="274.4" y1="411.3" x2="280.3" y2="418.5"/>
+</g>
+<rect x="258.3" y="430.4" class="st5" width="10.1" height="18.2"/>
+<line class="st6" x1="263.4" y1="434.1" x2="260.1" y2="443.9"/>
+<line class="st6" x1="260.1" y1="443.9" x2="266.9" y2="443.9"/>
+<line class="st6" x1="266.9" y1="443.9" x2="263.4" y2="434.1"/>
+<line class="st6" x1="263.4" y1="439.5" x2="263.5" y2="461.9"/>
+<line class="st6" x1="263.5" y1="421.1" x2="263.5" y2="430.4"/>
+<line class="st6" x1="260.1" y1="461.9" x2="266.9" y2="461.9"/>
+<line class="st6" x1="261" y1="464" x2="266.2" y2="464"/>
+<line class="st6" x1="262.3" y1="466.4" x2="264.4" y2="466.4"/>
+<path class="st7" d="M299.1,421.1"/>
+<path class="st7" d="M290.5,441.1"/>
+<rect x="275.7" y="380.6" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="280.3" y1="414.2" x2="280.6" y2="505.2"/>
+<line class="st6" x1="274.4" y1="453.8" x2="286.7" y2="453.8"/>
+<line class="st6" x1="274.4" y1="453.8" x2="280.3" y2="462.8"/>
+<line class="st6" x1="280.3" y1="462.8" x2="286.7" y2="453.8"/>
+<g>
+	<line class="st21" x1="299.1" y1="420.8" x2="299.1" y2="439.7"/>
+</g>
+<g>
+	<line class="st21" x1="302.3" y1="439.6" x2="296.5" y2="439.6"/>
+</g>
+<g>
+	<line class="st21" x1="296.4" y1="441.5" x2="299.2" y2="446.5"/>
+</g>
+<g>
+	<line class="st21" x1="299.1" y1="446.3" x2="299.1" y2="461.3"/>
+</g>
+<line class="st6" x1="263.5" y1="421.1" x2="299.1" y2="421.1"/>
+<line class="st4" x1="363.4" y1="343.8" x2="363.4" y2="367.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="363.9" y1="375.8" x2="361.2" y2="378.5"/>
+	<line class="st4" x1="365.9" y1="378.5" x2="362.8" y2="375.8"/>
+	<line class="st4" x1="363.9" y1="378.9" x2="361.2" y2="381.6"/>
+	<line class="st4" x1="365.9" y1="381.6" x2="362.8" y2="378.9"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="363" y1="390.1" x2="365.8" y2="387.4"/>
+	<line class="st4" x1="361.1" y1="387.4" x2="364.2" y2="390.1"/>
+	<line class="st4" x1="363" y1="387" x2="365.8" y2="384.4"/>
+	<line class="st4" x1="361.1" y1="384.4" x2="364.2" y2="387"/>
+</g>
+<line class="st23" x1="363.4" y1="370.3" x2="363.4" y2="376.5"/>
+<line class="st23" x1="364" y1="384" x2="350.8" y2="384"/>
+<line class="st23" x1="363.4" y1="380.9" x2="363.4" y2="384"/>
+<line class="st23" x1="365.2" y1="390" x2="365.2" y2="405.1"/>
+<line class="st23" x1="361.4" y1="390.2" x2="361.4" y2="405.3"/>
+<line class="st23" x1="361.6" y1="405" x2="365.5" y2="405"/>
+<line class="st23" x1="361.1" y1="390.2" x2="365" y2="390.2"/>
+<line class="st23" x1="363" y1="384.5" x2="363" y2="420.8"/>
+<path class="st24" d="M367.4,424.3c-1.3,0-2.3-1-2.3-2.2s1.1-2.2,2.3-2.2c1.3,0,2.4,1,2.4,2.2S368.7,424.3,367.4,424.3"/>
+<text transform="matrix(1 0 0 1 366.1143 422.8147)" class="st8 st1 st25">Q</text>
+<text transform="matrix(1 0 0 1 366.1143 422.8147)" class="st6 st1 st25">Q</text>
+<path class="st24" d="M363,422.4c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5S364.5,422.4,363,422.4"/>
+<line class="st6" x1="363.1" y1="418.2" x2="363.1" y2="419.9"/>
+<line class="st6" x1="363.1" y1="419.7" x2="364.1" y2="421"/>
+<line class="st6" x1="363" y1="420" x2="362" y2="421.3"/>
+<path class="st24" d="M363.1,424.9c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5C365.8,423.8,364.6,424.9,363.1,424.9"/>
+<line class="st26" x1="363.2" y1="420.7" x2="363.2" y2="422.4"/>
+<line class="st26" x1="363.2" y1="422.2" x2="364.2" y2="423.5"/>
+<line class="st26" x1="363.1" y1="422.4" x2="362.1" y2="423.8"/>
+<line class="st4" x1="431.4" y1="413.7" x2="431.4" y2="508"/>
+<line class="st23" x1="412.2" y1="419.2" x2="431" y2="419.2"/>
+<line class="st23" x1="410.2" y1="419.2" x2="431" y2="419.2"/>
+<line class="st4" x1="494.3" y1="413.8" x2="494.3" y2="468"/>
+<path class="st7" d="M502.2,434.1"/>
+<line class="st6" x1="488.2" y1="454.1" x2="500.5" y2="454.1"/>
+<line class="st6" x1="488.2" y1="454.1" x2="494" y2="463.1"/>
+<line class="st6" x1="494" y1="463.1" x2="500.5" y2="454.1"/>
+<g>
+	<line class="st21" x1="509.7" y1="421.2" x2="509.7" y2="437"/>
+</g>
+<g>
+	<line class="st21" x1="512.9" y1="427.8" x2="507.1" y2="427.8"/>
+</g>
+<g>
+	<line class="st21" x1="507.1" y1="438.4" x2="509.9" y2="442.6"/>
+</g>
+<g>
+	<line class="st21" x1="509.7" y1="442.4" x2="509.7" y2="455"/>
+</g>
+<line class="st6" x1="506.3" y1="454.5" x2="513.2" y2="454.5"/>
+<line class="st6" x1="507.2" y1="456.3" x2="512.4" y2="456.3"/>
+<line class="st6" x1="508.5" y1="458.2" x2="510.6" y2="458.2"/>
+<line class="st4" x1="431.4" y1="508" x2="928.5" y2="508"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="492.9" y1="374" x2="487.6" y2="381.3"/>
+	<line class="st4" x1="498.4" y1="381.3" x2="492.6" y2="374.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="493.8" y1="423.1" x2="499" y2="415.9"/>
+	<line class="st4" x1="488.2" y1="415.9" x2="494.1" y2="423"/>
+</g>
+<line class="st4" x1="564" y1="343.2" x2="564" y2="366.5"/>
+<line class="st6" x1="550.5" y1="421.5" x2="580.7" y2="421.5"/>
+<line class="st4" x1="564.7" y1="414.1" x2="564.7" y2="468.3"/>
+<path class="st7" d="M572.5,434.4"/>
+<line class="st6" x1="558.6" y1="454.3" x2="570.9" y2="454.3"/>
+<line class="st6" x1="558.6" y1="454.3" x2="564.4" y2="463.4"/>
+<line class="st6" x1="564.4" y1="463.4" x2="570.9" y2="454.3"/>
+<g>
+	<line class="st21" x1="580.1" y1="421.5" x2="580.1" y2="437.3"/>
+</g>
+<g>
+	<line class="st21" x1="583.3" y1="428.1" x2="577.5" y2="428.1"/>
+</g>
+<g>
+	<line class="st21" x1="577.5" y1="438.7" x2="580.3" y2="442.9"/>
+</g>
+<g>
+	<line class="st21" x1="580.1" y1="442.7" x2="580.1" y2="455.3"/>
+</g>
+<line class="st6" x1="576.7" y1="454.8" x2="583.5" y2="454.8"/>
+<line class="st6" x1="577.6" y1="456.6" x2="582.8" y2="456.6"/>
+<line class="st6" x1="578.9" y1="458.5" x2="581" y2="458.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M581.1,384.8"/>
+	<path class="st27" d="M580.8,384.8"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="564.2" y1="376.3" x2="559" y2="383.6"/>
+	<line class="st4" x1="569.8" y1="383.6" x2="564" y2="376.4"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="564.2" y1="423.4" x2="569.4" y2="416.2"/>
+	<line class="st4" x1="558.6" y1="416.2" x2="564.4" y2="423.3"/>
+</g>
+<line class="st23" x1="350.9" y1="383.7" x2="350.9" y2="399.1"/>
+<line class="st23" x1="353.7" y1="395.5" x2="353.7" y2="410.1"/>
+<line class="st23" x1="347.6" y1="395.7" x2="347.6" y2="410.3"/>
+<line class="st28" x1="347.6" y1="410.1" x2="353.7" y2="410.1"/>
+<line class="st28" x1="347.6" y1="395.7" x2="353.7" y2="395.7"/>
+<line class="st28" x1="350.6" y1="410.1" x2="350.6" y2="414.7"/>
+<line class="st6" x1="347.1" y1="414.8" x2="353.8" y2="414.8"/>
+<line class="st6" x1="348" y1="417" x2="353.1" y2="417"/>
+<line class="st6" x1="349.3" y1="419.3" x2="351.3" y2="419.3"/>
+<line class="st23" x1="410.2" y1="419.2" x2="410.2" y2="433"/>
+<line class="st23" x1="413.2" y1="429.3" x2="413.2" y2="444"/>
+<line class="st23" x1="406.7" y1="429.5" x2="406.7" y2="444.2"/>
+<line class="st23" x1="406.7" y1="444" x2="413.2" y2="444"/>
+<line class="st23" x1="406.7" y1="429.5" x2="413.2" y2="429.5"/>
+<line class="st23" x1="409.9" y1="444" x2="409.9" y2="448.6"/>
+<line class="st6" x1="406.2" y1="448.7" x2="413.3" y2="448.7"/>
+<line class="st6" x1="407.1" y1="450.9" x2="412.5" y2="450.9"/>
+<line class="st6" x1="408.5" y1="453.2" x2="410.7" y2="453.2"/>
+<line class="st23" x1="480.2" y1="420.5" x2="480.2" y2="436.1"/>
+<path class="st6" d="M456,436.3"/>
+<path class="st6" d="M455.9,436.1"/>
+<line class="st23" x1="483.2" y1="432.4" x2="483.2" y2="447.1"/>
+<line class="st23" x1="476.7" y1="432.6" x2="476.7" y2="447.3"/>
+<line class="st23" x1="476.7" y1="447.1" x2="483.2" y2="447.1"/>
+<line class="st23" x1="476.7" y1="432.6" x2="483.2" y2="432.6"/>
+<line class="st28" x1="479.9" y1="447.1" x2="479.9" y2="451.7"/>
+<line class="st6" x1="476.2" y1="451.9" x2="483.3" y2="451.9"/>
+<line class="st6" x1="477.1" y1="454" x2="482.5" y2="454"/>
+<line class="st6" x1="478.5" y1="456.3" x2="480.7" y2="456.3"/>
+<line class="st23" x1="550.8" y1="421.7" x2="550.8" y2="437.3"/>
+<line class="st23" x1="553.5" y1="433.4" x2="553.5" y2="448.1"/>
+<line class="st23" x1="546.9" y1="433.6" x2="546.9" y2="448.3"/>
+<line class="st23" x1="546.9" y1="448.1" x2="553.5" y2="448.1"/>
+<line class="st23" x1="546.9" y1="433.6" x2="553.4" y2="433.6"/>
+<line class="st23" x1="550.1" y1="448.1" x2="550.1" y2="452.7"/>
+<line class="st6" x1="546.4" y1="452.9" x2="553.6" y2="452.9"/>
+<line class="st6" x1="547.3" y1="455" x2="552.8" y2="455"/>
+<line class="st6" x1="548.7" y1="457.3" x2="550.9" y2="457.3"/>
+<line class="st4" x1="683.6" y1="398.4" x2="683.6" y2="408.4"/>
+<line class="st4" x1="683.6" y1="369.7" x2="683.6" y2="380.2"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="683.6" y1="373.4" x2="678.3" y2="380.6"/>
+	<line class="st4" x1="689.1" y1="380.6" x2="683.3" y2="373.5"/>
+	<line class="st4" x1="683.6" y1="378.2" x2="678.3" y2="385.5"/>
+	<line class="st4" x1="689.1" y1="385.5" x2="683.3" y2="378.3"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="683.3" y1="422.6" x2="688.5" y2="415.4"/>
+	<line class="st4" x1="677.7" y1="415.4" x2="683.6" y2="422.5"/>
+	<line class="st4" x1="683.3" y1="417.8" x2="688.5" y2="410.5"/>
+	<line class="st4" x1="677.7" y1="410.5" x2="683.6" y2="417.7"/>
+</g>
+<path class="st7" d="M702.3,420.4"/>
+<path class="st7" d="M693.8,440.4"/>
+<rect x="679" y="379.8" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="683.6" y1="413.4" x2="683.9" y2="494.9"/>
+<line class="st6" x1="677.7" y1="452.5" x2="690" y2="452.5"/>
+<line class="st6" x1="677.7" y1="452.5" x2="683.6" y2="442.1"/>
+<line class="st6" x1="683.6" y1="442.1" x2="690" y2="452.5"/>
+<line class="st6" x1="666.8" y1="420.4" x2="683.6" y2="420.4"/>
+<line class="st23" x1="666.9" y1="420" x2="666.9" y2="435.6"/>
+<line class="st23" x1="669.9" y1="431.9" x2="669.9" y2="446.6"/>
+<line class="st23" x1="663.4" y1="432.1" x2="663.4" y2="446.8"/>
+<line class="st23" x1="663.4" y1="446.6" x2="669.9" y2="446.6"/>
+<line class="st23" x1="663.4" y1="432.1" x2="669.9" y2="432.1"/>
+<line class="st23" x1="666.6" y1="446.6" x2="666.6" y2="451.2"/>
+<line class="st6" x1="662.9" y1="451.3" x2="670" y2="451.3"/>
+<line class="st6" x1="663.8" y1="453.5" x2="669.2" y2="453.5"/>
+<line class="st6" x1="665.2" y1="455.8" x2="667.4" y2="455.8"/>
+<line class="st4" x1="791.1" y1="400.3" x2="791.1" y2="410.3"/>
+<line class="st4" x1="791.1" y1="371.6" x2="791.1" y2="382"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="791.1" y1="375.3" x2="785.9" y2="382.5"/>
+	<line class="st4" x1="796.7" y1="382.5" x2="790.9" y2="375.3"/>
+	<line class="st4" x1="791.1" y1="380.1" x2="785.9" y2="387.3"/>
+	<line class="st4" x1="796.7" y1="387.3" x2="790.9" y2="380.2"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="790.9" y1="424.5" x2="796.1" y2="417.2"/>
+	<line class="st4" x1="785.3" y1="417.2" x2="791.1" y2="424.4"/>
+	<line class="st4" x1="790.9" y1="419.6" x2="796.1" y2="412.4"/>
+	<line class="st4" x1="785.3" y1="412.4" x2="791.1" y2="419.6"/>
+</g>
+<path class="st7" d="M801.3,442.2"/>
+<rect x="786.5" y="381.7" class="st18" width="9.7" height="18.5"/>
+<line class="st4" x1="791.1" y1="415.3" x2="791.5" y2="468"/>
+<line class="st6" x1="785.3" y1="454.3" x2="797.6" y2="454.3"/>
+<line class="st6" x1="785.3" y1="454.3" x2="791.1" y2="464.6"/>
+<line class="st6" x1="791.1" y1="464.6" x2="797.6" y2="454.3"/>
+<line class="st6" x1="774.4" y1="422.2" x2="809" y2="422.2"/>
+<line class="st23" x1="774.5" y1="421.9" x2="774.5" y2="437.4"/>
+<line class="st23" x1="777.5" y1="433.8" x2="777.5" y2="448.5"/>
+<line class="st23" x1="771" y1="434" x2="771" y2="448.7"/>
+<line class="st23" x1="771" y1="448.4" x2="777.5" y2="448.4"/>
+<line class="st23" x1="771" y1="434" x2="777.4" y2="434"/>
+<line class="st23" x1="774.2" y1="448.5" x2="774.2" y2="453.1"/>
+<line class="st6" x1="770.4" y1="453.2" x2="777.6" y2="453.2"/>
+<line class="st6" x1="771.4" y1="455.4" x2="776.8" y2="455.4"/>
+<line class="st6" x1="772.7" y1="457.7" x2="774.9" y2="457.7"/>
+<g>
+	<line class="st21" x1="809" y1="421.5" x2="809" y2="435.7"/>
+</g>
+<g>
+	<line class="st21" x1="812.2" y1="435.6" x2="806.4" y2="435.6"/>
+</g>
+<g>
+	<line class="st21" x1="806.4" y1="437" x2="809.1" y2="440.7"/>
+</g>
+<g>
+	<line class="st21" x1="809" y1="440.6" x2="809" y2="451.9"/>
+</g>
+<line class="st6" x1="805.6" y1="451.9" x2="812.4" y2="451.9"/>
+<line class="st6" x1="806.5" y1="454.4" x2="811.7" y2="454.4"/>
+<line class="st6" x1="807.8" y1="456.2" x2="809.9" y2="456.2"/>
+<line class="st4" x1="650.1" y1="494.8" x2="684.3" y2="494.5"/>
+<line class="st4" x1="650" y1="305.8" x2="650.3" y2="494.8"/>
+<line class="st4" x1="928.2" y1="420.8" x2="928.5" y2="508.1"/>
+<path class="st27" d="M943.8,401.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M948.7,413.4"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="927.7" y1="383.8" x2="922.5" y2="391"/>
+	<line class="st4" x1="933.3" y1="391" x2="927.4" y2="383.8"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="927.9" y1="429.8" x2="933.1" y2="422.6"/>
+	<line class="st4" x1="922.3" y1="422.6" x2="928.2" y2="429.8"/>
+</g>
+<line class="st4" x1="927.2" y1="342.7" x2="927.5" y2="375.2"/>
+<line class="st6" x1="1025.3" y1="424.7" x2="1055.5" y2="424.7"/>
+<line class="st4" x1="1039.5" y1="417.3" x2="1039.5" y2="471.5"/>
+<path class="st7" d="M1047.4,437.7"/>
+<line class="st6" x1="1033.4" y1="457.6" x2="1045.7" y2="457.6"/>
+<line class="st6" x1="1033.4" y1="457.6" x2="1039.2" y2="466.6"/>
+<line class="st6" x1="1039.2" y1="466.6" x2="1045.7" y2="457.6"/>
+<g>
+	<line class="st21" x1="1054.9" y1="424.7" x2="1054.9" y2="440.5"/>
+</g>
+<g>
+	<line class="st21" x1="1058.1" y1="431.3" x2="1052.3" y2="431.3"/>
+</g>
+<g>
+	<line class="st21" x1="1052.3" y1="441.9" x2="1055.1" y2="446.1"/>
+</g>
+<g>
+	<line class="st21" x1="1054.9" y1="445.9" x2="1054.9" y2="458.5"/>
+</g>
+<line class="st6" x1="1051.5" y1="458" x2="1058.4" y2="458"/>
+<line class="st6" x1="1052.4" y1="459.8" x2="1057.6" y2="459.8"/>
+<line class="st6" x1="1053.7" y1="461.8" x2="1055.8" y2="461.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M1050.6,414"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1039.1" y1="377.6" x2="1033.8" y2="384.8"/>
+	<line class="st4" x1="1044.6" y1="384.8" x2="1038.8" y2="377.6"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1039" y1="426.6" x2="1044.2" y2="419.4"/>
+	<line class="st4" x1="1033.4" y1="419.4" x2="1039.3" y2="426.6"/>
+</g>
+<line class="st23" x1="1025.4" y1="424.3" x2="1025.4" y2="439.9"/>
+<line class="st23" x1="1028.4" y1="436.2" x2="1028.4" y2="450.9"/>
+<line class="st23" x1="1021.9" y1="436.4" x2="1021.9" y2="451.1"/>
+<line class="st23" x1="1021.9" y1="450.9" x2="1028.4" y2="450.9"/>
+<line class="st23" x1="1021.9" y1="436.4" x2="1028.4" y2="436.4"/>
+<line class="st23" x1="1025.1" y1="450.9" x2="1025.1" y2="455.5"/>
+<line class="st6" x1="1021.4" y1="455.6" x2="1028.5" y2="455.6"/>
+<line class="st6" x1="1022.3" y1="457.8" x2="1027.7" y2="457.8"/>
+<line class="st6" x1="1023.7" y1="460.1" x2="1025.9" y2="460.1"/>
+<line class="st4" x1="1116.4" y1="344" x2="1116.3" y2="369.6"/>
+<line class="st6" x1="1104.9" y1="425.7" x2="1135.1" y2="425.7"/>
+<line class="st4" x1="1119.1" y1="418.4" x2="1119.1" y2="472.5"/>
+<path class="st7" d="M1126.9,438.7"/>
+<line class="st6" x1="1113" y1="458.6" x2="1125.3" y2="458.6"/>
+<line class="st6" x1="1113" y1="458.6" x2="1118.8" y2="467.6"/>
+<line class="st6" x1="1118.8" y1="467.6" x2="1125.3" y2="458.6"/>
+<g>
+	<line class="st21" x1="1134.5" y1="425.7" x2="1134.5" y2="441.5"/>
+</g>
+<g>
+	<line class="st21" x1="1137.7" y1="432.4" x2="1131.9" y2="432.4"/>
+</g>
+<g>
+	<line class="st21" x1="1131.9" y1="443" x2="1134.7" y2="447.2"/>
+</g>
+<g>
+	<line class="st21" x1="1134.5" y1="447" x2="1134.5" y2="459.6"/>
+</g>
+<line class="st6" x1="1131.1" y1="459.1" x2="1137.9" y2="459.1"/>
+<line class="st6" x1="1132" y1="460.8" x2="1137.2" y2="460.8"/>
+<line class="st6" x1="1133.3" y1="462.8" x2="1135.4" y2="462.8"/>
+<line class="st29" x1="1118.1" y1="403.4" x2="1118.1" y2="411.3"/>
+<line class="st29" x1="1117.1" y1="380.8" x2="1117.1" y2="389.1"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1117.5" y1="389" x2="1112.3" y2="394.7"/>
+	<line class="st4" x1="1123.1" y1="394.7" x2="1117.2" y2="389.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1117.7" y1="420.8" x2="1123" y2="415"/>
+	<line class="st4" x1="1112.1" y1="415" x2="1118" y2="420.7"/>
+</g>
+<rect x="1113.2" y="388.7" class="st18" width="9.7" height="14.7"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1116.6" y1="381.6" x2="1111.4" y2="388.8"/>
+	<line class="st4" x1="1122.2" y1="388.8" x2="1116.4" y2="381.6"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1118.6" y1="427.6" x2="1123.8" y2="420.4"/>
+	<line class="st4" x1="1113" y1="420.4" x2="1118.8" y2="427.6"/>
+</g>
+<line class="st23" x1="1105" y1="425.4" x2="1105" y2="440.9"/>
+<line class="st23" x1="1108" y1="437.2" x2="1108" y2="452"/>
+<line class="st23" x1="1101.5" y1="437.4" x2="1101.5" y2="452.2"/>
+<line class="st23" x1="1101.5" y1="451.9" x2="1108" y2="451.9"/>
+<line class="st23" x1="1101.5" y1="437.4" x2="1108" y2="437.4"/>
+<line class="st23" x1="1104.7" y1="452" x2="1104.7" y2="456.5"/>
+<line class="st6" x1="1101" y1="456.7" x2="1108.1" y2="456.7"/>
+<line class="st6" x1="1101.9" y1="458.8" x2="1107.3" y2="458.8"/>
+<line class="st6" x1="1103.3" y1="461.1" x2="1105.5" y2="461.1"/>
+<line class="st4" x1="1189" y1="344.5" x2="1189" y2="370.1"/>
+<line class="st6" x1="1175.6" y1="426.2" x2="1205.8" y2="426.2"/>
+<line class="st4" x1="1189.8" y1="418.9" x2="1189.8" y2="473"/>
+<path class="st7" d="M1197.6,439.2"/>
+<line class="st6" x1="1183.6" y1="459.1" x2="1195.9" y2="459.1"/>
+<line class="st6" x1="1183.6" y1="459.1" x2="1189.5" y2="468.1"/>
+<line class="st6" x1="1189.5" y1="468.1" x2="1195.9" y2="459.1"/>
+<g>
+	<line class="st21" x1="1205.2" y1="426.2" x2="1205.2" y2="442"/>
+</g>
+<g>
+	<line class="st21" x1="1208.4" y1="432.9" x2="1202.5" y2="432.9"/>
+</g>
+<g>
+	<line class="st21" x1="1202.6" y1="443.5" x2="1205.3" y2="447.7"/>
+</g>
+<g>
+	<line class="st21" x1="1205.2" y1="447.5" x2="1205.2" y2="460"/>
+</g>
+<line class="st6" x1="1201.8" y1="459.6" x2="1208.6" y2="459.6"/>
+<line class="st6" x1="1202.7" y1="461.3" x2="1207.9" y2="461.3"/>
+<line class="st6" x1="1204" y1="463.3" x2="1206.1" y2="463.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M1200.8,415.5"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1189.3" y1="380.1" x2="1184.1" y2="387.3"/>
+	<line class="st4" x1="1194.9" y1="387.3" x2="1189" y2="380.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1189.2" y1="428.1" x2="1194.5" y2="420.9"/>
+	<line class="st4" x1="1183.7" y1="420.9" x2="1189.5" y2="428.1"/>
+</g>
+<line class="st23" x1="1175.7" y1="425.8" x2="1175.7" y2="441.4"/>
+<line class="st23" x1="1178.7" y1="437.7" x2="1178.7" y2="452.4"/>
+<line class="st23" x1="1172.2" y1="437.9" x2="1172.2" y2="452.6"/>
+<line class="st28" x1="1172.2" y1="452.4" x2="1178.7" y2="452.4"/>
+<line class="st23" x1="1172.2" y1="437.9" x2="1178.7" y2="437.9"/>
+<line class="st23" x1="1175.4" y1="452.4" x2="1175.4" y2="457"/>
+<line class="st6" x1="1171.6" y1="457.2" x2="1178.8" y2="457.2"/>
+<line class="st6" x1="1172.6" y1="459.3" x2="1178" y2="459.3"/>
+<line class="st6" x1="1173.9" y1="461.6" x2="1176.1" y2="461.6"/>
+<path class="st30" d="M1277.7,435"/>
+<path class="st30" d="M1277.7,435"/>
+<path class="st30" d="M1276.7,433.8"/>
+<path class="st30" d="M1261.7,424.9"/>
+<path class="st30" d="M1262.6,426"/>
+<line class="st4" x1="1277.7" y1="344.2" x2="1277.7" y2="367.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1277.5" y1="375" x2="1272.3" y2="382.3"/>
+	<line class="st4" x1="1283.1" y1="382.3" x2="1277.2" y2="375.1"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<path class="st27" d="M1295,378.7"/>
+</g>
+<path class="st27" d="M1295.3,370.7"/>
+<line class="st6" x1="1230.2" y1="304.6" x2="1244.7" y2="304.6"/>
+<line class="st4" x1="1244.4" y1="297.2" x2="1244.4" y2="342.7"/>
+<path class="st7" d="M1252.3,317.6"/>
+<line class="st6" x1="1239.1" y1="318.6" x2="1250.3" y2="318.6"/>
+<line class="st6" x1="1239.1" y1="318.6" x2="1244.4" y2="325.1"/>
+<line class="st6" x1="1244.4" y1="325.1" x2="1250.3" y2="318.6"/>
+<line class="st23" x1="1230.2" y1="304.2" x2="1230.2" y2="314.7"/>
+<line class="st23" x1="1232" y1="315" x2="1232" y2="328.4"/>
+<line class="st23" x1="1227.2" y1="315.2" x2="1227.2" y2="328.5"/>
+<line class="st23" x1="1227.4" y1="328.3" x2="1232.4" y2="328.3"/>
+<line class="st23" x1="1226.7" y1="315.2" x2="1231.7" y2="315.2"/>
+<line class="st28" x1="1229.9" y1="328.4" x2="1229.9" y2="332.5"/>
+<line class="st6" x1="1227.9" y1="332.6" x2="1231.9" y2="332.6"/>
+<line class="st6" x1="1228.5" y1="335" x2="1231.5" y2="335"/>
+<line class="st6" x1="1229.2" y1="336.6" x2="1230.5" y2="336.6"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1244" y1="263.5" x2="1238.7" y2="270.7"/>
+	<line class="st4" x1="1249.5" y1="270.7" x2="1243.7" y2="263.5"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1243.9" y1="306.5" x2="1249.1" y2="299.3"/>
+	<line class="st4" x1="1238.3" y1="299.3" x2="1244.2" y2="306.5"/>
+</g>
+<line class="st4" x1="1243.7" y1="233.6" x2="1243.7" y2="257"/>
+<line class="st3" x1="926.2" y1="344.1" x2="1290.1" y2="344.1"/>
+<line class="st31" x1="651" y1="305.8" x2="495.5" y2="305.8"/>
+<line class="st6" x1="530.8" y1="157.3" x2="522.9" y2="157.3"/>
+<line class="st6" x1="529.7" y1="159.6" x2="523.7" y2="159.6"/>
+<line class="st6" x1="528.2" y1="162.3" x2="525.8" y2="162.3"/>
+<line class="st6" x1="495.5" y1="151" x2="513.2" y2="151"/>
+<line class="st6" x1="519" y1="157.5" x2="519" y2="145"/>
+<line class="st6" x1="526.8" y1="151.1" x2="519.3" y2="151.2"/>
+<line class="st6" x1="526.8" y1="157.4" x2="526.8" y2="151.2"/>
+<line class="st6" x1="426.1" y1="162.3" x2="494.1" y2="162.3"/>
+<line class="st6" x1="426.1" y1="175.3" x2="426.1" y2="162.8"/>
+<path class="st24" d="M430.6,178c-1.3,0-2.4-1.2-2.4-2.6c0-1.4,1.1-2.6,2.4-2.6s2.4,1.2,2.4,2.6S431.9,178,430.6,178"/>
+<text transform="matrix(0.8602 0 0 1 429.249 176.1934)" class="st8 st1 st32">Q</text>
+<text transform="matrix(0.8602 0 0 1 429.249 176.1934)" class="st6 st1 st32">Q</text>
+<line class="st6" x1="426.1" y1="170.6" x2="426.1" y2="172.7"/>
+<line class="st6" x1="426.1" y1="172.4" x2="427.2" y2="174.1"/>
+<line class="st6" x1="426.1" y1="172.7" x2="425" y2="174.4"/>
+<path class="st24" d="M426.1,178.8c-1.5,0-2.8-1.3-2.8-3s1.3-3,2.8-3s2.8,1.3,2.8,3C428.9,177.4,427.7,178.8,426.1,178.8"/>
+<line class="st26" x1="426.2" y1="173.6" x2="426.2" y2="175.7"/>
+<line class="st26" x1="426.2" y1="175.4" x2="427.3" y2="177.1"/>
+<line class="st26" x1="426.1" y1="175.8" x2="425.1" y2="177.4"/>
+<line class="st6" x1="413.3" y1="179.3" x2="421.9" y2="179.3"/>
+<line class="st6" x1="414.4" y1="181.7" x2="420.9" y2="181.7"/>
+<line class="st6" x1="417.6" y1="173.1" x2="425.8" y2="173.3"/>
+<line class="st6" x1="416" y1="184.4" x2="418.7" y2="184.4"/>
+<line class="st6" x1="417.6" y1="179.5" x2="417.6" y2="173.2"/>
+<path class="st24" d="M426.1,175.7c-1.5,0-2.8-1.3-2.8-3s1.3-3,2.8-3s2.8,1.3,2.8,3S427.6,175.7,426.1,175.7"/>
+<line class="st33" x1="505" y1="170" x2="487.8" y2="170"/>
+<line class="st6" x1="512.4" y1="151.4" x2="516" y2="145"/>
+<line class="st6" x1="417.8" y1="238.1" x2="411" y2="230.1"/>
+<line class="st6" x1="527.7" y1="197.3" x2="519.6" y2="197.3"/>
+<line class="st6" x1="526.7" y1="199.6" x2="520.5" y2="199.6"/>
+<line class="st6" x1="525.1" y1="202.3" x2="522.6" y2="202.3"/>
+<line class="st6" x1="495.8" y1="191.1" x2="509.6" y2="191.1"/>
+<line class="st6" x1="515.9" y1="197.5" x2="515.9" y2="185"/>
+<line class="st6" x1="523.6" y1="191.1" x2="515.9" y2="191.3"/>
+<line class="st6" x1="523.6" y1="197.4" x2="523.6" y2="191.2"/>
+<line class="st6" x1="509.8" y1="191.4" x2="513.3" y2="185"/>
+<path class="st34" d="M496,225.7c-5.6,0-10.2-4.5-10.2-9.9c0-5.5,4.6-9.9,10.2-9.9s10.2,4.5,10.2,9.9
+	C506.3,221.2,501.7,225.7,496,225.7"/>
+<path class="st35" d="M496.4,239.7c-5.9,0-10.6-4.6-10.6-10.3s4.8-10.3,10.6-10.3c5.9,0,10.6,4.6,10.6,10.3
+	C507,235.1,502.2,239.7,496.4,239.7"/>
+<line class="st36" x1="503.2" y1="233.9" x2="496.5" y2="222.6"/>
+<line class="st26" x1="496.6" y1="222.5" x2="489.2" y2="234.5"/>
+<line class="st26" x1="503.6" y1="234.1" x2="489.2" y2="233.9"/>
+<line class="st6" x1="428.1" y1="215.4" x2="496.1" y2="215.4"/>
+<line class="st6" x1="433.9" y1="241.9" x2="428.3" y2="236.6"/>
+<line class="st6" x1="428" y1="236.2" x2="423.2" y2="242"/>
+<line class="st6" x1="428.3" y1="236.9" x2="428.3" y2="262.3"/>
+<line class="st6" x1="423.2" y1="225.6" x2="427.9" y2="232"/>
+<line class="st6" x1="427.8" y1="232.3" x2="431.3" y2="225.3"/>
+<line class="st6" x1="427.9" y1="231.7" x2="427.9" y2="215"/>
+<line class="st23" x1="441.4" y1="223.3" x2="441.4" y2="238.3"/>
+<line class="st23" x1="443.1" y1="234.7" x2="443.1" y2="248.9"/>
+<line class="st23" x1="439.3" y1="234.9" x2="439.3" y2="249.1"/>
+<line class="st23" x1="439.3" y1="248.9" x2="443.1" y2="248.9"/>
+<line class="st23" x1="439.3" y1="234.9" x2="443.1" y2="234.9"/>
+<line class="st6" x1="410.7" y1="223" x2="441.3" y2="223"/>
+<line class="st6" x1="410.7" y1="223.3" x2="410.7" y2="231.2"/>
+<line class="st6" x1="417.9" y1="241" x2="404.1" y2="241"/>
+<line class="st6" x1="410.7" y1="240.9" x2="410.7" y2="253.5"/>
+<line class="st6" x1="409.6" y1="253.5" x2="441.8" y2="253.5"/>
+<line class="st6" x1="441.8" y1="248.5" x2="441.8" y2="253.5"/>
+<line class="st6" x1="424.5" y1="262.5" x2="431.4" y2="262.5"/>
+<line class="st6" x1="425.4" y1="264.2" x2="430.6" y2="264.2"/>
+<line class="st6" x1="426.7" y1="266.2" x2="428.8" y2="266.2"/>
+<text transform="matrix(0.907 0 0 1 922.7803 77.8848)" class="st10 st37">10KV</text>
+<text transform="matrix(0.907 0 0 1 953.9805 77.5923)" class="st1 st37">涓讳緵瀹�</text>
+<text transform="matrix(0.907 0 0 1 915.7803 105.8301)" class="st1 st37">  </text>
+<text transform="matrix(0.907 0 0 1 924.8545 105.5376)" class="st1 st37">浜屾ゼ</text>
+<text transform="matrix(0.907 0 0 1 953.9805 105.5376)" class="st1 st37">涓讳緵瀹�</text>
+<text transform="matrix(0.907 0 0 1 923.7803 137.0771)" class="st10 st37">10KV</text>
+<text transform="matrix(0.907 0 0 1 954.9805 136.7847)" class="st1 st37">澶囦緵瀹�</text>
+<text transform="matrix(0.9726 0 0 1 1020.0811 77.8848)" class="st1 st38">娓╁害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1020.0811 107.5059)" class="st1 st38">娓╁害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1020.0811 137.0771)" class="st1 st38">娓╁害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1152.7803 75.582)" class="st1 st38">婀垮害锛�</text>
+<text id="_x31_0KVWD_x5F_wd" transform="matrix(1 0 0 1 1056.5176 77.885)" class="st19 st10 st14">18###.## </text>
+<text id="_x32_ZK_x5F_WD_x5F_wd" transform="matrix(1 0 0 1 1056.5176 107.5061)" class="st19 st10 st14">19###.## </text>
+<text id="_x31_0KVB_x5F_wd" transform="matrix(1 0 0 1 1056.5176 137.0774)" class="st19 st10 st14">20###.## </text>
+<text id="_x31_0KVSD_x5F_sd" transform="matrix(1 0 0 1 1195.9385 77.885)" class="st19 st10 st14">21###.## </text>
+<text transform="matrix(0.9726 0 0 1 1152.7803 107.5059)" class="st1 st38">婀垮害锛�</text>
+<text transform="matrix(0.9726 0 0 1 1152.7803 137.0771)" class="st1 st38">婀垮害锛�</text>
+<text id="_x32_ZKSD_x5F_sd" transform="matrix(1 0 0 1 1195.9385 107.5061)" class="st19 st10 st14">22###.## </text>
+<text id="_x31_0KVB_x5F_sd" transform="matrix(1 0 0 1 1195.9385 137.4309)" class="st19 st10 st14">23###.## </text>
+<text transform="matrix(1 0 0 1 1266.791 77.885)" class="st19 st1 st14">% </text>
+<text transform="matrix(1 0 0 1 1266.791 107.5061)" class="st19 st1 st14">% </text>
+<text transform="matrix(1 0 0 1 1265.4297 137.0774)" class="st19 st1 st14">% </text>
+<text transform="matrix(0.9434 0 0 1 977.8799 187.1885)" class="st1 st39">杩涚嚎</text>
+<text transform="matrix(0.9434 0 0 1 1002.6914 187.354)" class="st1 st39">(</text>
+<text transform="matrix(0.9434 0 0 1 1006.8418 187.1885)" class="st1 st39">澶囦緵</text>
+<text transform="matrix(0.9434 0 0 1 1031.748 187.354)" class="st1 st39">)</text>
+<text id="_x31_0KVB_x5F_ia" transform="matrix(1.0507 0 0 1 1126.9375 216.0146)" class="st15 st10 st40">     27###.##  </text>
+<text id="_x31_0KVB_x5F_ib" transform="matrix(1.0507 0 0 1 1126.9375 230.8584)" class="st15 st10 st40">     28###.## </text>
+<text id="_x31_0KVB_x5F_ic" transform="matrix(1.0507 0 0 1 1126.9375 245.7285)" class="st15 st10 st40">     29###.##</text>
+<text transform="matrix(1.0507 0 0 1 1011.9727 211.7891)" class="st19 st10 st40">Va</text>
+<text id="_x31_10KV_x5F_ua" transform="matrix(1.0507 0 0 1 1029.3936 211.7891)" class="st19 st10 st40">  24###.##</text>
+<text transform="matrix(1.0507 0 0 1 1011.9727 230.7861)" class="st19 st10 st40">Vb</text>
+<text id="_x31_10KV_x5F_ub" transform="matrix(1.0507 0 0 1 1028.3936 230.7861)" class="st19 st10 st40">  25###.##</text>
+<text transform="matrix(1.0507 0 0 1 1011.2891 248.8857)" class="st19 st10 st40">Vc</text>
+<text id="_x31_10KV_x5F_uc" transform="matrix(1.0507 0 0 1 1022.9922 248.8857)" class="st19 st1 st40">  26###.##</text>
+<text transform="matrix(0.9013 0 0 1 1267.2754 335.7031)" class="st8 st1 st41">浜�</text>
+<text transform="matrix(0.9013 0 0 1 1267.2754 335.7031)" class="st6 st1 st41">浜�</text>
+<text transform="matrix(1 0 0 1 53.0977 297.6213)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 53.0977 297.6213)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 53.0977 297.135)" class="st10 st12">10kV1</text>
+<text transform="matrix(1 0 0 1 98.4787 296.567)" class="st1 st12">娈垫瘝绾�</text>
+<text transform="matrix(1 0 0 1 874.0977 309.76)" class="st8 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 874.0977 309.76)" class="st6 st1 st11">  </text>
+<text transform="matrix(1 0 0 1 891.0977 309.1272)" class="st10 st12">10kV2</text>
+<text transform="matrix(1 0 0 1 936.4788 308.5591)" class="st1 st12">娈垫瘝绾�</text>
+<text transform="matrix(1.0185 0 0 1 208.7949 551.6924)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 208.1299 567.3301)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 208.1299 583.6611)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 207.4277 608.6523)" class="st19 st10 st42">MW </text>
+<text transform="matrix(1 0 0 1 1204.7803 523.635)" class="st19 st1 st43">鍗楀巶</text>
+<text transform="matrix(1 0 0 1 1228.7803 523.635)" class="st19 st1 st43">3#</text>
+<text transform="matrix(1 0 0 1 1110.6484 523.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 1134.6484 523.635)" class="st19 st10 st43">201</text>
+<text transform="matrix(1 0 0 1 1022.9727 523.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 1046.9727 523.635)" class="st19 st10 st43">303</text>
+<text transform="matrix(1 0 0 1 1207.7803 538.635)" class="st19 st10 st43">AH04</text>
+<text transform="matrix(1 0 0 1 1107.6484 538.635)" class="st19 st10 st43">1#HT220</text>
+<text transform="matrix(1 0 0 1 1022.2891 538.635)" class="st19 st10 st43">6#HT219</text>
+<text transform="matrix(1 0 0 1 907.7803 525.635)" class="st19 st1 st43">鑱旂粶</text>
+<text transform="matrix(1 0 0 1 768.7803 523.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 792.7803 523.635)" class="st19 st10 st43">303</text>
+<text transform="matrix(1 0 0 1 767.7803 536.635)" class="st19 st10 st43">6#AH001</text>
+<text transform="matrix(1 0 0 1 650.9629 523.635)" class="st19 st1 st43">涓讳緵杩涚嚎</text>
+<text transform="matrix(1 0 0 1 548.7109 523.635)" class="st19 st1 st43">澶囩敤</text>
+<text transform="matrix(1 0 0 1 477.1221 523.635)" class="st19 st1 st43">澶囩敤</text>
+<text transform="matrix(1 0 0 1 417.8154 523.635)" class="st19 st1 st43">闅旂</text>
+<text transform="matrix(1 0 0 1 258.3271 520.635)" class="st19 st1 st43">鍖楀巶</text>
+<text transform="matrix(1 0 0 1 282.3271 520.635)" class="st19 st10 st43">201</text>
+<text transform="matrix(1 0 0 1 256.4434 533.635)" class="st19 st10 st43">1#HT001</text>
+<text transform="matrix(1 0 0 1 178.4912 520.635)" class="st19 st1 st43">鍗楀巶</text>
+<text transform="matrix(1 0 0 1 202.4912 520.635)" class="st19 st10 st43">3#</text>
+<text transform="matrix(1 0 0 1 87.0479 519.635)" class="st19 st1 st43">鎵�鐢ㄥ彉</text>
+<text transform="matrix(0.8166 0 0 1 247.1797 551.6924)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 247.1797 568.9219)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 247.1797 583.6611)" class="st19 st10 st20">Ic</text>
+<text id="HT001_ia" transform="matrix(0.8166 0 0 1 258.8633 551.6924)" class="st19 st10 st20">33A###.##</text>
+<text id="HT001_ib" transform="matrix(0.8166 0 0 1 258.8633 567.3301)" class="st19 st10 st20">34B###.##</text>
+<text id="HT001_ic" transform="matrix(0.8166 0 0 1 258.8633 583.6611)" class="st19 st10 st20">35C###.##</text>
+<text transform="matrix(1.0185 0 0 1 311.5693 551.6924)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 310.9043 567.3301)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 310.9043 583.6611)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 310.2021 608.6523)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 432.8813 551.3145)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 432.8813 568.5439)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 432.8813 583.2832)" class="st19 st10 st20">Ic</text>
+<text id="BY35_ia" transform="matrix(0.8166 0 0 1 444.5645 551.3145)" class="st19 st10 st20">40A###.##</text>
+<text id="BY35_ib" transform="matrix(0.8166 0 0 1 444.5645 566.9521)" class="st19 st10 st20">41B###.##</text>
+<text id="BY35_ic" transform="matrix(0.8166 0 0 1 444.5645 583.2832)" class="st19 st10 st20">42C###.##</text>
+<text transform="matrix(1.0185 0 0 1 497.271 551.3145)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 496.6064 566.9521)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 496.6064 583.2832)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 495.9038 609.2744)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 539.5176 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 539.5176 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 539.5176 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="BY39_ia" transform="matrix(0.8166 0 0 1 551.2002 551.3135)" class="st19 st10 st20">45A###.##</text>
+<text id="BY39_ib" transform="matrix(0.8166 0 0 1 551.2002 566.9512)" class="st19 st10 st20">46B###.##</text>
+<text id="BY39_ic" transform="matrix(0.8166 0 0 1 551.2002 583.2822)" class="st19 st10 st20">47C###.##</text>
+<text transform="matrix(1.0185 0 0 1 603.9067 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 603.2417 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 603.2417 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 602.54 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 642.752 551.3145)" class="st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 642.752 568.5439)" class="st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 642.752 583.2832)" class="st10 st20">Ic</text>
+<text id="ZB10KV31_ia" transform="matrix(0.8166 0 0 1 654.4355 551.3145)" class="st15 st10 st20">50A###.##</text>
+<text id="ZB10KV31_ib" transform="matrix(0.8166 0 0 1 654.4355 566.9521)" class="st15 st10 st20">51B###.##</text>
+<text id="ZB10KV31_iC" transform="matrix(0.8166 0 0 1 654.4355 583.2832)" class="st15 st10 st20">52C###.##</text>
+<text transform="matrix(1.0185 0 0 1 707.1416 551.3145)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 706.4766 566.9521)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 706.4766 583.2832)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 705.7744 609.2744)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 750.3291 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 750.3291 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 750.3291 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="AH1_ia" transform="matrix(0.8166 0 0 1 762.0127 551.3135)" class="st19 st10 st20">55A###.##</text>
+<text id="AH1_ib" transform="matrix(0.8166 0 0 1 762.0127 566.9512)" class="st19 st10 st20">56B###.##</text>
+<text id="AH1_ic" transform="matrix(0.8166 0 0 1 762.0127 583.2822)" class="st19 st10 st20">57C###.##</text>
+<text transform="matrix(1.0185 0 0 1 814.7188 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 814.0537 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 814.0537 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 812.3516 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 884.3525 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 884.3525 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 884.3525 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="_x31_0KVL233_x5F_ia" transform="matrix(0.8166 0 0 1 896.0361 551.3135)" class="st19 st10 st20">60A###.##</text>
+<text id="_x31_0KVL233_x5F_ib" transform="matrix(0.8166 0 0 1 896.0361 566.9512)" class="st19 st10 st20">61B###.##</text>
+<text id="_x31_0KVL233_x5F_ic" transform="matrix(0.8166 0 0 1 896.0361 583.2822)" class="st19 st10 st20">62C###.##</text>
+<text transform="matrix(1.0185 0 0 1 948.7422 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 948.0771 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 948.0771 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 950.375 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 1000.4854 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 1000.4854 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 1000.4854 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="HT219_ia" transform="matrix(0.8166 0 0 1 1012.1689 551.3135)" class="st19 st10 st20">65A###.##</text>
+<text id="HT219_ib" transform="matrix(0.8166 0 0 1 1012.1689 566.9512)" class="st19 st10 st20">66B###.##</text>
+<text id="HT219_ic" transform="matrix(0.8166 0 0 1 1012.1689 583.2822)" class="st19 st10 st20">67C###.##</text>
+<text transform="matrix(1.0185 0 0 1 1064.875 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1064.21 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1064.21 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1062.5078 609.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 1107.085 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 1107.085 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 1107.085 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="HT220_ia" transform="matrix(0.8166 0 0 1 1118.7686 551.3135)" class="st19 st10 st20">70A###.##</text>
+<text id="HT220_ib" transform="matrix(0.8166 0 0 1 1118.7686 566.9512)" class="st19 st10 st20">71B###.##</text>
+<text id="HT220_ic" transform="matrix(0.8166 0 0 1 1118.7686 583.2822)" class="st19 st10 st20">72C###.##</text>
+<text transform="matrix(1.0185 0 0 1 1171.4746 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1170.8096 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1170.8096 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1170.1074 610.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.8166 0 0 1 1206.4639 551.3135)" class="st19 st10 st20">Ia</text>
+<text transform="matrix(0.8166 0 0 1 1206.4639 568.543)" class="st19 st10 st20">Ib</text>
+<text transform="matrix(0.8166 0 0 1 1206.4639 583.2822)" class="st19 st10 st20">Ic</text>
+<text id="AH04_ia" transform="matrix(0.8166 0 0 1 1218.1475 551.3135)" class="st19 st10 st20">75A###.##</text>
+<text id="AH04_ib" transform="matrix(0.8166 0 0 1 1218.1475 566.9512)" class="st19 st10 st20">76B###.##</text>
+<text id="AH04_ic" transform="matrix(0.8166 0 0 1 1218.1475 583.2822)" class="st19 st10 st20">77C###.##</text>
+<text transform="matrix(1.0185 0 0 1 1270.8535 551.3135)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1270.1885 566.9512)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1270.1885 583.2822)" class="st19 st10 st42">A </text>
+<text transform="matrix(1.0185 0 0 1 1271.4863 608.2734)" class="st19 st10 st42">MW </text>
+<text transform="matrix(0.9119 0 0 1 158.1772 137.4312)" class="st1 st14">Uab </text>
+<text id="_x31_10KV10_x5F_ua" transform="matrix(0.8166 0 0 1 185.0889 92.7002)" class="st15 st1 st44">2 ###.##</text>
+<text id="_x31_10KV10_x5F_ub" transform="matrix(0.8166 0 0 1 185.4277 107.8999)" class="st15 st1 st44">3 ###.##</text>
+<text id="_x31_10KV10_x5F_uc" transform="matrix(0.8166 0 0 1 185.0889 122.5972)" class="st15 st1 st44">4 ###.##</text>
+<text id="_x31_10KV10_x5F_uab" transform="matrix(0.8166 0 0 1 185.0889 137.4316)" class="st15 st1 st44">5 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 227.9004 94.3999)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.4004 107.8994)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.4004 123.6001)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 227.4004 138.7852)" class="st1 st14">   KV</text>
+<text id="ZBD_uab" transform="matrix(0.8166 0 0 1 312.5029 231.1113)" class="st15 st1 st44">6 ###.##</text>
+<text id="ZBD_ubc" transform="matrix(0.8166 0 0 1 312.5029 248.8115)" class="st15 st1 st44">7 ###.##</text>
+<text id="ZBD_uca" transform="matrix(0.8166 0 0 1 312.7754 266.7119)" class="st15 st1 st44">8 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 352.4756 230.1113)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 352.4756 267.1123)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 351.9746 248.8115)" class="st1 st14">   KV</text>
+<text id="_x31_10KV10_x5F_ia" transform="matrix(0.8166 0 0 1 650 90.2998)" class="st15 st1 st44">9 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 92.2998)" class="st1 st14">   A</text>
+<text id="_x31_10KV10_x5F_ib_x5F_" transform="matrix(0.8166 0 0 1 645.9004 105.5376)" class="st15 st1 st44">10 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 107.5376)" class="st1 st14">   A</text>
+<text id="_x31_10KV10_x5F_ic" transform="matrix(0.8166 0 0 1 645.9004 119.8711)" class="st15 st1 st44">11 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 123.5972)" class="st1 st14">   A</text>
+<text id="_x31_10KV10_x5F_yg" transform="matrix(0.8166 0 0 1 645.9004 136.7847)" class="st15 st1 st44">12 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 695.2998 138.7847)" class="st1 st14">   A</text>
+<text transform="matrix(0.7564 0 0 1 693.3008 153.3999)" class="st1 st14">   Mvar</text>
+<text id="_x31_10KV10_x5F_wg" transform="matrix(0.8166 0 0 1 645.9004 153.3999)" class="st15 st1 st44">13 ###.##</text>
+<text id="_x31_10KV10_x5F_ys" transform="matrix(0.8166 0 0 1 646.9004 169.6001)" class="st15 st1 st44">14 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 1087.5078 212.4863)" class="st19 st10 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 1087.5078 230.5)" class="st19 st10 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 1087.5078 249.1528)" class="st19 st10 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 1201.8008 217.5005)" class="st19 st10 st14">   A</text>
+<text transform="matrix(0.7564 0 0 1 1201.9004 230.8716)" class="st19 st10 st14">   A</text>
+<text transform="matrix(0.7564 0 0 1 1202.5 246.1001)" class="st19 st10 st14">   A</text>
+<text transform="matrix(1 0 0 1 1125.3 246.3002)" class="st19 st1 st14">Ic     </text>
+<text transform="matrix(1 0 0 1 1125.3 230.8586)" class="st19 st1 st14">Ib   </text>
+<text transform="matrix(1 0 0 1 1125.3 215.2502)" class="st19 st1 st14">Ia   </text>
+<text transform="matrix(1 0 0 1 1207.1477 609.574)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 1106.0629 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 997.9319 610.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 884.114 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 749.7756 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 641.1979 609.8794)" class="st10 st44">P</text>
+<text transform="matrix(1 0 0 1 536.563 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 431.3273 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 245.0628 609.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 143.0887 608.8794)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 132.0605 625.9822)" class="st19 st10 st44">cos</text>
+<text id="AH00_ys" transform="matrix(0.8166 0 0 1 155.7002 626.875)" class="st19 st10 st44">37###.##</text>
+<text id="HT001_ys" transform="matrix(0.8166 0 0 1 257.7002 627.208)" class="st19 st10 st44">39###.##</text>
+<text transform="matrix(1 0 0 1 233.3957 626.9365)" class="st19 st10 st44">cos</text>
+<text id="AH00_yg" transform="matrix(0.8166 0 0 1 155.7002 608.6523)" class="st19 st10 st44">36###.##</text>
+<text id="HT001_yg" transform="matrix(0.8166 0 0 1 257.3496 609.6523)" class="st19 st10 st44">38###.##</text>
+<text id="BY35_ys" transform="matrix(0.8166 0 0 1 444.1006 626.4961)" class="st19 st10 st44">44###.##</text>
+<text transform="matrix(1 0 0 1 418.6331 625.9822)" class="st19 st10 st44">cos</text>
+<text id="BY35_yg" transform="matrix(0.8166 0 0 1 444.1006 609.6523)" class="st19 st10 st44">43###.##</text>
+<text transform="matrix(1 0 0 1 525.3333 627.5737)" class="st19 st10 st44">cos</text>
+<text id="BY39_ys" transform="matrix(0.8166 0 0 1 549.2002 627.8301)" class="st19 st10 st44">49###.##</text>
+<text id="BY39_yg" transform="matrix(0.8166 0 0 1 549.2002 608.6533)" class="st19 st10 st44">48###.##</text>
+<text transform="matrix(1 0 0 1 630.2756 628.6738)" class="st10 st44">cos</text>
+<text id="ZB10KV31_ys" transform="matrix(0.8166 0 0 1 654.2998 629.5664)" class="st15 st10 st44">54###.##</text>
+<text id="ZB10KV31_yg" transform="matrix(0.8166 0 0 1 654.2998 609.6523)" class="st15 st10 st44">53###.##</text>
+<text transform="matrix(1 0 0 1 736.3459 627.5737)" class="st19 st10 st44">cos</text>
+<text transform="matrix(0.8166 0 0 1 761.5996 628.208)" class="st19 st10 st44">59###.##</text>
+<text id="AH1_yg" transform="matrix(0.8166 0 0 1 761.7998 609.6523)" class="st19 st10 st44">58###.##</text>
+<text id="_x31_0KVL233_x5F_ys" transform="matrix(0.8166 0 0 1 896.5996 627.875)" class="st19 st10 st44">64###.##</text>
+<text transform="matrix(1 0 0 1 872.6741 627.6738)" class="st19 st10 st44">cos</text>
+<text id="_x31_0KVL233_x5F_yg" transform="matrix(0.8166 0 0 1 895.6006 609.6523)" class="st19 st10 st44">63###.##</text>
+<text id="HT219_ys" transform="matrix(0.8166 0 0 1 1011.7002 629.5664)" class="st19 st10 st44">69###.##</text>
+<text id="HT219_yg" transform="matrix(0.8166 0 0 1 1010.5 610.6523)" class="st19 st10 st44">68###.##</text>
+<text transform="matrix(1 0 0 1 985.5021 628.6738)" class="st19 st10 st44">cos</text>
+<text id="HT220_yg" transform="matrix(0.8166 0 0 1 1118.9375 609.6006)" class="st19 st10 st44">73###.##</text>
+<text id="HT220_ys" transform="matrix(0.8166 0 0 1 1120.0996 629.875)" class="st19 st10 st44">74###.##</text>
+<text transform="matrix(1 0 0 1 1095.7832 628.6738)" class="st19 st10 st44">cos</text>
+<text transform="matrix(1 0 0 1 1195.4807 627.6738)" class="st19 st10 st44">cos</text>
+<text id="AH04_yg" transform="matrix(0.8166 0 0 1 1218.7998 608.2734)" class="st19 st10 st44">78###.##</text>
+<text id="AH04_ys" transform="matrix(0.8166 0 0 1 1218.7002 629.208)" class="st19 st10 st44">79###.##</text>
+<path class="st27" d="M564,377.9"/>
+<path class="st27" d="M563.8,377.9"/>
+<path class="st27" d="M1039.1,407.9"/>
+<line class="st29" x1="928.6" y1="403.5" x2="928.6" y2="411.5"/>
+<line class="st29" x1="927.6" y1="381" x2="927.6" y2="389.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st29" x1="928.1" y1="389.2" x2="922.8" y2="394.9"/>
+	<line class="st29" x1="933.6" y1="394.9" x2="927.8" y2="389.3"/>
+</g>
+<line class="st29" x1="928.3" y1="412" x2="933.5" y2="406.2"/>
+<line class="st29" x1="922.8" y1="406.2" x2="928.5" y2="411.9"/>
+<rect x="923.8" y="388.9" class="st45" width="9.7" height="14.7"/>
+<line class="st46" x1="1189.9" y1="403.8" x2="1189.9" y2="411.7"/>
+<line class="st47" x1="1188.9" y1="381.2" x2="1188.9" y2="389.5"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1189.4" y1="389.4" x2="1184.1" y2="395.1"/>
+	<line class="st4" x1="1195" y1="395.1" x2="1189.1" y2="389.4"/>
+</g>
+<line class="st48" x1="1189.6" y1="412.1" x2="1194.8" y2="406.4"/>
+<line class="st47" x1="1184" y1="406.4" x2="1189.9" y2="412.1"/>
+<rect x="1185.1" y="389.1" class="st18" width="9.7" height="14.7"/>
+<line class="st23" x1="1279.1" y1="410.1" x2="1265.9" y2="410.1"/>
+<line class="st23" x1="1278.5" y1="407.1" x2="1278.5" y2="410.1"/>
+<line class="st23" x1="1280.3" y1="416.1" x2="1280.3" y2="431.2"/>
+<line class="st23" x1="1276.5" y1="416.4" x2="1276.5" y2="431.4"/>
+<line class="st23" x1="1276.7" y1="431.1" x2="1280.6" y2="431.1"/>
+<line class="st23" x1="1276.2" y1="416.4" x2="1280.1" y2="416.4"/>
+<line class="st23" x1="1278.1" y1="410.7" x2="1278.1" y2="446.9"/>
+<path class="st24" d="M1282.5,450.4c-1.3,0-2.3-1-2.3-2.2s1.1-2.2,2.3-2.2c1.3,0,2.3,1,2.3,2.2S1283.8,450.4,1282.5,450.4"/>
+<text transform="matrix(1 0 0 1 1281.1855 448.9528)" class="st8 st1 st25">Q</text>
+<text transform="matrix(1 0 0 1 1281.1855 448.9528)" class="st6 st1 st25">Q</text>
+<path class="st24" d="M1278.1,448.6c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5
+	C1280.8,447.5,1279.6,448.6,1278.1,448.6"/>
+<line class="st6" x1="1278.2" y1="444.3" x2="1278.2" y2="446"/>
+<line class="st6" x1="1278.2" y1="445.8" x2="1279.2" y2="447.2"/>
+<line class="st6" x1="1278.1" y1="446.1" x2="1277.1" y2="447.4"/>
+<path class="st24" d="M1278.2,451.1c-1.5,0-2.7-1.1-2.7-2.5s1.2-2.5,2.7-2.5s2.7,1.1,2.7,2.5C1280.9,450,1279.7,451.1,1278.2,451.1"
+	/>
+<line class="st26" x1="1278.2" y1="446.8" x2="1278.3" y2="448.5"/>
+<line class="st26" x1="1278.2" y1="448.3" x2="1279.3" y2="449.7"/>
+<line class="st26" x1="1278.2" y1="448.6" x2="1277.2" y2="449.9"/>
+<line class="st23" x1="1266" y1="409.8" x2="1266" y2="425.3"/>
+<line class="st23" x1="1268.8" y1="421.6" x2="1268.8" y2="436.3"/>
+<line class="st23" x1="1262.7" y1="421.8" x2="1262.7" y2="436.5"/>
+<line class="st28" x1="1262.7" y1="436.2" x2="1268.8" y2="436.2"/>
+<line class="st23" x1="1262.7" y1="421.8" x2="1268.8" y2="421.8"/>
+<line class="st23" x1="1265.7" y1="436.3" x2="1265.7" y2="440.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1277.9" y1="417.1" x2="1283.1" y2="409.9"/>
+	<line class="st4" x1="1272.3" y1="409.9" x2="1278.2" y2="417.1"/>
+</g>
+<line class="st4" x1="1277.6" y1="376.8" x2="1272.3" y2="384"/>
+<line class="st4" x1="1283.3" y1="384" x2="1277.3" y2="376.8"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1277.6" y1="405.2" x2="1282.9" y2="397.8"/>
+	<line class="st4" x1="1272.1" y1="397.8" x2="1277.9" y2="405"/>
+</g>
+<line class="st4" x1="1277.9" y1="394" x2="1277.9" y2="377.8"/>
+<line class="st4" x1="1245" y1="282.3" x2="1245" y2="289"/>
+<line class="st4" x1="1244.2" y1="263.3" x2="1244.2" y2="270.3"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1244.6" y1="271.5" x2="1240.6" y2="276.5"/>
+	<line class="st4" x1="1248.9" y1="276.5" x2="1244.4" y2="271.5"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1244.8" y1="298.5" x2="1248.8" y2="293.6"/>
+	<line class="st4" x1="1240.5" y1="293.6" x2="1245" y2="298.5"/>
+</g>
+<rect x="1241.3" y="270" class="st49" width="7.4" height="12.4"/>
+<text transform="matrix(1 0 0 1 149.7948 207.7999)" class="st1 st14">10kv</text>
+<text transform="matrix(1 0 0 1 178.0629 207.7997)" class="st1 st14">渚х浉鐢靛帇</text>
+<text transform="matrix(1 0 0 1 153.1999 233.2303)" class="st1 st14"> Ua</text>
+<text transform="matrix(1 0 0 1 157.5013 248.0361)" class="st1 st14">Ub</text>
+<text transform="matrix(1 0 0 1 157.5013 264.5)" class="st1 st14">Uc</text>
+<text transform="matrix(1 0 0 1 161.8553 264.2563)" class="st8 st1 st14"> :</text>
+<text id="_x31_10KV10_x5F_ua_1_" transform="matrix(0.8166 0 0 1 179.5889 233.2305)" class="st15 st1 st44">82 ###.##</text>
+<text id="_x31_10KV10_x5F_ub_1_" transform="matrix(0.8166 0 0 1 179.9277 249.4297)" class="st15 st1 st44">83 ###.##</text>
+<text id="_x31_10KV10_x5F_uc_1_" transform="matrix(0.8166 0 0 1 179.5889 266.127)" class="st15 st1 st44">84 ###.##</text>
+<text transform="matrix(0.7564 0 0 1 229.4004 233.9297)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.9004 248.4297)" class="st1 st14">   KV</text>
+<text transform="matrix(0.7564 0 0 1 228.9004 266.127)" class="st1 st14">   KV</text>
+<line class="st36" x1="496.5" y1="207.6" x2="496.5" y2="212.3"/>
+<line class="st36" x1="496.5" y1="212.3" x2="503.8" y2="217.4"/>
+<line class="st36" x1="496.5" y1="212.3" x2="490.7" y2="217.3"/>
+<text transform="matrix(0.7564 0 0 1 484 30.6133)" class="st1 st14">   kwh</text>
+<text transform="matrix(1 0 0 1 1018.0886 264.7607)" class="st19 st10 st44">P</text>
+<text transform="matrix(1 0 0 1 1006.8799 280.1998)" class="st19 st10 st44">cos</text>
+<text id="_x31_10KV_x5F_uc_1_" transform="matrix(1.0507 0 0 1 1035.6426 264.8711)" class="st15 st10 st40">80###.##</text>
+<text transform="matrix(0.7564 0 0 1 1086.1582 265.1382)" class="st19 st10 st14">   MW</text>
+<text id="_x31_10KV_x5F_uc_2_" transform="matrix(1.0507 0 0 1 1031.9922 280.833)" class="st19 st10 st40"> 81###.##</text>
+<text transform="matrix(0.7564 0 0 1 1073.5078 281.1001)" class="st19 st1 st14">   </text>
+<text transform="matrix(1 0 0 1 180.1768 532.6353)" class="st19 st10 st43">AH00</text>
+<text transform="matrix(1 0 0 1 437 100)" class="st10 st43">105</text>
+<text transform="matrix(1 0 0 1 511.55 69)" class="st10 st43">101</text>
+<text transform="matrix(1 0 0 1 505 123.9702)" class="st10 st43">10</text>
+<text transform="matrix(1 0 0 1 522 148.2)" class="st10 st43">108</text>
+<text transform="matrix(1 0 0 1 460 187)" class="st10 st43">106</text>
+<text transform="matrix(1 0 0 1 525.8 187.354)" class="st10 st43">109</text>
+<line class="st4" x1="1058.8" y1="399.5" x2="1058.8" y2="407.5"/>
+<line class="st4" x1="1057.8" y1="377" x2="1057.8" y2="385.4"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="1058.3" y1="385.2" x2="1053" y2="391"/>
+	<line class="st4" x1="1063.8" y1="391" x2="1058" y2="385.2"/>
+</g>
+<line class="st4" x1="1058.5" y1="408" x2="1063.8" y2="402.2"/>
+<line class="st4" x1="1053" y1="402.2" x2="1058.8" y2="408"/>
+<rect x="1054" y="384.9" class="st50" width="9.7" height="14.7"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="510.5" y1="381.7" x2="505.3" y2="387.4"/>
+	<line class="st4" x1="516" y1="387.4" x2="510.3" y2="381.7"/>
+</g>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="510.7" y1="414.4" x2="516" y2="408.7"/>
+	<line class="st4" x1="505.2" y1="408.7" x2="511" y2="414.4"/>
+</g>
+<rect x="506.2" y="381.3" class="st49" width="9.7" height="14.7"/>
+<line class="st4" x1="510.5" y1="373.7" x2="510.5" y2="381.9"/>
+<line class="st4" x1="511" y1="395.1" x2="511" y2="403.3"/>
+<line class="st4" x1="591.5" y1="393.9" x2="591.5" y2="401.8"/>
+<line class="st4" x1="589.5" y1="375.4" x2="589.5" y2="383.6"/>
+<line class="st4" x1="589.8" y1="374.6" x2="584.7" y2="380.3"/>
+<line class="st4" x1="595.5" y1="380.3" x2="589.6" y2="374.6"/>
+<g transform="matrix(1,0,0,1,0,-9)">
+	<line class="st4" x1="590.1" y1="415.3" x2="595.3" y2="409.6"/>
+	<line class="st4" x1="584.6" y1="409.6" x2="590.3" y2="415.3"/>
+</g>
+<rect x="585.6" y="383.2" class="st49" width="9.7" height="14.7"/>
+<text transform="matrix(1 0 0 1 521.3335 92)" class="st1 st43">L</text>
+<path class="st51" d="M523.6,93.4c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8C529.5,90.8,526.9,93.4,523.6,93.4"/>
+<text transform="matrix(1 0 0 1 520.5 90.2998)" class="st1 st43">L</text>
+<path class="st51" d="M215.8,368.4c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s5.9,2.6,5.9,5.8S219,368.4,215.8,368.4"/>
+<path class="st51" d="M299.1,367.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,5.9,2.6,5.9,5.8S302.4,367.8,299.1,367.8"/>
+<path class="st51" d="M506.2,365.9c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S509.5,365.9,506.2,365.9"/>
+<path class="st51" d="M578.9,365.9c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S582.2,365.9,578.9,365.9"/>
+<text transform="matrix(1 0 0 1 211.75 365.3)" class="st1 st43">R</text>
+<text transform="matrix(1 0 0 1 295.5 365.3)" class="st1 st43">R</text>
+<text transform="matrix(1 0 0 1 503.8 362.667)" class="st1 st43">L</text>
+<text transform="matrix(1 0 0 1 576.7 362.667)" class="st1 st43">L</text>
+<line class="st36" x1="496.5" y1="222.6" x2="503.2" y2="233.9"/>
+<line class="st36" x1="496" y1="225.7" x2="503.2" y2="233.9"/>
+<path class="st51" d="M706.5,367.8c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S709.7,367.8,706.5,367.8"/>
+<text transform="matrix(1 0 0 1 702.8766 365.3)" class="st1 st43">R</text>
+<path class="st51" d="M812.2,367.8c-3.3,0-6-2.6-6-5.8s2.7-5.8,6-5.8s6,2.6,6,5.8S815.5,367.8,812.2,367.8"/>
+<text transform="matrix(1 0 0 1 808.6 365.3)" class="st1 st43">R</text>
+<path class="st51" d="M941.1,366.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S944.4,366.8,941.1,366.8"/>
+<text transform="matrix(1 0 0 1 936.5 365.3)" class="st1 st43">R</text>
+<path class="st51" d="M1050.1,364.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S1053.4,364.8,1050.1,364.8"/>
+<text transform="matrix(1 0 0 1 1045.5 363.3)" class="st1 st43">R</text>
+<path class="st51" d="M1133.1,364.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S1136.4,364.8,1133.1,364.8"/>
+<text transform="matrix(1 0 0 1 1128.5 363.3)" class="st1 st43">R</text>
+<path class="st51" d="M1205.1,366.8c-3.3,0-5.9-2.6-5.9-5.8s2.7-5.8,5.9-5.8c3.3,0,6,2.6,6,5.8S1208.4,366.8,1205.1,366.8"/>
+<text transform="matrix(1 0 0 1 1201.5 364.3)" class="st1 st43">R</text>
+<line class="st36" x1="496" y1="225.7" x2="501.5" y2="232"/>
+<line class="st36" x1="300.5" y1="171.6" x2="305.8" y2="176.6"/>
+<line class="st36" x1="503.1" y1="233.2" x2="496.6" y2="223.3"/>
+<line class="st26" x1="503.3" y1="234.8" x2="496.5" y2="222.6"/>
+<line class="st52" x1="496.3" y1="213.9" x2="492.7" y2="218.9"/>
+<line class="st52" x1="496.3" y1="213.9" x2="499.6" y2="219"/>
+<line class="st52" x1="496.3" y1="209.3" x2="496.3" y2="214.3"/>
+<text transform="matrix(1 0 0 1 390.5 233.5)" class="st1 st43">闆�</text>
+<text transform="matrix(1 0 0 1 402.5 233.5)" class="st10 st43">1</text>
+<line class="st6" x1="413.5" y1="433.7" x2="405.9" y2="433.7"/>
+<line class="st6" x1="413.6" y1="433.6" x2="410" y2="436.1"/>
+<line class="st6" x1="410.8" y1="436.6" x2="406.8" y2="434.1"/>
+<line class="st6" x1="670.7" y1="435.4" x2="663" y2="435.4"/>
+<line class="st6" x1="670.4" y1="436" x2="666.8" y2="438.6"/>
+<line class="st6" x1="667" y1="438.3" x2="662.9" y2="435.7"/>
+<line class="st6" x1="778.3" y1="437.5" x2="770.6" y2="437.5"/>
+<line class="st6" x1="778.4" y1="437.4" x2="774.7" y2="440"/>
+<line class="st6" x1="774.6" y1="440" x2="770.6" y2="437.4"/>
+<line class="st6" x1="1179.4" y1="441.2" x2="1171.7" y2="441.2"/>
+<line class="st6" x1="1178.5" y1="442" x2="1174.8" y2="444.7"/>
+<line class="st6" x1="1175.7" y1="444.8" x2="1171.7" y2="442.1"/>
+<line class="st6" x1="1263.2" y1="426.3" x2="1268.8" y2="426.3"/>
+<line class="st6" x1="1263.5" y1="426.4" x2="1266.2" y2="429"/>
+<line class="st6" x1="1265.5" y1="429.3" x2="1268.5" y2="426.7"/>
+<line class="st6" x1="1108.9" y1="440.8" x2="1101.2" y2="440.8"/>
+<line class="st6" x1="1107.8" y1="441.5" x2="1104.2" y2="444.1"/>
+<line class="st6" x1="1105" y1="443.3" x2="1100.9" y2="440.7"/>
+<line class="st6" x1="1029.1" y1="440" x2="1021.5" y2="440"/>
+<line class="st6" x1="1029.1" y1="440.4" x2="1025.5" y2="443"/>
+<line class="st6" x1="1025.5" y1="442.8" x2="1021.5" y2="440.1"/>
+<line class="st6" x1="208.3" y1="462.8" x2="215.2" y2="462.8"/>
+<line class="st6" x1="209.2" y1="464.9" x2="214.4" y2="464.9"/>
+<line class="st6" x1="210.5" y1="467.3" x2="212.6" y2="467.3"/>
+<line class="st6" x1="295.6" y1="461.5" x2="302.6" y2="461.5"/>
+<line class="st6" x1="296.6" y1="463.6" x2="301.8" y2="463.6"/>
+<line class="st6" x1="297.9" y1="466" x2="300" y2="466"/>
+<line class="st6" x1="1262.5" y1="441.2" x2="1269.3" y2="441.2"/>
+<line class="st6" x1="1263.4" y1="442.9" x2="1268.6" y2="442.9"/>
+<line class="st6" x1="1264.7" y1="444.9" x2="1266.8" y2="444.9"/>
+<line class="st6" x1="483.6" y1="436.1" x2="476" y2="436.1"/>
+<line class="st6" x1="483.5" y1="435.9" x2="479.9" y2="438.5"/>
+<line class="st6" x1="480" y1="438.7" x2="476" y2="436.1"/>
+<line class="st6" x1="554.3" y1="437.8" x2="546.7" y2="437.8"/>
+<line class="st6" x1="554.1" y1="437.6" x2="550.4" y2="440.2"/>
+<line class="st6" x1="550.7" y1="440.4" x2="546.7" y2="437.8"/>
+<line class="st6" x1="347.7" y1="398.8" x2="353.3" y2="398.8"/>
+<line class="st6" x1="347.6" y1="399" x2="350.4" y2="401.6"/>
+<line class="st6" x1="350.7" y1="401.6" x2="353.6" y2="399"/>
+<text transform="matrix(0.9013 0 0 1 1282.9004 335.7031)" class="st6 st10 st41">203</text>
+<text transform="matrix(0.9013 0 0 1 1267.2754 315.2007)" class="st6 st10 st41">231</text>
+<line class="st6" x1="1227.9" y1="317.3" x2="1231.4" y2="317.3"/>
+<line class="st6" x1="1227.8" y1="317.5" x2="1229.5" y2="319.9"/>
+<line class="st6" x1="1229.5" y1="319.9" x2="1231.3" y2="317.5"/>
+</svg>
diff --git a/energy_management_ui/src/assets/icons/svg/dict.svg b/energy_management_ui/src/assets/icons/svg/dict.svg
new file mode 100644
index 0000000..4849377
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/dict.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035680909" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3601" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1002.0848 744.672l-33.568 10.368c0.96 7.264 2.144 14.304 2.144 21.76 0 7.328-1.184 14.432-2.368 21.568l33.792 10.56c7.936 2.24 14.496 7.616 18.336 14.752 3.84 7.328 4.672 15.808 1.952 23.552-5.376 16-23.168 24.672-39.936 19.68l-34.176-10.624c-7.136 12.8-15.776 24.672-26.208 35.2l20.8 27.488a28.96 28.96 0 0 1 5.824 22.816 29.696 29.696 0 0 1-12.704 19.616 32.544 32.544 0 0 1-44.416-6.752l-20.8-27.552c-13.696 6.56-28.192 11.2-43.008 13.888v33.632c0 16.736-14.112 30.432-31.648 30.432-17.6 0-31.872-13.696-31.872-30.432v-33.632a167.616 167.616 0 0 1-42.88-13.888l-20.928 27.552c-10.72 13.76-30.08 16.64-44.288 6.752a29.632 29.632 0 0 1-12.704-19.616 29.28 29.28 0 0 1 5.696-22.816l20.896-27.808a166.72 166.72 0 0 1-27.008-34.688l-33.376 10.432c-16.8 5.184-34.56-3.552-39.936-19.616a29.824 29.824 0 0 1 20.224-38.24l33.472-10.432c-0.8-7.264-2.016-14.304-2.016-21.824 0-7.36 1.184-14.496 2.304-21.632l-33.792-10.368c-16.672-5.376-25.632-22.496-20.224-38.432 5.376-16 23.136-24.672 39.936-19.68l34.016 10.752c7.328-12.672 15.84-24.8 26.336-35.328l-20.8-27.552a29.44 29.44 0 0 1 6.944-42.432 32.704 32.704 0 0 1 44.384 6.752l20.832 27.616c13.696-6.432 28.224-11.2 43.104-13.952v-33.568c0-16.736 14.048-30.432 31.648-30.432 17.536 0 31.808 13.568 31.808 30.432v33.504c15.072 2.688 29.344 7.808 42.848 14.016l20.992-27.616a32.48 32.48 0 0 1 44.224-6.752 29.568 29.568 0 0 1 7.136 42.432l-21.024 27.808c10.432 10.432 19.872 21.888 27.04 34.752l33.376-10.432c16.768-5.12 34.56 3.68 39.936 19.68 5.536 15.936-3.712 33.056-20.32 38.304z m-206.016-74.432c-61.344 0-111.136 47.808-111.136 106.56 0 58.88 49.792 106.496 111.136 106.496 61.312 0 111.104-47.616 111.104-106.496 0-58.752-49.792-106.56-111.104-106.56z" p-id="3602"></path><path d="M802.7888 57.152h-76.448c0-22.08-21.024-38.24-42.848-38.24H39.3968a39.68 39.68 0 0 0-39.36 40.032v795.616s41.888 120.192 110.752 120.192H673.2848a227.488 227.488 0 0 1-107.04-97.44H117.6368s-40.608-13.696-40.608-41.248l470.304-0.256 1.664 3.36a227.68 227.68 0 0 1-12.64-73.632c0-60.576 24-118.624 66.88-161.44a228.352 228.352 0 0 1 123.552-63.392l-3.2 0.288 2.144-424.672h38.208l0.576 421.024c27.04 0 52.672 4.8 76.64 13.344V101.536c0.032 0-6.304-44.384-38.368-44.384zM149.7648 514.336H72.3888v-77.408H149.7648v77.408z m0-144.32H72.3888v-77.44H149.7648v77.44z m0-137.248H72.3888v-77.44H149.7648v77.44z m501.856 281.568H206.0848v-77.408h445.536v77.408z m0-144.32H206.0848v-77.44h445.536v77.44z m0-137.248H206.0848v-77.44h445.536v77.44z" p-id="3603"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/documentation.svg b/energy_management_ui/src/assets/icons/svg/documentation.svg
new file mode 100644
index 0000000..7043122
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/documentation.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M71.984 44.815H115.9L71.984 9.642v35.173zM16.094.05h63.875l47.906 38.37v76.74c0 3.392-1.682 6.645-4.677 9.044-2.995 2.399-7.056 3.746-11.292 3.746H16.094c-4.236 0-8.297-1.347-11.292-3.746-2.995-2.399-4.677-5.652-4.677-9.044V12.84C.125 5.742 7.23.05 16.094.05zm71.86 102.32V89.58h-71.86v12.79h71.86zm23.952-25.58V64H16.094v12.79h95.812z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/download.svg b/energy_management_ui/src/assets/icons/svg/download.svg
new file mode 100644
index 0000000..c896951
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/download.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1569915748289" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3062" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M768.35456 416a256 256 0 1 0-512 0 192 192 0 1 0 0 384v64a256 256 0 0 1-58.88-505.216 320.128 320.128 0 0 1 629.76 0A256.128 256.128 0 0 1 768.35456 864v-64a192 192 0 0 0 0-384z m-512 384h64v64H256.35456v-64z m448 0h64v64h-64v-64z" fill="#333333" p-id="3063"></path><path d="M539.04256 845.248V512.192a32.448 32.448 0 0 0-32-32.192c-17.664 0-32 14.912-32 32.192v333.056l-36.096-36.096a32.192 32.192 0 0 0-45.056 0.192 31.616 31.616 0 0 0-0.192 45.056l90.88 90.944a31.36 31.36 0 0 0 22.528 9.088 30.08 30.08 0 0 0 22.4-9.088l90.88-90.88a32.192 32.192 0 0 0-0.192-45.12 31.616 31.616 0 0 0-45.056-0.192l-36.096 36.096z" fill="#333333" p-id="3064"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/drag.svg b/energy_management_ui/src/assets/icons/svg/drag.svg
new file mode 100644
index 0000000..4185d3c
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/drag.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M73.137 29.08h-9.209 29.7L63.886.093 34.373 29.08h20.49v27.035H27.238v17.948h27.625v27.133h18.274V74.063h27.41V56.115h-27.41V29.08zm-9.245 98.827l27.518-26.711H36.59l27.302 26.71zM.042 64.982l27.196 27.029V38.167L.042 64.982zm100.505-26.815V92.01l27.41-27.029-27.41-26.815z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/druid.svg b/energy_management_ui/src/assets/icons/svg/druid.svg
new file mode 100644
index 0000000..a2b4b4e
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/druid.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036347051" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5853" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M832 128H192a64.19 64.19 0 0 0-64 64v640a64.19 64.19 0 0 0 64 64h640a64.19 64.19 0 0 0 64-64V192a64.19 64.19 0 0 0-64-64z m0 703.89l-0.11 0.11H192.11l-0.11-0.11V768h640zM832 544H720L605.6 696.54 442.18 435.07 333.25 544H192v-64h114.75l147.07-147.07L610.4 583.46 688 480h144z m0-288H192v-63.89l0.11-0.11h639.78l0.11 0.11z" p-id="5854"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/edit.svg b/energy_management_ui/src/assets/icons/svg/edit.svg
new file mode 100644
index 0000000..d26101f
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/edit.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M106.133 67.2a4.797 4.797 0 0 0-4.8 4.8c0 .187.014.36.027.533h-.027V118.4H9.6V26.667h50.133c2.654 0 4.8-2.147 4.8-4.8 0-2.654-2.146-4.8-4.8-4.8H9.6a9.594 9.594 0 0 0-9.6 9.6V118.4c0 5.307 4.293 9.6 9.6 9.6h91.733c5.307 0 9.6-4.293 9.6-9.6V72.533h-.026c.013-.173.026-.346.026-.533 0-2.653-2.146-4.8-4.8-4.8z"/><path d="M125.16 13.373L114.587 2.8c-3.747-3.747-9.854-3.72-13.6.027l-52.96 52.96a4.264 4.264 0 0 0-.907 1.36L33.813 88.533c-.746 1.76-.226 3.534.907 4.68 1.133 1.147 2.92 1.667 4.693.92l31.4-13.293c.507-.213.96-.52 1.36-.907l52.96-52.96c3.747-3.746 3.774-9.853.027-13.6zM66.107 72.4l-18.32 7.76 7.76-18.32L92.72 24.667l10.56 10.56L66.107 72.4zm52.226-52.227l-8.266 8.267-10.56-10.56 8.266-8.267.027-.026 10.56 10.56-.027.026z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/education.svg b/energy_management_ui/src/assets/icons/svg/education.svg
new file mode 100644
index 0000000..7bfb01d
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/education.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M88.883 119.565c-7.284 0-19.434 2.495-21.333 8.25v.127c-4.232.13-5.222 0-7.108 0-1.895-5.76-14.045-8.256-21.333-8.256H0V0h42.523c9.179 0 17.109 5.47 21.47 13.551C68.352 5.475 76.295 0 85.478 0H128v119.57l-39.113-.005h-.004zM60.442 24.763c0-9.651-8.978-16.507-17.777-16.507H7.108V111.43H39.11c7.054-.14 18.177.082 21.333 6.12v-4.628c-.134-5.722-.004-13.522 0-13.832V27.413l.004-2.655-.004.005zm60.442-16.517h-35.55c-8.802 0-17.78 6.856-17.78 16.493v74.259c.004.32.138 8.115 0 13.813v4.627c3.155-6.022 14.279-6.26 21.333-6.114h32V8.25l-.003-.005z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/email.svg b/energy_management_ui/src/assets/icons/svg/email.svg
new file mode 100644
index 0000000..74d25e2
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/email.svg
@@ -0,0 +1 @@
+<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/example.svg b/energy_management_ui/src/assets/icons/svg/example.svg
new file mode 100644
index 0000000..46f42b5
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/example.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/excel.svg b/energy_management_ui/src/assets/icons/svg/excel.svg
new file mode 100644
index 0000000..74d97b8
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/excel.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.208 16.576v8.384h38.72v5.376h-38.72v8.704h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.576h38.72v5.376h-38.72v8.512h38.72v5.376h-38.72v11.136H128v-94.72H78.208zM0 114.368L72.128 128V0L0 13.632v100.736z"/><path d="M28.672 82.56h-11.2l14.784-23.488-14.08-22.592h11.52l8.192 14.976 8.448-14.976h11.136l-14.08 22.208L58.368 82.56H46.656l-8.768-15.68z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/exit-fullscreen.svg b/energy_management_ui/src/assets/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000..485c128
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M49.217 41.329l-.136-35.24c-.06-2.715-2.302-4.345-5.022-4.405h-3.65c-2.712-.06-4.866 2.303-4.806 5.016l.152 19.164-24.151-23.79a6.698 6.698 0 0 0-9.499 0 6.76 6.76 0 0 0 0 9.526l23.93 23.713-18.345.074c-2.712-.069-5.228 1.813-5.64 5.02v3.462c.069 2.721 2.31 4.97 5.022 5.03l35.028-.207c.052.005.087.025.133.025l2.457.054a4.626 4.626 0 0 0 3.436-1.38c.88-.874 1.205-2.096 1.169-3.462l-.262-2.465c0-.048.182-.081.182-.136h.002zm52.523 51.212l18.32-.073c2.713.06 5.224-1.609 5.64-4.815v-3.462c-.068-2.722-2.317-4.97-5.021-5.04l-34.58.21c-.053 0-.086-.021-.138-.021l-2.451-.06a4.64 4.64 0 0 0-3.445 1.381c-.885.868-1.201 2.094-1.174 3.46l.27 2.46c.005.06-.177.095-.177.141l.141 34.697c.069 2.713 2.31 4.338 5.022 4.397l3.45.006c2.705.062 4.867-2.31 4.8-5.026l-.153-18.752 24.151 23.946a6.69 6.69 0 0 0 9.494 0 6.747 6.747 0 0 0 0-9.523L101.74 92.54v.001zM48.125 80.662a4.636 4.636 0 0 0-3.437-1.382l-2.457.06c-.05 0-.082.022-.137.022l-35.025-.21c-2.712.07-4.957 2.318-5.022 5.04v3.462c.409 3.206 2.925 4.874 5.633 4.814l18.554.06-24.132 23.928c-2.62 2.626-2.62 6.89 0 9.524a6.694 6.694 0 0 0 9.496 0l24.155-23.79-.155 18.866c-.06 2.722 2.094 5.093 4.801 5.025h3.65c2.72-.069 4.962-1.685 5.022-4.406l.141-34.956c0-.05-.182-.082-.182-.136l.262-2.46c.03-1.366-.286-2.592-1.166-3.46h-.001zM80.08 47.397a4.62 4.62 0 0 0 3.443 1.374l2.45-.054c.055 0 .088-.02.143-.028l35.08.21c2.712-.062 4.953-2.312 5.021-5.033l.009-3.463c-.417-3.211-2.937-5.084-5.64-5.025l-18.615-.073 23.917-23.715c2.63-2.623 2.63-6.879.008-9.513a6.691 6.691 0 0 0-9.494 0L92.251 26.016l.155-19.312c.065-2.713-2.097-5.085-4.802-5.025h-3.45c-2.713.069-4.954 1.693-5.022 4.406l-.139 35.247c0 .054.18.088.18.136l-.267 2.465c-.028 1.366.288 2.588 1.174 3.463v.001z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/eye-open.svg b/energy_management_ui/src/assets/icons/svg/eye-open.svg
new file mode 100644
index 0000000..88dcc98
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/eye.svg b/energy_management_ui/src/assets/icons/svg/eye.svg
new file mode 100644
index 0000000..16ed2d8
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/eye.svg
@@ -0,0 +1 @@
+<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/form.svg b/energy_management_ui/src/assets/icons/svg/form.svg
new file mode 100644
index 0000000..dcbaa18
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/form.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/fullscreen.svg b/energy_management_ui/src/assets/icons/svg/fullscreen.svg
new file mode 100644
index 0000000..0e86b6f
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M38.47 52L52 38.462l-23.648-23.67L43.209 0H.035L0 43.137l14.757-14.865L38.47 52zm74.773 47.726L89.526 76 76 89.536l23.648 23.672L84.795 128h43.174L128 84.863l-14.757 14.863zM89.538 52l23.668-23.648L128 43.207V.038L84.866 0 99.73 14.76 76 38.472 89.538 52zM38.46 76L14.792 99.651 0 84.794v43.173l43.137.033-14.865-14.757L52 89.53 38.46 76z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/guide.svg b/energy_management_ui/src/assets/icons/svg/guide.svg
new file mode 100644
index 0000000..98f0753
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/guide.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.482 70.131l36.204 16.18 69.932-65.485-61.38 70.594 46.435 18.735c1.119.425 2.397-.17 2.797-1.363v-.085L.998.047 1.322 65.874c-1.12.597-1.519 1.959-1.04 3.151.32.511.72.937 1.2 1.107zm44.676 57.821L64.22 107.26l-18.062-7.834v28.527z"/></svg>
diff --git a/energy_management_ui/src/assets/icons/svg/icon.svg b/energy_management_ui/src/assets/icons/svg/icon.svg
new file mode 100644
index 0000000..82be8ee
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/icon.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.147.062a13 13 0 0 1 4.94.945c1.55.63 2.907 1.526 4.069 2.688a13.148 13.148 0 0 1 2.761 4.069c.678 1.55 1.017 3.245 1.017 5.086v102.3c0 3.681-1.187 6.733-3.56 9.155-2.373 2.422-5.352 3.633-8.937 3.633H12.992c-3.875 0-7-1.26-9.373-3.779-2.373-2.518-3.56-5.667-3.56-9.445V12.704c0-3.39 1.163-6.345 3.488-8.863C5.872 1.32 8.972.062 12.847.062h102.3zM81.434 109.047c1.744 0 3.003-.412 3.778-1.235.775-.824 1.163-1.914 1.163-3.27 0-1.26-.388-2.325-1.163-3.197-.775-.872-2.034-1.307-3.778-1.307H72.57c.097-.194.145-.485.145-.872V27.09h9.01c1.743 0 2.954-.436 3.633-1.308.678-.872 1.017-1.938 1.017-3.197 0-1.26-.34-2.325-1.017-3.197-.679-.872-1.89-1.308-3.633-1.308H46.268c-1.743 0-2.954.436-3.632 1.308-.678.872-1.018 1.938-1.018 3.197 0 1.26.34 2.325 1.018 3.197.678.872 1.889 1.308 3.632 1.308h8.138v72.075c0 .193.024.339.073.436.048.096.072.242.072.436H46.56c-1.744 0-3.003.435-3.778 1.307-.775.872-1.163 1.938-1.163 3.197 0 1.356.388 2.446 1.163 3.27.775.823 2.034 1.235 3.778 1.235h34.875z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/international.svg b/energy_management_ui/src/assets/icons/svg/international.svg
new file mode 100644
index 0000000..e9b56ee
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/international.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/job.svg b/energy_management_ui/src/assets/icons/svg/job.svg
new file mode 100644
index 0000000..2a93a25
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/job.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036191400" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5472" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M934.912 1016.832H192c-14.336 0-25.6-11.264-25.6-25.6v-189.44c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v163.84h691.712V64H217.6v148.48c0 14.336-11.264 25.6-25.6 25.6s-25.6-11.264-25.6-25.6v-174.08c0-14.336 11.264-25.6 25.6-25.6h742.912c14.336 0 25.6 11.264 25.6 25.6v952.832c0 14.336-11.264 25.6-25.6 25.6z" p-id="5473"></path><path d="M232.96 371.2h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 540.16h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM232.96 698.88h-117.76c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h117.76c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6zM574.464 762.88c-134.144 0-243.2-109.056-243.2-243.2S440.32 276.48 574.464 276.48s243.2 109.056 243.2 243.2-109.056 243.2-243.2 243.2z m0-435.2c-105.984 0-192 86.016-192 192S468.48 711.68 574.464 711.68s192-86.016 192-192S680.448 327.68 574.464 327.68z" p-id="5474"></path><path d="M663.04 545.28h-87.04c-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6h87.04c14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6z" p-id="5475"></path><path d="M576 545.28c-14.336 0-25.6-11.264-25.6-25.6v-87.04c0-14.336 11.264-25.6 25.6-25.6s25.6 11.264 25.6 25.6v87.04c0 14.336-11.264 25.6-25.6 25.6z" p-id="5476"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/language.svg b/energy_management_ui/src/assets/icons/svg/language.svg
new file mode 100644
index 0000000..0082b57
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/language.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.742 36.8c2.398 7.2 5.595 12.8 11.19 18.4 4.795-4.8 7.992-11.2 10.39-18.4h-21.58zm-52.748 40h20.78l-10.39-28-10.39 28z"/><path d="M111.916 0H16.009C7.218 0 .025 7.2.025 16v96c0 8.8 7.193 16 15.984 16h95.907c8.791 0 15.984-7.2 15.984-16V16c0-8.8-6.394-16-15.984-16zM72.754 103.2c-1.598 1.6-3.197 1.6-4.795 1.6-.8 0-2.398 0-3.197-.8-.8-.8-1.599 0-1.599-.8s-.799-1.6-1.598-3.2c-.8-1.6-.8-2.4-1.599-4l-3.196-8.8H28.797L25.6 96c-1.598 3.2-2.398 5.6-3.197 7.2-.8 1.6-2.398 1.6-4.795 1.6-1.599 0-3.197-.8-4.796-1.6-1.598-1.6-2.397-2.4-2.397-4 0-.8 0-1.6.799-3.2.8-1.6.8-2.4 1.598-4l17.583-44.8c.8-1.6.8-3.2 1.599-4.8.799-1.6 1.598-3.2 2.397-4 .8-.8 1.599-2.4 3.197-3.2 1.599-.8 3.197-.8 4.796-.8 1.598 0 3.196 0 4.795.8 1.598.8 2.398 1.6 3.197 3.2.799.8 1.598 2.4 2.397 4 .8 1.6 1.599 3.2 2.398 5.6l17.583 44c1.598 3.2 2.398 5.6 2.398 7.2-.8.8-1.599 2.4-2.398 4zM116.711 72c-8.791-3.2-15.185-7.2-20.78-12-5.594 5.6-12.787 9.6-21.579 12l-2.397-4c8.791-2.4 15.984-5.6 21.579-11.2C87.939 51.2 83.144 44 81.545 36h-7.992v-3.2h21.58c-1.6-2.4-3.198-5.6-4.796-8l2.397-.8c1.599 2.4 3.997 5.6 5.595 8.8h19.98v4h-7.992c-2.397 8-6.393 15.2-11.189 20 5.595 4.8 11.988 8.8 20.78 11.2l-3.197 4z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/link.svg b/energy_management_ui/src/assets/icons/svg/link.svg
new file mode 100644
index 0000000..48197ba
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/link.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/list.svg b/energy_management_ui/src/assets/icons/svg/list.svg
new file mode 100644
index 0000000..20259ed
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/list.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M1.585 12.087c0 6.616 3.974 11.98 8.877 11.98 4.902 0 8.877-5.364 8.877-11.98 0-6.616-3.975-11.98-8.877-11.98-4.903 0-8.877 5.364-8.877 11.98zM125.86.107H35.613c-1.268 0-2.114 1.426-2.114 2.852v18.255c0 1.712 1.057 2.853 2.114 2.853h90.247c1.268 0 2.114-1.426 2.114-2.853V2.96c0-1.711-1.057-2.852-2.114-2.852zM.106 62.86c0 6.615 3.974 11.979 8.876 11.979 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zM124.17 50.88H33.921c-1.268 0-2.114 1.425-2.114 2.851v18.256c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852V53.73c0-1.426-.846-2.852-2.114-2.852zM.106 115.913c0 6.616 3.974 11.98 8.876 11.98 4.903 0 8.877-5.364 8.877-11.98 0-6.616-3.974-11.98-8.877-11.98-4.902 0-8.876 5.364-8.876 11.98zm124.064-11.98H33.921c-1.268 0-2.114 1.426-2.114 2.853v18.255c0 1.711 1.057 2.852 2.114 2.852h90.247c1.268 0 2.114-1.426 2.114-2.852v-18.255c0-1.427-.846-2.853-2.114-2.853z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/lock.svg b/energy_management_ui/src/assets/icons/svg/lock.svg
new file mode 100644
index 0000000..74fee54
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/lock.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/log.svg b/energy_management_ui/src/assets/icons/svg/log.svg
new file mode 100644
index 0000000..d879d33
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/log.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035943711" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4805" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M208.736 566.336H64.384v59.328h144.352v-59.328z m0-336.096H165.44V74.592c0-7.968 4.896-14.848 10.464-14.848h502.016V0.448H175.936c-38.72 1.248-69.248 34.368-68.192 74.144v155.648H64.384V289.6h144.352V230.24z m0 168.096H64.384v59.328h144.352v-59.328z m714.656 76.576h-57.76v474.496c0 7.936-4.896 14.848-10.464 14.848H175.936c-5.568 0-10.464-6.912-10.464-14.848v-155.68h43.296v-59.296H64.384v59.296h43.328v155.68c-1.024 39.776 29.472 72.896 68.192 74.144h679.232c38.72-1.184 69.248-34.368 68.256-74.144V474.912z m14.944-290.336l-83.072-85.312a71.264 71.264 0 0 0-52.544-21.728 71.52 71.52 0 0 0-51.616 23.872L386.528 507.264a30.496 30.496 0 0 0-6.176 10.72L308.16 740.512a30.016 30.016 0 0 0 6.976 30.24c7.712 7.968 19.2 10.752 29.568 7.2l216.544-74.112a28.736 28.736 0 0 0 12.128-7.936L940.448 287.456a75.552 75.552 0 0 0-2.112-102.88z m-557.12 518.272l39.104-120.64 78.336 80.416-117.44 40.224z m170.048-70.016l-103.552-106.016 200.16-222.4 103.52 106.304-200.128 222.112zM897.952 247.072l-0.256 0.224-107.136 119.168-103.52-106.528 106.432-118.624a14.144 14.144 0 0 1 10.304-4.736 13.44 13.44 0 0 1 10.464 4.288l83.264 85.696c5.472 5.6 5.664 14.72 0.448 20.512z" p-id="4806"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/logininfor.svg b/energy_management_ui/src/assets/icons/svg/logininfor.svg
new file mode 100644
index 0000000..267f844
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/logininfor.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036016814" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5261" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896 128h-85.333333a42.666667 42.666667 0 0 0 0 85.333333h42.666666v640H170.666667V213.333333h42.666666a42.666667 42.666667 0 0 0 0-85.333333H128a42.666667 42.666667 0 0 0-42.666667 42.666667v725.333333a42.666667 42.666667 0 0 0 42.666667 42.666667h768a42.666667 42.666667 0 0 0 42.666667-42.666667V170.666667a42.666667 42.666667 0 0 0-42.666667-42.666667z" p-id="5262"></path><path d="M341.333333 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666666 42.666667zM512 298.666667a42.666667 42.666667 0 0 0 42.666667-42.666667V128a42.666667 42.666667 0 0 0-85.333334 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM682.666667 298.666667a42.666667 42.666667 0 0 0 42.666666-42.666667V128a42.666667 42.666667 0 0 0-85.333333 0v128a42.666667 42.666667 0 0 0 42.666667 42.666667zM341.333333 768a42.666667 42.666667 0 0 0 42.666667-42.666667 128 128 0 0 1 256 0 42.666667 42.666667 0 0 0 85.333333 0 213.333333 213.333333 0 0 0-107.52-184.32A128 128 0 0 0 640 469.333333a128 128 0 0 0-256 0 128 128 0 0 0 22.186667 71.68A213.333333 213.333333 0 0 0 298.666667 725.333333a42.666667 42.666667 0 0 0 42.666666 42.666667z m128-298.666667a42.666667 42.666667 0 1 1 42.666667 42.666667 42.666667 42.666667 0 0 1-42.666667-42.666667z" p-id="5263"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/message.svg b/energy_management_ui/src/assets/icons/svg/message.svg
new file mode 100644
index 0000000..14ca817
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/message.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/money.svg b/energy_management_ui/src/assets/icons/svg/money.svg
new file mode 100644
index 0000000..c1580de
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/money.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.122 127.892v-28.68H7.513V87.274h46.609v-12.4H7.513v-12.86h38.003L.099 0h22.6l32.556 45.07c3.617 5.144 6.44 9.611 8.487 13.385 1.788-3.05 4.89-7.779 9.301-14.186L103.93 0h24.01L82.385 62.013h38.34v12.862h-46.41v12.4h46.41v11.937h-46.41v28.68H54.123z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/monitor.svg b/energy_management_ui/src/assets/icons/svg/monitor.svg
new file mode 100644
index 0000000..bc308cb
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/monitor.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543827393750" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4695" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
+</style></defs><path d="M64 64V640H896V64H64zM0 0h960v704H0V0z" p-id="4696"></path><path d="M192 896H768v64H192zM448 640H512v256h-64z" p-id="4697"></path><path d="M479.232 561.604267l309.9904-348.330667-47.803733-42.5472-259.566934 291.669333L303.957333 240.008533 163.208533 438.6048l52.224 37.009067 91.6224-129.28z" p-id="4698"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/nested.svg b/energy_management_ui/src/assets/icons/svg/nested.svg
new file mode 100644
index 0000000..06713a8
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/nested.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/online.svg b/energy_management_ui/src/assets/icons/svg/online.svg
new file mode 100644
index 0000000..330a202
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/online.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1568899557259" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="535" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M356.246145 681.56286c-68.156286-41.949414-107.246583-103.84102-107.246583-169.805384 0-65.966411 39.090297-127.860063 107.246583-169.809477 12.046361-7.414877 15.800871-23.190165 8.385994-35.236526-7.413853-12.046361-23.191188-15.801894-35.236526-8.387018-39.640836 24.399713-72.539106 56.044434-95.137801 91.515297-23.86657 37.461193-36.481889 79.620385-36.481889 121.917724 0 42.297338 12.615319 84.454484 36.481889 121.914654 22.598694 35.469839 55.496965 67.11456 95.137801 91.51325 4.185322 2.576685 8.821923 3.804652 13.400195 3.804652 8.598842 0 16.998139-4.329609 21.836331-12.190647C372.047016 704.752002 368.291482 688.976714 356.246145 681.56286zM263.943926 754.580874c-92.603071-61.111846-145.713686-149.623739-145.713686-242.840794 0-93.195565 53.094242-181.682899 145.667637-242.774279 11.805884-7.79043 15.061021-23.677259 7.269567-35.483142-7.79043-11.805884-23.677259-15.062044-35.483142-7.269567C128.487861 296.954249 67.006602 401.024489 67.006602 511.74008c0 110.73708 61.496609 214.830857 168.721703 285.593504 4.343935 2.867304 9.240455 4.238534 14.08274 4.238534 8.317433 0 16.476253-4.046153 21.400403-11.507078C279.003923 778.258133 275.748786 762.372328 263.943926 754.580874zM788.660552 226.213092c-11.80486-7.791453-27.692712-4.536316-35.483142 7.269567-7.79043 11.805884-4.536316 27.692712 7.269567 35.483142 92.575442 61.092403 145.670707 149.579737 145.670707 242.774279 0 93.216032-53.111638 181.727924-145.715733 242.840794-11.805884 7.79043-15.059997 23.678282-7.269567 35.484166 4.925173 7.461949 13.081946 11.507078 21.400403 11.507078 4.841262 0 9.739828-1.37123 14.083763-4.238534 107.22714-70.761624 168.724773-174.857447 168.724773-285.593504C957.341323 401.025513 895.860063 296.955272 788.660552 226.213092zM790.090111 633.67213c23.865547-37.459147 36.480866-79.617315 36.480866-121.914654 0-42.298362-12.615319-84.45653-36.480866-121.917724-22.598694-35.470863-55.496965-67.115584-95.139847-91.515297-12.047384-7.413853-27.821649-3.659343-35.236526 8.387018-7.414877 12.045337-3.659343 27.821649 8.385994 35.236526 68.156286 41.949414 107.247606 103.842043 107.247606 169.809477 0 65.964364-39.090297 127.85597-107.247606 169.804361-12.045337 7.414877-15.800871 23.190165-8.385994 35.237549 4.838192 7.861038 13.236466 12.190647 21.835308 12.190647 4.579295 0 9.215896-1.227967 13.400195-3.804652C734.591099 700.786691 767.490394 669.142993 790.090111 633.67213zM567.129086 518.274914c24.12342-17.150612 39.887452-45.305859 39.887452-77.07133 0-52.128241-42.452881-94.538143-94.634334-94.538143-52.18043 0-94.633311 42.408879-94.633311 94.538143 0 31.695886 15.696494 59.797921 39.730886 76.958766-49.875944 21.128203-84.917018 70.234621-84.917018 127.301338 0 2.366907 0.061398 4.762467 0.182149 7.119141l1.249457 24.296359 276.373515 0 1.238201-24.308639c0.119727-2.358721 0.181125-4.750187 0.181125-7.106862C651.786185 588.497255 616.865861 539.465538 567.129086 518.274914zM512.381182 397.889079c23.937179 0 43.411719 19.430538 43.411719 43.314505 0 23.882943-19.47454 43.313481-43.411719 43.313481-23.936155 0-43.409672-19.430538-43.409672-43.313481C468.971509 417.320641 488.445026 397.889079 512.381182 397.889079zM426.08884 625.656573c9.119705-38.542828 44.254923-67.337641 86.085634-67.337641s76.966952 28.794813 86.085634 67.337641L426.08884 625.656573z" p-id="536"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/password.svg b/energy_management_ui/src/assets/icons/svg/password.svg
new file mode 100644
index 0000000..e291d85
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/password.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/pdf.svg b/energy_management_ui/src/assets/icons/svg/pdf.svg
new file mode 100644
index 0000000..957aa0c
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/pdf.svg
@@ -0,0 +1 @@
+<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><path d="M869.073 277.307H657.111V65.344l211.962 211.963zm-238.232 26.27V65.344l-476.498-.054v416.957h714.73v-178.67H630.841zm-335.836 360.57c-5.07-3.064-10.944-5.133-17.61-6.201-6.67-1.064-13.603-1.6-20.81-1.6h-48.821v85.641h48.822c7.206 0 14.14-.532 20.81-1.6 6.665-1.065 12.54-3.133 17.609-6.202 5.064-3.063 9.134-7.406 12.208-13.007 3.065-5.602 4.6-12.937 4.6-22.011 0-9.07-1.535-16.408-4.6-22.01-3.074-5.603-7.144-9.94-12.208-13.01zM35.82 541.805v416.904h952.358V541.805H35.821zm331.421 191.179c-3.6 11.071-9.343 20.879-17.209 29.413-7.874 8.542-18.078 15.408-30.617 20.61-12.544 5.206-27.747 7.807-45.621 7.807h-66.036v102.45h-62.831V607.517h128.867c17.874 0 33.077 2.6 45.62 7.802 12.541 5.207 22.745 12.076 30.618 20.615 7.866 8.538 13.604 18.277 17.21 29.212 3.6 10.943 5.401 22.278 5.401 34.018 0 11.477-1.8 22.752-5.402 33.819zM644.9 806.417c-5.343 17.61-13.408 32.818-24.212 45.627-10.807 12.803-24.283 22.879-40.423 30.213-16.146 7.343-35.155 11.007-57.03 11.007h-123.26V607.518h123.26c18.41 0 35.552 2.941 51.428 8.808 15.873 5.869 29.618 14.671 41.22 26.412 11.608 11.744 20.674 26.411 27.217 44.02 6.535 17.61 9.803 38.288 9.803 62.035 0 20.81-2.67 40.02-8.003 57.624zm245.362-146.07h-138.07v66.03h119.66v48.829h-119.66v118.058h-62.83V607.518h200.9v52.829h-.001zm-318.2 25.611c-6.402-8.266-14.877-14.604-25.412-19.01-10.544-4.402-23.551-6.602-39.019-6.602h-44.825v180.088h56.029c9.07 0 17.872-1.463 26.415-4.401 8.535-2.932 16.14-7.802 22.812-14.609 6.665-6.8 12.007-15.667 16.007-26.61 4.003-10.94 6.003-24.275 6.003-40.021 0-14.408-1.4-27.416-4.202-39.019-2.8-11.607-7.406-21.542-13.808-29.816zm0 0"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/people.svg b/energy_management_ui/src/assets/icons/svg/people.svg
new file mode 100644
index 0000000..2bd54ae
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/people.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M104.185 95.254c8.161 7.574 13.145 17.441 13.145 28.28 0 1.508-.098 2.998-.285 4.466h-10.784c.238-1.465.403-2.948.403-4.465 0-8.983-4.36-17.115-11.419-23.216C86 104.66 75.355 107.162 64 107.162c-11.344 0-21.98-2.495-31.22-6.83-7.064 6.099-11.444 14.218-11.444 23.203 0 1.517.165 3 .403 4.465H10.955a35.444 35.444 0 0 1-.285-4.465c0-10.838 4.974-20.713 13.127-28.291C9.294 85.42.003 70.417.003 53.58.003 23.99 28.656.001 64 .001s63.997 23.988 63.997 53.58c0 16.842-9.299 31.85-23.812 41.673zM64 36.867c-29.454 0-53.33-10.077-53.33 15.342 0 25.418 23.876 46.023 53.33 46.023 29.454 0 53.33-20.605 53.33-46.023 0-25.419-23.876-15.342-53.33-15.342zm24.888 25.644c-3.927 0-7.111-2.665-7.111-5.953 0-3.288 3.184-5.954 7.11-5.954 3.928 0 7.111 2.666 7.111 5.954s-3.183 5.953-7.11 5.953zm-3.556 16.372c0 4.11-9.55 7.442-21.332 7.442-11.781 0-21.332-3.332-21.332-7.442 0-1.06.656-2.064 1.8-2.976 3.295 2.626 10.79 4.465 19.532 4.465 8.743 0 16.237-1.84 19.531-4.465 1.145.912 1.801 1.916 1.801 2.976zm-46.22-16.372c-3.927 0-7.11-2.665-7.11-5.953 0-3.288 3.183-5.954 7.11-5.954 3.927 0 7.111 2.666 7.111 5.954s-3.184 5.953-7.11 5.953z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/peoples.svg b/energy_management_ui/src/assets/icons/svg/peoples.svg
new file mode 100644
index 0000000..aab852e
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/peoples.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M95.648 118.762c0 5.035-3.563 9.121-7.979 9.121H7.98c-4.416 0-7.979-4.086-7.979-9.121C0 100.519 15.408 83.47 31.152 76.75c-9.099-6.43-15.216-17.863-15.216-30.987v-9.128c0-20.16 14.293-36.518 31.893-36.518s31.894 16.358 31.894 36.518v9.122c0 13.137-6.123 24.556-15.216 30.993 15.738 6.726 31.141 23.769 31.141 42.012z"/><path d="M106.032 118.252h15.867c3.376 0 6.101-3.125 6.101-6.972 0-13.957-11.787-26.984-23.819-32.123 6.955-4.919 11.638-13.66 11.638-23.704v-6.985c0-15.416-10.928-27.926-24.39-27.926-1.674 0-3.306.193-4.89.561 1.936 4.713 3.018 9.974 3.018 15.526v9.121c0 13.137-3.056 23.111-11.066 30.993 14.842 4.41 27.312 23.42 27.541 41.509z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/phone.svg b/energy_management_ui/src/assets/icons/svg/phone.svg
new file mode 100644
index 0000000..ab8e8c4
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/phone.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1567417214476" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2266" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M761.503029 2.90619 242.121921 2.90619c-32.405037 0-58.932204 26.060539-58.932204 58.527998l0 902.302287c0 32.156374 26.217105 58.216913 58.932204 58.216913l519.381108 0c32.344662 0 58.591443-26.060539 58.591443-58.216913L820.094472 61.123103C820.094472 28.966729 793.847691 2.90619 761.503029 2.90619M452.878996 61.123103l98.147344 0c6.780427 0 12.31549 5.536087 12.31549 12.253068 0 6.748704-5.535063 12.253068-12.31549 12.253068l-98.147344 0c-6.779404 0-12.345166-5.504364-12.345166-12.253068C440.532807 66.659189 446.099592 61.123103 452.878996 61.123103M501.641583 980.593398c-29.636994 0-53.987588-23.946388-53.987588-53.677527 0-29.356608 24.039509-53.614082 53.987588-53.614082 29.91738 0 53.987588 23.883967 53.987588 53.614082C555.629171 956.647009 531.559986 980.593398 501.641583 980.593398M766.35657 803.142893c0 16.23373-13.186324 29.107945-29.233811 29.107945l-470.618521 0c-16.35755 0-29.325909-13.186324-29.325909-29.107945L237.178329 163.500794c0-16.232706 13.279445-29.138644 29.325909-29.138644l470.246037 0c16.420995 0 29.357632 13.1853 29.357632 29.138644l0 639.642099L766.35657 803.142893zM766.35657 803.142893" p-id="2267"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/post.svg b/energy_management_ui/src/assets/icons/svg/post.svg
new file mode 100644
index 0000000..2922c61
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/post.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035724641" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3998" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M136.4 434.3h77.7c21.5 0 38.9-17.4 38.9-38.9s-17.4-38.9-38.9-38.9h-77.7c-21.5 0-38.9 17.4-38.9 38.9s17.4 38.9 38.9 38.9zM252.9 628.6c0-21.5-17.4-38.9-38.9-38.9h-77.7c-21.5 0-38.9 17.4-38.9 38.9s17.4 38.9 38.9 38.9H214c21.5-0.1 38.9-17.5 38.9-38.9z" p-id="3999"></path><path d="M874.7 97.5H227c-28.6 0-51.8 23.2-51.8 51.8v194.3h38.9c28.6 0 51.8 23.2 51.8 51.8 0 28.6-23.2 51.8-51.8 51.8h-38.9v129.5h38.9c28.6 0 51.8 23.2 51.8 51.8 0 28.6-23.2 51.8-51.8 51.8h-38.9v194.3c0 28.6 23.2 51.8 51.8 51.8h647.7c28.6 0 51.8-23.2 51.8-51.8V149.3c0-28.6-23.2-51.8-51.8-51.8z m-311.3 723c-15.6 0-146.7-71.6-146.7-91 0-19.4 102-368.6 102-368.6l-83.6-104s-12.3-23.1 24.6-23.1h208.9c36.9 0 18.4 23.1 18.4 23.1l-79 104s102 351.3 102 368.6c0.1 17.3-131 91-146.6 91z m169.2-253.6l-27.9 40.2-74.5-240 103.4 171.7c4.6 7.9 4.2 20.6-1 28.1z" p-id="4000"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/qq.svg b/energy_management_ui/src/assets/icons/svg/qq.svg
new file mode 100644
index 0000000..ee13d4e
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/qq.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M18.448 57.545l-.244-.744-.198-.968-.132-.53v-2.181l.236-.859.24-.908.317-.953.428-1.06.561-1.103.794-1.104v-.773l.077-.724.123-.984.34-1.106.313-1.194.25-.548.289-.511.371-.569.405-.423v-2.73l.234-1.407.236-1.633.42-1.955.577-2.035.43-1.118.426-1.217.468-1.135.559-1.216.57-1.332.655-1.247.737-1.331.929-1.33.43-.762.457-.624.995-1.406 1.025-1.403 1.163-1.444 1.246-1.405 1.352-1.384 1.41-1.423 1.708-1.536 1.083-.934 1.322-1.008 1.34-.89 1.448-.855 1.392-.76 1.57-.63 1.667-.775 1.657-.532 1.653-.552 1.787-.548 1.785-.417 1.876-.347L59.128.68l1.879-.245 1.876-.252 2.002-.106h5.912l1.97.243 1.981.231 2.019.207 1.874.441 1.979.413 1.857.475 2.035.53 1.862.646 1.782.738 1.904.78 1.736.853 1.689.95 1.655 1.044 1.425.971.662.548.693.401 1.323 1.1 1.115 1.064 1.112 1.1 1.083 1.214.894 1.178 1.064 1.217.74 1.306.752 1.162.798 1.352.661 1.175 1.113 2.489.546 1.286.428 1.192.428 1.294.384 1.217.267 1.047.347 1.231.607 2.198.388 1.924.253 1.861.217 1.497.342 2.28.077.362.274.41.737 1.18.473.8.42.832.534.892.472 1.07.307 1.093.334 1.2.252 1.232.115.605.106.746v.648l-.106.643v.8l-.192.774-.35 1.5-.403.76-.299.852v.213l.142.264.4.623 1.746 2.53 1.377 1.9.66 1.267.889 1.389.774 1.52.893 1.627.894 1.828 1.006 2.069.567 1.268.518 1.239.447 1.307.44 1.175.336 1.235.342 1.16.432 2.261.343 2.31.235 2.05v2.891l-.158 1.025-.226 1.768-.308 1.59-.48 1.44-.18.588-.336.707-.28.493-.375.607-.33.383-.42.494-.375.4-.401.34-.48.207-.432.207-.355.114h-.543l-.346-.114-.66-.32-.302-.212-.317-.223-.347-.304-.35-.342-.579-.63-.684-.89-.539-.917-.538-.734-.526-.855-.741-1.517-.833-1.579-.098-.055h-.138l-.338.247-.196.415-.326.516-.567 1.533-.856 2.182-1.096 2.626-.824 1.308-.864 1.366-1.027 1.536-1.09 1.503-.557.68-.676.743-1.555 1.497.136.135.21.214.777.446 3.235 1.524 1.41.779 1.347.756 1.332.953 1.187.982.574.443.432.511.445.593.367.643.198.533.242.64.105.554.115.647-.115.433v.44l-.105.454-.242.415-.092.325-.22.394-.587.784-.543.627-.42.47-.35.348-.893.638-1.01.556-1.077.532-1.155.511-1.287.495-.693.207-.608.167-1.496.342-1.545.325-1.552.323-1.689.27-1.74.072-1.785.21h-5.539l-1.998-.114-1.86-.168-2.005-.27-1.99-.209-2.095-.286-2.03-.495-1.981-.374-1.968-.552-2.019-.707-1.98-.585-1.044-.342-.927-.323-.586-.223-.582-.12h-1.647l-1.904-.131-.962-.096-1.24-.135-.795.705-1.085.665-1.471.701-1.628.875-.99.475-1.033.376-2.281.914-1.24.305-1.3.343-1.803.344-1.13.086-1.193.1-1.246.135-1.45.053h-5.926l-3.346-.053-3.25-.321-1.644-.23-1.589-.23-1.546-.227-1.547-.305-1.442-.456-1.434-.325-1.294-.51-1.223-.474-1.142-.533-.99-.583-.984-.71-.336-.343-.44-.415-.334-.362-.3-.417-.278-.415-.215-.42-.311-.89-.109-.46-.138-.51v-.473l.138-.533v-.53l.109-.53v-1.069l.052-.564.259-.647.215-.646.39-.779.286-.3.236-.348.615-.738.49-.38.464-.266.428-.338.676-.21.543-.324.676-.341.77-.227.775-.231.897-.192.85-.11 1.008-.13 1.093-.081.284-.092h.063l.137-.115v-.13l-.2-.266-.58-.27-1.45-1.231-.975-.761-1.127-.967-1.136-1.082-1.181-1.382-1.36-1.558-.508-.843-.672-.87-.58-1.007-.522-1.1-.704-1.047-.459-1.194-.547-1.192-.546-1.33-.397-1.273-.378-1.575-.112-.057h-.115l-.059-.113h-.14l-.23.113-.114.057-.158.264-.057.321-.119.286-.206.477-.664 1.157-.345.701-.546.612-.58.736-.641.816-.677.724-.795.701-.734.658-.814.524-.89.546-.855.325-1.008.247-.99.095h-.233l-.228-.095-.18-.384-.29-.188-.38-.912-.237-.493-.255-.707-.21-.734-.113-.724-.313-1.648-.12-.972v-3.185l.12-2.379.196-1.214.23-1.252.21-1.347.374-1.254.42-1.443.431-1.407.578-1.448.545-1.38.754-1.4.699-1.52.855-1.425 1.006-1.538 1.023-1.382 1.069-1.538.891-1.071 1.142-1.227 1.202-1.237.56-.59.678-.662.985-.836 1.012-.853 1.647-1.446 1.242-.889z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/search.svg b/energy_management_ui/src/assets/icons/svg/search.svg
new file mode 100644
index 0000000..84233dd
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/search.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/server.svg b/energy_management_ui/src/assets/icons/svg/server.svg
new file mode 100644
index 0000000..ca37b00
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/server.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1547360688278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M890 120H134a70 70 0 0 0-70 70v500a70 70 0 0 0 70 70h756a70 70 0 0 0 70-70V190a70 70 0 0 0-70-70z m-10 520a40 40 0 0 1-40 40H712V448a40 40 0 0 0-80 0v232h-80V368a40 40 0 0 0-80 0v312h-80V512a40 40 0 0 0-80 0v168H184a40 40 0 0 1-40-40V240a40 40 0 0 1 40-40h656a40 40 0 0 1 40 40zM696 824H328a40 40 0 0 0 0 80h368a40 40 0 0 0 0-80z" fill="#bfbfbf" p-id="6718"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/shopping.svg b/energy_management_ui/src/assets/icons/svg/shopping.svg
new file mode 100644
index 0000000..87513e7
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/shopping.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M42.913 101.36c1.642 0 3.198.332 4.667.996a12.28 12.28 0 0 1 3.89 2.772c1.123 1.184 1.987 2.582 2.592 4.193.605 1.612.908 3.318.908 5.118 0 1.8-.303 3.507-.908 5.118-.605 1.611-1.469 3.01-2.593 4.194a13.3 13.3 0 0 1-3.889 2.843 10.582 10.582 0 0 1-4.667 1.066c-1.729 0-3.306-.355-4.732-1.066a13.604 13.604 0 0 1-3.825-2.843c-1.123-1.185-1.988-2.583-2.593-4.194a14.437 14.437 0 0 1-.907-5.118c0-1.8.302-3.506.907-5.118.605-1.61 1.47-3.009 2.593-4.193a12.515 12.515 0 0 1 3.825-2.772c1.426-.664 3.003-.996 4.732-.996zm53.932.285c1.643 0 3.22.331 4.733.995a11.386 11.386 0 0 1 3.889 2.772c1.08 1.185 1.945 2.583 2.593 4.194.648 1.61.972 3.317.972 5.118 0 1.8-.324 3.506-.972 5.117-.648 1.611-1.513 3.01-2.593 4.194a12.253 12.253 0 0 1-3.89 2.843 11 11 0 0 1-4.732 1.066 10.58 10.58 0 0 1-4.667-1.066 12.478 12.478 0 0 1-3.824-2.843c-1.08-1.185-1.945-2.583-2.593-4.194a13.581 13.581 0 0 1-.973-5.117c0-1.801.325-3.507.973-5.118.648-1.611 1.512-3.01 2.593-4.194a11.559 11.559 0 0 1 3.824-2.772 11.212 11.212 0 0 1 4.667-.995zm21.781-80.747c2.42 0 4.3.355 5.64 1.066 1.34.71 2.29 1.587 2.852 2.63a6.427 6.427 0 0 1 .778 3.34c-.044 1.185-.195 2.204-.454 3.057-.26.853-.8 2.606-1.62 5.26a589.268 589.268 0 0 1-2.788 8.743 1236.373 1236.373 0 0 0-3.047 9.453c-.994 3.128-1.75 5.592-2.269 7.393-1.123 3.79-2.55 6.42-4.278 7.89-1.728 1.469-3.846 2.203-6.352 2.203H39.023l1.945 12.795h65.342c4.148 0 6.223 1.943 6.223 5.828 0 1.896-.41 3.53-1.232 4.905-.821 1.374-2.442 2.061-4.862 2.061H38.505c-1.729 0-3.176-.426-4.343-1.28-1.167-.852-2.14-1.966-2.917-3.34a21.277 21.277 0 0 1-1.88-4.478 44.128 44.128 0 0 1-1.102-4.55c-.087-.568-.324-1.942-.713-4.122-.39-2.18-.865-4.904-1.426-8.174l-1.88-10.947c-.692-4.027-1.383-8.079-2.075-12.154-1.642-9.572-3.5-20.234-5.574-31.986H6.87c-1.296 0-2.377-.356-3.24-1.067a9.024 9.024 0 0 1-2.14-2.558 10.416 10.416 0 0 1-1.167-3.2C.108 8.53 0 7.488 0 6.54c0-1.896.583-3.46 1.75-4.69C2.917.615 4.494 0 6.482 0h13.095c1.728 0 3.111.284 4.148.853 1.037.569 1.858 1.28 2.463 2.132a8.548 8.548 0 0 1 1.297 2.701c.26.948.475 1.754.648 2.417.173.758.346 1.825.519 3.199.173 1.374.345 2.772.518 4.193.26 1.706.519 3.507.778 5.403h88.678z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/size.svg b/energy_management_ui/src/assets/icons/svg/size.svg
new file mode 100644
index 0000000..ddb25b8
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/size.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h54.796v18.286H36.531V128H18.265V73.143H0V54.857zm127.857-36.571H91.935V128H72.456V18.286H36.534V0h91.326l-.003 18.286z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/skill.svg b/energy_management_ui/src/assets/icons/svg/skill.svg
new file mode 100644
index 0000000..a3b7312
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/skill.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M31.652 93.206h33.401c1.44 2.418 3.077 4.663 4.93 6.692h-38.33v-6.692zm0-10.586h28.914a44.8 44.8 0 0 1-1.264-6.688h-27.65v6.688zm0-17.27H59.39c.288-2.286.714-4.532 1.34-6.687H31.65v6.687h.003zm53.913 44.84v5.85c0 2.798-2.095 5.075-4.667 5.075h-70.07c-2.576 0-4.663-2.277-4.663-5.075V31.26l23.22-20.96v22.25H17.16v6.688h18.39V6.688h45.348c2.576 0 4.667 2.277 4.667 5.066v20.009c1.987-.675 4.053-1.128 6.17-1.445v-18.56C91.738 5.28 86.874 0 80.902 0H31.15L0 28.118v87.917c0 6.48 4.859 11.759 10.832 11.759h70.07c5.974 0 10.837-5.27 10.837-11.759v-4.41c-2.117-.312-4.183-.765-6.17-1.435h-.004zM23.279 58.667h-7.96v6.688h7.96v-6.688zm-7.956 41.23h7.96v-6.691h-7.96v6.692zm7.956-23.96h-7.96v6.687h7.96v-6.688zm89.718-15.042l-4.896-4.07-12.447 17.613-11.19-9.305-3.762 5.311 16.091 13.38 16.204-22.929zM128 70.978c0-18.632-13.97-33.782-31.147-33.782-17.168 0-31.135 15.155-31.135 33.782 0 18.628 13.97 33.783 31.135 33.783 17.172 0 31.143-15.15 31.143-33.783H128zm-6.17 0c0 14.933-11.203 27.1-24.981 27.1-13.77 0-24.987-12.158-24.987-27.1 0-14.941 11.195-27.099 24.987-27.099 13.778 0 24.982 12.158 24.982 27.1z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/star.svg b/energy_management_ui/src/assets/icons/svg/star.svg
new file mode 100644
index 0000000..6cf86e6
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/star.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M70.66 4.328l14.01 29.693c1.088 2.29 3.177 3.882 5.603 4.25l31.347 4.76c6.087.926 8.528 8.756 4.117 13.247L103.05 79.395c-1.75 1.78-2.544 4.352-2.132 6.867l5.352 32.641c1.043 6.337-5.33 11.182-10.778 8.19l-28.039-15.409a7.13 7.13 0 0 0-6.91 0l-28.039 15.41c-5.448 2.99-11.821-1.854-10.777-8.19l5.352-32.642c.415-2.515-.387-5.088-2.136-6.867L2.264 56.278C-2.146 51.787.286 43.957 6.38 43.031l31.343-4.76c2.419-.368 4.51-1.96 5.595-4.25L57.334 4.328c2.728-5.77 10.605-5.77 13.325 0z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/swagger.svg b/energy_management_ui/src/assets/icons/svg/swagger.svg
new file mode 100644
index 0000000..05d4e7b
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/swagger.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566036776944" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6463" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M64 223.995345h168.001164v47.997673c0 26.428509 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.569164 41.984-47.997673v-47.997673h504.003491a32.004655 32.004655 0 0 0 0-64.009309H455.996509V111.988364c0-26.428509-18.878836-47.997673-41.984-47.997673H273.985164c-23.095855 0-41.984 21.569164-41.984 47.997673v47.997672H64a32.004655 32.004655 0 0 0 0 64.009309zM288.004655 128h111.997672V256H288.004655V128zM960 479.995345H791.998836v-47.997672c0-26.372655-18.878836-47.997673-41.984-47.997673H609.978182c-23.095855 0-41.984 21.634327-41.984 47.997673v47.997672H64a32.004655 32.004655 0 0 0 0 64.00931h504.003491v47.997672c0 26.363345 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.634327 41.984-47.997673v-47.997672h168.001164a32.004655 32.004655 0 1 0-0.009309-64.00931zM735.995345 576H623.997673v-128h111.997672v128zM960 800.293236v-0.288581H455.996509v-47.997673c0-26.363345-18.878836-47.997673-41.984-47.997673H274.050327c-23.105164 0-41.984 21.634327-41.984 47.997673v47.997673H64v0.288581a32.004655 32.004655 0 0 0 0 64.009309c0.986764 0 1.917673-0.195491 2.885818-0.288581h165.115346v47.997672c0 26.363345 18.878836 47.997673 41.984 47.997673h140.036654c23.095855 0 41.984-21.634327 41.984-47.997673v-47.997672h501.108364c0.968145 0.093091 1.899055 0.288582 2.895127 0.288581a32.004655 32.004655 0 1 0-0.009309-64.009309zM400.002327 896H288.004655V768h111.997672v128z" fill="" p-id="6464"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/system.svg b/energy_management_ui/src/assets/icons/svg/system.svg
new file mode 100644
index 0000000..dba28cf
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/system.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1543827724451" class="icon" style="" viewBox="0 0 1084 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10233" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css">@font-face { font-family: rbicon; src: url("chrome-extension://dipiagiiohfljcicegpgffpbnjmgjcnf/fonts/rbicon.woff2") format("woff2"); font-weight: normal; font-style: normal; }
+</style></defs><path d="M1080.09609 434.500756c-4.216302-23.731757-26.9241-47.945376-50.595623-53.185637l-17.648235-4.095836a175.940257 175.940257 0 0 1-101.612877-80.832531 177.807476 177.807476 0 0 1-18.732427-129.801867l5.541425-16.684509c7.10748-23.129428-2.108151-54.992624-20.599646-70.833873 0 0-16.624276-14.094495-63.244529-41.199293-46.800951-26.984332-66.858502-34.513443-66.858502-34.513443-22.76803-8.372371-54.631227-0.361397-71.255503 17.407304l-12.287509 13.251234a173.470708 173.470708 0 0 1-120.465769 48.065842A174.13327 174.13327 0 0 1 421.329029 33.590675L409.583617 20.761071C393.140039 2.99237 361.096144-4.898138 338.267881 3.353767c0 0-20.358715 7.529111-67.099434 34.513443-46.800951 27.34573-63.244529 41.440225-63.244529 41.440225-18.431263 15.66055-27.646894 47.222582-20.539413 70.592941l5.059562 16.865207a178.048407 178.048407 0 0 1-18.672194 129.621169 174.916297 174.916297 0 0 1-102.275439 81.073463l-17.045906 3.854904c-23.310126 5.42096-46.258856 29.333415-50.595623 53.185637 0 0-3.854905 21.382674-3.854905 75.712737 0 54.330062 3.854905 75.712736 3.854905 75.712736 4.216302 23.972688 26.9241 47.945376 50.595623 53.185637l16.624276 3.854905a174.253736 174.253736 0 0 1 102.395904 81.314394c23.310126 40.837896 28.911785 87.337683 18.732427 129.801867l-4.81863 16.443578c-7.10748 23.129428 2.108151 54.992624 20.599646 70.833872 0 0 16.624276 14.094495 63.244529 41.199293 46.800951 27.104798 66.918735 34.513443 66.918735 34.513443 22.707798 8.372371 54.631227 0.361397 71.255503-17.407303l11.624947-12.588673a175.096996 175.096996 0 0 1 242.256662 0.120465l11.624947 12.648906c16.383345 17.708468 48.427239 25.598976 71.255503 17.347071 0 0 20.358715-7.529111 67.159666-34.513443 46.740719-27.104798 63.124063-41.199293 63.124064-41.199293 18.491496-15.600317 27.707127-47.463513 20.599646-70.833873l-5.059562-17.106139a176.723284 176.723284 0 0 1 18.672194-129.139305 176.060722 176.060722 0 0 1 102.395904-81.314394l16.68451-3.854905c23.310126-5.42096 46.258856-29.333415 50.595623-53.185637 0 0 3.854905-21.382674 3.854904-75.712737-0.240932-54.330062-4.095836-75.833202-4.095836-75.833202z m-537.819428 293.334149c-119.261112 0-216.175824-97.336342-216.175824-217.621412a216.657687 216.657687 0 0 1 216.236057-217.320249c119.200879 0 216.115591 97.276109 216.11559 217.56118-0.240932 120.044139-96.974945 217.320248-216.175823 217.320249z" p-id="10234" fill="#bfbfbf"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/tab.svg b/energy_management_ui/src/assets/icons/svg/tab.svg
new file mode 100644
index 0000000..b4b48e4
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/tab.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.921.052H49.08c-1.865 0-3.198 1.599-3.198 3.464v6.661c0 1.865 1.6 3.464 3.198 3.464h29.84c1.865 0 3.198-1.599 3.198-3.464V3.516C82.385 1.65 80.786.052 78.92.052zm45.563 0H94.642c-1.865 0-3.464 1.599-3.464 3.464v6.661c0 1.865 1.599 3.464 3.464 3.464h29.842c1.865-.266 3.464-1.599 3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464zm0 22.382H40.02c-1.866 0-3.464-1.599-3.464-3.464V3.516c0-1.865-1.599-3.464-3.464-3.464H3.516C1.65.052.052 1.651.052 3.516V124.75c0 1.598 1.599 3.197 3.464 3.197h120.968c1.865 0 3.464-1.599 3.464-3.464V25.898c0-1.865-1.599-3.464-3.464-3.464z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/table.svg b/energy_management_ui/src/assets/icons/svg/table.svg
new file mode 100644
index 0000000..0e3dc9d
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/table.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/theme.svg b/energy_management_ui/src/assets/icons/svg/theme.svg
new file mode 100644
index 0000000..5982a2f
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/theme.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M125.5 36.984L95.336 2.83C93.735 1.018 91.565 0 89.3 0c-2.263 0-4.433 1.018-6.033 2.83l-3.786 4.286c-1.6 1.812-3.77 2.83-6.032 2.831H54.553c-2.263 0-4.434-1.018-6.033-2.83L44.734 2.83C43.134 1.018 40.964 0 38.701 0c-2.263 0-4.434 1.018-6.034 2.83L2.5 36.984C.9 38.796 0 41.254 0 43.815c0 2.562.899 5.02 2.5 6.831L14.565 64.31c2.178 2.468 5.367 3.403 8.33 2.444 1.35-.435 2.709.592 2.709 2.18v49.407c0 5.313 3.84 9.66 8.532 9.66h59.726c4.693 0 8.532-4.347 8.532-9.66V68.934c0-1.59 1.36-2.616 2.71-2.181 2.962.96 6.15.024 8.329-2.444L125.5 50.646c1.6-1.811 2.499-4.269 2.499-6.83 0-2.563-.899-5.02-2.5-6.832z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/tool.svg b/energy_management_ui/src/assets/icons/svg/tool.svg
new file mode 100644
index 0000000..c813067
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/tool.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1553828490559" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1684" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M898.831744 900.517641 103.816972 900.517641c-36.002982 0-65.363683-29.286-65.363683-65.313541l0-554.949184c0-36.041868 29.361725-65.326844 65.363683-65.326844l795.015795 0c36.002982 0 65.198931 29.284977 65.198931 65.326844l0 554.949184C964.030675 871.231641 934.834726 900.517641 898.831744 900.517641L898.831744 900.517641zM103.816972 255.593236c-13.576203 0-24.711821 11.085476-24.711821 24.662703l0 554.949184c0 13.576203 11.136641 24.662703 24.711821 24.662703l795.015795 0c13.577227 0 24.547069-11.086499 24.547069-24.662703l0-554.949184c0-13.577227-10.970866-24.662703-24.547069-24.662703L103.816972 255.593236 103.816972 255.593236zM664.346245 251.774257c-11.161201 0-20.332071-9.080819-20.332071-20.332071l0-101.278661c0-13.576203-11.047614-24.623817-24.699542-24.623817L383.181611 105.539708c-13.576203 0-24.712845 11.04659-24.712845 24.623817l0 101.278661c0 11.252275-9.041934 20.332071-20.332071 20.332071-11.20111 0-20.319791-9.080819-20.319791-20.332071l0-101.278661c0-35.989679 29.323862-65.275679 65.364707-65.275679l236.133022 0c36.06745 0 65.402569 29.284977 65.402569 65.275679l0 101.278661C684.717202 242.694461 675.636383 251.774257 664.346245 251.774257L664.346245 251.774257zM413.233044 521.725502 75.694471 521.725502c-11.163247 0-20.333094-9.117658-20.333094-20.35663 0-11.252275 9.169847-20.332071 20.333094-20.332071l337.538573 0c11.277858 0 20.319791 9.080819 20.319791 20.332071C433.552835 512.607844 424.510902 521.725502 413.233044 521.725502L413.233044 521.725502zM912.894018 521.725502 575.367725 521.725502c-11.213389 0-20.332071-9.117658-20.332071-20.35663 0-11.252275 9.118682-20.332071 20.332071-20.332071l337.526293 0c11.290137 0 20.332071 9.080819 20.332071 20.332071C933.226089 512.607844 924.184155 521.725502 912.894018 521.725502L912.894018 521.725502zM557.56322 634.217552 445.085496 634.217552c-11.213389 0-20.332071-9.079796-20.332071-20.331048l0-168.763658c0-11.251252 9.118682-20.332071 20.332071-20.332071l112.478747 0c11.290137 0 20.370956 9.080819 20.370956 20.332071l0 168.763658C577.934177 625.137757 568.853357 634.217552 557.56322 634.217552L557.56322 634.217552zM465.417567 593.514525l71.827909 0L537.245476 465.454918l-71.827909 0L465.417567 593.514525 465.417567 593.514525z" p-id="1685" fill="#bfbfbf"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/tree-table.svg b/energy_management_ui/src/assets/icons/svg/tree-table.svg
new file mode 100644
index 0000000..8aafdb8
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M44.8 0h79.543C126.78 0 128 1.422 128 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H44.8c-2.438 0-3.657-1.422-3.657-4.267V4.267C41.143 1.422 42.362 0 44.8 0zm22.857 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 80 64 78.578 64 75.733V52.267C64 49.422 65.219 48 67.657 48zm0 48h56.686c2.438 0 3.657 1.422 3.657 4.267v23.466c0 2.845-1.219 4.267-3.657 4.267H67.657C65.22 128 64 126.578 64 123.733v-23.466C64 97.422 65.219 96 67.657 96zM50.286 68.267c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V32h6.4c2.02 0 3.658-1.91 3.658-4.267V4.267C27.429 1.91 25.79 0 23.77 0H3.657C1.637 0 0 1.91 0 4.267v23.466C0 30.09 1.637 32 3.657 32h6.4v80c0 2.356 1.638 4.267 3.657 4.267h36.572c2.02 0 3.657-1.91 3.657-4.267 0-2.356-1.638-4.267-3.657-4.267H17.37V68.267h32.915z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/tree.svg b/energy_management_ui/src/assets/icons/svg/tree.svg
new file mode 100644
index 0000000..dd4b7dd
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/tree.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/user.svg b/energy_management_ui/src/assets/icons/svg/user.svg
new file mode 100644
index 0000000..0ba0716
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/user.svg
@@ -0,0 +1 @@
+<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/validCode.svg b/energy_management_ui/src/assets/icons/svg/validCode.svg
new file mode 100644
index 0000000..cfb1021
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/validCode.svg
@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1569580729849" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1939" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M513.3 958.5c-142.2 0-397.9-222.1-401.6-440.5V268c1.7-39.6 31.7-72.3 71.1-77.3 49-4.6 97.1-16.5 142.7-35.3 47.8-14 91.9-38.3 129.4-71.1 30.3-24.4 72.9-26.3 105.3-4.6 39.9 30.7 83.8 55.9 130.5 74.6 48.6 14.7 98.2 25.9 148.4 33.7 38.5 7.6 67.1 40.3 69.5 79.5 3.3 84.9 2.5 169.9-2.6 254.7-33.7 281.6-253.7 436.4-392.7 436.3z m-0.1-813.7c-7.2-0.2-14.3 2-20 6.4-39.7 35.2-86.8 61.1-137.7 75.7-46.8 19.2-96.2 31-146.6 35.2-11 3.2-18.8 13-19.5 24.4v230.1c3.5 180.3 223.3 361 323.9 361s287.3-120.2 317.6-360.5c7.3-142.7 0-228.6 0-229.6-1.3-13.3-11-24.3-24-27.3-49.6-7.7-98.6-19-146.5-33.7-46.3-19.5-89.7-45.3-129-76.7-5.8-3.8-12.7-5.5-19.5-4.9l1.3-0.1z" fill="#C6CCDA" p-id="1940"></path><path d="M750.1 428L490.7 673.2c-11.7 11.1-29.5 12.9-43.1 4.2l-6.8-5.8-141.2-149.4c-9.3-9.3-12.7-22.9-9-35.5 3.8-12.6 14.1-22.1 27-24.8 12.9-2.7 26.1 1.9 34.6 11.9L469 597.5l233.7-221c14.6-12.8 36.8-11.6 49.9 2.7 13.2 14.2 11.5 35.3-2.5 48.8" fill="#C6CCDA" p-id="1941"></path></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/wechat.svg b/energy_management_ui/src/assets/icons/svg/wechat.svg
new file mode 100644
index 0000000..c586e55
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/wechat.svg
@@ -0,0 +1 @@
+<svg width="128" height="110" xmlns="http://www.w3.org/2000/svg"><path d="M86.635 33.334c1.467 0 2.917.113 4.358.283C87.078 14.392 67.58.111 45.321.111 20.44.111.055 17.987.055 40.687c0 13.104 6.781 23.863 18.115 32.209l-4.527 14.352 15.82-8.364c5.666 1.182 10.207 2.395 15.858 2.395 1.42 0 2.829-.073 4.227-.189-.886-3.19-1.398-6.53-1.398-9.996 0-20.845 16.98-37.76 38.485-37.76zm-24.34-12.936c3.407 0 5.665 2.363 5.665 5.954 0 3.576-2.258 5.97-5.666 5.97-3.392 0-6.795-2.395-6.795-5.97 0-3.591 3.403-5.954 6.795-5.954zM30.616 32.323c-3.393 0-6.818-2.395-6.818-5.971 0-3.591 3.425-5.954 6.818-5.954 3.392 0 5.65 2.363 5.65 5.954 0 3.576-2.258 5.97-5.65 5.97z"/><path d="M127.945 70.52c0-19.075-18.108-34.623-38.448-34.623-21.537 0-38.5 15.548-38.5 34.623 0 19.108 16.963 34.622 38.5 34.622 4.508 0 9.058-1.2 13.584-2.395l12.414 7.167-3.404-11.923c9.087-7.184 15.854-16.712 15.854-27.471zm-50.928-5.97c-2.254 0-4.53-2.362-4.53-4.773 0-2.378 2.276-4.771 4.53-4.771 3.422 0 5.665 2.393 5.665 4.771 0 2.41-2.243 4.773-5.665 4.773zm24.897 0c-2.24 0-4.498-2.362-4.498-4.773 0-2.378 2.258-4.771 4.498-4.771 3.392 0 5.665 2.393 5.665 4.771 0 2.41-2.273 4.773-5.665 4.773z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svg/zip.svg b/energy_management_ui/src/assets/icons/svg/zip.svg
new file mode 100644
index 0000000..f806fc4
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svg/zip.svg
@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M78.527 116.793c.178.008.348.024.527.024h40.233c4.711-.005 8.53-3.677 8.534-8.21V18.895c-.004-4.532-3.823-8.204-8.534-8.209H79.054c-.179 0-.353.016-.527.024V0L0 10.082v107.406l78.527 10.342v-11.037zm0-101.362c.174-.024.348-.052.527-.052h40.233c2.018 0 3.659 1.578 3.659 3.52v89.713c-.003 1.942-1.64 3.517-3.659 3.519H79.054c-.179 0-.353-.028-.527-.052V15.431zM30.262 75.757l-18.721-.46V72.37l11.3-16.673v-.148l-10.266.164v-4.51l17.504-.44v3.264L18.696 70.76v.144l11.566.176v4.678zm9.419.231l-5.823-.144V50.671l5.823-.144v25.461zm22.255-11.632c-2.168 1.922-5.353 2.76-9.02 2.736-.702.004-1.402-.04-2.097-.131v9.303l-5.997-.148V50.743c1.852-.352 4.473-.647 8.218-.743 3.838-.096 6.608.539 8.48 1.913 1.807 1.306 3.032 3.5 3.032 6.112s-.926 4.833-2.612 6.331h-.004zM53.36 54.45c-.856-.01-1.71.083-2.541.275v7.682c.523.116 1.167.152 2.06.152 3.301-.004 5.36-1.614 5.36-4.314 0-2.425-1.772-3.843-4.875-3.791l-.004-.004zm39.847-37.066h9.564v3.795h-9.564v-3.795zm-9.568 5.68h9.564v3.8h-9.564v-3.8zm9.568 6.216h9.564v3.799h-9.564V29.28zm0 12h9.564v3.794h-9.564V41.28zm-9.568-6.096h9.564v3.795h-9.564v-3.795zm9.472 47.064c2.512 0 4.921-.96 6.697-2.67 1.776-1.708 2.773-4.026 2.772-6.442l-1.748-15.263c0-5.033-2.492-9.112-7.725-9.112-5.232 0-7.72 4.079-7.72 9.112l-1.752 15.263c-.001 2.417.996 4.735 2.773 6.444 1.777 1.71 4.187 2.669 6.7 2.668h.003zm-3.135-16.75h6.27v12.743h-6.27V65.5z"/></svg>
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/icons/svgo.yml b/energy_management_ui/src/assets/icons/svgo.yml
new file mode 100644
index 0000000..d11906a
--- /dev/null
+++ b/energy_management_ui/src/assets/icons/svgo.yml
@@ -0,0 +1,22 @@
+# replace default config
+
+# multipass: true
+# full: true
+
+plugins:
+
+  # - name
+  #
+  # or:
+  # - name: false
+  # - name: true
+  #
+  # or:
+  # - name:
+  #     param1: 1
+  #     param2: 2
+
+- removeAttrs:
+    attrs:
+      - 'fill'
+      - 'fill-rule'
diff --git a/energy_management_ui/src/assets/image/configureChart.png b/energy_management_ui/src/assets/image/configureChart.png
new file mode 100644
index 0000000..1cd84e7
--- /dev/null
+++ b/energy_management_ui/src/assets/image/configureChart.png
Binary files differ
diff --git a/energy_management_ui/src/assets/image/login-background.png b/energy_management_ui/src/assets/image/login-background.png
new file mode 100644
index 0000000..ce2a674
--- /dev/null
+++ b/energy_management_ui/src/assets/image/login-background.png
Binary files differ
diff --git a/energy_management_ui/src/assets/image/login-background1.png b/energy_management_ui/src/assets/image/login-background1.png
new file mode 100644
index 0000000..e839866
--- /dev/null
+++ b/energy_management_ui/src/assets/image/login-background1.png
Binary files differ
diff --git a/energy_management_ui/src/assets/image/navbar/exit.png b/energy_management_ui/src/assets/image/navbar/exit.png
new file mode 100644
index 0000000..a30899b
--- /dev/null
+++ b/energy_management_ui/src/assets/image/navbar/exit.png
Binary files differ
diff --git a/energy_management_ui/src/assets/image/navbar/xiala.png b/energy_management_ui/src/assets/image/navbar/xiala.png
new file mode 100644
index 0000000..276e7c0
--- /dev/null
+++ b/energy_management_ui/src/assets/image/navbar/xiala.png
Binary files differ
diff --git a/energy_management_ui/src/assets/image/rectangle.png b/energy_management_ui/src/assets/image/rectangle.png
new file mode 100644
index 0000000..ef0017d
--- /dev/null
+++ b/energy_management_ui/src/assets/image/rectangle.png
Binary files differ
diff --git a/energy_management_ui/src/assets/image/touxiang.png b/energy_management_ui/src/assets/image/touxiang.png
new file mode 100644
index 0000000..0df32c6
--- /dev/null
+++ b/energy_management_ui/src/assets/image/touxiang.png
Binary files differ
diff --git a/energy_management_ui/src/assets/logo/logo-page-left.png b/energy_management_ui/src/assets/logo/logo-page-left.png
new file mode 100644
index 0000000..5dc1c2f
--- /dev/null
+++ b/energy_management_ui/src/assets/logo/logo-page-left.png
Binary files differ
diff --git a/energy_management_ui/src/assets/logo/logo2.png b/energy_management_ui/src/assets/logo/logo2.png
new file mode 100644
index 0000000..380134d
--- /dev/null
+++ b/energy_management_ui/src/assets/logo/logo2.png
Binary files differ
diff --git a/energy_management_ui/src/assets/logo/toray_group_icon.png b/energy_management_ui/src/assets/logo/toray_group_icon.png
new file mode 100644
index 0000000..6c56317
--- /dev/null
+++ b/energy_management_ui/src/assets/logo/toray_group_icon.png
Binary files differ
diff --git a/energy_management_ui/src/assets/styles/btn.scss b/energy_management_ui/src/assets/styles/btn.scss
new file mode 100644
index 0000000..e6ba1a8
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/btn.scss
@@ -0,0 +1,99 @@
+@import './variables.scss';
+
+@mixin colorBtn($color) {
+  background: $color;
+
+  &:hover {
+    color: $color;
+
+    &:before,
+    &:after {
+      background: $color;
+    }
+  }
+}
+
+.blue-btn {
+  @include colorBtn($blue)
+}
+
+.light-blue-btn {
+  @include colorBtn($light-blue)
+}
+
+.red-btn {
+  @include colorBtn($red)
+}
+
+.pink-btn {
+  @include colorBtn($pink)
+}
+
+.green-btn {
+  @include colorBtn($green)
+}
+
+.tiffany-btn {
+  @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+  @include colorBtn($yellow)
+}
+
+.pan-btn {
+  font-size: 14px;
+  color: #fff;
+  padding: 14px 36px;
+  border-radius: 8px;
+  border: none;
+  outline: none;
+  transition: 600ms ease all;
+  position: relative;
+  display: inline-block;
+
+  &:hover {
+    background: #fff;
+
+    &:before,
+    &:after {
+      width: 100%;
+      transition: 600ms ease all;
+    }
+  }
+
+  &:before,
+  &:after {
+    content: '';
+    position: absolute;
+    top: 0;
+    right: 0;
+    height: 2px;
+    width: 0;
+    transition: 400ms ease all;
+  }
+
+  &::after {
+    right: inherit;
+    top: inherit;
+    left: 0;
+    bottom: 0;
+  }
+}
+
+.custom-button {
+  display: inline-block;
+  line-height: 1;
+  white-space: nowrap;
+  cursor: pointer;
+  background: #fff;
+  color: #fff;
+  -webkit-appearance: none;
+  text-align: center;
+  box-sizing: border-box;
+  outline: 0;
+  margin: 0;
+  padding: 10px 15px;
+  font-size: 14px;
+  border-radius: 4px;
+}
diff --git a/energy_management_ui/src/assets/styles/common-table-form.scss b/energy_management_ui/src/assets/styles/common-table-form.scss
new file mode 100644
index 0000000..41191b6
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/common-table-form.scss
@@ -0,0 +1,13 @@
+.el-form-item {
+  margin-bottom: 0;
+  margin-right: 0
+}
+
+.operation {
+  display: flex;
+  justify-content: end;
+}
+
+.el-row {
+  margin-bottom: 0;
+}
diff --git a/energy_management_ui/src/assets/styles/element-ui.scss b/energy_management_ui/src/assets/styles/element-ui.scss
new file mode 100644
index 0000000..9581d56
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/element-ui.scss
@@ -0,0 +1,79 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+  font-weight: 400 !important;
+}
+
+.el-upload {
+  input[type="file"] {
+    display: none !important;
+  }
+}
+
+.el-upload__input {
+  display: none;
+}
+
+.cell {
+  .el-tag {
+    margin-right: 0px;
+  }
+}
+
+.small-padding {
+  .cell {
+    padding-left: 5px;
+    padding-right: 5px;
+  }
+}
+
+.fixed-width {
+  .el-button--mini {
+    padding: 7px 10px;
+    width: 60px;
+  }
+}
+
+.status-col {
+  .cell {
+    padding: 0 10px;
+    text-align: center;
+
+    .el-tag {
+      margin-right: 0px;
+    }
+  }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+  transform: none;
+  left: 0;
+  position: relative;
+  margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+  .el-upload {
+    width: 100%;
+
+    .el-upload-dragger {
+      width: 100%;
+      height: 200px;
+    }
+  }
+}
+
+// dropdown
+.el-dropdown-menu {
+  a {
+    display: block
+  }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+  display: inline-flex !important;
+}
diff --git a/energy_management_ui/src/assets/styles/element-variables.scss b/energy_management_ui/src/assets/styles/element-variables.scss
new file mode 100644
index 0000000..6c2ce08
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/element-variables.scss
@@ -0,0 +1,31 @@
+/**
+* I think element-ui's default theme color is too light for long-term use.
+* So I modified the default color and you can modify it to your liking.
+**/
+
+/* theme color */
+$--color-primary: #38BCBF;
+$--color-success: #13ce66;
+$--color-warning: #FFBA00;
+$--color-danger: #ff4949;
+// $--color-info: #1E1E1E;
+
+$--button-font-weight: 400;
+
+// $--color-text-regular: #1f2d3d;
+
+$--border-color-light: #dfe4ed;
+$--border-color-lighter: #e6ebf5;
+
+$--table-border:1px solid#dfe6ec;
+
+/* icon font path, required */
+$--font-path: '~element-ui/lib/theme-chalk/fonts';
+
+@import "~element-ui/packages/theme-chalk/src/index";
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+  theme: $--color-primary;
+}
diff --git a/energy_management_ui/src/assets/styles/index.scss b/energy_management_ui/src/assets/styles/index.scss
new file mode 100644
index 0000000..0f46af8
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/index.scss
@@ -0,0 +1,191 @@
+@import './variables.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './btn.scss';
+
+body {
+  height: 100%;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  text-rendering: optimizeLegibility;
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+  font-weight: 700;
+}
+
+html {
+  height: 100%;
+  box-sizing: border-box;
+}
+
+#app {
+  height: 100%;
+}
+
+*,
+*:before,
+*:after {
+  box-sizing: inherit;
+}
+
+.no-padding {
+  padding: 0px !important;
+}
+
+.padding-content {
+  padding: 4px 0;
+}
+
+a:focus,
+a:active {
+  outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+  cursor: pointer;
+  color: inherit;
+  text-decoration: none;
+}
+
+div:focus {
+  outline: none;
+}
+
+.fr {
+  float: right;
+}
+
+.fl {
+  float: left;
+}
+
+.pr-5 {
+  padding-right: 5px;
+}
+
+.pl-5 {
+  padding-left: 5px;
+}
+
+.block {
+  display: block;
+}
+
+.pointer {
+  cursor: pointer;
+}
+
+.inlineBlock {
+  display: block;
+}
+
+.clearfix {
+  &:after {
+    visibility: hidden;
+    display: block;
+    font-size: 0;
+    content: " ";
+    clear: both;
+    height: 0;
+  }
+}
+
+aside {
+  background: #eef1f6;
+  padding: 8px 24px;
+  margin-bottom: 20px;
+  border-radius: 2px;
+  display: block;
+  line-height: 32px;
+  font-size: 16px;
+  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+  color: #2c3e50;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+
+  a {
+    color: #38BCBF;
+    cursor: pointer;
+
+    &:hover {
+      color: rgb(32, 160, 255);
+    }
+  }
+}
+
+//main-container鍏ㄥ眬鏍峰紡
+.app-container {
+  padding: 20px;
+}
+
+.components-container {
+  margin: 30px 50px;
+  position: relative;
+}
+
+.pagination-container {
+  margin-top: 30px;
+}
+
+.text-center {
+  text-align: center
+}
+
+.sub-navbar {
+  height: 50px;
+  line-height: 50px;
+  position: relative;
+  width: 100%;
+  text-align: right;
+  padding-right: 20px;
+  transition: 600ms ease position;
+  background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+  .subtitle {
+    font-size: 20px;
+    color: #fff;
+  }
+
+  &.draft {
+    background: #d0d0d0;
+  }
+
+  &.deleted {
+    background: #d0d0d0;
+  }
+}
+
+.link-type,
+.link-type:focus {
+  color: #337ab7;
+  cursor: pointer;
+
+  &:hover {
+    color: rgb(32, 160, 255);
+  }
+}
+
+.filter-container {
+  padding-bottom: 10px;
+
+  .filter-item {
+    display: inline-block;
+    vertical-align: middle;
+    margin-bottom: 10px;
+  }
+}
+
+//refine vue-multiselect plugin
+.multiselect {
+  line-height: 16px;
+}
+
+.multiselect--active {
+  z-index: 1000 !important;
+}
diff --git a/energy_management_ui/src/assets/styles/left-right-layout.scss b/energy_management_ui/src/assets/styles/left-right-layout.scss
new file mode 100644
index 0000000..eee7478
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/left-right-layout.scss
@@ -0,0 +1,8 @@
+.page-left {
+  width: 280px
+}
+
+.page-right {
+  padding-left: 14px;
+  width: calc(100% - 280px);
+}
\ No newline at end of file
diff --git a/energy_management_ui/src/assets/styles/mixin.scss b/energy_management_ui/src/assets/styles/mixin.scss
new file mode 100644
index 0000000..06fa061
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/mixin.scss
@@ -0,0 +1,66 @@
+@mixin clearfix {
+  &:after {
+    content: "";
+    display: table;
+    clear: both;
+  }
+}
+
+@mixin scrollBar {
+  &::-webkit-scrollbar-track-piece {
+    background: #d3dce6;
+  }
+
+  &::-webkit-scrollbar {
+    width: 6px;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    background: #99a9bf;
+    border-radius: 20px;
+  }
+}
+
+@mixin relative {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+
+@mixin pct($pct) {
+  width: #{$pct};
+  position: relative;
+  margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+  $width: $width/2;
+  $color-border-style: $height solid $color;
+  $transparent-border-style: $width solid transparent;
+  height: 0;
+  width: 0;
+
+  @if $direction==up {
+    border-bottom: $color-border-style;
+    border-left: $transparent-border-style;
+    border-right: $transparent-border-style;
+  }
+
+  @else if $direction==right {
+    border-left: $color-border-style;
+    border-top: $transparent-border-style;
+    border-bottom: $transparent-border-style;
+  }
+
+  @else if $direction==down {
+    border-top: $color-border-style;
+    border-left: $transparent-border-style;
+    border-right: $transparent-border-style;
+  }
+
+  @else if $direction==left {
+    border-right: $color-border-style;
+    border-top: $transparent-border-style;
+    border-bottom: $transparent-border-style;
+  }
+}
diff --git a/energy_management_ui/src/assets/styles/ruoyi.scss b/energy_management_ui/src/assets/styles/ruoyi.scss
new file mode 100644
index 0000000..0ca1268
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/ruoyi.scss
@@ -0,0 +1,299 @@
+/**
+* 閫氱敤css鏍峰紡甯冨眬澶勭悊
+* Copyright (c) 2019 ruoyi
+*/
+.el-table tbody tr:hover > td {
+  background-color: #CFDCF5 !important
+}
+
+.el-table .el-table__header-wrapper th {
+  word-break: break-word;
+  background-color: #D5D5D5;
+  color: #515a6e;
+  height: 40px;
+  font-size: 13px;
+}
+
+.el-table__body tr.hover-row.current-row > td,
+.el-table__body tr.hover-row.el-table__row--striped.current-row > td,
+.el-table__body tr.hover-row.el-table__row--striped > td,
+.el-table__body tr.hover-row > td {
+  background-color: #CFDCF5 !important;
+}
+
+
+.el-table th {
+  background: #D5D5D5;
+  color: #515a6e;
+}
+
+/** 鍩虹閫氱敤 **/
+.pt5 {
+  padding-top: 5px;
+}
+
+.pr5 {
+  padding-right: 5px;
+}
+
+.pb5 {
+  padding-bottom: 5px;
+}
+
+.mt5 {
+  margin-top: 5px;
+}
+
+.mr5 {
+  margin-right: 5px;
+}
+
+.mb5 {
+  margin-bottom: 5px;
+}
+
+.mb8 {
+  margin-bottom: 8px;
+}
+
+.ml5 {
+  margin-left: 5px;
+}
+
+.mt10 {
+  margin-top: 10px;
+}
+
+.mr10 {
+  margin-right: 10px;
+}
+
+.mb10 {
+  margin-bottom: 10px;
+}
+
+.ml0 {
+  margin-left: 10px;
+}
+
+.mt20 {
+  margin-top: 20px;
+}
+
+.mr20 {
+  margin-right: 20px;
+}
+
+.mb20 {
+  margin-bottom: 20px;
+}
+
+.m20 {
+  margin-left: 20px;
+}
+
+.el-dialog {
+  margin-top: 6vh !important;
+}
+
+
+/** 琛ㄥ崟甯冨眬 **/
+.form-header {
+  font-size: 15px;
+  color: #6379bb;
+  border-bottom: 1px solid #ddd;
+  margin: 8px 10px 25px 10px;
+  padding-bottom: 5px
+}
+
+/** 琛ㄦ牸甯冨眬 **/
+.pagination-container {
+  position: relative;
+  height: 25px;
+  margin-bottom: 10px;
+  margin-top: 15px;
+  padding: 10px 20px !important;
+}
+
+.pagination-container .el-pagination {
+  right: 0;
+  position: absolute;
+}
+
+.el-table .fixed-width .el-button--mini {
+  color: #38BCBF;
+  padding-left: 0;
+  padding-right: 0;
+  width: inherit;
+}
+
+.el-tree-node__content > .el-checkbox {
+  margin-right: 8px;
+}
+
+.list-group-striped > .list-group-item {
+  border-left: 0;
+  border-right: 0;
+  border-radius: 0;
+  padding-left: 0;
+  padding-right: 0;
+}
+
+.list-group {
+  padding-left: 0px;
+  list-style: none;
+}
+
+.list-group-item {
+  border-bottom: 1px solid #e7eaec;
+  border-top: 1px solid #e7eaec;
+  margin-bottom: -1px;
+  padding: 11px 0px;
+  font-size: 13px;
+}
+
+.pull-right {
+  float: right !important;
+}
+
+.el-card__header {
+  padding: 14px 15px 7px;
+  min-height: 40px;
+}
+
+.el-card__body {
+  padding: 27px 20px;
+}
+
+.card-box {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 10px;
+}
+
+/* text color */
+.text-navy {
+  color: #1ab394;
+}
+
+.text-primary {
+  color: inherit;
+}
+
+.text-success {
+  color: #1c84c6;
+}
+
+.text-info {
+  color: #23c6c8;
+}
+
+.text-warning {
+  color: #f8ac59;
+}
+
+.text-danger {
+  color: #ed5565;
+}
+
+.text-muted {
+  color: #888888;
+}
+
+/* image */
+.img-circle {
+  border-radius: 50%;
+}
+
+.img-lg {
+  width: 120px;
+  height: 120px;
+}
+
+.avatar-upload-preview {
+  position: absolute;
+  top: 50%;
+  transform: translate(50%, -50%);
+  width: 180px;
+  height: 180px;
+  border-radius: 50%;
+  box-shadow: 0 0 4px #ccc;
+  overflow: hidden;
+}
+
+.split-container {
+  height: calc(100vh - 131px);
+
+  .el-card__header {
+    padding: 10px;
+    min-height: 40px;
+    line-height: 32px;
+  }
+
+  .left-content {
+    width: 260px;
+    margin-bottom: 0;
+    padding: 0;
+  }
+
+  .el-card__body {
+    padding: 8px 10px 10px 10px;
+    height: calc(100vh - 142px);
+    overflow: auto;
+  }
+}
+
+.modelnode-tree {
+  margin-top: 8px;
+
+  .custom-tree-node {
+    flex: 1;
+    padding-right: 8px;
+    // line-height: 26px;
+  }
+
+  .node-opt {
+    float: right;
+  }
+}
+
+.query-form {
+  .el-form-item {
+    margin-bottom: 8px;
+  }
+}
+
+.model-node-setting {
+  .el-card__body {
+    padding: 8px 10px 10px 10px;
+    height: calc(100vh - 220px);
+    overflow: auto;
+  }
+}
+
+.el-table  ::v-deep .disabledCheck .cell .el-checkbox__inner {
+  display: none !important;
+}
+
+.el-table  ::v-deep .disabledCheck .cell:before {
+  content: '閫夋嫨';
+  position: absolute;
+  right: 15px;
+}
+
+.configure-upload {
+  width: 100%;
+
+  .el-upload {
+    width: 100%;
+  }
+
+  .el-upload-dragger {
+    width: 100%;
+    height: calc(100vh - 165px);
+  }
+
+  .el-icon-upload {
+    margin-top: calc(50vh - 180px);
+  }
+}
diff --git a/energy_management_ui/src/assets/styles/sidebar.scss b/energy_management_ui/src/assets/styles/sidebar.scss
new file mode 100644
index 0000000..363446f
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/sidebar.scss
@@ -0,0 +1,212 @@
+#app {
+
+  .main-container {
+    height: 100vh;
+    overflow: hidden;
+    transition: margin-left .28s;
+    margin-left: $sideBarWidth;
+    position: relative;
+    background: rgba(235, 237, 240, 1);
+  }
+
+  .sidebar-container {
+    transition: width 0.28s;
+    width: $sideBarWidth !important;
+    background-color: $menuBg;
+    height: 100%;
+    position: fixed;
+    font-size: 0px;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1001;
+    overflow: hidden;
+
+    // reset element-ui css
+    .horizontal-collapse-transition {
+      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+    }
+
+    .scrollbar-wrapper {
+      overflow-x: hidden !important;
+    }
+
+    .el-scrollbar__bar.is-vertical {
+      right: 0px;
+    }
+
+    .el-scrollbar {
+      height: 100%;
+    }
+
+    &.has-logo {
+      .el-scrollbar {
+        height: calc(100% - 87px);
+      }
+    }
+
+    .is-horizontal {
+      display: none;
+    }
+
+    a {
+      display: inline-block;
+      width: 100%;
+      overflow: hidden;
+    }
+
+    .svg-icon {
+      margin-right: 16px;
+    }
+
+    .el-menu {
+      border: none;
+      height: 100%;
+      width: 100% !important;
+    }
+
+    // menu hover
+    .submenu-title-noDropdown,
+    .el-submenu__title {
+      font-size: 16px;
+      &:hover {
+        background-color: $menuHover !important;
+      }
+    }
+
+    .is-active>.el-submenu__title {
+      font-size: 16px;
+      // color: rgba(11, 107, 241, 1) !important;
+      font-weight: 500;
+    }
+
+    & .nest-menu .el-submenu>.el-submenu__title,
+    & .el-submenu .el-menu-item {
+      min-width: $sideBarWidth !important;
+      &:hover {
+        background-color: $subMenuHover !important;
+      }
+    }
+  }
+
+  .hideSidebar {
+    .sidebar-container {
+      width: 54px !important;
+    }
+
+    .main-container {
+      margin-left: 54px;
+    }
+
+    .submenu-title-noDropdown {
+      padding: 0 !important;
+      position: relative;
+
+      .el-tooltip {
+        padding: 0 !important;
+
+        .svg-icon {
+          margin-left: 20px;
+        }
+      }
+    }
+
+    .el-submenu {
+      overflow: hidden;
+
+      &>.el-submenu__title {
+        padding: 0 !important;
+
+        .svg-icon {
+          margin-left: 20px;
+        }
+
+        .el-submenu__icon-arrow {
+          display: none;
+        }
+      }
+    }
+
+    .el-menu--collapse {
+      .el-submenu {
+        &>.el-submenu__title {
+          &>span {
+            height: 0;
+            width: 0;
+            overflow: hidden;
+            visibility: hidden;
+            display: inline-block;
+          }
+        }
+      }
+    }
+  }
+
+  .el-menu--collapse .el-menu .el-submenu {
+    min-width: $sideBarWidth !important;
+  }
+
+  // mobile responsive
+  .mobile {
+    .main-container {
+      margin-left: 0px;
+    }
+
+    .sidebar-container {
+      transition: transform .28s;
+      width: $sideBarWidth !important;
+    }
+
+    &.hideSidebar {
+      .sidebar-container {
+        pointer-events: none;
+        transition-duration: 0.3s;
+        transform: translate3d(-$sideBarWidth, 0, 0);
+      }
+    }
+  }
+
+  .withoutAnimation {
+
+    .main-container,
+    .sidebar-container {
+      transition: none;
+    }
+  }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+  &>.el-menu {
+    .svg-icon {
+      margin-right: 16px;
+    }
+  }
+
+  .nest-menu .el-submenu>.el-submenu__title,
+  .el-menu-item {
+    &:hover {
+      // you can use $subMenuHover
+      background-color: $menuHover !important;
+    }
+  }
+
+  // the scroll bar appears when the subMenu is too long
+  >.el-menu--popup {
+    max-height: 100vh;
+    overflow-y: auto;
+
+    &::-webkit-scrollbar-track-piece {
+      background: #d3dce6;
+    }
+
+    &::-webkit-scrollbar {
+      width: 6px;
+    }
+
+    &::-webkit-scrollbar-thumb {
+      background: #99a9bf;
+      border-radius: 20px;
+    }
+  }
+}
diff --git a/energy_management_ui/src/assets/styles/transition.scss b/energy_management_ui/src/assets/styles/transition.scss
new file mode 100644
index 0000000..4cb27cc
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/transition.scss
@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+  opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+  transition: all .5s;
+}
+
+.fade-transform-enter {
+  opacity: 0;
+  transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+  transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+  opacity: 0;
+  transform: translateX(20px);
+}
+
+.breadcrumb-move {
+  transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+  position: absolute;
+}
diff --git a/energy_management_ui/src/assets/styles/variables.scss b/energy_management_ui/src/assets/styles/variables.scss
new file mode 100644
index 0000000..9d2b5e0
--- /dev/null
+++ b/energy_management_ui/src/assets/styles/variables.scss
@@ -0,0 +1,37 @@
+// base color
+$primary-color: #38BCBF;
+$blue:#324157;
+$light-blue:#3A71A8;
+$red:#C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow:#FEC171;
+$panGreen: #30B08F;
+
+// sidebar
+$menuText:#333;
+$menuActiveText: #fff;
+$subMenuActiveText:#38BCBF; // https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:rgba(255, 255, 255, 1);
+$menuHover:rgba(246, 250, 255, 1);
+
+$subMenuBg:#38BCBF;
+$subMenuHover:rgba(246, 250, 255, 1)s;
+
+$sideBarWidth: 220px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+  menuText: $menuText;
+  menuActiveText: $menuActiveText;
+  subMenuActiveText: $subMenuActiveText;
+  menuBg: $menuBg;
+  menuHover: $menuHover;
+  subMenuBg: $subMenuBg;
+  subMenuHover: $subMenuHover;
+  sideBarWidth: $sideBarWidth;
+  primary-color: $primary-color;
+}
diff --git a/energy_management_ui/src/components/Breadcrumb/index.vue b/energy_management_ui/src/components/Breadcrumb/index.vue
new file mode 100644
index 0000000..97603c4
--- /dev/null
+++ b/energy_management_ui/src/components/Breadcrumb/index.vue
@@ -0,0 +1,81 @@
+<template>
+  <el-breadcrumb class="app-breadcrumb" separator="/">
+    <transition-group name="breadcrumb">
+      <el-breadcrumb-item v-for="(item,index) in levelList" :key="item.path">
+        <span v-if="item.redirect==='noRedirect'||index==levelList.length-1" class="no-redirect">{{ item.meta.title }}</span>
+        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
+      </el-breadcrumb-item>
+    </transition-group>
+  </el-breadcrumb>
+</template>
+
+<script>
+import pathToRegexp from 'path-to-regexp'
+
+export default {
+  data() {
+    return {
+      levelList: null
+    }
+  },
+  watch: {
+    $route(route) {
+      // if you go to the redirect page, do not update the breadcrumbs
+      if (route.path.startsWith('/redirect/')) {
+        return
+      }
+      this.getBreadcrumb()
+    }
+  },
+  created() {
+    this.getBreadcrumb()
+  },
+  methods: {
+    getBreadcrumb() {
+      // only show routes with meta.title
+      let matched = this.$route.matched.filter(item => item.meta && item.meta.title)
+      const first = matched[0]
+
+      if (!this.isDashboard(first)) {
+        matched = [{ path: '/index', meta: { title: '棣栭〉' }}].concat(matched)
+      }
+
+      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)
+    },
+    isDashboard(route) {
+      const name = route && route.name
+      if (!name) {
+        return false
+      }
+      return name.trim() === '棣栭〉'
+    },
+    pathCompile(path) {
+      const { params } = this.$route
+      var toPath = pathToRegexp.compile(path)
+      return toPath(params)
+    },
+    handleLink(item) {
+      const { redirect, path } = item
+      if (redirect) {
+        this.$router.push(redirect)
+        return
+      }
+      this.$router.push(this.pathCompile(path))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-breadcrumb.el-breadcrumb {
+  display: inline-block;
+  font-size: 14px;
+  line-height: 50px;
+  margin-left: 8px;
+
+  .no-redirect {
+    color: #97a8be;
+    cursor: text;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/components/Editor/index.vue b/energy_management_ui/src/components/Editor/index.vue
new file mode 100644
index 0000000..771f250
--- /dev/null
+++ b/energy_management_ui/src/components/Editor/index.vue
@@ -0,0 +1,226 @@
+<template>
+  <div>
+    <!-- 鍥剧墖涓婁紶缁勪欢杈呭姪 -->
+    <el-upload
+      class="avatar-uploader quill-img"
+      :action="uploadImgUrl"
+      name="file"
+      :headers="headers"
+      :show-file-list="false"
+      :on-success="quillImgSuccess"
+      :on-error="uploadError"
+      :before-upload="quillImgBefore"
+      accept='.jpg,.jpeg,.png,.gif'
+    ></el-upload>
+
+    <!-- 瀵屾枃鏈粍浠� -->
+    <quill-editor
+      class="editor"
+      v-model="content"
+      ref="quillEditor"
+      :options="editorOption"
+      @blur="onEditorBlur($event)"
+      @focus="onEditorFocus($event)"
+      @change="onEditorChange($event)"
+    ></quill-editor>
+  </div>
+</template>
+
+<script>
+import { getToken } from '@/utils/auth'
+
+// 宸ュ叿鏍忛厤缃�
+const toolbarOptions = [
+  ["bold", "italic", "underline", "strike"],       // 鍔犵矖 鏂滀綋 涓嬪垝绾� 鍒犻櫎绾�
+  ["blockquote", "code-block"],                    // 寮曠敤  浠g爜鍧�
+  [{ list: "ordered" }, { list: "bullet" }],       // 鏈夊簭銆佹棤搴忓垪琛�
+  [{ indent: "-1" }, { indent: "+1" }],            // 缂╄繘
+  [{ size: ["small", false, "large", "huge"] }],   // 瀛椾綋澶у皬
+  [{ header: [1, 2, 3, 4, 5, 6, false] }],         // 鏍囬
+  [{ color: [] }, { background: [] }],             // 瀛椾綋棰滆壊銆佸瓧浣撹儗鏅鑹�
+  [{ align: [] }],                                 // 瀵归綈鏂瑰紡
+  ["clean"],                                       // 娓呴櫎鏂囨湰鏍煎紡
+  ["link", "image", "video"]                       // 閾炬帴銆佸浘鐗囥�佽棰�
+];
+
+import { quillEditor } from "vue-quill-editor";
+import "quill/dist/quill.core.css";
+import "quill/dist/quill.snow.css";
+import "quill/dist/quill.bubble.css";
+
+export default {
+  props: {
+    /* 缂栬緫鍣ㄧ殑鍐呭 */
+    value: {
+      type: String
+    },
+    /* 鍥剧墖澶у皬 */
+    maxSize: {
+      type: Number,
+      default: 4000 //kb
+    }
+  },
+  components: { quillEditor },
+  data() {
+    return {
+      content: this.value,
+      uploadImgUrl: "",
+      editorOption: {
+        placeholder: "",
+        theme: "snow", // or 'bubble'
+        placeholder: "璇疯緭鍏ュ唴瀹�",
+        modules: {
+          toolbar: {
+            container: toolbarOptions,
+            handlers: {
+              image: function(value) {
+                if (value) {
+                  // 瑙﹀彂input妗嗛�夋嫨鍥剧墖鏂囦欢
+                  document.querySelector(".quill-img input").click();
+                } else {
+                  this.quill.format("image", false);
+                }
+              }
+            }
+          }
+        }
+      },
+      uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃
+      headers: {
+        Authorization: 'Bearer ' + getToken()
+      }
+    };
+  },
+  watch: {
+    value: function() {
+      this.content = this.value;
+    }
+  },
+  methods: {
+    onEditorBlur() {
+      //澶卞幓鐒︾偣浜嬩欢
+    },
+    onEditorFocus() {
+      //鑾峰緱鐒︾偣浜嬩欢
+    },
+    onEditorChange() {
+      //鍐呭鏀瑰彉浜嬩欢
+      this.$emit("input", this.content);
+    },
+
+    // 瀵屾枃鏈浘鐗囦笂浼犲墠
+    quillImgBefore(file) {
+      let fileType = file.type;
+			if(fileType === 'image/jpeg' || fileType === 'image/png'){
+				return true;
+			}else {
+				this.$message.error('璇锋彃鍏ュ浘鐗囩被鍨嬫枃浠�(jpg/jpeg/png)');
+				return false;
+			}
+    },
+
+    quillImgSuccess(res, file) {
+      // res涓哄浘鐗囨湇鍔″櫒杩斿洖鐨勬暟鎹�
+      // 鑾峰彇瀵屾枃鏈粍浠跺疄渚�
+      let quill = this.$refs.quillEditor.quill;
+      // 濡傛灉涓婁紶鎴愬姛
+      if (res.code == 200) {
+        // 鑾峰彇鍏夋爣鎵�鍦ㄤ綅缃�
+        let length = quill.getSelection().index;
+        // 鎻掑叆鍥剧墖  res.url涓烘湇鍔″櫒杩斿洖鐨勫浘鐗囧湴鍧�
+        quill.insertEmbed(length, "image", res.url);
+        // 璋冩暣鍏夋爣鍒版渶鍚�
+        quill.setSelection(length + 1);
+      } else {
+        this.$message.error("鍥剧墖鎻掑叆澶辫触");
+      }
+    },
+    // 瀵屾枃鏈浘鐗囦笂浼犲け璐�
+    uploadError() {
+      // loading鍔ㄧ敾娑堝け
+      this.$message.error("鍥剧墖鎻掑叆澶辫触");
+    }
+  }
+};
+</script> 
+
+<style scoped>
+.editor {
+  line-height: normal !important;
+  height: 192px;
+}
+.el-upload {
+  display: none;
+}
+.ql-snow .ql-tooltip[data-mode="link"]::before {
+  content: "璇疯緭鍏ラ摼鎺ュ湴鍧�:";
+}
+.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
+  border-right: 0px;
+  content: "淇濆瓨";
+  padding-right: 0px;
+}
+
+.ql-snow .ql-tooltip[data-mode="video"]::before {
+  content: "璇疯緭鍏ヨ棰戝湴鍧�:";
+}
+
+.ql-snow .ql-picker.ql-size .ql-picker-label::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item::before {
+  content: "14px";
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {
+  content: "10px";
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {
+  content: "18px";
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
+  content: "32px";
+}
+
+.ql-snow .ql-picker.ql-header .ql-picker-label::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item::before {
+  content: "鏂囨湰";
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+  content: "鏍囬1";
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+  content: "鏍囬2";
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+  content: "鏍囬3";
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+  content: "鏍囬4";
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+  content: "鏍囬5";
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+  content: "鏍囬6";
+}
+
+.ql-snow .ql-picker.ql-font .ql-picker-label::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item::before {
+  content: "鏍囧噯瀛椾綋";
+}
+.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
+  content: "琛嚎瀛椾綋";
+}
+.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
+  content: "绛夊瀛椾綋";
+}
+</style>
\ No newline at end of file
diff --git a/energy_management_ui/src/components/Hamburger/index.vue b/energy_management_ui/src/components/Hamburger/index.vue
new file mode 100644
index 0000000..f4c42af
--- /dev/null
+++ b/energy_management_ui/src/components/Hamburger/index.vue
@@ -0,0 +1,45 @@
+<template>
+  <div style="padding: 0 15px;" @click="toggleClick">
+    <svg
+      :class="{'is-active':isActive}"
+      class="hamburger"
+      viewBox="0 0 1024 1024"
+      xmlns="http://www.w3.org/2000/svg"
+      width="64"
+      height="64"
+      fill="white"
+    >
+      <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" />
+    </svg>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Hamburger',
+  props: {
+    isActive: {
+      type: Boolean,
+      default: false
+    }
+  },
+  methods: {
+    toggleClick() {
+      this.$emit('toggleClick')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.hamburger {
+  display: inline-block;
+  vertical-align: middle;
+  width: 20px;
+  height: 20px;
+}
+
+.hamburger.is-active {
+  transform: rotate(180deg);
+}
+</style>
diff --git a/energy_management_ui/src/components/HeaderSearch/index.vue b/energy_management_ui/src/components/HeaderSearch/index.vue
new file mode 100644
index 0000000..6db441d
--- /dev/null
+++ b/energy_management_ui/src/components/HeaderSearch/index.vue
@@ -0,0 +1,180 @@
+<template>
+  <div :class="{'show':show}" class="header-search">
+    <svg-icon class-name="search-icon" icon-class="search" @click.stop="click" />
+    <el-select
+      ref="headerSearchSelect"
+      v-model="search"
+      :remote-method="querySearch"
+      filterable
+      default-first-option
+      remote
+      placeholder="Search"
+      class="header-search-select"
+      @change="change"
+    >
+      <el-option v-for="item in options" :key="item.path" :value="item" :label="item.title.join(' > ')" />
+    </el-select>
+  </div>
+</template>
+
+<script>
+// fuse is a lightweight fuzzy-search module
+// make search results more in line with expectations
+import Fuse from 'fuse.js'
+import path from 'path'
+
+export default {
+  name: 'HeaderSearch',
+  data() {
+    return {
+      search: '',
+      options: [],
+      searchPool: [],
+      show: false,
+      fuse: undefined
+    }
+  },
+  computed: {
+    routes() {
+      return this.$store.getters.permission_routes
+    }
+  },
+  watch: {
+    routes() {
+      this.searchPool = this.generateRoutes(this.routes)
+    },
+    searchPool(list) {
+      this.initFuse(list)
+    },
+    show(value) {
+      if (value) {
+        document.body.addEventListener('click', this.close)
+      } else {
+        document.body.removeEventListener('click', this.close)
+      }
+    }
+  },
+  mounted() {
+    this.searchPool = this.generateRoutes(this.routes)
+  },
+  methods: {
+    click() {
+      this.show = !this.show
+      if (this.show) {
+        this.$refs.headerSearchSelect && this.$refs.headerSearchSelect.focus()
+      }
+    },
+    close() {
+      this.$refs.headerSearchSelect && this.$refs.headerSearchSelect.blur()
+      this.options = []
+      this.show = false
+    },
+    change(val) {
+      this.$router.push(val.path)
+      this.search = ''
+      this.options = []
+      this.$nextTick(() => {
+        this.show = false
+      })
+    },
+    initFuse(list) {
+      this.fuse = new Fuse(list, {
+        shouldSort: true,
+        threshold: 0.4,
+        location: 0,
+        distance: 100,
+        maxPatternLength: 32,
+        minMatchCharLength: 1,
+        keys: [{
+          name: 'title',
+          weight: 0.7
+        }, {
+          name: 'path',
+          weight: 0.3
+        }]
+      })
+    },
+    // Filter out the routes that can be displayed in the sidebar
+    // And generate the internationalized title
+    generateRoutes(routes, basePath = '/', prefixTitle = []) {
+      let res = []
+
+      for (const router of routes) {
+        // skip hidden router
+        if (router.hidden) { continue }
+
+        const data = {
+          path: path.resolve(basePath, router.path),
+          title: [...prefixTitle]
+        }
+
+        if (router.meta && router.meta.title) {
+          data.title = [...data.title, router.meta.title]
+
+          if (router.redirect !== 'noRedirect') {
+            // only push the routes with title
+            // special case: need to exclude parent router without redirect
+            res.push(data)
+          }
+        }
+
+        // recursive child routes
+        if (router.children) {
+          const tempRoutes = this.generateRoutes(router.children, data.path, data.title)
+          if (tempRoutes.length >= 1) {
+            res = [...res, ...tempRoutes]
+          }
+        }
+      }
+      return res
+    },
+    querySearch(query) {
+      if (query !== '') {
+        this.options = this.fuse.search(query)
+      } else {
+        this.options = []
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.header-search {
+  font-size: 0 !important;
+
+  .search-icon {
+    cursor: pointer;
+    font-size: 18px;
+    vertical-align: middle;
+  }
+
+  .header-search-select {
+    font-size: 18px;
+    transition: width 0.2s;
+    width: 0;
+    overflow: hidden;
+    background: transparent;
+    border-radius: 0;
+    display: inline-block;
+    vertical-align: middle;
+
+     ::v-deep .el-input__inner {
+      border-radius: 0;
+      border: 0;
+      padding-left: 0;
+      padding-right: 0;
+      box-shadow: none !important;
+      border-bottom: 1px solid #d9d9d9;
+      vertical-align: middle;
+    }
+  }
+
+  &.show {
+    .header-search-select {
+      width: 210px;
+      margin-left: 10px;
+    }
+  }
+}
+</style>
diff --git a/energy_management_ui/src/components/IconSelect/index.vue b/energy_management_ui/src/components/IconSelect/index.vue
new file mode 100644
index 0000000..0611dc5
--- /dev/null
+++ b/energy_management_ui/src/components/IconSelect/index.vue
@@ -0,0 +1,69 @@
+<!-- @author zhengjie -->
+<template>
+  <div class="icon-body">
+    <el-input v-model="name" style="position: relative;" clearable placeholder="璇疯緭鍏ュ浘鏍囧悕绉�" @clear="filterIcons" @input.native="filterIcons">
+      <i slot="suffix" class="el-icon-search el-input__icon" />
+    </el-input>
+    <div class="icon-list">
+      <div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)">
+        <svg-icon :icon-class="item" style="height: 30px;width: 16px;" />
+        <span>{{ item }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import icons from './requireIcons'
+export default {
+  name: 'IconSelect',
+  data() {
+    return {
+      name: '',
+      iconList: icons
+    }
+  },
+  methods: {
+    filterIcons() {
+      if (this.name) {
+        this.iconList = this.iconList.filter(item => item.includes(this.name))
+      } else {
+        this.iconList = icons
+      }
+    },
+    selectedIcon(name) {
+      this.$emit('selected', name)
+      document.body.click()
+    },
+    reset() {
+      this.name = ''
+      this.iconList = icons
+    }
+  }
+}
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+  .icon-body {
+    width: 100%;
+    padding: 10px;
+    .icon-list {
+      height: 200px;
+      overflow-y: scroll;
+      div {
+        height: 30px;
+        line-height: 30px;
+        margin-bottom: -5px;
+        cursor: pointer;
+        width: 33%;
+        float: left;
+      }
+      span {
+        display: inline-block;
+        vertical-align: -0.15em;
+        fill: currentColor;
+        overflow: hidden;
+      }
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/components/IconSelect/requireIcons.js b/energy_management_ui/src/components/IconSelect/requireIcons.js
new file mode 100644
index 0000000..99e5c54
--- /dev/null
+++ b/energy_management_ui/src/components/IconSelect/requireIcons.js
@@ -0,0 +1,11 @@
+
+const req = require.context('../../assets/icons/svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys()
+
+const re = /\.\/(.*)\.svg/
+
+const icons = requireAll(req).map(i => {
+  return i.match(re)[1]
+})
+
+export default icons
diff --git a/energy_management_ui/src/components/Pagination/index.vue b/energy_management_ui/src/components/Pagination/index.vue
new file mode 100644
index 0000000..c815e13
--- /dev/null
+++ b/energy_management_ui/src/components/Pagination/index.vue
@@ -0,0 +1,101 @@
+<template>
+  <div :class="{'hidden':hidden}" class="pagination-container">
+    <el-pagination
+      :background="background"
+      :current-page.sync="currentPage"
+      :page-size.sync="pageSize"
+      :layout="layout"
+      :page-sizes="pageSizes"
+      :total="total"
+      v-bind="$attrs"
+      @size-change="handleSizeChange"
+      @current-change="handleCurrentChange"
+    />
+  </div>
+</template>
+
+<script>
+import { scrollTo } from '@/utils/scroll-to'
+
+export default {
+  name: 'Pagination',
+  props: {
+    total: {
+      required: true,
+      type: Number
+    },
+    page: {
+      type: Number,
+      default: 1
+    },
+    limit: {
+      type: Number,
+      default: 20
+    },
+    pageSizes: {
+      type: Array,
+      default() {
+        return [10, 20, 30, 50]
+      }
+    },
+    layout: {
+      type: String,
+      default: 'total, sizes, prev, pager, next, jumper'
+    },
+    background: {
+      type: Boolean,
+      default: true
+    },
+    autoScroll: {
+      type: Boolean,
+      default: true
+    },
+    hidden: {
+      type: Boolean,
+      default: false
+    }
+  },
+  computed: {
+    currentPage: {
+      get() {
+        return this.page
+      },
+      set(val) {
+        this.$emit('update:page', val)
+      }
+    },
+    pageSize: {
+      get() {
+        return this.limit
+      },
+      set(val) {
+        this.$emit('update:limit', val)
+      }
+    }
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.$emit('pagination', { page: this.currentPage, limit: val })
+      if (this.autoScroll) {
+        scrollTo(0, 800)
+      }
+    },
+    handleCurrentChange(val) {
+      this.$emit('pagination', { page: val, limit: this.pageSize })
+      if (this.autoScroll) {
+        scrollTo(0, 800)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.pagination-container {
+  background: #fff;
+  padding: 32px 16px;
+}
+.pagination-container.hidden {
+  display: none;
+}
+</style>
diff --git a/energy_management_ui/src/components/PanThumb/index.vue b/energy_management_ui/src/components/PanThumb/index.vue
new file mode 100644
index 0000000..1bcf417
--- /dev/null
+++ b/energy_management_ui/src/components/PanThumb/index.vue
@@ -0,0 +1,142 @@
+<template>
+  <div :style="{zIndex:zIndex,height:height,width:width}" class="pan-item">
+    <div class="pan-info">
+      <div class="pan-info-roles-container">
+        <slot />
+      </div>
+    </div>
+    <!-- eslint-disable-next-line -->
+    <div :style="{backgroundImage: `url(${image})`}" class="pan-thumb"></div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'PanThumb',
+  props: {
+    image: {
+      type: String,
+      required: true
+    },
+    zIndex: {
+      type: Number,
+      default: 1
+    },
+    width: {
+      type: String,
+      default: '150px'
+    },
+    height: {
+      type: String,
+      default: '150px'
+    }
+  }
+}
+</script>
+
+<style scoped>
+.pan-item {
+  width: 200px;
+  height: 200px;
+  border-radius: 50%;
+  display: inline-block;
+  position: relative;
+  cursor: default;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
+}
+
+.pan-info-roles-container {
+  padding: 20px;
+  text-align: center;
+}
+
+.pan-thumb {
+  width: 100%;
+  height: 100%;
+  background-position: center center;
+  background-size: cover;
+  border-radius: 50%;
+  overflow: hidden;
+  position: absolute;
+  transform-origin: 95% 40%;
+  transition: all 0.3s ease-in-out;
+}
+
+/* .pan-thumb:after {
+  content: '';
+  width: 8px;
+  height: 8px;
+  position: absolute;
+  border-radius: 50%;
+  top: 40%;
+  left: 95%;
+  margin: -4px 0 0 -4px;
+  background: radial-gradient(ellipse at center, rgba(14, 14, 14, 1) 0%, rgba(125, 126, 125, 1) 100%);
+  box-shadow: 0 0 1px rgba(255, 255, 255, 0.9);
+} */
+
+.pan-info {
+  position: absolute;
+  width: inherit;
+  height: inherit;
+  border-radius: 50%;
+  overflow: hidden;
+  box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.05);
+}
+
+.pan-info h3 {
+  color: #fff;
+  text-transform: uppercase;
+  position: relative;
+  letter-spacing: 2px;
+  font-size: 18px;
+  margin: 0 60px;
+  padding: 22px 0 0 0;
+  height: 85px;
+  font-family: 'Open Sans', Arial, sans-serif;
+  text-shadow: 0 0 1px #fff, 0 1px 2px rgba(0, 0, 0, 0.3);
+}
+
+.pan-info p {
+  color: #fff;
+  padding: 10px 5px;
+  font-style: italic;
+  margin: 0 30px;
+  font-size: 12px;
+  border-top: 1px solid rgba(255, 255, 255, 0.5);
+}
+
+.pan-info p a {
+  display: block;
+  color: #333;
+  width: 80px;
+  height: 80px;
+  background: rgba(255, 255, 255, 0.3);
+  border-radius: 50%;
+  color: #fff;
+  font-style: normal;
+  font-weight: 700;
+  text-transform: uppercase;
+  font-size: 9px;
+  letter-spacing: 1px;
+  padding-top: 24px;
+  margin: 7px auto 0;
+  font-family: 'Open Sans', Arial, sans-serif;
+  opacity: 0;
+  transition: transform 0.3s ease-in-out 0.2s, opacity 0.3s ease-in-out 0.2s, background 0.2s linear 0s;
+  transform: translateX(60px) rotate(90deg);
+}
+
+.pan-info p a:hover {
+  background: rgba(255, 255, 255, 0.5);
+}
+
+.pan-item:hover .pan-thumb {
+  transform: rotate(-110deg);
+}
+
+.pan-item:hover .pan-info p a {
+  opacity: 1;
+  transform: translateX(0px) rotate(0deg);
+}
+</style>
diff --git a/energy_management_ui/src/components/RightPanel/index.vue b/energy_management_ui/src/components/RightPanel/index.vue
new file mode 100644
index 0000000..fbf27eb
--- /dev/null
+++ b/energy_management_ui/src/components/RightPanel/index.vue
@@ -0,0 +1,149 @@
+<template>
+  <div ref="rightPanel" :class="{show:show}" class="rightPanel-container">
+    <div class="rightPanel-background" />
+    <div class="rightPanel">
+      <div class="rightPanel-items">
+        <slot />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { addClass, removeClass } from '@/utils'
+
+export default {
+  name: 'RightPanel',
+  props: {
+    clickNotClose: {
+      default: false,
+      type: Boolean
+    },
+    buttonTop: {
+      default: 250,
+      type: Number
+    }
+  },
+  computed: {
+    show: {
+      get() {
+        return this.$store.state.settings.showSettings
+      },
+      set(val) {
+        this.$store.dispatch('settings/changeSetting', {
+          key: 'showSettings',
+          value: val
+        })
+      }
+    },
+    theme() {
+      return this.$store.state.settings.theme
+    },
+  },
+  watch: {
+    show(value) {
+      if (value && !this.clickNotClose) {
+        this.addEventClick()
+      }
+      if (value) {
+        addClass(document.body, 'showRightPanel')
+      } else {
+        removeClass(document.body, 'showRightPanel')
+      }
+    }
+  },
+  mounted() {
+    this.insertToBody()
+    this.addEventClick()
+  },
+  beforeDestroy() {
+    const elx = this.$refs.rightPanel
+    elx.remove()
+  },
+  methods: {
+    addEventClick() {
+      window.addEventListener('click', this.closeSidebar)
+    },
+    closeSidebar(evt) {
+      const parent = evt.target.closest('.rightPanel')
+      if (!parent) {
+        this.show = false
+        window.removeEventListener('click', this.closeSidebar)
+      }
+    },
+    insertToBody() {
+      const elx = this.$refs.rightPanel
+      const body = document.querySelector('body')
+      body.insertBefore(elx, body.firstChild)
+    }
+  }
+}
+</script>
+
+<style>
+.showRightPanel {
+  overflow: hidden;
+  position: relative;
+  width: calc(100% - 15px);
+}
+</style>
+
+<style lang="scss" scoped>
+.rightPanel-background {
+  position: fixed;
+  top: 0;
+  left: 0;
+  opacity: 0;
+  transition: opacity .3s cubic-bezier(.7, .3, .1, 1);
+  background: rgba(0, 0, 0, .2);
+  z-index: -1;
+}
+
+.rightPanel {
+  width: 100%;
+  max-width: 260px;
+  height: 100vh;
+  position: fixed;
+  top: 0;
+  right: 0;
+  box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05);
+  transition: all .25s cubic-bezier(.7, .3, .1, 1);
+  transform: translate(100%);
+  background: #fff;
+  z-index: 40000;
+}
+
+.show {
+  transition: all .3s cubic-bezier(.7, .3, .1, 1);
+
+  .rightPanel-background {
+    z-index: 20000;
+    opacity: 1;
+    width: 100%;
+    height: 100%;
+  }
+
+  .rightPanel {
+    transform: translate(0);
+  }
+}
+
+.handle-button {
+  width: 48px;
+  height: 48px;
+  position: absolute;
+  left: -48px;
+  text-align: center;
+  font-size: 24px;
+  border-radius: 6px 0 0 6px !important;
+  z-index: 0;
+  pointer-events: auto;
+  cursor: pointer;
+  color: #fff;
+  line-height: 48px;
+  i {
+    font-size: 24px;
+    line-height: 48px;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/components/RuoYi/index.vue b/energy_management_ui/src/components/RuoYi/index.vue
new file mode 100644
index 0000000..3f541d1
--- /dev/null
+++ b/energy_management_ui/src/components/RuoYi/index.vue
@@ -0,0 +1,21 @@
+<template>
+  <div>
+    <svg-icon icon-class="download" @click="handleDownload"/>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'RuoYi',
+  data() {
+    return {
+      url: 'https://gitee.com/y_project/RuoYi-Vue'
+    }
+  },
+  methods: {
+    handleDownload() {
+      window.open(this.url)
+    }
+  }
+}
+</script>
\ No newline at end of file
diff --git a/energy_management_ui/src/components/Screenfull/index.vue b/energy_management_ui/src/components/Screenfull/index.vue
new file mode 100644
index 0000000..260c90d
--- /dev/null
+++ b/energy_management_ui/src/components/Screenfull/index.vue
@@ -0,0 +1,60 @@
+<template>
+  <div>
+    <svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" @click="click" />
+  </div>
+</template>
+
+<script>
+import screenfull from 'screenfull'
+
+export default {
+  name: 'Screenfull',
+  data() {
+    return {
+      isFullscreen: false
+    }
+  },
+  mounted() {
+    this.init()
+  },
+  beforeDestroy() {
+    this.destroy()
+  },
+  methods: {
+    click() {
+      if (!screenfull.enabled) {
+        this.$message({
+          message: 'you browser can not work',
+          type: 'warning'
+        })
+        return false
+      }
+      screenfull.toggle()
+    },
+    change() {
+      this.isFullscreen = screenfull.isFullscreen
+    },
+    init() {
+      if (screenfull.enabled) {
+        screenfull.on('change', this.change)
+      }
+    },
+    destroy() {
+      if (screenfull.enabled) {
+        screenfull.off('change', this.change)
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.screenfull-svg {
+  display: inline-block;
+  cursor: pointer;
+  fill: #5a5e66;;
+  width: 20px;
+  height: 20px;
+  vertical-align: 10px;
+}
+</style>
diff --git a/energy_management_ui/src/components/SizeSelect/index.vue b/energy_management_ui/src/components/SizeSelect/index.vue
new file mode 100644
index 0000000..e88065b
--- /dev/null
+++ b/energy_management_ui/src/components/SizeSelect/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <el-dropdown trigger="click" @command="handleSetSize">
+    <div>
+      <svg-icon class-name="size-icon" icon-class="size" />
+    </div>
+    <el-dropdown-menu slot="dropdown">
+      <el-dropdown-item v-for="item of sizeOptions" :key="item.value" :disabled="size===item.value" :command="item.value">
+        {{
+          item.label }}
+      </el-dropdown-item>
+    </el-dropdown-menu>
+  </el-dropdown>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      sizeOptions: [
+        { label: 'Default', value: 'default' },
+        { label: 'Medium', value: 'medium' },
+        { label: 'Small', value: 'small' },
+        { label: 'Mini', value: 'mini' }
+      ]
+    }
+  },
+  computed: {
+    size() {
+      return this.$store.getters.size
+    }
+  },
+  methods: {
+    handleSetSize(size) {
+      this.$ELEMENT.size = size
+      this.$store.dispatch('app/setSize', size)
+      this.refreshView()
+      this.$message({
+        message: 'Switch Size Success',
+        type: 'success'
+      })
+    },
+    refreshView() {
+      // In order to make the cached page re-rendered
+      this.$store.dispatch('tagsView/delAllCachedViews', this.$route)
+
+      const { fullPath } = this.$route
+
+      this.$nextTick(() => {
+        this.$router.replace({
+          path: '/redirect' + fullPath
+        })
+      })
+    }
+  }
+
+}
+</script>
diff --git a/energy_management_ui/src/components/SvgIcon/index.vue b/energy_management_ui/src/components/SvgIcon/index.vue
new file mode 100644
index 0000000..e4bf5ad
--- /dev/null
+++ b/energy_management_ui/src/components/SvgIcon/index.vue
@@ -0,0 +1,61 @@
+<template>
+  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
+  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
+    <use :xlink:href="iconName" />
+  </svg>
+</template>
+
+<script>
+import { isExternal } from '@/utils/validate'
+
+export default {
+  name: 'SvgIcon',
+  props: {
+    iconClass: {
+      type: String,
+      required: true
+    },
+    className: {
+      type: String,
+      default: ''
+    }
+  },
+  computed: {
+    isExternal() {
+      return isExternal(this.iconClass)
+    },
+    iconName() {
+      return `#icon-${this.iconClass}`
+    },
+    svgClass() {
+      if (this.className) {
+        return 'svg-icon ' + this.className
+      } else {
+        return 'svg-icon'
+      }
+    },
+    styleExternalIcon() {
+      return {
+        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
+        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+
+.svg-external-icon {
+  background-color: currentColor;
+  mask-size: cover!important;
+  display: inline-block;
+}
+</style>
diff --git a/energy_management_ui/src/components/ThemePicker/index.vue b/energy_management_ui/src/components/ThemePicker/index.vue
new file mode 100644
index 0000000..a984004
--- /dev/null
+++ b/energy_management_ui/src/components/ThemePicker/index.vue
@@ -0,0 +1,198 @@
+<template>
+  <el-color-picker
+    v-model="theme"
+    :predefine="[
+      '#409EFF',
+      '#38BCBF',
+      '#304156',
+      '#212121',
+      '#11a983',
+      '#13c2c2',
+      '#6959CD',
+      '#f5222d'
+    ]"
+    class="theme-picker"
+    popper-class="theme-picker-dropdown"
+  />
+</template>
+
+<script>
+const version = require("element-ui/package.json").version; // element-ui version from node_modules
+const ORIGINAL_THEME = "#409EFF"; // default color
+
+export default {
+  data() {
+    return {
+      chalk: "", // content of theme-chalk css
+      theme: ""
+    };
+  },
+  computed: {
+    defaultTheme() {
+      return this.$store.state.settings.theme;
+    }
+  },
+  watch: {
+    defaultTheme: {
+      handler: function(val, oldVal) {
+        this.theme = val;
+      },
+      immediate: true
+    },
+    async theme(val) {
+      const oldVal = this.chalk ? this.theme : ORIGINAL_THEME;
+      if (typeof val !== "string") return;
+      const themeCluster = this.getThemeCluster(val.replace("#", ""));
+      const originalCluster = this.getThemeCluster(oldVal.replace("#", ""));
+      console.log(themeCluster, originalCluster);
+
+      const $message = this.$message({
+        message: "  Compiling the theme",
+        customClass: "theme-message",
+        type: "success",
+        duration: 0,
+        iconClass: "el-icon-loading"
+      });
+
+      const getHandler = (variable, id) => {
+        return () => {
+          const originalCluster = this.getThemeCluster(
+            ORIGINAL_THEME.replace("#", "")
+          );
+          const newStyle = this.updateStyle(
+            this[variable],
+            originalCluster,
+            themeCluster
+          );
+
+          let styleTag = document.getElementById(id);
+          if (!styleTag) {
+            styleTag = document.createElement("style");
+            styleTag.setAttribute("id", id);
+            document.head.appendChild(styleTag);
+          }
+          styleTag.innerText = newStyle;
+        };
+      };
+
+      if (!this.chalk) {
+        const url = `https://unpkg.com/element-ui@${version}/lib/theme-chalk/index.css`;
+        await this.getCSSString(url, "chalk");
+      }
+
+      const chalkHandler = getHandler("chalk", "chalk-style");
+
+      chalkHandler();
+
+      const styles = [].slice
+        .call(document.querySelectorAll("style"))
+        .filter(style => {
+          const text = style.innerText;
+          return (
+            new RegExp(oldVal, "i").test(text) && !/Chalk Variables/.test(text)
+          );
+        });
+      styles.forEach(style => {
+        const { innerText } = style;
+        if (typeof innerText !== "string") return;
+        style.innerText = this.updateStyle(
+          innerText,
+          originalCluster,
+          themeCluster
+        );
+      });
+
+      this.$emit("change", val);
+
+      $message.close();
+    }
+  },
+
+  methods: {
+    updateStyle(style, oldCluster, newCluster) {
+      let newStyle = style;
+      oldCluster.forEach((color, index) => {
+        newStyle = newStyle.replace(new RegExp(color, "ig"), newCluster[index]);
+      });
+      return newStyle;
+    },
+
+    getCSSString(url, variable) {
+      return new Promise(resolve => {
+        const xhr = new XMLHttpRequest();
+        xhr.onreadystatechange = () => {
+          if (xhr.readyState === 4 && xhr.status === 200) {
+            this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, "");
+            resolve();
+          }
+        };
+        xhr.open("GET", url);
+        xhr.send();
+      });
+    },
+
+    getThemeCluster(theme) {
+      const tintColor = (color, tint) => {
+        let red = parseInt(color.slice(0, 2), 16);
+        let green = parseInt(color.slice(2, 4), 16);
+        let blue = parseInt(color.slice(4, 6), 16);
+
+        if (tint === 0) {
+          // when primary color is in its rgb space
+          return [red, green, blue].join(",");
+        } else {
+          red += Math.round(tint * (255 - red));
+          green += Math.round(tint * (255 - green));
+          blue += Math.round(tint * (255 - blue));
+
+          red = red.toString(16);
+          green = green.toString(16);
+          blue = blue.toString(16);
+
+          return `#${red}${green}${blue}`;
+        }
+      };
+
+      const shadeColor = (color, shade) => {
+        let red = parseInt(color.slice(0, 2), 16);
+        let green = parseInt(color.slice(2, 4), 16);
+        let blue = parseInt(color.slice(4, 6), 16);
+
+        red = Math.round((1 - shade) * red);
+        green = Math.round((1 - shade) * green);
+        blue = Math.round((1 - shade) * blue);
+
+        red = red.toString(16);
+        green = green.toString(16);
+        blue = blue.toString(16);
+
+        return `#${red}${green}${blue}`;
+      };
+
+      const clusters = [theme];
+      for (let i = 0; i <= 9; i++) {
+        clusters.push(tintColor(theme, Number((i / 10).toFixed(2))));
+      }
+      clusters.push(shadeColor(theme, 0.1));
+      return clusters;
+    }
+  }
+};
+</script>
+
+<style>
+.theme-message,
+.theme-picker-dropdown {
+  z-index: 99999 !important;
+}
+
+.theme-picker .el-color-picker__trigger {
+  height: 26px !important;
+  width: 26px !important;
+  padding: 2px;
+}
+
+.theme-picker-dropdown .el-color-dropdown__link-btn {
+  display: none;
+}
+</style>
diff --git a/energy_management_ui/src/components/common/basic-container.vue b/energy_management_ui/src/components/common/basic-container.vue
new file mode 100644
index 0000000..2382728
--- /dev/null
+++ b/energy_management_ui/src/components/common/basic-container.vue
@@ -0,0 +1,98 @@
+<template>
+  <div
+    class="basic-container"
+    :style="styleName"
+    :class="{ 'basic-container--block': block }"
+  >
+    <el-card class="basic-container__card" :body-style="bodyStyle">
+      <template #header v-if="!!title">
+        <div class="card-header">
+          <span>{{ title }}</span>
+        </div>
+      </template>
+      <slot></slot>
+    </el-card>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "basicContainer",
+  props: {
+    radius: {
+      type: [String, Number],
+      default: 10
+    },
+    background: {
+      type: String
+    },
+    block: {
+      type: Boolean,
+      default: false
+    },
+    title: {
+      type: String,
+      default: ""
+    },
+    bodyStyle: {
+      type: Object
+    }
+  },
+  computed: {
+    styleName() {
+      return {
+        background: this.background
+      };
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.basic-container {
+  height: 100%;
+  box-sizing: border-box;
+  margin-bottom: 5px;
+
+  .card-header {
+    font-size: 18px;
+    font-weight: 500;
+    height: 34px;
+    color: #272727;
+    position: relative;
+    padding-left: 10px;
+
+    &::after {
+      content: "";
+      position: absolute;
+      display: block;
+      width: 4px;
+      height: 17px;
+      background-color: #38bcbf;
+      border-radius: 3px;
+      top: 2px;
+      left: 0;
+    }
+  }
+
+  &--block {
+    height: 100%;
+
+    .basic-container__card {
+      height: 100%;
+    }
+  }
+
+  &__card {
+    width: 100%;
+  }
+
+  &:first-child {
+    padding-top: 0;
+  }
+}
+
+.basic-container:first-child {
+  margin-top: 5px;
+}
+</style>
diff --git a/energy_management_ui/src/components/shrink/index.vue b/energy_management_ui/src/components/shrink/index.vue
new file mode 100644
index 0000000..5bec340
--- /dev/null
+++ b/energy_management_ui/src/components/shrink/index.vue
@@ -0,0 +1,39 @@
+<template>
+  <el-col class="shrink-col">
+    <div class="click-img">
+      <img src="~@/assets/image/rectangle.png" alt=""
+           style="transform:rotate(180deg)"
+           @click="toggleCollapse">
+    </div>
+  </el-col>
+</template>
+
+<script>
+export default {
+  methods: {
+    toggleCollapse() {
+      this.$emit('toggleCollapse')
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.shrink-col {
+  width: 48px;
+  background: white;
+  margin: 5px 20px 5px 0;
+  box-sizing: border-box;
+  box-shadow: 0 2px 12px 0 #0000001a;
+  padding-top: 22px;
+  border-radius: 4px;
+
+  .click-img {
+    text-align: center;
+
+    img {
+      cursor: pointer;
+    }
+  }
+}
+</style>
diff --git a/energy_management_ui/src/directive/permission/hasPermi.js b/energy_management_ui/src/directive/permission/hasPermi.js
new file mode 100644
index 0000000..d7107ce
--- /dev/null
+++ b/energy_management_ui/src/directive/permission/hasPermi.js
@@ -0,0 +1,28 @@
+ /**
+ * 鎿嶄綔鏉冮檺澶勭悊
+ * Copyright (c) 2019 ruoyi
+ */
+ 
+import store from '@/store'
+
+export default {
+  inserted(el, binding, vnode) {
+    const { value } = binding
+    const all_permission = "*:*:*";
+    const permissions = store.getters && store.getters.permissions
+
+    if (value && value instanceof Array && value.length > 0) {
+      const permissionFlag = value
+
+      const hasPermissions = permissions.some(permission => {
+        return all_permission === permission || permissionFlag.includes(permission)
+      })
+
+      if (!hasPermissions) {
+        el.parentNode && el.parentNode.removeChild(el)
+      }
+    } else {
+      throw new Error(`璇疯缃搷浣滄潈闄愭爣绛惧�糮)
+    }
+  }
+}
diff --git a/energy_management_ui/src/directive/permission/hasRole.js b/energy_management_ui/src/directive/permission/hasRole.js
new file mode 100644
index 0000000..1303809
--- /dev/null
+++ b/energy_management_ui/src/directive/permission/hasRole.js
@@ -0,0 +1,28 @@
+ /**
+ * 瑙掕壊鏉冮檺澶勭悊
+ * Copyright (c) 2019 ruoyi
+ */
+ 
+import store from '@/store'
+
+export default {
+  inserted(el, binding, vnode) {
+    const { value } = binding
+    const super_admin = "admin";
+    const roles = store.getters && store.getters.roles
+
+    if (value && value instanceof Array && value.length > 0) {
+      const roleFlag = value
+
+      const hasRole = roles.some(role => {
+        return super_admin === role || roleFlag.includes(role)
+      })
+
+      if (!hasRole) {
+        el.parentNode && el.parentNode.removeChild(el)
+      }
+    } else {
+      throw new Error(`璇疯缃鑹叉潈闄愭爣绛惧��"`)
+    }
+  }
+}
diff --git a/energy_management_ui/src/directive/permission/index.js b/energy_management_ui/src/directive/permission/index.js
new file mode 100644
index 0000000..e3d76d3
--- /dev/null
+++ b/energy_management_ui/src/directive/permission/index.js
@@ -0,0 +1,15 @@
+import hasRole from './hasRole'
+import hasPermi from './hasPermi'
+
+const install = function(Vue) {
+  Vue.directive('hasRole', hasRole)
+  Vue.directive('hasPermi', hasPermi)
+}
+
+if (window.Vue) {
+  window['hasRole'] = hasRole
+  window['hasPermi'] = hasPermi
+  Vue.use(install); // eslint-disable-line
+}
+
+export default install
diff --git a/energy_management_ui/src/layout/RouteView.vue b/energy_management_ui/src/layout/RouteView.vue
new file mode 100644
index 0000000..98240ae
--- /dev/null
+++ b/energy_management_ui/src/layout/RouteView.vue
@@ -0,0 +1,3 @@
+<template>
+  <router-view />
+</template>
diff --git a/energy_management_ui/src/layout/components/AppMain.vue b/energy_management_ui/src/layout/components/AppMain.vue
new file mode 100644
index 0000000..5762924
--- /dev/null
+++ b/energy_management_ui/src/layout/components/AppMain.vue
@@ -0,0 +1,58 @@
+<template>
+  <section class="app-main">
+    <transition name="fade-transform" mode="out-in">
+      <keep-alive :include="cachedViews">
+        <router-view :key="key" />
+      </keep-alive>
+    </transition>
+  </section>
+</template>
+
+<script>
+export default {
+  name: 'AppMain',
+  computed: {
+    cachedViews() {
+      return this.$store.state.tagsView.cachedViews
+    },
+    key() {
+      return this.$route.path
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-main {
+  /* 50= navbar  50  */
+  min-height: calc(100vh - 160px);
+  width: 100%;
+  position: relative;
+  overflow: hidden;
+  padding: 12px 20px;
+}
+
+.fixed-header+.app-main {
+  padding-top: 50px;
+}
+
+.hasTagsView {
+  .app-main {
+    /* 84 = navbar + tags-view = 50 + 34 */
+    min-height: calc(100vh - 84px);
+  }
+
+  .fixed-header+.app-main {
+    padding-top: 84px;
+  }
+}
+</style>
+
+<style lang="scss">
+// fix css style bug in open el-dialog
+.el-popup-parent--hidden {
+  .fixed-header {
+    padding-right: 15px;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/layout/components/Navbar.vue b/energy_management_ui/src/layout/components/Navbar.vue
new file mode 100644
index 0000000..e46e783
--- /dev/null
+++ b/energy_management_ui/src/layout/components/Navbar.vue
@@ -0,0 +1,186 @@
+<template>
+  <div class="navbar">
+    <hamburger
+      id="hamburger-container"
+      :is-active="sidebar.opened"
+      class="hamburger-container"
+      @toggleClick="toggleSideBar"
+    />
+    <div class="right-menu">
+      <el-dropdown
+        class="avatar-container right-menu-item hover-effect"
+        trigger="click"
+      >
+        <div class="avatar-wrapper">
+          <img src="@/assets/image/touxiang.png" class="user-avatar" />
+          <span style="color: white;font-size: 16px;margin: 0 0 0 12px">{{
+            name || "- -"
+          }}</span>
+          <img
+            src="@/assets/image/navbar/xiala.png"
+            style="width: 10px;margin: 3px 0 0 5px"
+          />
+        </div>
+        <el-dropdown-menu slot="dropdown">
+          <router-link to="/user/profile">
+            <el-dropdown-item>涓汉涓績</el-dropdown-item>
+          </router-link>
+        </el-dropdown-menu>
+      </el-dropdown>
+      <img
+        src="@/assets/image/navbar/exit.png"
+        class="exit-img"
+        @click="logout"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+import Breadcrumb from "@/components/Breadcrumb";
+import Hamburger from "@/components/Hamburger";
+import Screenfull from "@/components/Screenfull";
+import SizeSelect from "@/components/SizeSelect";
+import Search from "@/components/HeaderSearch";
+import RuoYi from "@/components/RuoYi";
+
+export default {
+  components: {
+    Breadcrumb,
+    Hamburger,
+    Screenfull,
+    SizeSelect,
+    Search,
+    RuoYi
+  },
+  computed: {
+    ...mapGetters(["sidebar", "device"]),
+    setting: {
+      get() {
+        return this.$store.state.settings.showSettings;
+      },
+      set(val) {
+        this.$store.dispatch("settings/changeSetting", {
+          key: "showSettings",
+          value: val
+        });
+      }
+    },
+    name() {
+      return this.$store.state.user.name;
+    }
+  },
+  methods: {
+    toggleSideBar() {
+      this.$store.dispatch("app/toggleSideBar");
+    },
+    async logout() {
+      this.$confirm("纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(() => {
+        this.$store.dispatch("LogOut").then(() => {
+          location.reload();
+        });
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.navbar {
+  height: 64px;
+  overflow: hidden;
+  position: relative;
+  background: #16a5b6;
+  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+
+  .hamburger-container {
+    line-height: 64px;
+    height: 100%;
+    float: left;
+    cursor: pointer;
+    transition: background 0.3s;
+    -webkit-tap-highlight-color: transparent;
+
+    &:hover {
+      background: rgba(0, 0, 0, 0.025);
+    }
+  }
+
+  .breadcrumb-container {
+    float: left;
+  }
+
+  .errLog-container {
+    display: inline-block;
+    vertical-align: top;
+  }
+
+  .right-menu {
+    float: right;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    &:focus {
+      outline: none;
+    }
+
+    .exit-img {
+      margin-right: 30px;
+      cursor: pointer;
+      &:hover {
+        background: rgba(0, 0, 0, 0.025);
+      }
+    }
+
+    .right-menu-item {
+      display: inline-block;
+      padding: 0 8px;
+      height: 100%;
+      font-size: 18px;
+      color: #5a5e66;
+      display: flex;
+      justify-content: center;
+
+      &.hover-effect {
+        cursor: pointer;
+        transition: background 0.3s;
+
+        &:hover {
+          background: rgba(0, 0, 0, 0.025);
+        }
+      }
+    }
+
+    .avatar-container {
+      margin-right: 30px;
+
+      .avatar-wrapper {
+        // margin-top: 5px;
+        position: relative;
+        display: flex;
+        align-items: center;
+
+        .user-avatar {
+          cursor: pointer;
+          width: 35px;
+          border-radius: 10px;
+        }
+
+        .el-icon-caret-bottom {
+          cursor: pointer;
+          position: absolute;
+          right: -20px;
+          color: white;
+          top: 25px;
+          font-size: 12px;
+        }
+      }
+    }
+  }
+}
+</style>
diff --git a/energy_management_ui/src/layout/components/Sidebar/FixiOSBug.js b/energy_management_ui/src/layout/components/Sidebar/FixiOSBug.js
new file mode 100644
index 0000000..6823726
--- /dev/null
+++ b/energy_management_ui/src/layout/components/Sidebar/FixiOSBug.js
@@ -0,0 +1,25 @@
+export default {
+  computed: {
+    device() {
+      return this.$store.state.app.device
+    }
+  },
+  mounted() {
+    // In order to fix the click on menu on the ios device will trigger the mouseleave bug
+    this.fixBugIniOS()
+  },
+  methods: {
+    fixBugIniOS() {
+      const $subMenu = this.$refs.subMenu
+      if ($subMenu) {
+        const handleMouseleave = $subMenu.handleMouseleave
+        $subMenu.handleMouseleave = (e) => {
+          if (this.device === 'mobile') {
+            return
+          }
+          handleMouseleave(e)
+        }
+      }
+    }
+  }
+}
diff --git a/energy_management_ui/src/layout/components/Sidebar/Item.vue b/energy_management_ui/src/layout/components/Sidebar/Item.vue
new file mode 100644
index 0000000..b515f61
--- /dev/null
+++ b/energy_management_ui/src/layout/components/Sidebar/Item.vue
@@ -0,0 +1,29 @@
+<script>
+export default {
+  name: 'MenuItem',
+  functional: true,
+  props: {
+    icon: {
+      type: String,
+      default: ''
+    },
+    title: {
+      type: String,
+      default: ''
+    }
+  },
+  render(h, context) {
+    const { icon, title } = context.props
+    const vnodes = []
+
+    if (icon) {
+      vnodes.push(<svg-icon icon-class={icon}/>)
+    }
+
+    if (title) {
+      vnodes.push(<span slot='title'>{(title)}</span>)
+    }
+    return vnodes
+  }
+}
+</script>
diff --git a/energy_management_ui/src/layout/components/Sidebar/Link.vue b/energy_management_ui/src/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000..c88adc1
--- /dev/null
+++ b/energy_management_ui/src/layout/components/Sidebar/Link.vue
@@ -0,0 +1,47 @@
+
+<template>
+  <!-- eslint-disable vue/require-component-is -->
+  <component v-bind="linkProps(to,menuNode)">
+    <slot />
+  </component>
+</template>
+
+<script>
+import { isExternal } from '@/utils/validate'
+
+export default {
+  props: {
+    to: {
+      type: String,
+      required: true
+    },
+    menuNode:{}
+  },
+  methods: {
+    linkProps(url,menuNode) {
+      if (isExternal(url)) {
+        return {
+          is: 'a',
+          href: url,
+          target: '_blank',
+          rel: 'noopener'
+        }
+      }
+      if(menuNode.pageQueryParameter==null || menuNode.pageQueryParameter==undefined ||menuNode.pageQueryParameter=="")
+      {
+        return {
+          is: 'router-link',
+          to: url
+        }
+      }else {
+        let queryParaObj = JSON.parse(menuNode.pageQueryParameter);
+        return {
+          is: 'router-link',
+          // to: {name:menuNode.name, params:queryParaObj}
+          to: {path:url, query:queryParaObj}
+        }
+      }
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/layout/components/Sidebar/Logo.vue b/energy_management_ui/src/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000..9950cd1
--- /dev/null
+++ b/energy_management_ui/src/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,98 @@
+<template>
+  <div class="sidebar-logo-container" :class="{ collapse: collapse }">
+    <transition name="sidebarLogoFade">
+      <router-link
+        v-if="collapse"
+        key="expand"
+        class="sidebar-logo-link"
+        to="/"
+      >
+        <div class="collapse-logo">
+          <img v-if="logoImg2" :src="logoImg2" style="width: 44px" />
+        </div>
+      </router-link>
+      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
+        <img v-if="logo" :src="logo" class="sidebar-logo" />
+      </router-link>
+    </transition>
+  </div>
+</template>
+
+<script>
+// import logoImg2 from "@/assets/logo/toray_group_icon.png";
+
+export default {
+  name: "SidebarLogo",
+  props: {
+    collapse: {
+      type: Boolean,
+      required: true
+    }
+  },
+  data() {
+    return {
+      title: "涓滀附鍖荤枟鑳芥簮绠$悊绯荤粺",
+      logo: "https://www.toray.cn/shared/images/toray_logo_ch.svg",
+      logoImg2: "https://www.toray.cn/shared/images/toray_logo_ch.svg"
+    };
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.sidebarLogoFade-enter-active {
+  transition: opacity 1.5s;
+}
+
+.sidebarLogoFade-enter,
+.sidebarLogoFade-leave-to {
+  opacity: 0;
+}
+
+.sidebar-logo-container {
+  position: relative;
+  width: 100%;
+  height: 64px;
+  line-height: 64px;
+  background: #16a5b6;
+  text-align: center;
+  overflow: hidden;
+
+  & .sidebar-logo-link {
+    height: 100%;
+    width: 100%;
+
+    .collapse-logo {
+      display: flex;
+      align-items: center;
+      height: 100%;
+      text-align: center;
+      width: 100%;
+      justify-content: center;
+    }
+
+    & .sidebar-logo {
+      width: 190px;
+      vertical-align: middle;
+      margin-right: 12px;
+    }
+
+    & .sidebar-title {
+      display: inline-block;
+      margin: 0;
+      color: #fff;
+      font-weight: 600;
+      line-height: 50px;
+      font-size: 14px;
+      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
+      vertical-align: middle;
+    }
+  }
+
+  &.collapse {
+    .sidebar-logo {
+      margin-right: 0px;
+    }
+  }
+}
+</style>
diff --git a/energy_management_ui/src/layout/components/Sidebar/SidebarItem.vue b/energy_management_ui/src/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000..8c71254
--- /dev/null
+++ b/energy_management_ui/src/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,128 @@
+<template>
+  <div v-if="!item.hidden" class="menu-wrapper">
+    <template
+      v-if="
+        hasOneShowingChild(item.children, item) &&
+          (!onlyOneChild.children || onlyOneChild.noShowingChildren) &&
+          !item.alwaysShow
+      "
+    >
+      <app-link
+        v-if="onlyOneChild.meta"
+        :to="resolvePath(onlyOneChild.path)"
+        :menuNode="resolveParam(onlyOneChild)"
+      >
+        <el-menu-item
+          :index="resolvePath(onlyOneChild.path)"
+          :class="{ 'submenu-title-noDropdown': !isNest }"
+        >
+          <item
+            :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"
+            :title="onlyOneChild.meta.title"
+          />
+        </el-menu-item>
+      </app-link>
+    </template>
+
+    <el-submenu
+      v-else
+      ref="subMenu"
+      :index="resolvePath(item.path)"
+      popper-append-to-body
+    >
+      <template slot="title">
+        <item
+          v-if="item.meta"
+          :icon="item.meta && item.meta.icon"
+          :title="item.meta.title"
+        />
+      </template>
+      <sidebar-item
+        v-for="child in item.children"
+        :key="child.path"
+        :is-nest="true"
+        :item="child"
+        :base-path="resolvePath(child.path)"
+        class="nest-menu"
+      />
+    </el-submenu>
+  </div>
+</template>
+
+<script>
+import path from "path";
+import { isExternal } from "@/utils/validate";
+import Item from "./Item";
+import AppLink from "./Link";
+import FixiOSBug from "./FixiOSBug";
+
+export default {
+  name: "SidebarItem",
+  components: { Item, AppLink },
+  mixins: [FixiOSBug],
+  props: {
+    // route object
+    item: {
+      type: Object,
+      required: true
+    },
+    isNest: {
+      type: Boolean,
+      default: false
+    },
+    basePath: {
+      type: String,
+      default: ""
+    }
+  },
+  data() {
+    this.onlyOneChild = null;
+    return {};
+  },
+  methods: {
+    hasOneShowingChild(children = [], parent) {
+      const showingChildren = children.filter(item => {
+        if (item.hidden) {
+          return false;
+        } else {
+          // Temp set(will be used if only has one showing child)
+          this.onlyOneChild = item;
+          return true;
+        }
+      });
+
+      // When there is only one child router, the child router is displayed by default
+      if (showingChildren.length === 1) {
+        return true;
+      }
+
+      // Show parent if there are no child router to display
+      if (showingChildren.length === 0) {
+        this.onlyOneChild = { ...parent, path: "", noShowingChildren: true };
+        return true;
+      }
+
+      return false;
+    },
+    resolvePath(routePath) {
+      if (isExternal(routePath)) {
+        return routePath;
+      }
+      if (isExternal(this.basePath)) {
+        return this.basePath;
+      }
+      return path.resolve(this.basePath, routePath);
+    },
+    resolveParam(menuNode) {
+      // if(menuNode!=null && menuNode!=undefined && menuNode.pageQueryParameter!=undefined)
+      // {
+      //   return menuNode.pageQueryParameter
+      // }
+      // else {
+      //   return "";
+      // }
+      return menuNode;
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/layout/components/Sidebar/index.vue b/energy_management_ui/src/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000..1f56632
--- /dev/null
+++ b/energy_management_ui/src/layout/components/Sidebar/index.vue
@@ -0,0 +1,61 @@
+<template>
+  <div :class="{ 'has-logo': showLogo }">
+    <logo v-if="showLogo" :collapse="isCollapse" />
+    <el-scrollbar wrap-class="scrollbar-wrapper">
+      <el-menu
+        :default-active="activeMenu"
+        :collapse="isCollapse"
+        :text-color="variables.menuText"
+        :unique-opened="true"
+        :active-text-color="variables.menuActiveText"
+        :collapse-transition="false"
+        mode="vertical"
+      >
+        <sidebar-item
+          v-for="route in permission_routes"
+          :key="route.path"
+          :item="route"
+          :base-path="route.path"
+        />
+      </el-menu>
+    </el-scrollbar>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from "vuex";
+import Logo from "./Logo";
+import SidebarItem from "./SidebarItem";
+import variables from "@/assets/styles/variables.scss";
+
+export default {
+  components: { SidebarItem, Logo },
+  computed: {
+    ...mapGetters(["permission_routes", "sidebar"]),
+    activeMenu() {
+      const route = this.$route;
+      const { meta, path } = route;
+      // if set path, the sidebar will highlight the path you set
+      if (meta.activeMenu) {
+        return meta.activeMenu;
+      }
+      return path;
+    },
+    showLogo() {
+      return this.$store.state.settings.sidebarLogo;
+    },
+    variables() {
+      return variables;
+    },
+    isCollapse() {
+      return !this.sidebar.opened;
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-menu-item.is-active {
+  // background: rgba(246, 250, 255, 1) !important;
+  background: linear-gradient(90deg, #4fdac9 0%, #32b5cb 100%) !important;
+}
+</style>
diff --git a/energy_management_ui/src/layout/components/index.js b/energy_management_ui/src/layout/components/index.js
new file mode 100644
index 0000000..246b5e3
--- /dev/null
+++ b/energy_management_ui/src/layout/components/index.js
@@ -0,0 +1,3 @@
+export { default as AppMain } from './AppMain'
+export { default as Navbar } from './Navbar'
+export { default as Sidebar } from './Sidebar/index.vue'
diff --git a/energy_management_ui/src/layout/index.vue b/energy_management_ui/src/layout/index.vue
new file mode 100644
index 0000000..b9ad55e
--- /dev/null
+++ b/energy_management_ui/src/layout/index.vue
@@ -0,0 +1,103 @@
+<template>
+  <div :class="classObj" class="app-wrapper">
+    <div
+      v-if="device === 'mobile' && sidebar.opened"
+      class="drawer-bg"
+      @click="handleClickOutside"
+    />
+    <sidebar class="sidebar-container" />
+    <div :class="{ hasTagsView: needTagsView }" class="main-container">
+      <div :class="{ 'fixed-header': fixedHeader }">
+        <navbar />
+        <!-- <div style="height: 70px;background: #fff;">
+          caidan-鑿滃崟
+        </div> -->
+      </div>
+      <app-main />
+    </div>
+  </div>
+</template>
+
+<script>
+import RightPanel from "@/components/RightPanel";
+import { AppMain, Navbar, Sidebar } from "./components";
+import ResizeMixin from "./mixin/ResizeHandler";
+import { mapState } from "vuex";
+
+export default {
+  name: "Layout",
+  components: {
+    AppMain,
+    Navbar,
+    RightPanel,
+    Sidebar
+  },
+  mixins: [ResizeMixin],
+  computed: {
+    ...mapState({
+      sidebar: state => state.app.sidebar,
+      device: state => state.app.device,
+      showSettings: state => state.settings.showSettings,
+      needTagsView: state => state.settings.tagsView,
+      fixedHeader: state => state.settings.fixedHeader
+    }),
+    classObj() {
+      return {
+        hideSidebar: !this.sidebar.opened,
+        openSidebar: this.sidebar.opened,
+        withoutAnimation: this.sidebar.withoutAnimation,
+        mobile: this.device === "mobile"
+      };
+    }
+  },
+  methods: {
+    handleClickOutside() {
+      this.$store.dispatch("app/closeSideBar", { withoutAnimation: false });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+@import "~@/assets/styles/mixin.scss";
+@import "~@/assets/styles/variables.scss";
+
+.app-wrapper {
+  @include clearfix;
+  position: relative;
+  height: 100%;
+  width: 100%;
+
+  &.mobile.openSidebar {
+    position: fixed;
+    top: 0;
+  }
+}
+
+.drawer-bg {
+  background: #000;
+  opacity: 0.3;
+  width: 100%;
+  top: 0;
+  height: 100%;
+  position: absolute;
+  z-index: 999;
+}
+
+.fixed-header {
+  position: fixed;
+  top: 0;
+  right: 0;
+  z-index: 9;
+  width: calc(100% - #{$sideBarWidth});
+  transition: width 0.28s;
+}
+
+.hideSidebar .fixed-header {
+  width: calc(100% - 54px);
+}
+
+.mobile .fixed-header {
+  width: 100%;
+}
+</style>
diff --git a/energy_management_ui/src/layout/mixin/ResizeHandler.js b/energy_management_ui/src/layout/mixin/ResizeHandler.js
new file mode 100644
index 0000000..e8d0df8
--- /dev/null
+++ b/energy_management_ui/src/layout/mixin/ResizeHandler.js
@@ -0,0 +1,45 @@
+import store from '@/store'
+
+const { body } = document
+const WIDTH = 992 // refer to Bootstrap's responsive design
+
+export default {
+  watch: {
+    $route(route) {
+      if (this.device === 'mobile' && this.sidebar.opened) {
+        store.dispatch('app/closeSideBar', { withoutAnimation: false })
+      }
+    }
+  },
+  beforeMount() {
+    window.addEventListener('resize', this.$_resizeHandler)
+  },
+  beforeDestroy() {
+    window.removeEventListener('resize', this.$_resizeHandler)
+  },
+  mounted() {
+    const isMobile = this.$_isMobile()
+    if (isMobile) {
+      store.dispatch('app/toggleDevice', 'mobile')
+      store.dispatch('app/closeSideBar', { withoutAnimation: true })
+    }
+  },
+  methods: {
+    // use $_ for mixins properties
+    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+    $_isMobile() {
+      const rect = body.getBoundingClientRect()
+      return rect.width - 1 < WIDTH
+    },
+    $_resizeHandler() {
+      if (!document.hidden) {
+        const isMobile = this.$_isMobile()
+        store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
+
+        if (isMobile) {
+          store.dispatch('app/closeSideBar', { withoutAnimation: true })
+        }
+      }
+    }
+  }
+}
diff --git a/energy_management_ui/src/layout/mixin/getHeight.js b/energy_management_ui/src/layout/mixin/getHeight.js
new file mode 100644
index 0000000..59417fc
--- /dev/null
+++ b/energy_management_ui/src/layout/mixin/getHeight.js
@@ -0,0 +1,24 @@
+/**
+ * 鎶樼嚎鍥剧殑鑷�傚簲
+ * 褰撶獥鍙e彂鐢熷彉鍖栫殑鏃跺�� 浼氶噸鏂扮殑鏇存柊瑙嗗浘鐨勪綅缃� 杈惧埌鑷�傚簲
+ */
+export default {
+    data() {
+        return {
+            bodyStyle: {
+                height: '',
+                overflow: 'auto'
+            }
+        }
+    },
+    mounted() {
+        this.setCharts();
+        window.addEventListener('resize', this.setCharts);
+    },
+    beforeDestroy() {
+        window.removeEventListener('resize', this.setCharts);
+    },
+    methods: {
+
+    }
+};
diff --git a/energy_management_ui/src/main.js b/energy_management_ui/src/main.js
new file mode 100644
index 0000000..860441f
--- /dev/null
+++ b/energy_management_ui/src/main.js
@@ -0,0 +1,107 @@
+import Vue from 'vue'
+
+import Cookies from 'js-cookie'
+
+import 'normalize.css/normalize.css' // a modern alternative to CSS resets
+import Element from 'element-ui'
+import './assets/styles/element-variables.scss'
+
+import '@/assets/styles/index.scss' // global css
+import '@/assets/styles/ruoyi.scss' // ruoyi css
+import App from './App'
+import store from './store'
+import router from './router'
+import permission from './directive/permission'
+
+import './assets/icons' // icon
+import './permission' // permission control
+import {
+  getDicts
+} from "@/api/system/dict/data";
+import {
+  getConfigKey
+} from "@/api/system/config";
+import {
+  addDateRange,
+  download,
+  fileDownload,
+  hideCheckAll,
+  parseTime,
+  resetForm,
+  selectDictLabel,
+  selectTimeTypeLabel
+} from "@/utils/ruoyi";
+import Pagination from "@/components/Pagination";
+import basicContainer from '@/components/common/basic-container';
+import htmlToPdf from '@/utils/vueToPdf/htmlToPdf'
+
+// 鍏ㄥ眬鏂规硶鎸傝浇
+Vue.prototype.getDicts = getDicts;
+Vue.prototype.getConfigKey = getConfigKey;
+Vue.prototype.parseTime = parseTime;
+Vue.prototype.resetForm = resetForm;
+Vue.prototype.addDateRange = addDateRange;
+Vue.prototype.selectDictLabel = selectDictLabel;
+Vue.prototype.download = download;
+Vue.prototype.fileDownload = fileDownload;
+Vue.prototype.selectTimeTypeLabel = selectTimeTypeLabel;
+
+Vue.prototype.hideCheckAll = hideCheckAll;
+
+Vue.prototype.msgSuccess = function (msg) {
+  this.$message({
+    showClose: true,
+    message: msg,
+    type: "success"
+  });
+};
+// 娉ㄥ唽鍏ㄥ眬瀹瑰櫒
+Vue.component('basicContainer', basicContainer);
+
+Vue.prototype.msgError = function (msg) {
+  this.$message({
+    showClose: true,
+    message: msg,
+    type: "error"
+  });
+};
+
+Vue.prototype.msgWarning = function (msg) {
+  this.$message({
+    showClose: true,
+    message: msg,
+    type: "warning"
+  });
+};
+
+Vue.prototype.msgInfo = function (msg) {
+  this.$message.info(msg);
+};
+
+// 鍏ㄥ眬缁勪欢鎸傝浇
+Vue.component('Pagination', Pagination);
+
+Vue.use(permission);
+Vue.use(htmlToPdf)
+
+/**
+ * If you don't want to use mock-server
+ * you want to use MockJs for mock api
+ * you can execute: mockXHR()
+ *
+ * Currently MockJs will be used in the production environment,
+ * please remove it before going online! ! !
+ */
+
+Vue.use(Element, {
+  size: Cookies.get('size') || 'medium' // set element-ui default size
+});
+
+Vue.config.productionTip = false;
+
+new Vue({
+  el: '#app',
+  router,
+  store,
+  render: h => h(App)
+});
diff --git a/energy_management_ui/src/permission.js b/energy_management_ui/src/permission.js
new file mode 100644
index 0000000..092eb11
--- /dev/null
+++ b/energy_management_ui/src/permission.js
@@ -0,0 +1,91 @@
+import router from './router'
+import store from './store'
+import {Message} from 'element-ui'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import {getToken} from '@/utils/auth'
+
+NProgress.configure({showSpinner: false})
+
+const whiteList = ['/login', '/auth-redirect', '/bind', '/register']
+
+router.beforeEach((to, from, next) => {
+    NProgress.start()
+    if (getToken()) {
+        /* has token*/
+        if (to.path === '/login') {
+            next({path: '/'})
+            NProgress.done()
+        } else if (to.path === '/reportAnd-monitorBy-provincesAnd-cities') {
+            const node = document.createElement('a');
+            node.href = 'https://www.baidu.com/';
+            node.target = '_blank';
+            node.rel = 'noopener noreferrer';
+            node.click();
+            node.remove();
+            // 闃绘璺敱璺宠浆
+            next(false);
+        } else if (to.path === '/reportAnd-monitorBy-provincesAnd-group') {
+            const node = document.createElement('a');
+            node.href = 'https://www.baidu.com/';
+            node.target = '_blank';
+            node.rel = 'noopener noreferrer';
+            node.click();
+            node.remove();
+            // 闃绘璺敱璺宠浆
+            next(false);
+        } else if (to.path === '/radiation-heating-monitoring') {
+            const node = document.createElement('a');
+            node.href = 'https://www.51iot.com.cn:3000/frame/ASTopen?orgId=2&language=en-US&theme=gray&refresh=30s';
+            node.target = '_blank';
+            node.rel = 'noopener noreferrer';
+            node.click();
+            node.remove();
+            // 闃绘璺敱璺宠浆
+            next(false);
+        } else {
+            if (store.getters.roles.length === 0) {
+                // 鍒ゆ柇褰撳墠鐢ㄦ埛鏄惁宸叉媺鍙栧畬user_info淇℃伅
+                store.dispatch('GetInfo').then(res => {
+                    // 鎷夊彇user_info
+                    const roles = res.roles
+                    store.dispatch('GenerateRoutes', {roles}).then(accessRoutes => {
+                        // 娴嬭瘯 榛樿闈欐�侀〉闈�
+                        // store.dispatch('permission/generateRoutes', { roles }).then(accessRoutes => {
+                        // 鏍规嵁roles鏉冮檺鐢熸垚鍙闂殑璺敱琛�
+                        router.addRoutes(accessRoutes) // 鍔ㄦ�佹坊鍔犲彲璁块棶璺敱琛�
+                        next({...to, replace: true}) // hack鏂规硶 纭繚addRoutes宸插畬鎴�
+                    })
+                })
+                    .catch(err => {
+                        store.dispatch('FedLogOut').then(() => {
+                            Message.error(err)
+                            next({path: '/'})
+                        })
+                    })
+            } else {
+                next()
+                // 娌℃湁鍔ㄦ�佹敼鍙樻潈闄愮殑闇�姹傚彲鐩存帴next() 鍒犻櫎涓嬫柟鏉冮檺鍒ゆ柇 鈫�
+                // if (hasPermission(store.getters.roles, to.meta.roles)) {
+                //   next()
+                // } else {
+                //   next({ path: '/401', replace: true, query: { noGoBack: true }})
+                // }
+                // 鍙垹 鈫�
+            }
+        }
+    } else {
+        // 娌℃湁token
+        if (whiteList.indexOf(to.path) !== -1) {
+            // 鍦ㄥ厤鐧诲綍鐧藉悕鍗曪紝鐩存帴杩涘叆
+            next()
+        } else {
+            next(`/login?redirect=${to.path}`) // 鍚﹀垯鍏ㄩ儴閲嶅畾鍚戝埌鐧诲綍椤�
+            NProgress.done()
+        }
+    }
+})
+
+router.afterEach(() => {
+    NProgress.done()
+})
diff --git a/energy_management_ui/src/router/index.js b/energy_management_ui/src/router/index.js
new file mode 100644
index 0000000..a7967d6
--- /dev/null
+++ b/energy_management_ui/src/router/index.js
@@ -0,0 +1,174 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+
+Vue.use(Router)
+
+/* Layout */
+import Layout from '@/layout'
+
+/**
+ * Note: 璺敱閰嶇疆椤�
+ *
+ * hidden: true                   // 褰撹缃� true 鐨勬椂鍊欒璺敱涓嶄細鍐嶄晶杈规爮鍑虹幇 濡�401锛宭ogin绛夐〉闈紝鎴栬�呭涓�浜涚紪杈戦〉闈�/edit/1
+ * alwaysShow: true               // 褰撲綘涓�涓矾鐢变笅闈㈢殑 children 澹版槑鐨勮矾鐢卞ぇ浜�1涓椂锛岃嚜鍔ㄤ細鍙樻垚宓屽鐨勬ā寮�--濡傜粍浠堕〉闈�
+ *                                // 鍙湁涓�涓椂锛屼細灏嗛偅涓瓙璺敱褰撳仛鏍硅矾鐢辨樉绀哄湪渚ц竟鏍�--濡傚紩瀵奸〉闈�
+ *                                // 鑻ヤ綘鎯充笉绠¤矾鐢变笅闈㈢殑 children 澹版槑鐨勪釜鏁伴兘鏄剧ず浣犵殑鏍硅矾鐢�
+ *                                // 浣犲彲浠ヨ缃� alwaysShow: true锛岃繖鏍峰畠灏变細蹇界暐涔嬪墠瀹氫箟鐨勮鍒欙紝涓�鐩存樉绀烘牴璺敱
+ * redirect: noRedirect           // 褰撹缃� noRedirect 鐨勬椂鍊欒璺敱鍦ㄩ潰鍖呭睉瀵艰埅涓笉鍙鐐瑰嚮
+ * name:'router-name'             // 璁惧畾璺敱鐨勫悕瀛楋紝涓�瀹氳濉啓涓嶇劧浣跨敤<keep-alive>鏃朵細鍑虹幇鍚勭闂
+ * meta : {
+    roles: ['admin','editor']    // 璁剧疆璇ヨ矾鐢辫繘鍏ョ殑鏉冮檺锛屾敮鎸佸涓潈闄愬彔鍔�
+    title: 'title'               // 璁剧疆璇ヨ矾鐢卞湪渚ц竟鏍忓拰闈㈠寘灞戜腑灞曠ず鐨勫悕瀛�
+    icon: 'svg-name'             // 璁剧疆璇ヨ矾鐢辩殑鍥炬爣锛屽搴旇矾寰剆rc/icons/svg
+    breadcrumb: false            // 濡傛灉璁剧疆涓篺alse锛屽垯涓嶄細鍦╞readcrumb闈㈠寘灞戜腑鏄剧ず
+  }
+ */
+
+// 鍏叡璺敱
+export const constantRoutes = [{
+    path: '/redirect',
+    component: Layout,
+    hidden: true,
+    children: [{
+      path: '/redirect/:path*',
+      component: () => import('@/views/redirect')
+    }]
+  },
+  {
+    path: '/login',
+    component: () => import('@/views/login'),
+    hidden: true
+  },
+  {
+    path: '/404',
+    component: () => import('@/views/error/404'),
+    hidden: true
+  },
+  {
+    path: '/401',
+    component: () => import('@/views/error/401'),
+    hidden: true
+  },
+  {
+    path: '',
+    component: Layout,
+    redirect: 'index',
+    children: [{
+      path: 'index',
+      component: () => import('@/views/index'),
+      name: '棣栭〉',
+      meta: {
+        title: '棣栭〉',
+        icon: 'dashboard',
+        noCache: true,
+        affix: true
+      }
+    }]
+  },
+  {
+    path: '/indexdev',
+    component: () => import('@/views/index_dev'),
+    hidden: 'true'
+  },
+  {
+    path: '/user',
+    component: Layout,
+    hidden: true,
+    redirect: 'noredirect',
+    children: [{
+      path: 'profile',
+      component: () => import('@/views/system/user/profile/index'),
+      name: 'Profile',
+      meta: {
+        title: '涓汉涓績',
+        icon: 'user'
+      }
+    }]
+  },
+  {
+    path: '/dict',
+    component: Layout,
+    hidden: true,
+    children: [{
+      path: 'type/data/:dictId(\\d+)',
+      component: () => import('@/views/system/dict/data'),
+      name: 'Data',
+      meta: {
+        title: '瀛楀吀鏁版嵁',
+        icon: ''
+      }
+    }]
+  },
+  {
+    path: '/gen',
+    component: Layout,
+    hidden: true,
+    children: [{
+      path: 'edit',
+      component: () => import('@/views/tool/gen/editTable'),
+      name: 'GenEdit',
+      meta: {
+        title: '淇敼鐢熸垚閰嶇疆'
+      }
+    }]
+  },
+  {
+    path: '/model',
+    component: Layout,
+    hidden: true,
+    children: [{
+      path: '',
+      component: () => import('@/views/basicsetting/model/index'),
+      name: 'modelManage',
+      meta: {
+        title: '妯″瀷绠$悊'
+      }
+    }]
+  }, {
+    path: '/electricityPrice',
+    component: Layout,
+    hidden: true,
+    children: [{
+      path: 'listHistory',
+      component: () => import('@/views/electricityPrice/electricity/history'),
+      name: 'electricity',
+      meta: {
+        title: '宄板钩璋峰巻鍙茶褰�',
+        icon: ''
+      }
+    }]
+  }, {
+    path: '/energyConsumption',
+    component: Layout,
+    hidden: true,
+    children: [{
+      path: 'listEnergyConsumption/:timeType/:beginTime/:endTime/:indexCode/:id/:titleName',
+      component: () => import('@/views/energyStatistics/energyConsumption/consumptionCost'),
+      name: 'listEnergyConsumption',
+      meta: {
+        title: '鑳芥簮娑堣垂鎴愭湰鍒嗘椂鍒嗘瀽鎶ヨ〃'
+      }
+    }]
+  },
+  {
+    path: '/rosteringSchemeitem',
+    component: Layout,
+    hidden: true,
+    children: [{
+      path: 'list/:id',
+      component: () => import('@/views/workforce/management/schemeItem'),
+      name: 'list',
+      meta: {
+        title: '杞�兼柟妗堢粏鍒�'
+      }
+    }]
+  }
+]
+
+export default new Router({
+  mode: 'history', // 鍘绘帀url涓殑#
+  scrollBehavior: () => ({
+    y: 0
+  }),
+  routes: constantRoutes
+})
diff --git a/energy_management_ui/src/settings.js b/energy_management_ui/src/settings.js
new file mode 100644
index 0000000..ddeef7c
--- /dev/null
+++ b/energy_management_ui/src/settings.js
@@ -0,0 +1,31 @@
+module.exports = {
+  title: '涓滀附鍖荤枟鑳芥簮绠$悊绯荤粺',
+
+  /**
+   * 鏄惁绯荤粺甯冨眬閰嶇疆
+   */
+  showSettings: false,
+
+  /**
+   * 鏄惁鏄剧ず tagsView
+   */
+  tagsView: true,
+
+  /**
+   * 鏄惁鍥哄畾澶撮儴
+   */
+  fixedHeader: false,
+
+  /**
+   * 鏄惁鏄剧ずlogo
+   */
+  sidebarLogo: true,
+
+  /**
+   * @type {string | array} 'production' | ['production', 'development']
+   * @description Need show err logs component.
+   * The default is only used in the production env
+   * If you want to also use it in dev, you can pass ['production', 'development']
+   */
+  errorLog: 'production'
+}
diff --git a/energy_management_ui/src/store/getters.js b/energy_management_ui/src/store/getters.js
new file mode 100644
index 0000000..df51465
--- /dev/null
+++ b/energy_management_ui/src/store/getters.js
@@ -0,0 +1,15 @@
+const getters = {
+  sidebar: state => state.app.sidebar,
+  size: state => state.app.size,
+  device: state => state.app.device,
+  visitedViews: state => state.tagsView.visitedViews,
+  cachedViews: state => state.tagsView.cachedViews,
+  token: state => state.user.token,
+  avatar: state => state.user.avatar,
+  name: state => state.user.name,
+  introduction: state => state.user.introduction,
+  roles: state => state.user.roles,
+  permissions: state => state.user.permissions,
+  permission_routes: state => state.permission.routes
+}
+export default getters
diff --git a/energy_management_ui/src/store/index.js b/energy_management_ui/src/store/index.js
new file mode 100644
index 0000000..53b8437
--- /dev/null
+++ b/energy_management_ui/src/store/index.js
@@ -0,0 +1,23 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import app from './modules/app'
+import user from './modules/user'
+import tagsView from './modules/tagsView'
+import permission from './modules/permission'
+import settings from './modules/settings'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+const store = new Vuex.Store({
+  modules: {
+    app,
+    user,
+    tagsView,
+    permission,
+    settings
+  },
+  getters
+})
+
+export default store
diff --git a/energy_management_ui/src/store/modules/app.js b/energy_management_ui/src/store/modules/app.js
new file mode 100644
index 0000000..45d89bb
--- /dev/null
+++ b/energy_management_ui/src/store/modules/app.js
@@ -0,0 +1,56 @@
+import Cookies from 'js-cookie'
+
+const state = {
+  sidebar: {
+    opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+    withoutAnimation: false
+  },
+  device: 'desktop',
+  size: Cookies.get('size') || 'medium'
+}
+
+const mutations = {
+  TOGGLE_SIDEBAR: state => {
+    state.sidebar.opened = !state.sidebar.opened
+    state.sidebar.withoutAnimation = false
+    if (state.sidebar.opened) {
+      Cookies.set('sidebarStatus', 1)
+    } else {
+      Cookies.set('sidebarStatus', 0)
+    }
+  },
+  CLOSE_SIDEBAR: (state, withoutAnimation) => {
+    Cookies.set('sidebarStatus', 0)
+    state.sidebar.opened = false
+    state.sidebar.withoutAnimation = withoutAnimation
+  },
+  TOGGLE_DEVICE: (state, device) => {
+    state.device = device
+  },
+  SET_SIZE: (state, size) => {
+    state.size = size
+    Cookies.set('size', size)
+  }
+}
+
+const actions = {
+  toggleSideBar({ commit }) {
+    commit('TOGGLE_SIDEBAR')
+  },
+  closeSideBar({ commit }, { withoutAnimation }) {
+    commit('CLOSE_SIDEBAR', withoutAnimation)
+  },
+  toggleDevice({ commit }, device) {
+    commit('TOGGLE_DEVICE', device)
+  },
+  setSize({ commit }, size) {
+    commit('SET_SIZE', size)
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}
diff --git a/energy_management_ui/src/store/modules/permission.js b/energy_management_ui/src/store/modules/permission.js
new file mode 100644
index 0000000..26299d4
--- /dev/null
+++ b/energy_management_ui/src/store/modules/permission.js
@@ -0,0 +1,61 @@
+import { constantRoutes } from "@/router";
+import { getRouters } from "@/api/menu";
+import Layout from "@/layout/index";
+import RouteView from "@/layout/RouteView";
+
+const permission = {
+  state: {
+    routes: [],
+    addRoutes: []
+  },
+  mutations: {
+    SET_ROUTES: (state, routes) => {
+      state.addRoutes = routes;
+      state.routes = constantRoutes.concat(routes);
+    }
+  },
+  actions: {
+    // 鐢熸垚璺敱
+    GenerateRoutes({ commit }) {
+      return new Promise(resolve => {
+        // 鍚戝悗绔姹傝矾鐢辨暟鎹�
+        getRouters().then(res => {
+          const accessedRoutes = filterAsyncRouter(res.data);
+          accessedRoutes.push({ path: "*", redirect: "/404", hidden: true });
+          commit("SET_ROUTES", accessedRoutes);
+          resolve(accessedRoutes);
+        });
+      });
+    }
+  }
+};
+
+// 閬嶅巻鍚庡彴浼犳潵鐨勮矾鐢卞瓧绗︿覆锛岃浆鎹负缁勪欢瀵硅薄
+function filterAsyncRouter(asyncRouterMap) {
+  return asyncRouterMap.filter(route => {
+    if (route.component) {
+      // Layout缁勪欢鐗规畩澶勭悊
+      if (route.component === "Layout") {
+        route.component = Layout;
+      } else if (route.component === "RouteView") {
+        route.component = RouteView;
+      } else {
+        route.component = loadView(route.component);
+      }
+    }
+    if (route.children != null && route.children && route.children.length) {
+      route.children = filterAsyncRouter(route.children);
+    }
+    return true;
+  });
+}
+
+// export const loadView = (view) => { // 璺敱鎳掑姞杞�
+//   return () => import(`@/views/${view}`)
+// }
+export const loadView = view => {
+  // 璺敱鎳掑姞杞�
+  return resolve => require([`@/views/${view}`], resolve);
+};
+
+export default permission;
diff --git a/energy_management_ui/src/store/modules/settings.js b/energy_management_ui/src/store/modules/settings.js
new file mode 100644
index 0000000..a1152a9
--- /dev/null
+++ b/energy_management_ui/src/store/modules/settings.js
@@ -0,0 +1,34 @@
+import variables from '@/assets/styles/element-variables.scss'
+import defaultSettings from '@/settings'
+
+const { showSettings, tagsView, fixedHeader, sidebarLogo } = defaultSettings
+
+const state = {
+  theme: variables.theme,
+  showSettings: showSettings,
+  tagsView: tagsView,
+  fixedHeader: fixedHeader,
+  sidebarLogo: sidebarLogo
+}
+
+const mutations = {
+  CHANGE_SETTING: (state, { key, value }) => {
+    if (state.hasOwnProperty(key)) {
+      state[key] = value
+    }
+  }
+}
+
+const actions = {
+  changeSetting({ commit }, data) {
+    commit('CHANGE_SETTING', data)
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}
+
diff --git a/energy_management_ui/src/store/modules/tagsView.js b/energy_management_ui/src/store/modules/tagsView.js
new file mode 100644
index 0000000..3e2c170
--- /dev/null
+++ b/energy_management_ui/src/store/modules/tagsView.js
@@ -0,0 +1,165 @@
+const state = {
+  visitedViews: [],
+  cachedViews: []
+}
+
+const mutations = {
+  ADD_VISITED_VIEW: (state, view) => {
+    if (state.visitedViews.some(v => v.path === view.path)) return
+    state.visitedViews.push(
+      Object.assign({}, view, {
+        title: view.meta.title || 'no-name'
+      })
+    )
+  },
+  ADD_CACHED_VIEW: (state, view) => {
+    if (state.cachedViews.includes(view.name)) return
+    if (!view.meta.noCache) {
+      state.cachedViews.push(view.name)
+    }
+  },
+
+  DEL_VISITED_VIEW: (state, view) => {
+    for (const [i, v] of state.visitedViews.entries()) {
+      if (v.path === view.path) {
+        state.visitedViews.splice(i, 1)
+        break
+      }
+    }
+  },
+  DEL_CACHED_VIEW: (state, view) => {
+    for (const i of state.cachedViews) {
+      if (i === view.name) {
+        const index = state.cachedViews.indexOf(i)
+        state.cachedViews.splice(index, 1)
+        break
+      }
+    }
+  },
+
+  DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+    state.visitedViews = state.visitedViews.filter(v => {
+      return v.meta.affix || v.path === view.path
+    })
+  },
+  DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+    for (const i of state.cachedViews) {
+      if (i === view.name) {
+        const index = state.cachedViews.indexOf(i)
+        state.cachedViews = state.cachedViews.slice(index, index + 1)
+        break
+      }
+    }
+  },
+
+  DEL_ALL_VISITED_VIEWS: state => {
+    // keep affix tags
+    const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
+    state.visitedViews = affixTags
+  },
+  DEL_ALL_CACHED_VIEWS: state => {
+    state.cachedViews = []
+  },
+
+  UPDATE_VISITED_VIEW: (state, view) => {
+    for (let v of state.visitedViews) {
+      if (v.path === view.path) {
+        v = Object.assign(v, view)
+        break
+      }
+    }
+  }
+}
+
+const actions = {
+  addView({ dispatch }, view) {
+    dispatch('addVisitedView', view)
+    dispatch('addCachedView', view)
+  },
+  addVisitedView({ commit }, view) {
+    commit('ADD_VISITED_VIEW', view)
+  },
+  addCachedView({ commit }, view) {
+    commit('ADD_CACHED_VIEW', view)
+  },
+
+  delView({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delVisitedView', view)
+      dispatch('delCachedView', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delVisitedView({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_VISITED_VIEW', view)
+      resolve([...state.visitedViews])
+    })
+  },
+  delCachedView({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_CACHED_VIEW', view)
+      resolve([...state.cachedViews])
+    })
+  },
+
+  delOthersViews({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delOthersVisitedViews', view)
+      dispatch('delOthersCachedViews', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delOthersVisitedViews({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_OTHERS_VISITED_VIEWS', view)
+      resolve([...state.visitedViews])
+    })
+  },
+  delOthersCachedViews({ commit, state }, view) {
+    return new Promise(resolve => {
+      commit('DEL_OTHERS_CACHED_VIEWS', view)
+      resolve([...state.cachedViews])
+    })
+  },
+
+  delAllViews({ dispatch, state }, view) {
+    return new Promise(resolve => {
+      dispatch('delAllVisitedViews', view)
+      dispatch('delAllCachedViews', view)
+      resolve({
+        visitedViews: [...state.visitedViews],
+        cachedViews: [...state.cachedViews]
+      })
+    })
+  },
+  delAllVisitedViews({ commit, state }) {
+    return new Promise(resolve => {
+      commit('DEL_ALL_VISITED_VIEWS')
+      resolve([...state.visitedViews])
+    })
+  },
+  delAllCachedViews({ commit, state }) {
+    return new Promise(resolve => {
+      commit('DEL_ALL_CACHED_VIEWS')
+      resolve([...state.cachedViews])
+    })
+  },
+
+  updateVisitedView({ commit }, view) {
+    commit('UPDATE_VISITED_VIEW', view)
+  }
+}
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}
diff --git a/energy_management_ui/src/store/modules/user.js b/energy_management_ui/src/store/modules/user.js
new file mode 100644
index 0000000..477cfc4
--- /dev/null
+++ b/energy_management_ui/src/store/modules/user.js
@@ -0,0 +1,114 @@
+import {
+  login,
+  logout,
+  getInfo
+} from '@/api/login'
+import {
+  getToken,
+  setToken,
+  removeToken
+} from '@/utils/auth'
+
+const user = {
+  state: {
+    token: getToken(),
+    name: '',
+    avatar: '',
+    roles: [],
+    permissions: []
+  },
+
+  mutations: {
+    SET_TOKEN: (state, token) => {
+      state.token = token
+    },
+    SET_NAME: (state, name) => {
+      state.name = name
+    },
+    SET_AVATAR: (state, avatar) => {
+      state.avatar = avatar
+    },
+    SET_ROLES: (state, roles) => {
+      state.roles = roles
+    },
+    SET_PERMISSIONS: (state, permissions) => {
+      state.permissions = permissions
+    }
+  },
+
+  actions: {
+    // 鐧诲綍
+    Login({
+      commit
+    }, userInfo) {
+      const username = userInfo.username.trim()
+      const password = userInfo.password
+      const code = userInfo.code
+      const uuid = userInfo.uuid
+      return new Promise((resolve, reject) => {
+        login(username, password, code, uuid).then(res => {
+          setToken(res.token)
+          commit('SET_TOKEN', res.token)
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 鑾峰彇鐢ㄦ埛淇℃伅
+    GetInfo({
+      commit,
+      state
+    }) {
+      return new Promise((resolve, reject) => {
+        getInfo(state.token).then(res => {
+          const user = res.user
+          const avatar = user.avatar == "" ? require("@/assets/image/touxiang.png") : process.env.VUE_APP_BASE_API + user.avatar;
+          if (res.roles && res.roles.length > 0) { // 楠岃瘉杩斿洖鐨剅oles鏄惁鏄竴涓潪绌烘暟缁�
+            commit('SET_ROLES', res.roles)
+            commit('SET_PERMISSIONS', res.permissions)
+          } else {
+            commit('SET_ROLES', ['ROLE_DEFAULT'])
+          }
+          commit('SET_NAME', user.userName)
+          commit('SET_AVATAR', avatar)
+          resolve(res)
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 閫�鍑虹郴缁�
+    LogOut({
+      commit,
+      state
+    }) {
+      return new Promise((resolve, reject) => {
+        logout(state.token).then(() => {
+          commit('SET_TOKEN', '')
+          commit('SET_ROLES', [])
+          commit('SET_PERMISSIONS', [])
+          removeToken()
+          resolve()
+        }).catch(error => {
+          reject(error)
+        })
+      })
+    },
+
+    // 鍓嶇 鐧诲嚭
+    FedLogOut({
+      commit
+    }) {
+      return new Promise(resolve => {
+        commit('SET_TOKEN', '')
+        removeToken()
+        resolve()
+      })
+    }
+  }
+}
+
+export default user
diff --git a/energy_management_ui/src/utils/auth.js b/energy_management_ui/src/utils/auth.js
new file mode 100644
index 0000000..08a43d6
--- /dev/null
+++ b/energy_management_ui/src/utils/auth.js
@@ -0,0 +1,15 @@
+import Cookies from 'js-cookie'
+
+const TokenKey = 'Admin-Token'
+
+export function getToken() {
+  return Cookies.get(TokenKey)
+}
+
+export function setToken(token) {
+  return Cookies.set(TokenKey, token)
+}
+
+export function removeToken() {
+  return Cookies.remove(TokenKey)
+}
diff --git a/energy_management_ui/src/utils/index.js b/energy_management_ui/src/utils/index.js
new file mode 100644
index 0000000..04299a9
--- /dev/null
+++ b/energy_management_ui/src/utils/index.js
@@ -0,0 +1,317 @@
+/**
+ * 琛ㄦ牸鏃堕棿鏍煎紡鍖�
+ */
+export function formatDate(cellValue) {
+  if (cellValue == null || cellValue == "") return "";
+  var date = new Date(cellValue) 
+  var year = date.getFullYear()
+  var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
+  var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() 
+  var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() 
+  var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() 
+  var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
+  return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+  if (('' + time).length === 10) {
+    time = parseInt(time) * 1000
+  } else {
+    time = +time
+  }
+  const d = new Date(time)
+  const now = Date.now()
+
+  const diff = (now - d) / 1000
+
+  if (diff < 30) {
+    return '鍒氬垰'
+  } else if (diff < 3600) {
+    // less 1 hour
+    return Math.ceil(diff / 60) + '鍒嗛挓鍓�'
+  } else if (diff < 3600 * 24) {
+    return Math.ceil(diff / 3600) + '灏忔椂鍓�'
+  } else if (diff < 3600 * 24 * 2) {
+    return '1澶╁墠'
+  }
+  if (option) {
+    return parseTime(time, option)
+  } else {
+    return (
+      d.getMonth() +
+      1 +
+      '鏈�' +
+      d.getDate() +
+      '鏃�' +
+      d.getHours() +
+      '鏃�' +
+      d.getMinutes() +
+      '鍒�'
+    )
+  }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+  url = url == null ? window.location.href : url
+  const search = url.substring(url.lastIndexOf('?') + 1)
+  const obj = {}
+  const reg = /([^?&=]+)=([^?&=]*)/g
+  search.replace(reg, (rs, $1, $2) => {
+    const name = decodeURIComponent($1)
+    let val = decodeURIComponent($2)
+    val = String(val)
+    obj[name] = val
+    return rs
+  })
+  return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+  // returns the byte length of an utf8 string
+  let s = str.length
+  for (var i = str.length - 1; i >= 0; i--) {
+    const code = str.charCodeAt(i)
+    if (code > 0x7f && code <= 0x7ff) s++
+    else if (code > 0x7ff && code <= 0xffff) s += 2
+    if (code >= 0xDC00 && code <= 0xDFFF) i--
+  }
+  return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+  const newArray = []
+  for (let i = 0; i < actual.length; i++) {
+    if (actual[i]) {
+      newArray.push(actual[i])
+    }
+  }
+  return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+  if (!json) return ''
+  return cleanArray(
+    Object.keys(json).map(key => {
+      if (json[key] === undefined) return ''
+      return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+    })
+  ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+  const search = url.split('?')[1]
+  if (!search) {
+    return {}
+  }
+  return JSON.parse(
+    '{"' +
+      decodeURIComponent(search)
+        .replace(/"/g, '\\"')
+        .replace(/&/g, '","')
+        .replace(/=/g, '":"')
+        .replace(/\+/g, ' ') +
+      '"}'
+  )
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+  const div = document.createElement('div')
+  div.innerHTML = val
+  return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+  if (typeof target !== 'object') {
+    target = {}
+  }
+  if (Array.isArray(source)) {
+    return source.slice()
+  }
+  Object.keys(source).forEach(property => {
+    const sourceProperty = source[property]
+    if (typeof sourceProperty === 'object') {
+      target[property] = objectMerge(target[property], sourceProperty)
+    } else {
+      target[property] = sourceProperty
+    }
+  })
+  return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+  if (!element || !className) {
+    return
+  }
+  let classString = element.className
+  const nameIndex = classString.indexOf(className)
+  if (nameIndex === -1) {
+    classString += '' + className
+  } else {
+    classString =
+      classString.substr(0, nameIndex) +
+      classString.substr(nameIndex + className.length)
+  }
+  element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+  if (type === 'start') {
+    return new Date().getTime() - 3600 * 1000 * 24 * 90
+  } else {
+    return new Date(new Date().toDateString())
+  }
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+  let timeout, args, context, timestamp, result
+
+  const later = function() {
+    // 鎹笂涓�娆¤Е鍙戞椂闂撮棿闅�
+    const last = +new Date() - timestamp
+
+    // 涓婃琚寘瑁呭嚱鏁拌璋冪敤鏃堕棿闂撮殧 last 灏忎簬璁惧畾鏃堕棿闂撮殧 wait
+    if (last < wait && last > 0) {
+      timeout = setTimeout(later, wait - last)
+    } else {
+      timeout = null
+      // 濡傛灉璁惧畾涓篿mmediate===true锛屽洜涓哄紑濮嬭竟鐣屽凡缁忚皟鐢ㄨ繃浜嗘澶勬棤闇�璋冪敤
+      if (!immediate) {
+        result = func.apply(context, args)
+        if (!timeout) context = args = null
+      }
+    }
+  }
+
+  return function(...args) {
+    context = this
+    timestamp = +new Date()
+    const callNow = immediate && !timeout
+    // 濡傛灉寤舵椂涓嶅瓨鍦紝閲嶆柊璁惧畾寤舵椂
+    if (!timeout) timeout = setTimeout(later, wait)
+    if (callNow) {
+      result = func.apply(context, args)
+      context = args = null
+    }
+
+    return result
+  }
+}
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+  if (!source && typeof source !== 'object') {
+    throw new Error('error arguments', 'deepClone')
+  }
+  const targetObj = source.constructor === Array ? [] : {}
+  Object.keys(source).forEach(keys => {
+    if (source[keys] && typeof source[keys] === 'object') {
+      targetObj[keys] = deepClone(source[keys])
+    } else {
+      targetObj[keys] = source[keys]
+    }
+  })
+  return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+  return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+  const timestamp = +new Date() + ''
+  const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+  return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+  return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+  if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+  if (hasClass(ele, cls)) {
+    const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+    ele.className = ele.className.replace(reg, ' ')
+  }
+}
diff --git a/energy_management_ui/src/utils/jsencrypt.js b/energy_management_ui/src/utils/jsencrypt.js
new file mode 100644
index 0000000..83db480
--- /dev/null
+++ b/energy_management_ui/src/utils/jsencrypt.js
@@ -0,0 +1,30 @@
+import JSEncrypt from 'jsencrypt/bin/jsencrypt'
+
+// 瀵嗛挜瀵圭敓鎴� http://web.chacuo.net/netrsakeypair
+
+const publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' +
+  '2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=='
+
+const privateKey = 'MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8\n' +
+  'mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9p\n' +
+  'B6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue\n' +
+  '/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZ\n' +
+  'UBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6\n' +
+  'vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha\n' +
+  '4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3\n' +
+  'tTbklZkD2A=='
+
+// 鍔犲瘑
+export function encrypt(txt) {
+  const encryptor = new JSEncrypt()
+  encryptor.setPublicKey(publicKey) // 璁剧疆鍏挜
+  return encryptor.encrypt(txt) // 瀵归渶瑕佸姞瀵嗙殑鏁版嵁杩涜鍔犲瘑
+}
+
+// 瑙e瘑
+export function decrypt(txt) {
+  const encryptor = new JSEncrypt()
+  encryptor.setPrivateKey(privateKey)
+  return encryptor.decrypt(txt)
+}
+
diff --git a/energy_management_ui/src/utils/permission.js b/energy_management_ui/src/utils/permission.js
new file mode 100644
index 0000000..591e1c1
--- /dev/null
+++ b/energy_management_ui/src/utils/permission.js
@@ -0,0 +1,24 @@
+import store from '@/store'
+
+/**
+ * @param {Array} value
+ * @returns {Boolean}
+ */
+export default function checkPermission(value) {
+  if (value && value instanceof Array && value.length > 0) {
+    const roles = store.getters && store.getters.roles
+    const permissionRoles = value
+
+    const hasPermission = roles.some(role => {
+      return permissionRoles.includes(role)
+    })
+
+    if (!hasPermission) {
+      return false
+    }
+    return true
+  } else {
+    console.error(`need roles! Like v-permission="['admin','editor']"`)
+    return false
+  }
+}
diff --git a/energy_management_ui/src/utils/request.js b/energy_management_ui/src/utils/request.js
new file mode 100644
index 0000000..147ef09
--- /dev/null
+++ b/energy_management_ui/src/utils/request.js
@@ -0,0 +1,65 @@
+import axios from 'axios'
+import { Notification, MessageBox, Message } from 'element-ui'
+import store from '@/store'
+import { getToken } from '@/utils/auth'
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// 鍒涘缓axios瀹炰緥
+const service = axios.create({
+  // axios涓姹傞厤缃湁baseURL閫夐」锛岃〃绀鸿姹俇RL鍏叡閮ㄥ垎
+  baseURL: process.env.VUE_APP_BASE_API,
+  // 瓒呮椂
+  timeout: 500000
+})
+// request鎷︽埅鍣�
+service.interceptors.request.use(
+  config => {
+    if (getToken()) {
+      config.headers['Authorization'] = 'Bearer ' + getToken() // 璁╂瘡涓姹傛惡甯﹁嚜瀹氫箟token 璇锋牴鎹疄闄呮儏鍐佃嚜琛屼慨鏀�
+    }
+    return config
+  },
+  error => {
+    console.log(error)
+    Promise.reject(error)
+  }
+)
+
+// 鍝嶅簲鎷︽埅鍣�
+service.interceptors.response.use(res => {
+    const code = res.data.code
+    if (code === 401) {
+      MessageBox.confirm(
+        '鐧诲綍鐘舵�佸凡杩囨湡锛屾偍鍙互缁х画鐣欏湪璇ラ〉闈紝鎴栬�呴噸鏂扮櫥褰�',
+        '绯荤粺鎻愮ず',
+        {
+          confirmButtonText: '閲嶆柊鐧诲綍',
+          cancelButtonText: '鍙栨秷',
+          type: 'warning'
+        }
+      ).then(() => {
+        store.dispatch('LogOut').then(() => {
+          location.reload() // 涓轰簡閲嶆柊瀹炰緥鍖杤ue-router瀵硅薄 閬垮厤bug
+        })
+      })
+    } else if (code !== 200) {
+      Notification.error({
+        title: res.data.msg
+      })
+      return Promise.reject('error')
+    } else {
+      return res.data
+    }
+  },
+  error => {
+    console.log('err' + error)
+    Message({
+      message: error.message,
+      type: 'error',
+      duration: 5 * 1000
+    })
+    return Promise.reject(error)
+  }
+)
+
+export default service
diff --git a/energy_management_ui/src/utils/ruoyi.js b/energy_management_ui/src/utils/ruoyi.js
new file mode 100644
index 0000000..7782d56
--- /dev/null
+++ b/energy_management_ui/src/utils/ruoyi.js
@@ -0,0 +1,133 @@
+/**
+ * 閫氱敤js鏂规硶灏佽澶勭悊
+ * Copyright (c) 2019 ruoyi
+ */
+
+const baseURL = process.env.VUE_APP_BASE_API
+
+// 鏃ユ湡鏍煎紡鍖�
+export function parseTime(time, pattern) {
+  if (arguments.length === 0 || !time) {
+    return null
+  }
+  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+  let date
+  if (typeof time === 'object') {
+    date = time
+  } else {
+    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+      time = parseInt(time)
+    }
+    if ((typeof time === 'number') && (time.toString().length === 10)) {
+      time = time * 1000
+    }
+    date = new Date(time)
+  }
+  const formatObj = {
+    y: date.getFullYear(),
+    m: date.getMonth() + 1,
+    d: date.getDate(),
+    h: date.getHours(),
+    i: date.getMinutes(),
+    s: date.getSeconds(),
+    a: date.getDay()
+  }
+  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+    let value = formatObj[key]
+    // Note: getDay() returns 0 on Sunday
+    if (key === 'a') {
+      return ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][value]
+    }
+    if (result.length > 0 && value < 10) {
+      value = '0' + value
+    }
+    return value || 0
+  })
+  return time_str
+}
+
+// 琛ㄥ崟閲嶇疆
+export function resetForm(refName) {
+  if (this.$refs[refName]) {
+    this.$refs[refName].resetFields();
+  }
+}
+
+// 娣诲姞鏃ユ湡鑼冨洿
+export function addDateRange(params, dateRange) {
+  var search = params;
+  search.beginTime = "";
+  search.endTime = "";
+  if (null != dateRange && '' != dateRange) {
+    search.beginTime = this.dateRange[0];
+    search.endTime = this.dateRange[1];
+  }
+  return search;
+}
+
+// 鍥炴樉鏁版嵁瀛楀吀
+export function selectDictLabel(datas, value) {
+  var actions = [];
+  Object.keys(datas).map((key) => {
+    if (datas[key].dictValue == ('' + value)) {
+      actions.push(datas[key].dictLabel);
+      return false;
+    }
+  })
+  return actions.join('');
+}
+
+// 閫氱敤涓嬭浇鏂规硶
+export function download(fileName) {
+  window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true;
+}
+
+// 閫氱敤涓嬭浇鏂规硶 showfileName锛氫笅杞藉悗鐨勬枃浠跺悕绉板甫鎵╁睍鍚�;filePath:瑕佷笅杞芥枃浠剁殑缁濆璺緞,甯︾潃鏂囦欢鍚嶅拰鎵╁睍鍚嶏紱deleteflage涓嬭浇瀹屾垚鍚庢槸鍚﹀垹闄ゆ枃浠�
+export function fileDownload(showfileName, filePath, deleteflage) {
+  window.location.href = baseURL + "/common/downloadAssign?showFileName=" + encodeURI(showfileName) + "&filePath=" + encodeURI(filePath) + "&delete=" + deleteflage;
+}
+
+// 瀛楃涓叉牸寮忓寲(%s )
+export function sprintf(str) {
+  var args = arguments, flag = true, i = 1;
+  str = str.replace(/%s/g, function () {
+    var arg = args[i++];
+    if (typeof arg === 'undefined') {
+      flag = false;
+      return '';
+    }
+    return arg;
+  });
+  return flag ? str : '';
+}
+
+// 杞崲瀛楃涓诧紝undefined,null绛夎浆鍖栦负""
+export function praseStrEmpty(str) {
+  if (!str || str == "undefined" || str == "null") {
+    return "";
+  }
+  return str;
+}
+
+export function hideCheckAll(row) {
+  if (row.columnIndex === 0) {//浣犻渶瑕佸垽鏂殑鏉′欢
+    return 'disabledCheck'
+  }
+}
+
+export function selectTimeTypeLabel(timeType) {
+  switch (timeType) {
+    case 'HOUR':
+      return "灏忔椂";
+    case 'SCHEDULING':
+      return "鐝粍";
+    case 'DAY':
+      return "澶�";
+    case 'MONTH':
+      return "鏈�";
+    case 'YEAR':
+      return "骞�";
+    default:
+      return "";
+  }
+}
diff --git a/energy_management_ui/src/utils/scroll-to.js b/energy_management_ui/src/utils/scroll-to.js
new file mode 100644
index 0000000..c5d8e04
--- /dev/null
+++ b/energy_management_ui/src/utils/scroll-to.js
@@ -0,0 +1,58 @@
+Math.easeInOutQuad = function(t, b, c, d) {
+  t /= d / 2
+  if (t < 1) {
+    return c / 2 * t * t + b
+  }
+  t--
+  return -c / 2 * (t * (t - 2) - 1) + b
+}
+
+// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
+var requestAnimFrame = (function() {
+  return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
+})()
+
+/**
+ * Because it's so fucking difficult to detect the scrolling element, just move them all
+ * @param {number} amount
+ */
+function move(amount) {
+  document.documentElement.scrollTop = amount
+  document.body.parentNode.scrollTop = amount
+  document.body.scrollTop = amount
+}
+
+function position() {
+  return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
+}
+
+/**
+ * @param {number} to
+ * @param {number} duration
+ * @param {Function} callback
+ */
+export function scrollTo(to, duration, callback) {
+  const start = position()
+  const change = to - start
+  const increment = 20
+  let currentTime = 0
+  duration = (typeof (duration) === 'undefined') ? 500 : duration
+  var animateScroll = function() {
+    // increment the time
+    currentTime += increment
+    // find the value with the quadratic in-out easing function
+    var val = Math.easeInOutQuad(currentTime, start, change, duration)
+    // move the document.body
+    move(val)
+    // do the animation unless its over
+    if (currentTime < duration) {
+      requestAnimFrame(animateScroll)
+    } else {
+      if (callback && typeof (callback) === 'function') {
+        // the animation is done so lets callback
+        callback()
+      }
+    }
+  }
+  animateScroll()
+}
diff --git a/energy_management_ui/src/utils/validate.js b/energy_management_ui/src/utils/validate.js
new file mode 100644
index 0000000..10c1019
--- /dev/null
+++ b/energy_management_ui/src/utils/validate.js
@@ -0,0 +1,88 @@
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+  return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+  const valid_map = ['admin', 'editor']
+  return valid_map.indexOf(str.trim()) >= 0
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+  return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+  const reg = /^[a-z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+  const reg = /^[A-Z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+  const reg = /^[A-Za-z]+$/
+  return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+  return reg.test(email)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+  if (typeof str === 'string' || str instanceof String) {
+    return true
+  }
+  return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+  if (typeof Array.isArray === 'undefined') {
+    return Object.prototype.toString.call(arg) === '[object Array]'
+  }
+  return Array.isArray(arg)
+}
+
+export function specialKey(str){
+  const reg = /^\w{3,20}$/;
+  return reg.test(str)
+}
diff --git a/energy_management_ui/src/utils/vueToPdf/htmlToPdf.js b/energy_management_ui/src/utils/vueToPdf/htmlToPdf.js
new file mode 100644
index 0000000..2a698d6
--- /dev/null
+++ b/energy_management_ui/src/utils/vueToPdf/htmlToPdf.js
@@ -0,0 +1,32 @@
+import html2pdf from 'html2pdf.js';
+
+export default {
+  install(Vue, options) {
+    Vue.prototype.htmlToPdf = function (refs, fileName = '瀵煎嚭pdf') {
+      let element = refs
+      let opt = {
+        margin: 40,
+        filename: `${fileName}.pdf`,
+        image: {
+          type: 'jpeg',
+          quality: 1
+        },
+        html2canvas: {
+          scale: 1,
+          allowTaint: true,
+          useCORS: true
+        },
+        pagebreak: {
+          mode: 'avoid-all',
+          after: '.avoidThisRow'
+        }, // 鏅鸿兘鍒嗛〉锛岄槻姝㈣鎴柇
+        enableLinks: true, // 鏀寔鏂囨湰涓斁閾炬帴锛屽彲鐐瑰嚮璺宠浆
+        jsPDF: {
+          unit: 'pt',
+          format: 'a2',
+        }
+      }
+      html2pdf(element, opt)
+    };
+  }
+};
diff --git a/energy_management_ui/src/utils/zipdownload.js b/energy_management_ui/src/utils/zipdownload.js
new file mode 100644
index 0000000..363c45a
--- /dev/null
+++ b/energy_management_ui/src/utils/zipdownload.js
@@ -0,0 +1,40 @@
+import axios from 'axios'
+import { getToken } from '@/utils/auth'
+
+const mimeMap = {
+  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+  zip: 'application/zip'
+}
+
+const baseUrl = process.env.VUE_APP_BASE_API
+export function downLoadZip(str, filename) {
+  var url = baseUrl + str
+  axios({
+    method: 'get',
+    url: url,
+    responseType: 'blob',
+    headers: { 'Authorization': 'Bearer ' + getToken() }
+  }).then(res => {
+    resolveBlob(res, mimeMap.zip)
+  })
+}
+/**
+ * 瑙f瀽blob鍝嶅簲鍐呭骞朵笅杞�
+ * @param {*} res blob鍝嶅簲鍐呭
+ * @param {String} mimeType MIME绫诲瀷
+ */
+export function resolveBlob(res, mimeType) {
+  const aLink = document.createElement('a')
+  var blob = new Blob([res.data], { type: mimeType })
+  // //浠巖esponse鐨刪eaders涓幏鍙杅ilename, 鍚庣response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 璁剧疆鐨勬枃浠跺悕;
+  var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
+  var contentDisposition = decodeURI(res.headers['content-disposition'])
+  var result = patt.exec(contentDisposition)
+  var fileName = result[1]
+  fileName = fileName.replace(/\"/g, '')
+  aLink.href = URL.createObjectURL(blob)
+  aLink.setAttribute('download', fileName) // 璁剧疆涓嬭浇鏂囦欢鍚嶇О
+  document.body.appendChild(aLink)
+  aLink.click()
+  document.body.appendChild(aLink)
+}
diff --git a/energy_management_ui/src/views/alarm/LiChart.vue b/energy_management_ui/src/views/alarm/LiChart.vue
new file mode 100644
index 0000000..05993f0
--- /dev/null
+++ b/energy_management_ui/src/views/alarm/LiChart.vue
@@ -0,0 +1,119 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+/*import resize from './mixins/resize'*/
+
+export default {
+  /*mixins: [resize],*/
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData } = {}) {
+      this.chart.setOption({
+
+        title: {
+          text: '鎶ヨ鏇茬嚎'
+        },
+        tooltip: {
+          trigger: 'axis'
+        },
+        legend: {
+          data: ['涓婇檺鍊�', '涓嬮檺鍊�' ,'鎶ヨ鍊�']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        toolbox: {
+          feature: {
+            saveAsImage: {}
+          }
+        },
+        xAxis: {
+          type: 'category',
+          boundaryGap: false,
+          data: ['0鐐�', '1鐐�', '2鐐�', '3鐐�', '4鐐�', '5鐐�', '6鐐�']
+        },
+        yAxis: {
+          type: 'value'
+        },
+        series: [
+          {
+            name: '涓婇檺鍊�',
+            type: 'line',
+            stack: '鎬婚噺',
+            data: [150, 150, 150, 150, 150, 150, 150]
+          },
+          {
+            name: '涓嬮檺鍊�',
+            type: 'line',
+            stack: '鎬婚噺',
+            data: [120, 120, 120, 120, 120, 120, 120]
+          },
+          {
+            name: '鎶ヨ鍊�',
+            type: 'line',
+            stack: '鎬婚噺',
+            data: [182, 182, 191, 234, 290, 330, 310]
+          },
+        ]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/alarm/collectionIndex.vue b/energy_management_ui/src/views/alarm/collectionIndex.vue
new file mode 100644
index 0000000..96a478d
--- /dev/null
+++ b/energy_management_ui/src/views/alarm/collectionIndex.vue
@@ -0,0 +1,315 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <el-form-item label="鎸囨爣缂栫爜" prop="code">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          style="width:160px"
+        />
+      </el-form-item>
+
+      <el-form-item label="鎸囨爣鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          style="width:160px"
+        />
+      </el-form-item>
+      <el-form-item label="鏃堕棿">
+        <el-date-picker
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click=""
+          v-hasPermi="['']"
+        >瀵煎嚭
+        </el-button>
+      </el-col>
+    </el-row>
+    <el-table :data="tableData" v-loading="loading" border @selection-change=""  @cell-click="openDlg" >
+      <el-table-column label="鎸囨爣缂栫爜" align="center" prop="name"/>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="number"/>
+      <el-table-column label="瀹為檯鍊�" align="center" prop="value"/>
+      <el-table-column label="涓嬮檺鍊�" align="center" prop="values"/>
+      <el-table-column label="涓婇檺鍊�" align="center" prop="code"/>
+      <el-table-column label="鎶ヨ娆℃暟" align="center" prop="what">
+        <template slot-scope="scope">
+          <div style="color:blue;text-decoration:underline ;cursor:pointer">{{scope.row.what}}</div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!--寮规-->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" :close-on-click-modal="false"  >
+      <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+        <line-chart :chart-data="lineChartData" />
+      </el-row>
+      <el-table  :data="tableData"   :show-header="hiddenTableHeader"  border="1px" >
+        <el-table-column label="鎶ヨ鏃堕棿"prop="one"  />
+        <el-table-column label="鎶ヨ鍊�"  prop="two"  />
+        <el-table-column label="瀹為檯鍊�"  prop="three"  />
+        <el-table-column label="瀹為檯鍊�"  prop="four"  />
+        <el-table-column label="瀹為檯鍊�"  prop="five"  />
+        <el-table-column label="瀹為檯鍊�"  prop="six"  />
+        <el-table-column label="瀹為檯鍊�"  prop="seven"  />
+        <el-table-column label="瀹為檯鍊�"  prop="eieght"  />
+      </el-table>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+  </div>
+</template>
+
+
+<script>
+  const lineChartData = {
+    newVisitis: {
+    }
+  }
+  import {
+    addEnergyindex,
+    delEnergyindex,
+    exportEnergyindex,
+    getEnergyindex,
+    listEnergyindex,
+    updateEnergyindex
+  } from "@/api/basicsetting/energyindex";
+  import LineChart from './LiChart'
+
+
+
+  export default {
+    name: 'energyIndex',
+    components: {
+      LineChart
+    },
+    data() {
+      return {
+        hiddenTableHeader:false,
+        lineChartData: lineChartData.newVisitis,
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        dateRange: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        List: [],
+        energyindexList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+        indexCategoryOptions: [],
+        // 澶囨敞瀛楀吀
+        remarkOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        // 鏌ヨ鍙傛暟
+        lineChartData:{
+          newVisitis:null,
+        },
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined
+        },
+
+        tableData: [],
+        datas: [{
+          name: 'BUG',
+          number: '98013',
+          value: '500',
+          values: '450',
+          code: '480',
+          what: '5',
+          one: '鎶ヨ鏃堕棿',
+          two: '0鐐�',
+          three: '1鐐�',
+          four : '2鐐�',
+          five :'3鐐�',
+          six : '4鐐�',
+          seven :'5鐐�',
+          eieght:'6鐐�',
+        },
+          {
+            name: 'BUG',
+            number: '98013',
+            value : '500',
+            values : '450',
+            code : '480',
+            what: '5',
+            one :'鎶ヨ闄愬��',
+            two :'210',
+            three :'172',
+            four : '181',
+            five :'224',
+            six : '280',
+            seven :'310',
+            eieght:'300',
+        },
+       {
+         name: 'BUG',
+           number: '98013',
+         value : '500',
+         values : '450',
+         code : '480' ,
+         what: '5',
+         one :'鎶ヨ鏃跺��',
+         two :'300',
+         three :'182',
+         four : '191',
+         five :'234',
+         six : '290',
+         seven :'330',
+         eieght:'310',
+       }
+        ],
+
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          name: [
+            {required: true, message: "鎸囨爣鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+          ], code: [
+            {required: true, message: "鎸囨爣缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'},
+            {pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+          ], indexCategory: [
+            {required: true, message: "璇烽�夋嫨鎸囨爣鍒嗙被", trigger: "blur"}
+          ]
+        },
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+
+    created() {
+      /*  this.getList();*/
+      this.getDicts("sys_index_category").then(response => {
+        this.indexCategoryOptions = response.data;
+        this.indexCategoryDefaultVal = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+      });
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+        this.unitDefaultVal = this.unitIdOptions.find(f => f.isDefault === 'Y');
+      });
+      setInterval(this.getList(), 30000);
+
+      this.bpy()
+
+    },
+    methods: {
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList(modelNode) {
+        this.currentNode = modelNode;
+        if (modelNode) {
+          this.loading = true;
+          this.queryParams.nodeId = modelNode.id;
+          listEnergyindex(this.queryParams).then(response => {
+            this.energyindexList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          });
+        } else {
+          this.energyindexList = [];
+        }
+
+      },
+      bpy() {
+        this.tableData = this.datas;
+      },
+      /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        const indexId = row.indexId || this.ids;
+        /*  getEnergyindex(indexId).then(response => {
+            this.form = response.data;
+    this.title = "寮傚父淇℃伅"+  response.data.name ;
+          });*/
+
+        this.open = true;
+      /*  this.title = "鎶ヨ鏄庣粏";*/
+      },
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀缈昏瘧
+      indexCategoryFormat(row, column) {
+        return this.selectDictLabel(this.indexCategoryOptions, row.indexCategory);
+      },
+
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.currentNode);
+      },
+      openDlg (){
+        this.open=true;
+      }
+    }
+
+  };
+</script>
diff --git a/energy_management_ui/src/views/alarm/index.vue b/energy_management_ui/src/views/alarm/index.vue
new file mode 100644
index 0000000..425be7c
--- /dev/null
+++ b/energy_management_ui/src/views/alarm/index.vue
@@ -0,0 +1,70 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            <el-select v-model="modelData" placeholder="璇烽�夋嫨妯″瀷"
+                       style="width:220px"
+                       size="small"
+                       @change="changeModel">
+              <el-option
+                v-for="model in modelInfoOptions"
+                :key="model.modelCode"
+                :label="model.modelName"
+                :value="model.modelCode"
+              />
+            </el-select>
+           <!-- <el-button icon="el-icon-setting" circle title="绠$悊妯″瀷" style="float:right;padding:8px"
+                       @click="manageModel"></el-button>-->
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+          <CollectionSetting ref="CollectionSetting"></CollectionSetting>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import CollectionSetting from "./indexCollectionSetting";
+  import ModelNode from "../basicsetting/modelNode/modelNode";
+  import {listModel} from "@/api/basicsetting/model";
+
+
+
+  export default {
+    components: {CollectionSetting, ModelNode},
+    created() {
+      listModel({isShow: 1}).then(response => {
+        this.modelInfoOptions = response.data;
+        if (this.modelInfoOptions.length > 0) {
+          this.modelData = this.modelInfoOptions[0].modelCode;
+          this.$refs.modelNode.getList(this.modelData);
+        }
+      });
+    },
+
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: []
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.CollectionSetting.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/alarm/indexCollectionSetting.vue b/energy_management_ui/src/views/alarm/indexCollectionSetting.vue
new file mode 100644
index 0000000..4a1f933
--- /dev/null
+++ b/energy_management_ui/src/views/alarm/indexCollectionSetting.vue
@@ -0,0 +1,324 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label:''}}--鑺傜偣璁剧疆</span>
+      </div>
+      <el-tabs>
+        <el-tab-pane :disabled="disabledSetting">
+          <span slot="label"><i class="el-icon-reading"></i>瀹炴椂鏁版嵁</span>
+          <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+            <el-form-item label="鎸囨爣缂栫爜" prop="code">
+              <el-input
+                v-model="queryParams.code"
+                placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�"
+                clearable
+                size="small"
+                @keyup.enter.native="handleQuery"
+                style="width:160px"
+              />
+            </el-form-item>
+            <el-form-item label="鎸囨爣鍚嶇О" prop="name">
+              <el-input
+                v-model="queryParams.name"
+                placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+                clearable
+                size="small"
+                @keyup.enter.native="handleQuery"
+                style="width:160px"
+              />
+            </el-form-item>
+            <el-form-item label="鏃堕棿">
+              <el-date-picker
+                v-model="dateRange"
+                size="small"
+                style="width: 240px"
+                value-format="yyyy-MM-dd"
+                type="daterange"
+                range-separator="-"
+                start-placeholder="寮�濮嬫棩鏈�"
+                end-placeholder="缁撴潫鏃ユ湡"
+              ></el-date-picker>
+            </el-form-item>
+              <el-form-item>
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+            </el-form-item>
+          </el-form>
+          <el-table   :data="tableData"  v-loading="loading"    border @selection-change=""  >
+            <el-table-column label="鎸囨爣缂栫爜"  align="center"  prop="name"/>
+            <el-table-column label="鎸囨爣鍚嶇О"  align="center"  prop="number"/>
+            <el-table-column label="瀹為檯鍊�"  align="center"  prop="value"/>
+            <el-table-column label="涓嬮檺鍊�"  align="center"  prop="values"/>
+            <el-table-column label="涓婇檺鍊�"  align="center"  prop="code"/>
+            <el-table-column label="鎶ヨ鏃堕棿"  align="center"  prop="time"/>
+          </el-table>
+        </el-tab-pane>
+        <el-tab-pane :disabled="disabledSetting">
+          <span slot="label"><i class="el-icon-s-data"></i>鍘嗗彶鏁版嵁</span>
+          <CollectionIndex ref="CollectionIndex"></CollectionIndex>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+  </div>
+</template>
+<script>
+  import {
+    delDevice,
+    delEnergy,
+    delIndex,
+    delProduct,
+    getSettingDevice,
+    getSettingEnergy,
+    getSettingIndex,
+    getSettingProduct,
+    setNodeToIndex,
+    setDevice,
+    setEnergy,
+    setProduct
+  } from '@/api/basicsetting/modelNode'
+  import CollectionIndex from "./collectionIndex";
+  import {List} from "@/api/basicsetting/state"
+
+
+  export default {
+    name: "collectionIndex",
+    components: {CollectionIndex},
+    data() {
+      return {
+        dateRange:'',
+        currentNode: '',
+        deviceDialog: false,
+        energyDialog: false,
+        productDialog: false,
+        collectIndexDialog: false,
+        indexLoading: false,
+        deviceLoading: false,
+        energyLoading: false,
+        productLoading: false,
+        settingEnergyList: [],
+        settingDeviceList: [],
+        settingProductList: [],
+        settingIndexList: [],
+        disabledSetting: true,
+        nodeId:undefined,
+        loading: false,
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined
+        },
+
+
+        tableData: [],
+        datab :[{
+          name : 'BUG',
+          number : '98013',
+          value : '500',
+          values :'450',
+          code :'480',
+          time :'2020-3-12'
+        },
+          {
+            name : '98014',
+            number : '鐬椂娴侀噺',
+            value : '1000',
+            values :'960',
+            code :'980',
+            time :'2020-3-15'
+          }
+        ],
+
+      }
+    },
+    created() {
+      this.bpq()
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.nodeId = modelNode.id;
+        this.getList(this.nodeId);
+        this.settingDeviceList = [];
+        this.settingIndexList = [];
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+          this.deviceLoading = true;
+          getSettingDevice(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingDeviceList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.deviceLoading = false;
+          });
+
+          this.energyLoading = true;
+          getSettingEnergy(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingEnergyList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.energyLoading = false;
+          });
+
+          this.productLoading = true;
+          getSettingProduct(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingProductList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.productLoading = false;
+          });
+
+          this.indexLoading = true;
+          getSettingIndex(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingIndexList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.indexLoading = false;
+          });
+
+          // this.$refs.energyIndex.getList(modelNode);
+        }
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.currentNode);
+      },
+
+      getList(e)
+      {
+        List("STATISTIC",e).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.indexLoading = false;
+        });
+
+      },
+      deviceSetting() {
+        this.deviceDialog = true;
+      },
+      energySetting() {
+        this.energyDialog = true;
+      },
+      productSetting() {
+        this.productDialog = true;
+      },
+      collectIndexSetting() {
+        this.collectIndexDialog = true;
+      },
+      showDeviceDialog() {
+        this.$nextTick(() => {
+          this.$refs.deviceSetting.init(this.settingDeviceList);
+        })
+      },
+      showEnergyDialog() {
+        this.$nextTick(() => {
+          this.$refs.energySetting.init(this.settingEnergyList);
+        })
+      },
+      showProductDialog() {
+        this.$nextTick(() => {
+          this.$refs.productSetting.init(this.settingProductList);
+        })
+      },
+      showCollectIndexDialog() {
+        this.$nextTick(() => {
+          this.$refs.collectIndexSetting.init(this.currentNode, this.settingIndexList);
+        })
+      },
+      deviceConfirmSelect(selectedDevice) {
+        this.settingDeviceList = selectedDevice;
+        let deviceIds = selectedDevice.map(item => item.id);
+        setDevice(this.currentNode.id, deviceIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      energyConfirmSelect(selectedEnergy) {
+        this.settingEnergyList = selectedEnergy;
+        let energyIds = selectedEnergy.map(item => item.enerid);
+        setEnergy(this.currentNode.id, energyIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      productConfirmSelect(selectedProduct) {
+        this.settingProductList = selectedProduct;
+        let productIds = selectedProduct.map(item => item.productid);
+        setProduct(this.currentNode.id, productIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      collectIndexConfirmSelect(selectedIndex) {
+        this.settingIndexList = selectedIndex;
+        let indexIds = selectedIndex.map(item => item.indexId);
+        setNodeToIndex(this.currentNode.id, indexIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      handleSelectionChange() {
+      },
+      delDevice(row) {
+        delDevice(this.currentNode.id, row.id).then((response) => {
+          if (response.code === 200) {
+            this.settingDeviceList = this.settingDeviceList.filter(f => f.id !== row.id);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      delEnergy(row) {
+        delEnergy(this.currentNode.id, row.enerid).then((response) => {
+          if (response.code === 200) {
+            this.settingEnergyList = this.settingEnergyList.filter(f => f.enerid !== row.enerid);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      delProduct(row) {
+        delProduct(this.currentNode.id, row.productid).then((response) => {
+          if (response.code === 200) {
+            this.settingProductList = this.settingProductList.filter(f => f.productid !== row.productid);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      bpq(){
+        this.tableData=this.datab;
+      },
+      delIndex(row) {
+        delIndex(this.currentNode.id, row.indexId).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = this.settingIndexList.filter(f => f.indexId !== row.indexId);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/alarmItem/cjdIndex.vue b/energy_management_ui/src/views/alarmItem/cjdIndex.vue
new file mode 100644
index 0000000..422a599
--- /dev/null
+++ b/energy_management_ui/src/views/alarmItem/cjdIndex.vue
@@ -0,0 +1,685 @@
+<template>
+  <div class="app-container item-style" style="padding:0">
+    <!--<el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">-->
+      <!--<el-form-item label="鎸囨爣鍚嶇О" prop="name">-->
+        <!--<el-input-->
+          <!--v-model="queryParams.name"-->
+          <!--placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"-->
+          <!--clearable-->
+          <!--size="small"-->
+          <!--@keyup.enter.native="handleQuery"-->
+          <!--style="width:160px"-->
+        <!--/>-->
+      <!--</el-form-item>-->
+      <!--<el-form-item label="鎸囨爣缂栫爜" prop="code">-->
+        <!--<el-input-->
+          <!--v-model="queryParams.code"-->
+          <!--placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�"-->
+          <!--clearable-->
+          <!--size="small"-->
+          <!--@keyup.enter.native="handleQuery"-->
+          <!--style="width:160px"-->
+        <!--/>-->
+      <!--</el-form-item>-->
+      <!--<el-form-item label="鎸囨爣鍒嗙被" prop="indexCategory">-->
+        <!--<el-select v-model="queryParams.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" clearable-->
+                   <!--style="width:150px"-->
+                   <!--size="small">-->
+          <!--<el-option-->
+            <!--v-for="dict in indexCategoryOptions"-->
+            <!--:key="dict.dictValue"-->
+            <!--:label="dict.dictLabel"-->
+            <!--:value="dict.dictValue"-->
+          <!--/>-->
+        <!--</el-select>-->
+      <!--</el-form-item>-->
+      <!--<el-form-item>-->
+        <!--<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>-->
+      <!--</el-form-item>-->
+    <!--</el-form>-->
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          size="mini"
+          :disabled="multiple"
+          @click='updateStateBtn("1")'
+          v-hasPermi="['system:alarmitem:edit']"
+        >鍚敤
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          size="mini"
+          :disabled="multiple"
+          @click='updateStateBtn("2")'
+          v-hasPermi="['energyindex:energyindex:remove']"
+        >鍋滄
+        </el-button>
+      </el-col>
+      <!--<el-col :span="1.5">-->
+        <!--<el-button-->
+          <!--type="success"-->
+          <!--size="mini"-->
+          <!--:disabled="single"-->
+          <!--@click="save"-->
+          <!--v-hasPermi="['energyindex:energyindex:edit']"-->
+          <!--&gt;淇濆瓨-->
+        <!--</el-button>-->
+      <!--</el-col>-->
+    </el-row>
+
+    <!--琛ㄦ牸-->
+    <el-form :rules="model.rules" :model="model"  ref="form">
+      <el-table v-loading="loading" :data="model.energyindexList" border @selection-change="handleSelectionChange" :default-sort = "{prop: 'date', order: 'descending'}">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="閲囬泦鐐瑰悕绉�" align="center" prop="name"/>
+        <el-table-column label="閲囬泦鐐圭紪鐮�" align="center" prop="code"/>
+        <el-table-column label="鍚仠鐘舵��" align="center" prop="indexCategory" class-name="small-padding fixed-width">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="150" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="earlyWarning(scope.row)"
+              v-hasPermi="['basicsetting:template:edit']"
+            >鎶ヨ
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀规寚鏍囦俊鎭璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鎸囨爣鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"/>
+        </el-form-item>
+        <el-form-item label="鎸囨爣缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�"/>
+        </el-form-item>
+        <el-form-item label="鎸囨爣鍒嗙被">
+          <el-select v-model="form.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" prop="indexCategory">
+            <el-option
+              v-for="dict in indexCategoryOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍗曚綅">
+          <el-select v-model="form.unitId" placeholder="璇烽�夋嫨鍗曚綅">
+            <el-option
+              v-for="dict in unitIdOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!--鎶ヨ鐣岄潰start-->
+    <!-- 娣诲姞鎴栦慨鏀规寚鏍囦俊鎭璇濇 -->
+    <el-dialog :title="settingModel.title" :visible.sync="settingModel.open" width="800px" :close-on-click-modal="false"  @close='closeYjDialog'>
+      <el-form ref="settingForm" :model="settingModel" :rules="settingModel.rules" label-width="80px">
+        <el-form-item label="鎶ヨ绾у埆">
+          <el-select v-model="alarmLevel" placeholder="鎶ヨ绾у埆" clearable
+                     style="width:150px"
+                     size="small">
+            <el-option
+              v-for="dict in settingModel.alarmLevelOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-table v-loading="loading" :data="settingModel.settingOptions" border @selection-change="handleSelectionChange"
+                  :default-sort = "{prop: 'date', order: 'descending'}" :span-method="arraySpanMethod">
+          <!--<el-table-column type="selection" width="55" align="center"/>-->
+          <el-table-column label="鏃舵" align="center" prop="timeSlotName"/>
+          <el-table-column label="闄愬�肩被鍨�" align="center" prop="limitTypeName" width="120"/>
+          <el-table-column label="鎶ヨ闄愬埗绫诲瀷" align="center" prop="alarmType" width="120"  :formatter="typeFormat"/>
+          <el-table-column label="闄愬��" align="center" prop="limitVal">
+            <template slot-scope="scope">
+              <el-form-item :prop="'settingOptions.' + scope.$index + '.limitVal'" :rules='settingModel.rules.numRule'>
+                <el-input style="width:200px"  v-model="scope.row.limitVal"></el-input>
+              </el-form-item>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="settingSubmitForm">纭� 瀹�</el-button>
+        <el-button @click="yjSetCancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!--棰勮鐣岄潰end-->
+  </div>
+</template>
+
+<script>
+  import {getSetting,listSet,updateSet,getSettingIndex,getStartStop,updateDialogForm,getSettingCount} from "@/api/alarmItem/alarmItem"
+  import {listLimitType} from "@/api/basicsetting/limitType"
+  const  myModelNode = undefined;
+  export default {
+    name: 'EnergyIndex',
+    data() {
+      const checkNum = (rule, value, callback) => {
+        let reg =  /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/;
+        if (!reg.test(value)&&value!="") {
+          callback(new Error('鏁板瓧鍙�2浣嶅皬鏁�'));
+        } else {
+          callback();
+        }
+      };
+      return {
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        //table
+        // 琛ㄥ崟鍙傛暟
+        form:{
+          supplier2:"",
+          type:"",
+          desc:"",
+          input:"",
+          min:"",
+          max:""
+        },
+        //閰嶇疆琛ㄤ娇鐢ㄦā鍨�
+        settingModel:{
+          title:"",
+          open:false,
+          settingOptions:[
+            // {
+            //   interval:",
+            //   limit:"",
+            //   limit_value:"",
+            // },
+          ],
+          // 鏃舵鏁扮粍
+          timeSlotOptions:[],
+          limitTypeOptions:[],
+          //鎶ヨ绾у埆
+          alarmLevelOptions:[],
+          //鍝嶅簲
+          resposeList:[],
+          stateById:"",
+          rules: {
+            numRule: [
+              {type:"number",validator: checkNum,trigger: "change"},
+            ],
+          },
+        },
+        model:{
+          // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+          energyindexList: [],
+          rules: {
+            numRule: [
+              {type:"number",validator: checkNum,trigger: "change"},
+              // {pattern: /^\d+(\.\d{0,2})?$/, message: '鏁板瓧鍙�2浣嶅皬鏁�', trigger: "change"}
+            ],
+          },
+        },
+        //涓昏〃閫変腑鐨勫惎鍋滅姸鎬佹暟缁�
+        startStopOptions:[],
+
+        editModeEnabled:true,
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+        indexCategoryOptions: [],
+        // 澶囨敞瀛楀吀
+        remarkOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        //鎶ヨ绾у埆
+        alarmLevel:"",
+        // 榛樿鍊�
+        dictDefaultVal:undefined,
+        // 鏌ヨ鍙傛暟
+        hbCount:0,
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined,
+          //鎸囨爣index
+          indexType:"COLLECT"
+        },
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          name: [
+            {required: true, message: "鎸囨爣鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+          ], code: [
+            {required: true, message: "鎸囨爣缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'},
+            {pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+          ], indexCategory: [
+            {required: true, message: "璇烽�夋嫨鎸囨爣鍒嗙被", trigger: "blur"}
+          ]
+        },
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+    created() {
+      // this.getList();
+      this.getDicts("warn_time_slot").then(response => {
+        this.settingModel.timeSlotOptions = response.data;
+      });
+      listLimitType(this.queryParams).then(response => {
+        this.hbCount = response.rows.length;
+        this.settingModel.limitTypeOptions = response.rows;
+      });
+      this.getDicts("alarm_type").then(response => {
+        this.settingModel.alarmTypeOptions = response.data;
+      });
+      this.getDicts("alarm_level").then(response => {
+        this.settingModel.alarmLevelOptions = response.data;
+        this.dictDefaultVal = this.settingModel.alarmLevelOptions.find(f => f.isDefault === 'Y');
+      });
+    },
+    methods: {
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      setModelNode(modelNode)
+      {
+        this.myModelNode=modelNode;
+        this.currentNode = modelNode;
+        this.getList();
+      },
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList() {
+        if (this.myModelNode) {
+          this.loading = true;
+          this.queryParams.nodeId = this.myModelNode.id;
+          //鎺ュ彛
+          getSettingIndex(this.queryParams).then(response => {
+            // console.log("涓昏〃=="+JSON.stringify(response));
+            this.model.energyindexList = response.data;
+            this.initstartstop();
+            this.loading = false;
+          });
+        } else {
+          this.energyindexList = [];
+        }
+      },
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀缈昏瘧
+      indexCategoryFormat(row, column) {
+        return this.selectDictLabel(this.indexCategoryOptions, row.indexCategory);
+      },
+      initstartstop()
+      {
+        for(let i=0;i<this.model.energyindexList.length;i++)
+        {
+          let ndy ="";
+          getStartStop(this.model.energyindexList[i].indexId).then(response => {
+            if(response.code=='200')
+            {
+              if(response.msg=="1")
+              {
+                this.model.energyindexList[i].indexCategory= "鍚姩";
+              }else if(response.msg=="2")
+              {
+                this.model.energyindexList[i].indexCategory= "鍋滄";
+              }else {
+                this.model.energyindexList[i].indexCategory= "灏氭湭璁剧疆";
+              }
+            }else
+            {
+              this.model.energyindexList[i].indexCategory= "";
+            }
+          });
+        }
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      startStopFormat(row, column) {
+        //鍙栧惎鍋滅姸鎬�
+        let ndy ="";
+        // getStartStop(row.indexId).then(response => {
+        //   if(response.code=='200')
+        //   {
+        //     if(response.msg=="1")
+        //     {
+        //       ndy= "鍚姩";
+        //     }else if(response.msg=="2")
+        //     {
+        //       ndy= "鍋滄";
+        //     }else {
+        //       ndy= "灏氭湭璁剧疆";
+        //     }
+        //   }else
+        //   {
+        //     ndy= "www";
+        //   }
+        // });
+        return ndy;
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.currentNode);
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.indexId);
+        this.names = selection.map(item => item.name);
+        this.single = selection.length !== 1;
+        this.multiple = !selection.length
+        this.startStopOptions = selection.map(item => item.indexCategory);
+        this.codeOptions = selection.map(item => item.code);
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        if (this.indexCategoryDefaultVal) {
+          this.form.indexCategory = this.indexCategoryDefaultVal.dictValue;
+        }
+        if (this.unitDefaultVal) {
+          this.form.unitId = this.unitDefaultVal.dictValue;
+        }
+        this.open = true;
+        this.title = "娣诲姞鎸囨爣淇℃伅";
+      },
+      /** 淇敼鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        // const indexId = row.indexId || this.ids;
+        // getEnergyindex(indexId).then(response => {
+        //   this.form = response.data;
+        //   this.open = true;
+        //   this.title = "淇敼" + response.data.name + "鎸囨爣淇℃伅";
+        // });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitForm: function () {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.indexId !== undefined) {
+              updateEnergyindex(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇敼鎴愬姛");
+                  this.open = false;
+                  this.getList(this.currentNode);
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              addEnergyindex(this.currentNode.id, this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("鏂板鎴愬姛");
+                  this.open = false;
+                  this.getList(this.currentNode);
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+      handleDelete(row) {
+        const indexIds = row.indexId || this.ids;
+        const indexNames = row.name || this.names;
+        this.$confirm('鏄惁纭鍒犻櫎鎸囨爣鍚嶄负"' + indexNames + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return delEnergyindex(indexIds);
+        }).then(() => {
+          this.getList(this.currentNode);
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function () {
+        });
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋寚鏍囦俊鎭暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportEnergyindex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      //淇濆瓨
+      save (row) {
+        this.$refs["form"].validate((valid,model)=>{
+          const indexId = row.indexId || this.ids;
+        })
+      },
+      updateStateBtn(flag){
+        let stateName = "";
+        if("1"==flag){
+          stateName = "鍚姩"
+        }else {
+          stateName = "鍋滄"
+        }
+        getSettingCount(this.ids).then(response => {
+          let unStartStopArrName = [];
+          let startStopArrIds = [];
+          for(let i =0;i<response.data.length;i++){
+            if(0==response.data[i]){
+              unStartStopArrName.push(this.codeOptions[i])
+            }else {
+              startStopArrIds.push(this.ids[i]);
+            }
+          }
+          if(unStartStopArrName.length>0){
+            var bh = unStartStopArrName.join("锛�");
+            this.$confirm('閫変腑瀛樺湪鏈缃檺鍊肩殑浠櫒璁惧'+bh+'锛屾殏鏃犳硶'+stateName+'锛�', "璀﹀憡", {
+              confirmButtonText: "纭畾",
+              cancelButtonText: "鍙栨秷",
+              type: "warning"
+            }).catch(function() {});
+          }else {
+            if(startStopArrIds.length>0) {
+              updateSet(startStopArrIds || "", flag).then(response => {
+                if (response.code === 200) {
+                  this.initstartstop();
+                  this.msgSuccess("鎴愬姛");
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        })
+      },
+      handleUpdate(e){
+        this.settingModel.open=true;
+        this.settingModel.title = "鎸囨爣缂栧彿锛�"+e.code;
+      },
+      yjSetSubmitForm(){
+        this.settingModel.open=false;
+        this.settingModel.settingOptions=[];
+      },
+      yjSetCancel(){
+        this.settingModel.open=false;
+        this.settingModel.settingOptions=[];
+      },
+      arraySpanMethod({ row, column, rowIndex, columnIndex }){
+        if (columnIndex === 0) {
+          if (rowIndex % this.hbCount === 0) {
+            return {
+              rowspan: this.hbCount,
+              colspan: 1
+            };
+          } else {
+            return {
+              rowspan: 0,
+              colspan: 0
+            };
+          }
+        }
+      },
+      //棰勮缂栬緫
+      earlyWarning(e){
+        // console.log(JSON.stringify(e));
+        // if (this.dictDefaultVal) {
+        //   this.alarmLevel = this.dictDefaultVal.dictValue;
+        // }
+        getSetting(e.indexId).then(response => {
+          this.settingModel.resposeList = response.data;
+          this.alarmLevel = this.settingModel.resposeList.length>0?this.settingModel.resposeList[0].alarmLevel:this.dictDefaultVal.dictValue;
+          var data = {};
+          if("鍚姩"==e.indexCategory){
+            this.settingModel.stateById ="1";
+          }else if("鍋滄"==e.indexCategory){
+            this.settingModel.stateById ="2";
+          }else {
+            this.settingModel.stateById ="";
+          }
+          for(let j = 0;j<this.settingModel.timeSlotOptions.length;j++){
+            if("瀹炴椂"==this.settingModel.timeSlotOptions[j].dictLabel){
+              for(let i = 0;i<this.settingModel.limitTypeOptions.length;i++){
+                data = {
+                  indexId:e.indexId,
+                  //鏃舵鍚嶇О
+                  timeSlotName:this.settingModel.timeSlotOptions[j].dictLabel,
+                  //鏃舵鍊�
+                  timeSlotVal:this.settingModel.timeSlotOptions[j].dictValue,
+                  //闄愬�肩被鍨嬪悕绉�
+                  limitTypeName:this.settingModel.limitTypeOptions[i].limitName,
+                  //闄愬�肩被鍨嬪��
+                  limitTypeVal:this.settingModel.limitTypeOptions[i].limitCode,
+                  //闄愬�肩殑鍊�
+                  limitVal:"",
+                  //涓婚敭
+                  id:"",
+                  //鍚仠鐘舵��
+                  state:this.settingModel.stateById,
+                  //鎶ヨ闄愬埗绫诲瀷
+                  alarmType:this.settingModel.limitTypeOptions[i].alarmType,
+                  //鎶ヨ绾у埆
+                  alarmLevel:"",
+                  //nodeid
+                  nodeId:this.currentNode.id
+                }
+                this.settingModel.settingOptions.push(data);
+              }
+            }else {
+              continue;
+            }
+          }
+          let a = this.settingModel.settingOptions;
+          let b = this.settingModel.resposeList;
+
+          for(let j = 0;j<a.length;j++){
+            for(let i in b){
+              if(a[j].timeSlotVal==b[i].timeSlot&&a[j].limitTypeVal==b[i].limitType){
+                a[j].limitVal =  b[i].limitVal;
+              }
+            }
+          }
+          this.settingModel.open=true;
+          this.settingModel.title = "鎸囨爣缂栧彿锛�"+e.code;
+        });
+      },
+      //琛ㄥ崟鎻愪氦
+      settingSubmitForm(){
+        for(let i = 0;i<this.settingModel.settingOptions.length;i++){
+          this.settingModel.settingOptions[i].alarmLevel = this.alarmLevel;
+        }
+        console.log(JSON.stringify(this.settingModel.settingOptions));
+        this.$refs["settingForm"].validate(valid => {
+          if (valid) {
+          updateDialogForm(this.settingModel.settingOptions||"").then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              // this.getList();
+              this.settingModel.settingOptions=[];
+              this.settingModel.open=false;
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+            this.settingModel.open=false;
+          }
+        });
+      },
+      closeYjDialog(){
+        this.settingModel.settingOptions = [];
+        return false;
+      },
+      // 瀛楀吀缈昏瘧
+      typeFormat(row, column) {
+        return this.selectDictLabel(this.settingModel.alarmTypeOptions, row.alarmType);
+      },
+    }
+  };
+</script>
+<style>
+  .item-style .el-form-item__content{
+    margin-left: 0px!important;
+  }
+</style>
diff --git a/energy_management_ui/src/views/alarmItem/index.vue b/energy_management_ui/src/views/alarmItem/index.vue
new file mode 100644
index 0000000..0ca06a9
--- /dev/null
+++ b/energy_management_ui/src/views/alarmItem/index.vue
@@ -0,0 +1,79 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="棰勬姤璀︾鐞�" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode"
+                   :modelCode="modelCode"
+                   :showOpt="false"/>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :title="currentNode ? currentNode.label+'--鑺傜偣閰嶇疆' : '鑺傜偣閰嶇疆'" :bodyStyle="bodyStyleRight">
+        <WarnSetting ref="WarnSetting"/>
+      </basic-container>
+    </el-col>
+  </el-row>
+
+</template>
+
+<script>
+import WarnSetting from "./modelWarnSetting";
+import ModelNode from "../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from '@/components/shrink/index.vue'
+
+export default {
+  components: {WarnSetting, ModelNode,ShrinkCol},
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode: undefined,
+      isCollapse: false,
+      bodyStyleRight: {},
+      currentNode: ''
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + 'px';
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      if (node) {
+        this.currentNode = node;
+      }
+      this.$refs.WarnSetting.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/alarmItem/modelWarnSetting.vue b/energy_management_ui/src/views/alarmItem/modelWarnSetting.vue
new file mode 100644
index 0000000..a78dd7e
--- /dev/null
+++ b/energy_management_ui/src/views/alarmItem/modelWarnSetting.vue
@@ -0,0 +1,119 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-tabs>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 閲囬泦鐐圭鐞�</span>
+        <cjdIndex ref="cjdIndex"></cjdIndex>
+      </el-tab-pane>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 缁熻鎸囨爣绠$悊</span>
+        <zbIndex ref="zbIndex"></zbIndex>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import {
+  delDevice,
+  delEnergy,
+  delIndex,
+  delProduct,
+  getSettingDevice,
+  getSettingEnergy,
+  getSettingIndex,
+  getSettingProduct,
+  setCollectIndex,
+  setDevice,
+  setEnergy,
+  setProduct
+} from '@/api/basicsetting/modelNode'
+import zbIndex from "./zbIndex";
+import cjdIndex from "./cjdIndex";
+
+export default {
+  name: "modelWarnSetting",
+  components: {zbIndex, cjdIndex},
+  data() {
+    return {
+      currentNode: '',
+      deviceDialog: false,
+      energyDialog: false,
+      productDialog: false,
+      collectIndexDialog: false,
+      indexLoading: false,
+      deviceLoading: false,
+      energyLoading: false,
+      productLoading: false,
+      settingEnergyList: [],
+      settingDeviceList: [],
+      settingProductList: [],
+      settingIndexList: [],
+      disabledSetting: true
+    }
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.settingDeviceList = [];
+      this.settingIndexList = [];
+      this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+      this.$refs.zbIndex.setModelNode(modelNode);
+      this.$refs.cjdIndex.setModelNode(modelNode);
+      if (modelNode) {
+        this.currentNode = modelNode;
+        this.deviceLoading = true;
+        getSettingDevice(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingDeviceList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.deviceLoading = false;
+        });
+
+        this.energyLoading = true;
+        getSettingEnergy(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingEnergyList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.energyLoading = false;
+        });
+
+        this.productLoading = true;
+        getSettingProduct(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingProductList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.productLoading = false;
+        });
+
+        this.indexLoading = true;
+        getSettingIndex(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.indexLoading = false;
+        });
+      }
+    },
+    collectIndexSetting() {
+      this.collectIndexDialog = true;
+    },
+    showCollectIndexDialog() {
+      this.$nextTick(() => {
+        this.$refs.collectIndexSetting.init(this.currentNode, this.settingIndexList);
+      })
+    },
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/alarmItem/zbIndex.vue b/energy_management_ui/src/views/alarmItem/zbIndex.vue
new file mode 100644
index 0000000..b279b39
--- /dev/null
+++ b/energy_management_ui/src/views/alarmItem/zbIndex.vue
@@ -0,0 +1,598 @@
+<template>
+  <div class="app-container item-style" style="padding:0">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <!--<el-form-item label="鎸囨爣鍚嶇О" prop="name">-->
+        <!--<el-input-->
+          <!--v-model="queryParams.name"-->
+          <!--placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"-->
+          <!--clearable-->
+          <!--size="small"-->
+          <!--@keyup.enter.native="handleQuery"-->
+          <!--style="width:160px"-->
+        <!--/>-->
+      <!--</el-form-item>-->
+      <!--<el-form-item label="鎸囨爣缂栫爜" prop="code">-->
+        <!--<el-input-->
+          <!--v-model="queryParams.code"-->
+          <!--placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�"-->
+          <!--clearable-->
+          <!--size="small"-->
+          <!--@keyup.enter.native="handleQuery"-->
+          <!--style="width:160px"-->
+        <!--/>-->
+      <!--</el-form-item>-->
+      <!--<el-form-item label="鎸囨爣鍒嗙被" prop="indexCategory">-->
+        <!--<el-select v-model="queryParams.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" clearable-->
+                   <!--style="width:150px"-->
+                   <!--size="small">-->
+          <!--<el-option-->
+            <!--v-for="dict in indexCategoryOptions"-->
+            <!--:key="dict.dictValue"-->
+            <!--:label="dict.dictLabel"-->
+            <!--:value="dict.dictValue"-->
+          <!--/>-->
+        <!--</el-select>-->
+      <!--</el-form-item>-->
+      <!--<el-form-item>-->
+        <!--<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>-->
+      <!--</el-form-item>-->
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          size="mini"
+          :disabled="multiple"
+          @click='updateStateBtn("1")'
+          v-hasPermi="['system:alarmitem:edit']"
+        >鍚敤
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          size="mini"
+          :disabled="multiple"
+          @click='updateStateBtn("2")'
+          v-hasPermi="['energyindex:energyindex:remove']"
+        >鍋滄
+        </el-button>
+      </el-col>
+    </el-row>
+
+    <!--琛ㄦ牸-->
+    <el-form :rules="model.rules" :model="model"  ref="form">
+      <el-table v-loading="loading" :data="model.energyindexList" border @selection-change="handleSelectionChange"
+                :default-sort = "{prop: 'date', order: 'descending'}">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+        <el-table-column label="鍚仠鐘舵��" align="center" prop="indexCategory" class-name="small-padding fixed-width">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="150" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="earlyWarning(scope.row)"
+              v-hasPermi="['system:set:query1']"
+            >鎶ヨ
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+
+    <!--鎶ヨ鐣岄潰start-->
+    <!-- 娣诲姞鎴栦慨鏀规寚鏍囦俊鎭璇濇 -->
+    <el-dialog :title="settingModel.title" :visible.sync="settingModel.open" width="800px" :close-on-click-modal="false"  @close='closeYjDialog'>
+      <el-form ref="alarmSetForm" :model="settingModel" :rules="settingModel.rules" label-width="80px">
+        <el-table v-loading="loading" :data="settingModel.settingOptions" border @selection-change="handleSelectionChange"
+                  :default-sort = "{prop: 'date', order: 'descending'}" :span-method="arraySpanMethod" max-height="500">
+          <!--<el-table-column type="selection" width="55" align="center"/>-->
+          <el-table-column label="鏃舵" align="center" prop="timeSlotName"/>
+          <el-table-column label="闄愬�肩被鍨�" align="center" prop="limitTypeName" width="120"/>
+          <el-table-column label="鎶ヨ闄愬埗绫诲瀷" align="center" prop="alarmType" width="120"  :formatter="typeFormat" />
+          <el-table-column label="闄愬��" align="center" prop="limitVal">
+            <template slot-scope="scope">
+              <el-form-item :prop="'settingOptions.' + scope.$index + '.limitVal'" :rules='settingModel.rules.numRule'>
+                <el-input style="width:200px"  v-model="scope.row.limitVal"></el-input>
+              </el-form-item>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="settingSubmitForm" v-hasPermi="['system:alarmitem:edit']">纭� 瀹�</el-button>
+        <el-button @click="yjSetCancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!--棰勮鐣岄潰end-->
+  </div>
+</template>
+
+<script>
+  import {getSetting,listSet,updateSet,getSettingIndex,getStartStop,updateDialogForm,getSettingCount} from "@/api/alarmItem/alarmItem"
+  import {listLimitType} from "@/api/basicsetting/limitType"
+  // import {getSettingIndex} from "@/api/basicsetting/modelNode"
+  const  myModelNode = undefined;
+  export default {
+    name: 'EnergyIndex',
+    data() {
+      const checkNum = (rule, value, callback) => {
+        let reg =  /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/;
+        if (!reg.test(value)&&value!="") {
+          callback(new Error('鏁板瓧鍙�2浣嶅皬鏁�'));
+        } else {
+          callback();
+        }
+      };
+      return {
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        //table
+        // 琛ㄥ崟鍙傛暟
+        form:{
+          supplier2:"",
+          type:"",
+          desc:"",
+          input:""
+        },
+        //閰嶇疆琛ㄤ娇鐢ㄦā鍨�
+        settingModel:{
+          title:"",
+          open:false,
+          settingOptions:[
+            // {
+            //   timeSlotName:undefined,
+            //   limitTypeName:undefined,
+            //   limitVal:undefined,
+            // },
+          ],
+          // 鏃舵鏁扮粍
+          timeSlotOptions:[],
+          limitTypeOptions:[],
+          alarmTypeOptions:[],
+          //鍝嶅簲
+          resposeList:[],
+          stateById:"",
+          rules: {
+            numRule: [
+              {type:"number",validator: checkNum,trigger: "change"},
+            ],
+          },
+        },
+        //涓昏〃浣跨敤妯″瀷
+        model:{
+          // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+          energyindexList: [],
+          rules: {
+            numRule: [
+              {type:"number",validator: checkNum,trigger: "change"},
+            ],
+          },
+        },
+        //涓昏〃閫変腑鐨勫惎鍋滅姸鎬佹暟缁�
+        startStopOptions:[],
+
+        editModeEnabled:true,
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+        indexCategoryOptions: [],
+        // 澶囨敞瀛楀吀
+        remarkOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        //鍚堝苟琛�
+        hbList:[],
+        hbCount:0,
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined,
+          //鎸囨爣index
+          indexType:"STATISTIC"
+        },
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          name: [
+            {required: true, message: "鎸囨爣鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+          ], code: [
+            {required: true, message: "鎸囨爣缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'},
+            {pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+          ], indexCategory: [
+            {required: true, message: "璇烽�夋嫨鎸囨爣鍒嗙被", trigger: "blur"}
+          ]
+        },
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+    created() {
+      this.getDicts("warn_time_slot").then(response => {
+        this.settingModel.timeSlotOptions = response.data;
+      });
+      listLimitType(this.queryParams).then(response => {
+        this.hbCount = response.rows.length;
+        this.settingModel.limitTypeOptions = response.rows;
+      });
+      this.getDicts("alarm_type").then(response => {
+        this.settingModel.alarmTypeOptions = response.data;
+      });
+    },
+    methods: {
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      setModelNode(modelNode)
+      {
+        this.myModelNode=modelNode;
+        this.currentNode = modelNode;
+        this.getList();
+      },
+      getList() {
+        // console.log(this.myModelNode)
+        if (this.myModelNode) {
+        this.loading = true;
+        this.queryParams.nodeId = this.myModelNode.id;
+        //鎺ュ彛
+        getSettingIndex(this.queryParams).then(response => {
+          this.model.energyindexList = response.data;
+          this.initstartstop();
+          this.loading = false;
+        });
+        } else {
+          this.energyindexList = [];
+        }
+      },
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀缈昏瘧
+      indexCategoryFormat(row, column) {
+        return this.selectDictLabel(this.indexCategoryOptions, row.indexCategory);
+      },
+      initstartstop()
+      {
+          for(let i=0;i<this.model.energyindexList.length;i++)
+          {
+            let ndy ="";
+            getStartStop(this.model.energyindexList[i].indexId).then(response => {
+              if(response.code=='200')
+              {
+                if(response.msg=="1")
+                {
+                  this.model.energyindexList[i].indexCategory= "鍚姩";
+                }else if(response.msg=="2")
+                {
+                  this.model.energyindexList[i].indexCategory= "鍋滄";
+                }else {
+                  this.model.energyindexList[i].indexCategory= "灏氭湭璁剧疆";
+                }
+              }else
+              {
+                this.model.energyindexList[i].indexCategory= "";
+              }
+            });
+          }
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      startStopFormat(row, column) {
+          //鍙栧惎鍋滅姸鎬�
+        let ndy ="";
+        // getStartStop(row.indexId).then(response => {
+        //   if(response.code=='200')
+        //   {
+        //     if(response.msg=="1")
+        //     {
+        //       ndy= "鍚姩";
+        //     }else if(response.msg=="2")
+        //     {
+        //       ndy= "鍋滄";
+        //     }else {
+        //       ndy= "灏氭湭璁剧疆";
+        //     }
+        //   }else
+        //   {
+        //     ndy= "www";
+        //   }
+        // });
+        return ndy;
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.currentNode);
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.indexId);
+        this.names = selection.map(item => item.name);
+        this.single = selection.length !== 1;
+        this.multiple = !selection.length
+        // console.log(JSON.stringify(selection));
+        this.startStopOptions = selection.map(item => item.indexCategory);
+        this.codeOptions = selection.map(item => item.code);
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        if (this.indexCategoryDefaultVal) {
+          this.form.indexCategory = this.indexCategoryDefaultVal.dictValue;
+        }
+
+        if (this.unitDefaultVal) {
+          this.form.unitId = this.unitDefaultVal.dictValue;
+        }
+
+        this.open = true;
+        this.title = "娣诲姞鎸囨爣淇℃伅";
+      },
+      /** 淇敼鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        // const indexId = row.indexId || this.ids;
+        // getEnergyindex(indexId).then(response => {
+        //   this.form = response.data;
+        //   this.open = true;
+        //   this.title = "淇敼" + response.data.name + "鎸囨爣淇℃伅";
+        // });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitForm: function () {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.indexId !== undefined) {
+              updateEnergyindex(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇敼鎴愬姛");
+                  this.open = false;
+                  this.getList(this.currentNode);
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              addEnergyindex(this.currentNode.id, this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("鏂板鎴愬姛");
+                  this.open = false;
+                  this.getList(this.currentNode);
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+      handleDelete(row) {
+        const indexIds = row.indexId || this.ids;
+        const indexNames = row.name || this.names;
+        this.$confirm('鏄惁纭鍒犻櫎鎸囨爣鍚嶄负"' + indexNames + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return delEnergyindex(indexIds);
+        }).then(() => {
+          this.getList(this.currentNode);
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function () {
+        });
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋寚鏍囦俊鎭暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportEnergyindex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      //淇濆瓨
+      save (row) {
+        this.$refs["form"].validate((valid,model)=>{
+          const indexId = row.indexId || this.ids;
+        })
+      },
+      updateStateBtn(flag){
+        let stateName = "";
+        if("1"==flag){
+          stateName = "鍚姩"
+        }else {
+          stateName = "鍋滄"
+        }
+        getSettingCount(this.ids).then(response => {
+          let unStartStopArrName = [];
+          let startStopArrIds = [];
+          for(let i =0;i<response.data.length;i++){
+            if(0==response.data[i]){
+              unStartStopArrName.push(this.codeOptions[i])
+            }else {
+              startStopArrIds.push(this.ids[i]);
+            }
+          }
+          if(unStartStopArrName.length>0){
+            var bh = unStartStopArrName.join("锛�");
+            this.$confirm('閫変腑瀛樺湪鏈缃檺鍊肩殑浠櫒璁惧'+bh+'锛屾殏鏃犳硶'+stateName+'锛�', "璀﹀憡", {
+              confirmButtonText: "纭畾",
+              cancelButtonText: "鍙栨秷",
+              type: "warning"
+            }).catch(function() {});
+          }else {
+            if(startStopArrIds.length>0) {
+              updateSet(startStopArrIds || "", flag).then(response => {
+                if (response.code === 200) {
+                  this.initstartstop();
+                  this.msgSuccess("鎴愬姛");
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        })
+      },
+      //棰勮缂栬緫
+      earlyWarning(e){
+        getSetting(e.indexId).then(response => {
+          this.settingModel.resposeList = response.data;
+          var data = {};
+          if("鍚姩"==e.indexCategory){
+            this.settingModel.stateById ="1";
+          }else if("鍋滄"==e.indexCategory){
+            this.settingModel.stateById ="2";
+          }else {
+            this.settingModel.stateById ="";
+          }
+          for(let j = 0;j<this.settingModel.timeSlotOptions.length;j++){
+            if("瀹炴椂"!=this.settingModel.timeSlotOptions[j].dictLabel){
+              for(let i = 0;i<this.settingModel.limitTypeOptions.length;i++){
+                data = {
+                  indexId:e.indexId,
+                  //鏃舵鍚嶇О
+                  timeSlotName:this.settingModel.timeSlotOptions[j].dictLabel,
+                  //鏃舵鍊�
+                  timeSlotVal:this.settingModel.timeSlotOptions[j].dictValue,
+                  //闄愬�肩被鍨嬪悕绉�
+                  limitTypeName:this.settingModel.limitTypeOptions[i].limitName,
+                  //闄愬�肩被鍨嬪��
+                  limitTypeVal:this.settingModel.limitTypeOptions[i].limitCode,
+                  //闄愬�肩殑鍊�
+                  limitVal:"",
+                  //涓婚敭
+                  id:"",
+                  //鍚仠鐘舵��
+                  state:this.settingModel.stateById,
+                  //鎶ヨ闄愬埗绫诲瀷
+                  alarmType:this.settingModel.limitTypeOptions[i].alarmType,
+                  //nodeid
+                  nodeId:this.currentNode.id
+                }
+                this.settingModel.settingOptions.push(data);
+              }
+            }else {
+              continue;
+            }
+          }
+          let a = this.settingModel.settingOptions;
+          let b = this.settingModel.resposeList;
+          for(let j = 0;j<a.length;j++){
+            for(let i in b){
+              if(a[j].timeSlotVal==b[i].timeSlot&&a[j].limitTypeVal==b[i].limitType){
+                a[j].limitVal =  b[i].limitVal;
+              }
+            }
+          }
+          this.settingModel.open=true;
+          this.settingModel.title = "鎸囨爣缂栧彿锛�"+e.code;
+        });
+      },
+      //琛ㄥ崟鎻愪氦
+      settingSubmitForm(){
+        this.$refs["alarmSetForm"].validate(valid => {
+          if (valid) {
+            updateDialogForm(this.settingModel.settingOptions||"").then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                // this.getList();
+                this.settingModel.settingOptions=[];
+                this.settingModel.open=false;
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+            this.settingModel.open=false;
+          }
+        });
+      },
+      yjSetCancel(){
+        this.settingModel.open=false;
+        this.settingModel.settingOptions=[];
+      },
+      arraySpanMethod({ row, column, rowIndex, columnIndex }){
+        if (columnIndex === 0) {
+          if (rowIndex % this.hbCount === 0) {
+            return {
+              rowspan: this.hbCount,
+              colspan: 1
+            };
+          } else {
+            return {
+              rowspan: 0,
+              colspan: 0
+            };
+          }
+        }
+      },
+      closeYjDialog(){
+        this.settingModel.settingOptions = [];
+        return false;
+      },
+      // 瀛楀吀缈昏瘧
+      typeFormat(row, column) {
+        return this.selectDictLabel(this.settingModel.alarmTypeOptions, row.alarmType);
+      },
+    }
+  };
+</script>
+<style>
+  .item-style .el-form-item__content{
+    margin-left: 0px!important;
+  }
+</style>
diff --git a/energy_management_ui/src/views/basicSetup/equipmentfile/configure.vue b/energy_management_ui/src/views/basicSetup/equipmentfile/configure.vue
new file mode 100644
index 0000000..0a835bc
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/equipmentfile/configure.vue
@@ -0,0 +1,205 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <div slot="header" class="clearfix">
+      <el-button style="float: right; padding: 8px; margin-left:8px" type="text"
+                 icon="el-icon-setting"
+                 @click="saveSetting">
+        淇濆瓨閰嶇疆
+      </el-button>
+      <el-button style="float: right; padding: 8px; margin-left:8px" type="text"
+                 icon="el-icon-setting"
+                 @click="reset()">
+        閲嶆柊閫夋嫨搴曞浘
+      </el-button>
+    </div>
+    <el-row>
+      <el-col :span="18">
+        <el-upload
+            v-if="filePath==='绌鸿妭鐐�'"
+            class="configure-upload"
+            drag
+            ref="upload"
+            :limit="1"
+            :headers="uploadData.headers"
+            :action="uploadData.url"
+            :with-credentials="true"
+            :on-success="handleFileSuccess"
+            :show-file-list="false">
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        </el-upload>
+        <div id="svgHtml" v-if="filePath !== '绌鸿妭鐐�'">
+          <div v-html="svgHtml"/>
+        </div>
+      </el-col>
+      <el-col :span="6" style="height: calc(100vh - 165px); overflow: auto">
+        <el-table :data="tags" border>
+          <el-table-column label="鍙傛暟" align="center" prop="param"/>
+          <el-table-column label="閲囬泦鐐�" align="center" prop="tag">
+            <template slot-scope="scope">
+              <el-autocomplete popper-class="my-autocomplete"
+                               v-model="scope.row['tag']"
+                               :fetch-suggestions="querySearch"
+                               placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�">
+                <template slot-scope="{ item }">
+                  <div class="name">{{ item.value }}</div>
+                  <span class="addr">{{ item.name }}</span>
+                </template>
+              </el-autocomplete>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+import {
+  getAllCollectTag,
+  getConfigure,
+  saveSetting,
+  updateEquipmentfile
+} from "@/api/basicSetup/equipmentfile";
+import {getToken} from "@/utils/auth";
+
+export default {
+  name: "ConfigureView",
+  data() {
+    return {
+      currentNode: '',
+      form: {
+        nodeId: '',
+        fileName: '',
+        svgType:''
+      },
+      filePath: '绌鸿妭鐐�',
+      svgHtml: '',
+      tags: [],
+      uploadData: {
+        headers: {
+          Authorization: "Bearer " + getToken()
+        },
+        url: process.env.VUE_APP_BASE_API + "/basicSetup/equipmentfile/upload"
+      },
+    }
+  },
+  methods: {
+    changeModelNode(modelNode) {
+      this.currentNode = modelNode;
+      this.filePath = '绌鸿妭鐐�';
+      getConfigure(modelNode.id).then(response => {
+        this.tags = [];
+        this.svgHtml = '';
+        if (response.code === 200) {
+          if (response.data) {
+            this.filePath = process.env.VUE_APP_BASE_API + response.data.filePath;
+            this.tags = response.data.infoList;
+            this.getSvg();
+          }
+        } else {
+          this.msgError(response.msg);
+        }
+      });
+    },
+    // 鍒濆鍖杝vg
+    getSvg() {
+      /* 鍒涘缓xhr瀵硅薄 */
+      const xhr = new XMLHttpRequest();
+      xhr.open("GET", this.filePath, true);
+      xhr.send();
+      /* 鐩戝惉xhr瀵硅薄 */
+      xhr.addEventListener("load", () => {
+        this.svgHtml = xhr.responseText;
+        let values = xhr.responseXML.getElementsByTagName('text');
+        let tagTemps =[];
+        for (let i = 0; i < values.length; i++) {
+          if (values[i].getAttribute("id") != undefined)
+            tagTemps.push({
+              "param": values[i].textContent,
+              "tag": "",
+              "tagType":"COLLECT"
+            });
+        }
+        console.log(this.tags.length,tagTemps.length);
+        if (this.tags.length === 0 || this.tags.length!=tagTemps.length) {
+          this.tags=[];
+          this.tags=tagTemps;
+          console.log("222",this.tags.length,tagTemps.length);
+        }
+      });
+    },
+    //涓婁紶鎴愬姛鍚�
+    handleFileSuccess(response, file, fileList) {
+      if (response.code === 200) {
+        this.$refs.upload.clearFiles();
+        this.form.nodeId = this.currentNode.id;
+        this.form.filePath = response.msg;
+        this.form.svgType = 'COLLECT';
+        updateEquipmentfile(this.form).then(result => {
+          if (result.code === 200) {
+            this.filePath = process.env.VUE_APP_BASE_API + response.msg;
+            this.tags=[];
+            this.getSvg();
+          } else {
+            this.msgError(result.msg);
+          }
+        });
+      } else {
+        this.msgError(response.msg);
+      }
+    },
+    querySearch(queryString, cb) {
+      if (queryString) {
+        getAllCollectTag({codeOrName: queryString, indexType: 'COLLECT'}).then(response => {
+          // 璋冪敤 callback 杩斿洖寤鸿鍒楄〃鐨勬暟鎹�
+          let result = response.data;
+          let values = [];
+          result.forEach(item => {
+            values.push({
+              value: item.code,
+              name: item.name
+            })
+          });
+          cb(values);
+        });
+      }
+    },
+    saveSetting() {
+      saveSetting(this.currentNode.id, this.tags).then(response => {
+        if (response.code === 200) {
+          this.$message.success(response.msg);
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    reset() {
+      this.filePath = '绌鸿妭鐐�';
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.el-autocomplete {
+  width: 100%;
+}
+
+.my-autocomplete li {
+  line-height: normal;
+  padding: 7px;
+}
+
+.my-autocomplete li .name {
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+
+.my-autocomplete li .addr {
+  font-size: 12px;
+  color: #b4b4b4;
+}
+
+.my-autocomplete li .highlighted .addr {
+  color: #ddd;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicSetup/equipmentfile/configureChart.vue b/energy_management_ui/src/views/basicSetup/equipmentfile/configureChart.vue
new file mode 100644
index 0000000..60a040c
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/equipmentfile/configureChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div>
+    <el-row type="flex">
+      <el-col :style="{width:isCollapse?'0px': '280px',position:'relative',display:'none'}" v-show="!isCollapse">
+        <basic-container title="绯荤粺鍥�" :bodyStyle="bodyStyle">
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"/>
+        </basic-container>
+        <img src="~@/assets/image/rectangle.png" alt=""
+             class="shrink-col-block"
+             @click="toggleCollapse">
+      </el-col>
+      <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+      <!--      <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">     -->
+      <el-col>
+        <basic-container :bodyStyle="bodyStyleRight">
+          <el-tabs @tab-click="handleClick" style="width: 100%;height: 100%">
+            <el-tab-pane style="width: 100%;height: 100%">
+              <span slot="label"><i class="el-icon-pie-chart"></i> 绯荤粺鍥�</span>
+              <ConfigureChartView ref="configureChartView"/>
+            </el-tab-pane>
+            <el-tab-pane>
+              <span slot="label"><i class="el-icon-pie-chart"></i> 鏁版嵁鍒楄〃</span>
+              <DataList ref="dataList"></DataList>
+            </el-tab-pane>
+            <el-tab-pane name="third">
+              <span slot="label"><i class="el-icon-pie-chart"></i> 瓒嬪娍鍥�</span>
+              <trend-line-chart ref="trendLineChart"></trend-line-chart>
+            </el-tab-pane>
+          </el-tabs>
+        </basic-container>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+import ModelNode from '../../basicsetting/modelNode/modelNode'
+import HistoryAlarmNote from '../../energyAlarm/historicalAlarm/historyAlarmNote'
+import ConfigureChartView from './view'
+import DataList from './dataList'
+import {getConfigure} from '@/api/basicSetup/equipmentfile'
+import realTimeIndex from '../../energyStatistics/energyStatisticsTrend/realTimeIndex'
+import TrendLineChart from './trendLineChart'
+import mixins from '@/layout/mixin/getHeight'
+import ShrinkCol from '@/components/shrink/index.vue'
+
+export default {
+  components: {DataList, ConfigureChartView, ModelNode, HistoryAlarmNote, realTimeIndex, TrendLineChart, ShrinkCol},
+  created() {
+    this.modelCode = this.$route.query.modelCode
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelCode: undefined,
+      activeName: '',
+      isCollapse: false,
+      bodyStyleRight: {}
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + 'px'
+      this.bodyStyleRight = {
+        height: window.innerHeight - 100 + 'px'
+      }
+    },
+    changeNode(node) {
+      console.log('changeNode', node)
+      // this.modelCode = node.id
+      this.$refs.configureChartView.show(node.id)
+      getConfigure(node.id).then(response => {
+        if (response.code === 200) {
+          let tagCodes = []
+          if (response.data) {
+            response.data.infoList.forEach(tag => {
+              tagCodes.push(tag.tag)
+            })
+          }
+          this.$refs.dataList.show(tagCodes)
+        } else {
+          this.msgError(response.msg)
+        }
+      })
+      this.$refs.trendLineChart.modelNodeChange(node.id)
+      //}
+    },
+    handleClick(tab, event) {
+      this.activeName = tab.name
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+ ::v-deep .el-tabs__content {
+  overflow: auto;
+  height: 96%;
+  width: 100%;
+}
+
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicSetup/equipmentfile/dataList.vue b/energy_management_ui/src/views/basicSetup/equipmentfile/dataList.vue
new file mode 100644
index 0000000..5e4dc5f
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/equipmentfile/dataList.vue
@@ -0,0 +1,121 @@
+<template>
+  <div class="dataList-right">
+    <el-table
+        :data="tagValues"
+        border
+        :height="height"
+        ref="table"
+    >
+      <el-table-column
+          prop="tagName"
+          align="center"
+          label="鎸囨爣鍚嶇О">
+      </el-table-column>
+      <el-table-column
+          prop="meteName"
+          align="center"
+          label="琛ㄥ叿鍚嶇О">
+      </el-table-column>
+      <el-table-column
+          prop="value"
+          align="center"
+          label="閲囬泦鍊�">
+        <template slot-scope="scope">
+          <span v-html="showValue(scope.row['value'])"></span>
+        </template>
+      </el-table-column>
+      <el-table-column
+          prop="unitId"
+          align="center"
+          :formatter="unitIdFormat"
+          label="鍗曚綅">
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import {getLiveData} from "@/api/basicSetup/equipmentfile";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "DataList",
+  props: ["indexCodes"],
+  mixins: [mixins],
+  created() {
+    if (this.$props.indexCodes) {
+      this.tagCodes = this.$props.indexCodes;
+    }
+
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+  },
+  data() {
+    return {
+      tagValues: [],
+      tagCodes: [],
+      timer: null,
+      unitIdOptions: [],
+      height: null
+    }
+  },
+  mounted() {
+    clearInterval(this.timer);
+    this.refreshData()
+  },
+  beforeDestroy() {
+    clearInterval(this.timer)
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 240
+    },
+    show(tagCodes) {
+      this.tagValues = [];
+      this.tagCodes = tagCodes;
+      this.refresh();
+    },
+    refreshData() {
+      this.timer = setInterval(() => {
+        this.refresh();
+      }, 3000);
+    },
+    refresh() {
+      let that = this
+      this.$nextTick(() => {
+        that.$refs.table.doLayout()
+      })
+      if (this.tagCodes.length === 0) {
+        return;
+      }
+
+      getLiveData(this.tagCodes).then(response => {
+        if (response.code === 200) {
+          this.tagValues = response.data;
+          this.$nextTick(() => {
+            that.$refs.table && that.$refs.table.doLayout()
+          })
+        }
+      });
+    },
+    showValue(value) {
+      if (value) {
+        return value.toFixed(2);
+      }
+      return '';
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.unitId);
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.dataList-right {
+  height: 100%;
+  overflow: hidden;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicSetup/equipmentfile/index.vue b/energy_management_ui/src/views/basicSetup/equipmentfile/index.vue
new file mode 100644
index 0000000..28c1989
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/equipmentfile/index.vue
@@ -0,0 +1,70 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="缁勬�佸浘閰嶇疆" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode"
+                   :modelCode="modelCode"
+                   :showOpt="false"/>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :title="currentNode ? currentNode.label+'--鑺傜偣閰嶇疆' : '鑺傜偣閰嶇疆'" :bodyStyle="bodyStyleRight">
+        <ConfigureView ref="configureView"/>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+  import ConfigureView from "./configure";
+  import mixins from "@/layout/mixin/getHeight";
+  import ShrinkCol from '@/components/shrink/index.vue'
+
+  export default {
+    components: {ConfigureView, ModelNode,ShrinkCol},
+    created() {
+      this.modelCode = this.$route.query.modelCode;
+    },
+    mixins: [mixins],
+    data() {
+      return {
+        modelCode: undefined,
+        isCollapse: false,
+        bodyStyleRight: {},
+        currentNode:''
+      }
+    },
+    methods: {
+      setCharts() {
+        this.bodyStyle.height = window.innerHeight - 155 + 'px';
+        this.bodyStyleRight = {
+          ...this.bodyStyle,
+          height: window.innerHeight - 155 + 'px'
+        };
+      },
+      changeNode(node) {
+        if (node) {
+          this.currentNode = node;
+        }
+        this.$refs.configureView.changeModelNode(node);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicSetup/equipmentfile/tableDialog.vue b/energy_management_ui/src/views/basicSetup/equipmentfile/tableDialog.vue
new file mode 100644
index 0000000..1474e0a
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/equipmentfile/tableDialog.vue
@@ -0,0 +1,98 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-date-picker
+        style="margin-right: 5px"
+        v-model="time"
+        type="datetime"
+        format="yyyy-MM-dd HH"
+        :clearable="false"
+        popper-class="pickerDeleteMinutes"
+        @change="changeTime"
+    >
+    </el-date-picker>
+    <el-button type="primary" icon="el-icon-search" size="mini" @click="historyDataSelect">鏌ヨ</el-button>
+    <div style="margin:10px 5px 20px 0;color:#9e9a9a;font-size: 12px">鏍煎紡锛氬勾-鏈�-鏃� 鏃�</div>
+    <el-table
+        ref="dataTable"
+        :data="tableData"
+        border
+        height="300px"
+    >
+      <el-table-column
+          prop="dataTime"
+          align="center"
+          label="鏃ユ湡">
+      </el-table-column>
+      <el-table-column
+          prop="value"
+          align="center"
+          label="褰撳墠鍊�">
+      </el-table-column>
+      <el-table-column
+          prop="unitId"
+          align="center"
+          label="鍗曚綅">
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+import { getRealTimeTableData } from '@/api/energyAlarm/realTimeAlarm/liveHistoryAssembly'
+import moment from 'moment'
+
+let timers
+export default {
+  props: ['code', 'open'],
+  data() {
+    return {
+      tableData: [],
+      time: null
+    }
+  },
+  watch: {
+    open: {
+      immediate: true,
+      handler(val) {
+        this.time = val ? new Date() : null
+        val && this.historyDataSelect()
+        timers = val ? setInterval(this.setTimer, 50) : clearInterval(timers)
+      }
+    }
+  },
+  beforeDestroy() {
+    // 椤甸潰閿�姣佹椂 瑕佸仠姝㈣鏃跺櫒锛屽惁鍒欓�夐」鍗″垏鎹㈣鏃跺櫒涓嶅仠姝紝浼氳秺鏉ヨ秺蹇紝澶氫釜绾跨▼
+    clearInterval(timers)
+  },
+  methods: {
+    setTimer() {
+      let that = this
+      this.$nextTick(() => {
+        that.$refs.dataTable && that.$refs.dataTable.doLayout()
+      })
+    },
+    changeTime() {
+      this.historyDataSelect()
+    },
+    historyDataSelect() {
+      getRealTimeTableData(this.code, moment(this.time).format('yyyy-MM-DD HH')).then((res) => {
+        if (res.code === 200) {
+          this.tableData = res.data
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss">
+.pickerDeleteMinutes {
+  .el-scrollbar:nth-of-type(2) {
+    display: none !important;
+  }
+
+  .el-time-spinner {
+    text-align: center;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/basicSetup/equipmentfile/trendLineChart.vue b/energy_management_ui/src/views/basicSetup/equipmentfile/trendLineChart.vue
new file mode 100644
index 0000000..794c3c4
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/equipmentfile/trendLineChart.vue
@@ -0,0 +1,376 @@
+<template>
+  <div class="trendLineChart-right">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form"
+             style="margin-bottom: 20px">
+      <el-select v-model="value" placeholder="璇烽�夋嫨" style="width: 120px">
+        <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+        </el-option>
+      </el-select>
+      <el-form-item label="" prop="minute" :rules="rules.numRule">
+        鏈�鏂�
+        <el-input v-model="queryParams.minute" :min="1" :max="120" style="width: 120px" type="number"></el-input>
+        鍒嗛挓
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="tableStyle" v-if="value=='tableOpen'">
+      <el-table :data="tableData" ref="dataTable" border style="margin-top: 20px"
+                :height="height"
+                @selection-change="handleSelectionChange">
+        <el-table-column type="selection" align="center"></el-table-column>
+        <el-table-column prop="statusName" align="center" label="鍧愭爣杞�">
+          <template slot-scope="scope">
+            <el-select
+                v-model="scope.row.yValue"
+                @change="selectNumber(scope.row,scope.$index)"
+            >
+
+              <el-option
+                  v-for="(item,index) in addTableSelect"
+                  :key="item.yValue"
+                  :label="item.yLable"
+                  :value="item.yValue"
+              ></el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column
+            prop="meteName"
+            align="center"
+            label="琛ㄥ叿鍚嶇О">
+        </el-table-column>
+        <el-table-column prop="indexName" align="center" label="鐐逛綅鍚嶇О"/>
+        <el-table-column prop="indexUnit" align="center" label="鍗曚綅" :formatter="unitFormat"/>
+        <el-table-column prop="value" align="center" label="褰撳墠鍊�">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" width="200">
+          <template slot-scope="scope">
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="openDialog(scope.row,'line')">瓒嬪娍鍥�
+            </el-button>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="openDialog(scope.row,'table')">鏁版嵁
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <component ref="lincharVue" :is="vuename" :chart-data="liveLineChartData" style="margin-top: 20px"></component>
+    <!--鍘嗗彶鏇茬嚎dialog-->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" :close-on-click-modal="false" @close="closeDialog">
+      <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+        <history-alarm-view ref="historyAlarmView" :code="code" :activeName="activeName" v-if="dialogType==='line'"/>
+        <TableDialog :code="code" v-else :open="open"/>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancelDialog">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getTrendSettingIndexLineData,
+  getSvgTrendSettingIndex
+} from '@/api/dataMonitoring/realTimeTrend/realTimeTrend'
+import historyAlarmView from '../../energyAlarm/realTimeAlarm/historyAlarmView'
+import mixins from '@/layout/mixin/getHeight'
+import TableDialog from './tableDialog'
+
+let timers
+export default {
+  name: 'energyIndex',
+  components: {
+    lincharVue: () => import('../../dataMonitoring/realTimeTrend/LineChart.vue'),
+    historyAlarmView,
+    TableDialog
+  },
+  mixins: [mixins],
+  data() {
+    const checkNum = (rule, value, callback) => {
+      let reg = /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/
+      if ('' === value && !reg.test(value)) {
+        callback(new Error('鍒嗛挓闇�鏁板瓧骞朵笖涓嶈兘涓虹┖'))
+      } else if (0 > value || 120 < value) {
+        callback(new Error('鏁板瓧鑼冨洿1~120鐨勬鏁存暟'))
+      } else {
+        callback()
+      }
+    }
+    return {
+      value: 'tableOpen',
+      yValue: '',
+      minute: undefined,
+      count: undefined,
+      pickerOptions: {
+        /*  value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],*/
+      },
+      timeArr: [],
+      deviceCategory: undefined,
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      dateRange: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 10,
+      // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+      List: [],
+      energyindexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: null,
+      dialogType: null,
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      indexIdOptions: [],
+      // 鎸囨爣鍚嶇О瀛楀吀
+      nameOptions: [],
+      // 鎸囨爣缂栫爜瀛楀吀
+      codeOptions: [],
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+      indexCategoryOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 鍗曚綅瀛楀吀
+      unitIdOptions: [],
+      queryParams: {
+        minute: undefined,
+        nodeId: undefined,
+        //鎸囨爣index
+        indexType: 'COLLECT',
+        params: [{
+          'minute': undefined,
+          'count': undefined
+        }]
+      },
+      tableData: [],
+      lineData: [],
+      //閫変腑code
+      codes: [],
+      // //閫変腑鎸囨爣鍚嶇О
+      indexNames: [],
+      datas: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        numRule: [
+          { type: 'number', validator: checkNum, trigger: 'change' }
+        ]
+      },
+      options: [{
+        value: 'tableOpen',
+        label: '鍙傛暟鎵撳紑'
+      }, {
+        value: 'tableClose',
+        label: '鍙傛暟鏀剁缉'
+      }],
+      addTableSelect: [],
+      liveLineChartData: {
+        datas: [],
+        legendArr: [],
+        timeList: [],
+        legendNameArr: []
+      },
+      selectYaxis: [],
+      activeName: 'second',
+      code: undefined,
+      rows: [],
+      //鍗曚綅
+      unitOptions: [],
+      currentNode: undefined,
+      indexCategoryDefaultVal: undefined,
+      unitDefaultVal: undefined,
+      intervalTime: undefined,
+      timer: undefined,
+      vuename: '',
+      height: null
+    }
+  },
+  created() {
+    this.getConfigKey('dataMonitoring.realTimeTrend.pastMinute').then(response => {
+      this.queryParams.minute = response.msg
+    })
+    this.getConfigKey('dataMonitoring.realTimeTrend.piontCount').then(response => {
+      this.count = response.msg
+    })
+    this.getDicts('sys_unit').then(response => {
+      this.unitOptions = response.data
+    })
+  },
+  mounted() {
+    clearInterval(this.timer)
+    clearInterval(timers)
+    timers = setInterval(this.setTimer, 50)
+    this.getConfigKey('dataMonitoring.realTimeTrend.intervalTime').then(response => {
+      if (response.code === 200) {
+        this.intervalTime = response.msg
+        this.timer = setInterval(this.getLineDataList, this.intervalTime)
+      }
+    })
+  },
+  beforeDestroy() {
+    // 椤甸潰閿�姣佹椂 瑕佸仠姝㈣鏃跺櫒锛屽惁鍒欓�夐」鍗″垏鎹㈣鏃跺櫒涓嶅仠姝紝浼氳秺鏉ヨ秺蹇紝澶氫釜绾跨▼
+    clearInterval(this.timer)
+    clearInterval(timers)
+  },
+  methods: {
+    setTimer() {
+      let that = this
+      this.$nextTick(() => {
+        that.$refs.dataTable && that.$refs.dataTable.doLayout()
+      })
+    },
+    setCharts() {
+      this.height = window.innerHeight - 300 + 'px'
+    },
+    modelNodeChange(modelNode) {
+      this.queryParams.nodeId = modelNode
+      this.getList()
+      this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null
+      if (modelNode) {
+        this.currentNode = modelNode
+      }
+      if (this.$refs.lincharVue != undefined && this.$refs.lincharVue != null) {
+        this.$refs.lincharVue.closeLineChar()
+      }
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList() {
+      this.$refs['queryForm'].validate(valid => {
+        if (valid) {
+          this.loading = true
+          var search = this.queryParams
+          search.params[0].minute = this.queryParams.minute
+          search.params[0].count = this.count
+          //琛ㄦ牸鏁版嵁
+          getSvgTrendSettingIndex(search).then(response => {
+            this.tableData = response.data
+            this.total = response.total
+            this.addTableSelect = []
+            //琛ㄦ牸涓嬫媺閫夋嫨
+            for (let j = 0; j < 5 && j < this.tableData.length; j++) {
+              let optionItem = {
+                yValue: 'y' + j,
+                yLable: 'Y' + j
+              }
+              this.addTableSelect.push(optionItem)
+            }
+            this.loading = false
+          })
+        }
+      })
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    getTime() {
+      //鏄剧ず鏃堕棿
+      //this.timeArr = [this.startTime,this.endTime];
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.drawChars(selection)
+      // if(selection.length > 1){  //鍗曢�夋椂涓�1锛岄渶瑕侀�夋嫨n椤规敼鏁板�间负n灏卞彲浠�
+      //   this.$refs.dataTable.toggleRowSelection(selection[0],false);//瓒呭嚭鎸囧畾閫夋嫨涓暟鍚庯紝鎶婄涓�涓�変腑鐨剆election璁句负false
+      //   selection.splice(0,1);//鍚屾椂瑕佹妸閫変腑绗竴椤圭Щ闄�
+      // }
+    },
+    drawChars(selection) {
+      this.codes = selection.map(item => item.code)
+      this.indexNames = selection.map(item => item.indexName)
+      this.selectYaxis = selection.map(item => item.yValue ? item.yValue : '')
+      if (this.codes.length > 0) {
+        this.cleanLineData()
+        this.vuename = 'lincharVue'
+        this.getLineDataList()
+      } else {
+        this.cleanLineData()
+        if (this.$refs.lincharVue != undefined && this.$refs.lincharVue != null) {
+          this.$refs.lincharVue.closeLineChar()
+        }
+      }
+    },
+    getLineDataList() {
+      let that = this
+      this.$nextTick(() => {
+        that.$refs.dataTable.doLayout()
+      })
+      if (this.codes.length > 0) {
+        this.cleanLineData()
+        //鎶樼嚎鍥炬暟鎹�
+        getTrendSettingIndexLineData(this.codes, this.queryParams.minute, this.count).then(response => {
+          //鏁版嵁娣诲姞
+          this.liveLineChartData.datas = response.data
+          this.$nextTick(() => {
+            that.$refs.dataTable.doLayout()
+          })
+          // x杞存椂闂存坊鍔�
+          for (let i = 0; i < this.liveLineChartData.datas[0].length; i++) {
+            this.liveLineChartData.timeList.push(this.liveLineChartData.datas[0][i].showDataTime)
+          }
+          //鏇茬嚎鍚嶇О娣诲姞
+          this.liveLineChartData.legendNameArr = this.indexNames
+          this.liveLineChartData.legendArr = this.selectYaxis
+        })
+      }
+    },
+    selectNumber(row, index) {
+      let selection = this.$refs.dataTable.selection
+      this.drawChars(selection)
+    },
+    cleanLineData() {
+      this.liveLineChartData.legendArr = []
+      this.liveLineChartData.timeList = []
+      this.liveLineChartData.datas = []
+      this.liveLineChartData.legendNameArr = []
+    },
+    closeDialog() {
+      this.activeName = ''
+    },
+    openDialog(e, type) {
+      this.dialogType = type
+      if (e) {
+        this.code = e.code
+        this.open = true
+        this.activeName = 'second'
+        this.title = type === 'line' ? '鍘嗗彶鏇茬嚎鏌ヨ' : '鍘嗗彶鏁版嵁'
+      }
+    },
+    cancelDialog() {
+      this.open = false
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitFormat(row, column) {
+      return this.selectDictLabel(this.unitOptions, row.indexUnit)
+    }
+
+  }
+}
+
+</script>
+<style scoped lang="scss">
+.tableStyle .el-table__header-wrapper .el-checkbox {
+  display: none
+}
+
+.trendLineChart-right {
+  height: 100%;
+  overflow: hidden;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicSetup/equipmentfile/view.vue b/energy_management_ui/src/views/basicSetup/equipmentfile/view.vue
new file mode 100644
index 0000000..dc08043
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/equipmentfile/view.vue
@@ -0,0 +1,117 @@
+<template>
+  <div v-html="svgHtml"/>
+</template>
+
+<script>
+import {getConfigure, getLiveData} from "@/api/basicSetup/equipmentfile";
+
+export default {
+  props: ["nodeId"],
+  created() {
+    let nodeId = this.$props.nodeId;
+    if (nodeId) {
+      this.show(nodeId);
+    }
+  },
+  data() {
+    return {
+      svgHtml: null,
+      filePath: null,
+      tags: null,
+      tagCodes: [],
+      valueItems: null,
+      timer: null
+    }
+  },
+  mounted() {
+    clearInterval(this.timer);
+    this.refreshData()
+  },
+  methods: {
+    show(nodeId) {
+      console.log(nodeId)
+      this.tagCodes = [];
+      this.filePath = '';
+      getConfigure(nodeId).then(response => {
+        this.tags = [];
+        this.svgHtml = '';
+        if (response.code === 200) {
+          if (response.data) {
+            this.filePath = process.env.VUE_APP_BASE_API + response.data.filePath;
+            this.tags = response.data.infoList;
+            this.getSvg();
+            this.refresh();
+          }
+        } else {
+          this.msgError(response.msg);
+        }
+      });
+    },
+    getSvg() {
+      const xhr = new XMLHttpRequest();
+      xhr.open("GET", this.filePath, true);
+      xhr.send();
+      xhr.addEventListener("load", () => {
+        const resXML = xhr.responseXML;
+        let svgDom = resXML.documentElement.cloneNode(true);
+        let values = svgDom.getElementsByTagName('text');
+        for (let i = 0; i < values.length; i++) {
+          let tag = this.tags.filter(f => f.param === values[i].textContent);
+          if (tag && tag.length > 0) {
+            let tagCode = tag[0].tag;
+            values[i].textContent = '';
+            if (tagCode) {
+              values[i].setAttribute("id", tagCode);
+              this.tagCodes.push(tagCode)
+            }
+          }
+        }
+
+        let oSerializer = new XMLSerializer();
+        this.svgHtml = oSerializer.serializeToString(svgDom);
+      });
+    },
+    refreshData() {
+      this.timer = setInterval(() => {
+        this.refresh();
+      }, 3000);
+    },
+    refresh() {
+      if (this.tagCodes.length === 0) {
+        return;
+      }
+
+      getLiveData(this.tagCodes).then(response => {
+        if (response.code === 200) {
+          if (response.data) {
+            response.data.forEach(tagValue => {
+              let value = '';
+              if (tagValue.value) {
+                value = parseFloat(tagValue.value).toFixed(2);
+              } else {
+                value = "0";
+              }
+
+              let el = document.getElementById(tagValue.tagCode);
+              if (el) {
+                el.textContent = value;
+              }
+            });
+            //杩欏潡鏄崟鐙姞鐨� 鐢ㄦ潵澶勭悊 娌℃湁鎸囨爣鎴栬�呮寚鏍囨病鏈夌粨鏋滅殑 閮借缃�0
+            let allText = document.getElementsByTagName("text");
+            for (let i = 0; i < allText.length; i++) {
+              // console.log(i + "textContent=" + allText[i].textContent);
+              if (allText[i].textContent == null || allText[i].textContent == "") {
+                allText[i].textContent = "0";
+              }
+            }
+          }
+        }
+      });
+    }
+  },
+  beforeDestroy() {
+    clearInterval(this.timer)
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/basicSetup/parameters/basicIndex.vue b/energy_management_ui/src/views/basicSetup/parameters/basicIndex.vue
new file mode 100644
index 0000000..d4fd5c9
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/parameters/basicIndex.vue
@@ -0,0 +1,344 @@
+<style scoped lang="scss">
+  .el-header {
+    background-color: #B3C0D1;
+    color: #333;
+    line-height: 60px;
+  }
+
+  .el-aside {
+    color: #333;
+  }
+
+  .el-scrollbar .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+</style>
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <el-row :gutter="20">
+          <el-col :span="16">
+            <div class="grid-content bg-purple">{{titleName}} 鈥斺�� 璁捐</div>
+          </el-col>
+          <el-col :span="7">
+            <div class="grid-content bg-purple">
+              <el-button type="button" plain @click="addTable">鏂板琛ㄦ牸</el-button>
+              <el-button type="primary" @click="submitForm">淇� 瀛�</el-button>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+      <el-container>
+        <el-main><!---->
+          <div class="demo-input-size">
+            <el-form refs="form" :model="form" >
+              <template v-for='(config,tableIndex) in configInfos' >
+                <el-row :gutter="20">
+                  <el-col :span="6">
+                    <el-form-item prop="title">
+                      <el-input style="border: 0" v-model="config.tableName"></el-input>
+                    </el-form-item>
+                  </el-col>
+                  <el-col :span="18">
+                    <div class="grid-content bg-purple">
+                      <el-button type="button" plain @click="addRow(tableIndex)">澧炲姞琛�</el-button>
+                      <el-button type="button" plain @click="addColumn(tableIndex)">澧炲姞鍒�</el-button>
+                      <el-button type="button" plain @click="deleteTable(tableIndex)">鍒犻櫎琛ㄦ牸</el-button>
+                    </div>
+                  </el-col>
+                </el-row>
+                <el-table :data="config.tableRow" ref="multipleTable" tooltip-effect="dark" style="width: 100%;margin-bottom: 20px" border @header-click="deleteCol" @cell-dblclick="showPTable2"  :row-class-name="tableRowClassName">
+                  <template v-for='(col,columnIndex) in config.tableColumn'>
+                    <el-table-column :show-overflow-tooltip="true" :prop="col.item" :label="col.name" :key="col.item" :index="tableIndex" :type="numToStr(columnIndex)" :current-row-key="2">
+                      <template scope="scope">
+                        <el-input size="mini" v-model="scope.row[col.item]" v-if="columnIndex===0" ></el-input>
+                        <el-input size="mini" v-model="scope.row[col.item]" v-if="columnIndex !=0" ref="nav" style="width: 80%"></el-input>
+                        <!--<el-button v-if="columnIndex !=0" @click.native.prevent="collectIndexSetting(columnIndex,tableIndex,scope.$index)" style="width: 100px">閫夋嫨</el-button>-->
+                      </template>
+                    </el-table-column>
+                  </template>
+                  <el-table-column fixed="right" label="鎿嶄綔">
+                  <template slot-scope="scope">
+                    <el-button @click.native.prevent="deleteRow(tableIndex,scope.$index)" size="small"> 绉婚櫎 </el-button>
+                  </template>
+                </el-table-column>
+                </el-table>
+              </template>
+            </el-form>
+          </div>
+        </el-main>
+      </el-container>
+    </el-card>
+    <!--鏂板鍒楀悕绉�-->
+    <el-dialog :title="title" :visible.sync="dialogFormVisible" width="300px">
+      <el-form :model="forms" label-width="80px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="鍒楀悕绉�" prop="column">
+              <el-input v-model="forms.column"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitColumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+    <el-drawer title="閫夋嫨閲囬泦鎸囨爣" :visible.sync="collectIndexDialog" direction="rtl"
+               size="55%"> <!--@open="showCollectIndexDialog"-->
+      <StatisticIndexSetting ref="collectIndexSetting" indexType="COLLECT" @statisticIndexConfirmSelect="collectIndexConfirmSelect"></StatisticIndexSetting>
+    </el-drawer>
+  </div>
+</template>
+<script>
+  import {listParameters, getParameters, getAllCollectTag, updateParameters} from "@/api/basicSetup/parameters";
+  /*import CollectIndexSetting from "../../basicsetting/nodeSetting/collectIndexSetting"*/;
+  import {setNodeToIndex} from '@/api/basicsetting/modelNode'
+  /*import StatisticIndexSetting from "../../basicsetting/nodeSetting/statisticIndexSetting";*/
+  import StatisticIndexSetting from "./standard_statistic";
+  export default {
+    name: 'basicIndex',
+    components: {StatisticIndexSetting},
+    data() {
+      return {
+        // 缃╁眰閬�
+        loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // parameters琛ㄦ牸鏁版嵁
+        parametersList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        opens: false,
+        dialogFormVisible: false,
+        collectIndexDialog: false,
+        codeOptions: [],
+        // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀
+        dataTypeOptions: [],
+        // 鏄惁鏄剧ず鎶ヨ瀛楀吀
+        showAlarmOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          id: undefined,
+          name: undefined,
+          code: undefined,
+          categoryName: undefined,
+          categoryCode: undefined,
+          dataType: undefined,
+          showAlarm: undefined
+        },
+        titleName: "",
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        forms:{},
+        i: -1,
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          id: [{required: true, message: "鏄惁鏄剧ず鎶ヨ涓嶈兘涓虹┖", trigger: "blur"}],
+          name: [{required: true, message: "鏍囧噯鍙傛暟绫诲埆鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}],
+        },
+        configInfos: [],
+        tableInfos:{},
+        settingCollectIndexList: [],
+        row_number:"",
+        table_number:"",
+        column_number:"",
+        currentNode:"",
+      };
+    },
+    created() {},
+    methods: {
+      tableRowClassName ({row, rowIndex}) {
+       //鎶婃瘡涓�琛岀殑绱㈠紩鏀捐繘row
+        row.index = rowIndex;
+      },
+      showPTable2(row, column){
+        if(column.type>0){
+          let key = column.property;
+          this.row_number=row.index;
+          this.table_number=column.index
+          this.column_number=key
+          this.collectIndexDialog = true;
+          this.$nextTick(() => {
+            this.$refs.collectIndexSetting.init(this.queryParams.id, this.settingCollectIndexList);
+          })
+
+        }
+      },
+      collectIndexConfirmSelect(selectedIndex) {
+        //this.settingCollectIndexList = selectedIndex[0];
+        console.log(selectedIndex)
+        this.configInfos[this.table_number].tableRow[this.row_number][this.column_number] = selectedIndex.code;
+        /*let indexIds = selectedIndex.indexId
+        setNodeToIndex(this.queryParams.id, indexIds, "COLLECT").then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });*/
+      },
+      getList(data) {
+        this.titleName = data.label;
+        this.queryParams.id = data.id;
+        this.currentNode=data;
+        this.loading = true;
+        this.configInfos=[];
+        listParameters(this.queryParams).then(response => {
+          this.parametersList = response.rows;
+          if(this.parametersList.length >0){
+            if(this.parametersList[0].configInfo =="null" ||this.parametersList[0].configInfo==null ||this.parametersList[0].configInfo==""){
+              this.configInfos=[];
+            }else{
+              this.configInfos=JSON.parse(this.parametersList[0].configInfo);
+            }
+          }
+          this.loading = false;
+        });
+      },
+      // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀缈昏瘧
+      dataTypeFormat(row, column) {
+        return this.selectDictLabel(this.dataTypeOptions, row.dataType);
+      },
+      // 鏄惁鏄剧ず鎶ヨ瀛楀吀缈昏瘧
+      showAlarmFormat(row, column) {
+        return this.selectDictLabel(this.showAlarmOptions, row.showAlarm);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.opens = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          name: undefined,
+          configInfo: undefined,
+          remark: undefined,
+          code: undefined,
+          dataType: undefined,
+          showAlarm: undefined,
+          column: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        //this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.id)
+        this.single = selection.length != 1
+        this.multiple = !selection.length
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        this.open = true;
+        this.title = "娣诲姞鏍囧噯鍙傛暟";
+      },
+      dialogTable() {
+        this.reset();
+        this.opens = true;
+        this.title = "娣诲姞鎸囨爣";
+      },
+      /** 淇敼鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        const id = row.id || this.ids
+        getParameters(id).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "淇敼鏍囧噯鍙傛暟";
+        });
+      },
+      /** 淇濆瓨鎸夐挳 */
+      submitForm: function () {
+        this.form.id=this.queryParams.id;
+        this.form.name=this.titleName;
+        if (this.form.id != undefined) {
+          this.form.configInfo= JSON.stringify(this.configInfos);
+          updateParameters(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("淇濆瓨鎴愬姛");
+              this.getList(this.currentNode);
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+        }
+      },
+      //娣诲姞琛ㄦ牸
+      addTable: function () {
+        let tableConfig = {
+          tableName: '',
+          tableRow: [],
+          tableColumn: []
+        };
+        this.configInfos.push(tableConfig);
+      },
+      addRow: function (tableIndex) {
+        let tableInfo = this.configInfos[tableIndex];
+        let row = {};
+        for (let i = 0; i < tableInfo.tableColumn.length; i++) {
+          row[tableInfo.tableColumn[i].item] = '';
+        }
+        tableInfo.tableRow.push(row);
+      },
+      deleteRow: function (tableIndex, rowIndex) {
+        let tableInfo = this.configInfos[tableIndex];
+        tableInfo.tableRow.splice(rowIndex, 1);
+      },
+      numToStr(num) {
+        num = num.toString()
+        return num
+      },
+        deleteCol: function (column) {
+        let tableInfo = this.configInfos[column.index];
+        let num=column.type;
+        tableInfo.tableColumn.splice(num, 1);
+      },
+      addColumn: function (tableIndex) {
+        this.forms = {
+          column: undefined,
+        };
+        this.resetForm("forms");
+        this.dialogFormVisible = true;
+        this.title = "娣诲姞鍒楁爣棰�";
+        this.tableInfos = this.configInfos[tableIndex];
+      },
+      submitColumn: function () {
+        this.dialogFormVisible = false;
+        let tableInfo = this.tableInfos;
+        let tableColInfo = {
+          name: this.forms.column,
+          item: 'colName' + tableInfo.tableColumn.length
+          /*name: '杞﹂棿' + tableInfo.tableColumn.length,
+          item: 'colName' + tableInfo.tableColumn.length*/
+        };
+        tableInfo.tableColumn.push(tableColInfo)
+      },
+      deleteTable: function (tableIndex) {
+        this.configInfos.splice(tableIndex, 1);
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/basicSetup/parameters/index.vue b/energy_management_ui/src/views/basicSetup/parameters/index.vue
new file mode 100644
index 0000000..a7d3a03
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/parameters/index.vue
@@ -0,0 +1,298 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鏍囧噯鍙傛暟閰嶇疆
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <basicIndex ref="basicIndex"></basicIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import basicIndex from "./basicIndex";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,basicIndex},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.basicIndex.getList(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
+
+<!--
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" style="width: 20%">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix">
+            <span>鍔熻兘椤�</span>
+            <span class="node-opt" style="float: right;">
+              <el-link title="鏂板"  icon="el-icon-plus" @click="handleAdd"></el-link>
+              <el-link title="淇敼" icon="el-icon-edit" @click="handleEdit"></el-link>
+              <el-link title="鍒犻櫎"icon="el-icon-delete" @click="handleDel"></el-link>
+            </span>
+          </div>
+          <el-menu default-active="2" class="el-menu-vertical-demo">
+             <template v-for="(item,index) in parametersList">
+              <el-menu-item v-on:click.native="changeNode(item.id,item.name)"  :max="max">
+               &lt;!&ndash;<el-checkbox :key="item.id" @change="checked=>handleChange(checked,item.id)"></el-checkbox>&ndash;&gt;
+                <span slot="title">{{item.name}}</span>
+              </el-menu-item>
+           </template>
+          </el-menu>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+          <basicIndex ref="basicIndex"></basicIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+    &lt;!&ndash; 娣诲姞鎴栦慨鏀规爣鍑嗗弬鏁伴厤缃璇濇 &ndash;&gt;
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="绫诲埆鍚嶇О" prop="name">
+              <el-input v-model="form.name" placeholder="璇疯緭鍏ョ被鍒悕绉�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="绫诲埆缂栫爜" prop="code">
+              <el-input v-model="form.code" placeholder="绫诲埆缂栫爜" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏄惁鎶ヨ" prop="showAlarm">
+              <el-input v-model="form.showAlarm" placeholder="鏄惁鏄剧ず鎶ヨ" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏁版嵁绫诲瀷" prop="dataType">
+              <el-select v-model="form.dataType" placeholder="璇烽�夋嫨鏁版嵁绫诲瀷">
+                <el-option
+                  v-for="dict in dataTypeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+  import basicIndex from "./basicIndex";
+  import { listParameters, getParameters, addParameters, updateParameters,delParameters} from "@/api/basicSetup/parameters";
+  export default {
+    components: {basicIndex},
+    data() {
+      return {
+        // 缃╁眰閬�
+        loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        id:undefined,
+        max:1,
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // parameters琛ㄦ牸鏁版嵁
+        parametersList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        opens: false,
+        // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀
+        dataTypeOptions: [],
+        // 鏄惁鏄剧ず鎶ヨ瀛楀吀
+        showAlarmOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          categoryName: undefined,
+          categoryCode: undefined,
+          dataType: undefined,
+          showAlarm: undefined
+        },
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          name: [{ required: true, message: "鏍囧噯鍙傛暟绫诲埆鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+          code: [{ required: true, message: "鏍囧噯鍙傛暟缂栫爜涓嶈兘涓虹┖", trigger: "blur" }],
+        },
+      };
+    },
+    created() {
+      this.getList();
+      this.getDicts("data_type").then(response => {
+        this.dataTypeOptions = response.data;
+      });
+    },
+    methods: {
+      getList(){
+        this.loading = true;
+        listParameters(this.queryParams).then(response => {
+          this.parametersList = response.rows;
+          this.$refs.basicIndex.getList(this.parametersList[0]);
+          //this.total = response.total;
+          this.loading = false;
+        });
+      },
+      // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀缈昏瘧
+      dataTypeFormat(row, column) {
+        return this.selectDictLabel(this.dataTypeOptions, row.dataType);
+      },
+      // 鏄惁鏄剧ず鎶ヨ瀛楀吀缈昏瘧
+      showAlarmFormat(row, column) {
+        return this.selectDictLabel(this.showAlarmOptions, row.showAlarm);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          name: undefined,
+          configInfo: undefined,
+          code: undefined,
+          dataType: undefined,
+          showAlarm: undefined,
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+
+      handleChange(boolean,item){
+        if(boolean){
+          this.id =item;
+        }
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        this.open = true;
+        this.title = "娣诲姞鏍囧噯鍙傛暟";
+      },
+      handleEdit() {
+        this.reset();
+        const id =this.id;
+        getParameters(id).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "淇敼鏍囧噯鍙傛暟";
+        });
+      },
+      /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+      handleDel() {
+        const ids =this.id;
+        this.$confirm('鏄惁纭鍒犻櫎鏍囧噯鍙傛暟缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delParameters(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+      },
+      /** 淇濆瓨鎸夐挳 */
+      submitForm: function() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.id != undefined) {
+              updateParameters(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇濆瓨鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              addParameters(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇濆瓨鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      changeNode(data) {
+        this.$refs.basicIndex.getList(data);
+      }
+  }
+  };
+</script>
+-->
diff --git a/energy_management_ui/src/views/basicSetup/parameters/index1.vue b/energy_management_ui/src/views/basicSetup/parameters/index1.vue
new file mode 100644
index 0000000..7e482cc
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/parameters/index1.vue
@@ -0,0 +1,555 @@
+<style>
+  .demo-table-expand {
+    font-size: 0;
+  }
+  .demo-table-expand label {
+    width: 90px;
+    color: #99a9bf;
+  }
+  .demo-table-expand .el-form-item {
+    margin-right: 0;
+    margin-bottom: 0;
+    width: 50%;
+  }
+</style>
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="168px">
+      <el-form-item label="鏍囧噯鍙傛暟绫诲埆鍚嶇О" prop="categoryName">
+        <el-input
+          v-model="queryParams.categoryName"
+          placeholder="璇疯緭鍏ユ爣鍑嗗弬鏁扮被鍒悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏍囧噯鍙傛暟绫诲埆缂栫爜" prop="categoryCode">
+        <el-input
+          v-model="queryParams.categoryCode"
+          placeholder="璇疯緭鍏ユ爣鍑嗗弬鏁扮被鍒紪鐮�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏁版嵁灞曠ず绫诲瀷" prop="dataType">
+        <el-select v-model="queryParams.dataType" placeholder="璇烽�夋嫨鏁版嵁灞曠ず绫诲瀷" clearable size="small">
+          <el-option
+            v-for="dict in dataTypeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['basicSetup:category:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['basicSetup:category:edit']"
+        >淇敼</el-button>
+      </el-col>
+    </el-row>
+
+    <template>
+      <el-table v-loading="loading" :data="categoryList" style="width: 100%"  @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" prop="id"/>
+        <el-table-column type="expand" >
+          <template slot-scope="props">
+          <table cellspacing="0" cellpadding="0" border="0" class="el-table__body" style="width: 90%;border: 1px solid #ddd;margin-bottom: 20px"
+                 v-for="(item,index) in parametersList"
+                 v-if="item.categoryId === props.row.id">
+            <thead class="has-gutter" style="background: #e7eaec">
+            <tr class="">
+              <th colspan="1" rowspan="1" class="el-table_4_column_24  is-center is-leaf">
+                <div class="cell">鍚嶇О</div>
+              </th>
+              <th colspan="1" rowspan="1" class="el-table_4_column_25  is-center is-leaf" v-for="(items,indexs) in JSON.parse(item.name)" v-bind:key="items.id">
+                <div class="cell">{{items.name}}</div>
+              </th>
+              <th colspan="1" rowspan="1" class="el-table_4_column_26  is-center is-leaf">
+                <div class="cell">鎿嶄綔</div>
+              </th>
+              <th class="gutter" style="width: 0px; display: none;"></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr class="el-table__row expanded" v-for="(items,indexs) in JSON.parse(item.configInfo)" v-bind:key="items.id" style="border: 1px solid #ddd">
+              <td rowspan="1" colspan="1" class="el-table_1_column_3 is-center " >
+                <div class="cell">{{items.value}}</div>
+              </td>
+              <td rowspan="1" colspan="1" class="el-table_1_column_3 is-center " >
+                <div class="cell">娴嬭瘯1</div>
+              </td>
+              <td rowspan="1" colspan="1" class="el-table_1_column_3 is-center " >
+                <div class="cell">娴嬭瘯2</div>
+              </td>
+              <td rowspan="1" colspan="1" class="el-table_1_column_7 is-center small-padding fixed-width">
+                <div class="cell">
+                  <button type="button" class="el-button el-button&#45;&#45;text el-button&#45;&#45;mini" @click="handleRevise(item.id)">
+                    <i class="el-icon-edit"></i>
+                    <span>淇敼</span>
+                  </button>
+                </div>
+              </td>
+            </tr>
+            </tbody>
+          </table>
+          </template>
+        </el-table-column>
+        <el-table-column label="鏍囧噯鍙傛暟绫诲埆鍚嶇О" align="center" prop="categoryName"/>
+        <el-table-column label="鏍囧噯鍙傛暟绫诲埆缂栫爜" align="center" prop="categoryCode"/>
+        <el-table-column label="鏁版嵁灞曠ず绫诲瀷" align="center" prop="dataType" :formatter="dataTypeFormat"/>
+        <el-table-column label="鏄惁鏄剧ず鎶ヨ" align="center" prop="showAlarm"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-plus"
+              @click="handleSave(scope.row)"
+              v-hasPermi="['basicSetup:parameters:add']"
+            >鏂板</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['basicSetup:category:edit']"
+            >淇敼</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <!-- 娣诲姞鎴栦慨鏀规爣鍑嗗弬鏁伴厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="绫诲埆鍚嶇О" prop="categoryName">
+              <el-input v-model="form.categoryName" placeholder="璇疯緭鍏ョ被鍒悕绉�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="绫诲埆缂栫爜" prop="categoryCode">
+              <el-input v-model="form.categoryCode" placeholder="绫诲埆缂栫爜" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏄惁鎶ヨ" prop="showAlarm">
+              <el-input v-model="form.showAlarm" placeholder="鏄惁鏄剧ず鎶ヨ" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏁版嵁绫诲瀷" prop="dataType">
+              <el-select v-model="form.dataType" placeholder="璇烽�夋嫨鏁版嵁绫诲瀷">
+                <el-option
+                  v-for="dict in dataTypeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!--&lt;!&ndash; 娣诲姞鎴栦慨鏀筨asicSetup瀵硅瘽妗� &ndash;&gt;-->
+    <el-dialog :title="title" :visible.sync="opens" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row  v-for='(form,index) in lists' v-bind:key='form.id'>
+          <el-col :span="15">
+            <el-form-item label="鏍囬" prop="names">
+              <el-input v-model="form.name" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="9">
+            <el-button type="button" plain @click="addEl">娣诲姞</el-button>
+            <el-button type="button" @click="del(index)">鍒犻櫎</el-button>
+          </el-col>
+        </el-row>
+        <el-row  v-for='(form,index) in list' v-bind:key='form.id'>
+          <el-col :span="15">
+            <el-form-item label="鍊�" prop="value">
+              <el-input v-model="form.value" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="9">
+            <el-button type="button" plain @click="addE2">娣诲姞</el-button>
+            <el-button type="button" @click="del2(index)">鍒犻櫎</el-button>
+          </el-col>
+        </el-row>
+        <el-input type="hidden"  v-model="form.categoryId"></el-input>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFormC">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { listParameters, getParameters, addParameters, updateParameters} from "@/api/basicSetup/parameters";
+  import { listCategory, getCategory,  addCategory, updateCategory } from "@/api/basicSetup/category";
+  export default {
+    data() {
+      return {
+        // 缃╁眰閬�
+        loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // parameters琛ㄦ牸鏁版嵁
+        parametersList: [],
+        categoryList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        opens: false,
+        // 鏄惁鏄剧ず鎶ヨ瀛楀吀
+        idOptions: [],
+        // 鏍囧噯鍙傛暟绫诲埆鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 璁捐鍐呭瀛楀吀
+        configInfoOptions: [],
+        // 璁捐鍐呭瀛楀吀
+        createByOptions: [],
+        // 璁捐鍐呭瀛楀吀
+        createTimeOptions: [],
+        // 璁捐鍐呭瀛楀吀
+        updateByOptions: [],
+        // 璁捐鍐呭瀛楀吀
+        updateTimeOptions: [],
+        // 璁捐鍐呭瀛楀吀
+        remarkOptions: [],
+        // 鏍囧噯鍙傛暟绫诲埆缂栫爜瀛楀吀
+        codeOptions: [],
+        // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀
+        dataTypeOptions: [],
+        // 鏄惁鏄剧ず鎶ヨ瀛楀吀
+        showAlarmOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          categoryName: undefined,
+          categoryCode: undefined,
+          dataType: undefined,
+          showAlarm: undefined,
+          categoryId: undefined
+        },
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        lists: [
+          { name: ""}
+        ],
+        list: [
+          {value: ""}
+        ],
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          id: [{ required: true, message: "鏄惁鏄剧ず鎶ヨ涓嶈兘涓虹┖", trigger: "blur" }],
+          name: [{ required: true, message: "鏍囧噯鍙傛暟绫诲埆鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], }
+      };
+    },
+    created() {
+      this.getList();
+      this.getLists();
+      this.getDicts("${column.dictType}").then(response => {
+        this.idOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.nameOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.configInfoOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.createByOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.createTimeOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.updateByOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.updateTimeOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.remarkOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.codeOptions = response.data;
+      });
+      this.getDicts("data_type").then(response => {
+        this.dataTypeOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.showAlarmOptions = response.data;
+      });
+    },
+    methods: {
+      /** 鏌ヨparameters鍒楄〃 */
+      getList() {
+        this.loading = true;
+        listCategory(this.queryParams).then(response => {
+          this.categoryList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      getLists(){
+        this.loading = true;
+        listParameters(this.queryParams).then(response => {
+          this.parametersList = response.rows;
+          //this.total = response.total;
+          this.loading = false;
+        });
+      },
+      // 鏍囧噯鍙傛暟绫诲埆鍚嶇О瀛楀吀缈昏瘧
+      idFormat(row, column) {
+        return this.selectDictLabel(this.idOptions, row.id);
+      },
+      // 鏍囧噯鍙傛暟绫诲埆鍚嶇О瀛楀吀缈昏瘧
+      nameFormat(row, column) {
+        return this.selectDictLabel(this.nameOptions, row.name);
+      },
+      // 璁捐鍐呭瀛楀吀缈昏瘧
+      configInfoFormat(row, column) {
+        return this.selectDictLabel(this.configInfoOptions, row.configInfo);
+      },
+      // 璁捐鍐呭瀛楀吀缈昏瘧
+      createByFormat(row, column) {
+        return this.selectDictLabel(this.createByOptions, row.createBy);
+      },
+      // 璁捐鍐呭瀛楀吀缈昏瘧
+      createTimeFormat(row, column) {
+        return this.selectDictLabel(this.createTimeOptions, row.createTime);
+      },
+      // 璁捐鍐呭瀛楀吀缈昏瘧
+      updateByFormat(row, column) {
+        return this.selectDictLabel(this.updateByOptions, row.updateBy);
+      },
+      // 璁捐鍐呭瀛楀吀缈昏瘧
+      updateTimeFormat(row, column) {
+        return this.selectDictLabel(this.updateTimeOptions, row.updateTime);
+      },
+      // 璁捐鍐呭瀛楀吀缈昏瘧
+      remarkFormat(row, column) {
+        return this.selectDictLabel(this.remarkOptions, row.remark);
+      },
+      // 鏍囧噯鍙傛暟绫诲埆缂栫爜瀛楀吀缈昏瘧
+      codeFormat(row, column) {
+        return this.selectDictLabel(this.codeOptions, row.code);
+      },
+      // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀缈昏瘧
+      dataTypeFormat(row, column) {
+        return this.selectDictLabel(this.dataTypeOptions, row.dataType);
+      },
+      // 鏄惁鏄剧ず鎶ヨ瀛楀吀缈昏瘧
+      showAlarmFormat(row, column) {
+        return this.selectDictLabel(this.showAlarmOptions, row.showAlarm);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.opens = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          name: undefined,
+          configInfo: undefined,
+          createBy: undefined,
+          createTime: undefined,
+          updateBy: undefined,
+          updateTime: undefined,
+          remark: undefined,
+          code: undefined,
+          dataType: undefined,
+          showAlarm: undefined,
+          categoryName: undefined,
+          categoryCode: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.id)
+        this.single = selection.length!=1
+        this.multiple = !selection.length
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        this.open = true;
+        this.title = "娣诲姞鏍囧噯鍙傛暟绫诲埆";
+      },
+      /** 淇敼鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        const id = row.id || this.ids
+        getCategory(id).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "淇敼鏍囧噯鍙傛暟绫诲埆";
+        });
+      },
+      handleSave (row) {
+        this.opens = true;
+        this.reset();
+        const id = row.id || this.ids
+        this.form.categoryId=id;
+        this.opens = true;
+        this.title = "鏂板鏍囧噯鍙傛暟";
+      },
+
+      handleRevise(row){
+        this.opens = true;
+        this.reset();
+        getParameters(row).then(response => {
+          this.form = response.data;
+          this.list= JSON.parse(this.form.configInfo);
+          this.lists= JSON.parse(this.form.name);
+          console.log(response.data);
+          this.opens = true;
+          this.title = "淇敼鏍囧噯鍙傛暟";
+        });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitFormC: function() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.id != undefined) {
+              this.form.name=JSON.stringify(this.lists);
+              this.form.configInfo=JSON.stringify(this.list);
+              updateParameters(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇敼鎴愬姛");
+                  this.opens = false;
+                  this.getList();
+                  this.getLists();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              this.form.name=JSON.stringify(this.lists);
+              this.form.configInfo=JSON.stringify(this.list);
+              addParameters(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("鏂板鎴愬姛");
+                  this.opens = false;
+                  this.getList();
+                  this.getLists();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitForm: function() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.id != undefined) {
+              updateCategory(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇敼鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              addCategory(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("鏂板鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      addEl: function () {
+        let cope = {
+          name: " ",
+        }
+        this.lists.push(cope);
+      },
+      del: function(index) {
+        this.lists.splice(index, 1);
+      },
+      addE2: function () {
+        let cope = {
+          value: " ",
+        }
+        this.list.push(cope);
+      },
+      del2: function(index) {
+        this.list.splice(index, 1);
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/basicSetup/parameters/standard.vue b/energy_management_ui/src/views/basicSetup/parameters/standard.vue
new file mode 100644
index 0000000..22ccd11
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/parameters/standard.vue
@@ -0,0 +1,94 @@
+<template>
+  <div class="app-container">
+    <template v-for='(config) in parametersList' >
+    <el-row :gutter="20">
+      <el-col :span="24">{{config.tableName}}</el-col>
+    </el-row>
+    <el-table v-loading="loading" :data="config.tablerowdata" style="width: 100%;margin: 10px 0" border>
+      <template v-for='(col) in config.tablecolumn'>
+        <el-table-column :show-overflow-tooltip="true" :prop="col.item" :label="col.name" :key="col.item"/>
+      </template>
+    </el-table>
+      </template>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  import {getListSee} from "@/api/basicSetup/parameters";
+  export default {
+    data() {
+      return {
+        // 缃╁眰閬�
+        loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 鎬绘潯鏁�
+        total: 0,
+        // parameters琛ㄦ牸鏁版嵁
+        parametersList: [],
+        categoryList: [],
+        // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀
+        dataTypeOptions: [],
+        // 鏄惁鏄剧ず鎶ヨ瀛楀吀
+        showAlarmOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          categoryName: undefined,
+          categoryCode: undefined,
+          dataType: undefined,
+          showAlarm: undefined,
+          categoryId: undefined
+        },
+        currentNode:"",
+        titleName:"",
+        titleId:""
+      };
+    },
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+      //this.getList();
+      this.getDicts("data_type").then(response => {
+        this.dataTypeOptions = response.data;
+      });
+      this.getDicts("${column.dictType}").then(response => {
+        this.showAlarmOptions = response.data;
+      });
+    },
+    methods: {
+      /** 鏌ヨparameters鍒楄〃 */
+      getList(node) {
+        this.titleName = node.label;
+        this.titleId = node.id;
+        this.currentNode=node;
+        this.loading = true;
+        getListSee(this.titleId).then(response => {
+          /*this.parametersList = JSON.parse(response.data.tableList);*/
+          this.parametersList=response.data;
+          console.log(this.parametersList);
+          /*this.total = response.total;*/
+          this.loading = false;
+        });
+      },
+      // 鏁版嵁灞曠ず绫诲瀷锛�1-瀹炴椂鏁版嵁锛�2-闃舵鏁版嵁瀛楀吀缈昏瘧
+      dataTypeFormat(row, column) {
+        return this.selectDictLabel(this.dataTypeOptions, row.dataType);
+      },
+      // 鏄惁鏄剧ず鎶ヨ瀛楀吀缈昏瘧
+      showAlarmFormat(row, column) {
+        return this.selectDictLabel(this.showAlarmOptions, row.showAlarm);
+      },
+
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/basicSetup/parameters/standard_statistic.vue b/energy_management_ui/src/views/basicSetup/parameters/standard_statistic.vue
new file mode 100644
index 0000000..8380f78
--- /dev/null
+++ b/energy_management_ui/src/views/basicSetup/parameters/standard_statistic.vue
@@ -0,0 +1,156 @@
+
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" style="width: 260px">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鎸囨爣搴�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     modelCode="statistic_index_model"
+                     :showOpt="false" :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:8px">
+          <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"
+                   class="query-form">
+            <el-form-item label="" prop="indexCategory">
+              <el-select v-model="queryParams.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" clearable
+                         style="width:160px"
+                         size="small"
+                         @change="handleQuery">
+                <el-option
+                  v-for="dict in indexCategoryOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="name">
+              <el-input
+                v-model="queryParams.name"
+                placeholder="璇疯緭鍏ユ寚鏍囧悕绉�/缂栫爜"
+                clearable
+                size="small"
+                @input="handleQuery"
+                @clear="handleQuery"
+                style="width:190px"
+              />
+            </el-form-item>
+          </el-form>
+
+          <el-table v-loading="loading" :data="energyindexList" border @current-change="handleCurrentChange" highlight-current-row ref="energySettingTable">
+            <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+            <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"/>
+            <el-table-column label="鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat"/>
+          </el-table>
+
+          <pagination
+            v-show="total>0"
+            :total="total"
+            :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize"
+            @pagination="getList"
+          />
+
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import {listEnergyindex} from "@/api/basicsetting/energyindex";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    name: "StatisticIndexSetting",
+    components: {ModelNode},
+    props: ["indexType"],
+    data() {
+      return {
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        energyindexList: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined,
+          indexType: ''
+        },
+        indexCategoryOptions: [],
+        unitIdOptions: [],
+        currentNode: undefined,
+        loading: false,
+        selectedStatisticIndex: []
+      }
+    },
+    created() {
+      this.getDicts("sys_index_category").then(response => {
+        this.indexCategoryOptions = response.data;
+      });
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+      });
+    },
+    methods: {
+      init(modelNode, currentSelected) {
+        this.selectedStatisticIndex = currentSelected;
+      },
+      changeNode: function (modelNode) {
+        this.getList(modelNode);
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.currentNode);
+      },
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList(modelNode) {
+        this.currentNode = modelNode;
+        if (modelNode) {
+          this.loading = true;
+          this.queryParams.nodeId = modelNode.id;
+          this.queryParams.indexType = this.$props.indexType;
+          listEnergyindex(this.queryParams).then(response => {
+            this.energyindexList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+            this.$nextTick(function () {
+              this.$refs.energySettingTable.data.forEach(rowData => {
+                let exist = this.selectedStatisticIndex.filter(
+                  f => f.indexId === rowData.indexId).length;
+                if (exist > 0) {
+                  this.$refs.energySettingTable.toggleRowSelection(rowData, true);
+                }
+              });
+            });
+          });
+        } else {
+          this.energyindexList = [];
+        }
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      handleCurrentChange(val) {
+        this.currentRow = val;
+        this.$emit('statisticIndexConfirmSelect', this.currentRow);
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
+
diff --git a/energy_management_ui/src/views/basicsetting/dataAuthSetting/dataAuthModelNode.vue b/energy_management_ui/src/views/basicsetting/dataAuthSetting/dataAuthModelNode.vue
new file mode 100644
index 0000000..9115b01
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/dataAuthSetting/dataAuthModelNode.vue
@@ -0,0 +1,214 @@
+<template>
+  <div>
+    <basic-container>
+      <span>{{ selectedName }} 鏉冮檺閰嶇疆锛岄�夋嫨妯″瀷锛�</span>
+      <el-select v-model="modelData" placeholder="璇烽�夋嫨妯″瀷"
+                 style="width:220px"
+                 size="small"
+                 @change="changeModel">
+        <el-option
+            v-for="model in modelInfoOptions"
+            :key="model.modelCode"
+            :label="model.modelName"
+            :value="model.modelCode"
+        />
+      </el-select>
+      <el-button type="primary" class="fr" @click="saveSetting">淇濆瓨鏉冮檺</el-button>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-input
+          placeholder="杈撳叆鍏抽敭瀛楄繘琛岃繃婊�"
+          prefix-icon="el-icon-search"
+          v-model="filterText">
+      </el-input>
+      <el-tree
+          class="modelnode-tree"
+          node-key="id"
+          highlight-current
+          empty-text="娌℃湁鏌ヨ鍒版暟鎹�"
+          show-checkbox
+          :data="modelNodeData"
+          :filter-node-method="filterNode"
+          :default-expanded-keys="treeExpandData"
+          :expand-on-click-node="false"
+          :check-strictly="strictly"
+          @check-change="checkChange"
+          ref="dataAuthTree">
+         <span class="custom-tree-node" slot-scope="{ node, data }">
+              <el-tooltip class="item" effect="dark" :content="node.label" placement="top-end">
+                 <span>{{ node.label.length > 4 ? node.label.slice(0, 4) + '...' : node.label }}</span>
+                  <span class="tree-text-node-common">{{ node.label }}</span>
+              </el-tooltip>
+        <span class="node-opt" v-if="data.children && data.children.length>0">
+          <el-button
+              type="text"
+              size="mini"
+              @click="() => checkAllChildren(data)">
+            鍏ㄩ��
+          </el-button>
+          <el-button
+              type="text"
+              size="mini"
+              @click="() => uncheckAllChildren(data)">
+            鍙栨秷鍏ㄩ��
+          </el-button>
+        </span>
+      </span>
+      </el-tree>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {listModel} from "../../../api/basicsetting/model";
+import {modelNodeTree} from "../../../api/basicsetting/modelNode";
+import {selectSettingAuth, setDataAuth} from "../../../api/dataAuth/authSetting";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "dataAuthModelNode",
+  mixins: [mixins],
+  watch: {
+    filterText(val) {
+      this.$refs.modelNodeTree.filter(val);
+    }
+  },
+  created() {
+    listModel({isShow: 1}).then(response => {
+      this.modelInfoOptions = response.data;
+      if (this.modelInfoOptions.length > 0) {
+        this.modelData = this.modelInfoOptions[0].modelCode;
+        this.changeModel(this.modelData);
+      }
+    });
+  },
+  data() {
+    return {
+      modelData: null,
+      modelInfoOptions: [],
+      modelNodeData: [],
+      treeExpandData: [],
+      filterText: null,
+      userOrRoleId: null,
+      authType: 'user',
+      settingAuthIds: [],
+      selectedName: '',
+      currentModelCode: '',
+      strictly: true,
+      currentCheckedIds: []
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 205 + 'px';
+    },
+    changeModel(modelCode) {
+      this.loading = true;
+      this.currentModelCode = modelCode;
+      modelNodeTree({modelCode: modelCode}).then(response => {
+        this.modelNodeData = response.data;
+        this.loading = false;
+        if (this.modelNodeData.length > 0) {
+          this.treeExpandData.push(this.modelNodeData[0].id);
+        }
+        this.$nextTick(() => {
+          if (this.modelNodeData.length > 0) {
+            this.$refs.dataAuthTree.setCurrentKey(this.modelNodeData[0].id);
+          }
+        })
+      });
+
+      this.getAuthSetting();
+    },
+    changeSelected(id, name, authType) {
+      this.userOrRoleId = id;
+      this.selectedName = name;
+      this.authType = authType;
+      this.getAuthSetting();
+    },
+    filterNode(value, data) {
+      if (!value) {
+        return true;
+      }
+      return data.label.indexOf(value) !== -1;
+    },
+    getAuthSetting() {
+      if (this.userOrRoleId) {
+        selectSettingAuth(this.userOrRoleId, this.currentModelCode, this.authType)
+            .then(response => {
+              if (response.code === 200) {
+                this.currentCheckedIds = response.data;
+                this.$refs.dataAuthTree.setCheckedKeys(this.currentCheckedIds);
+              }
+            });
+      } else {
+        this.currentCheckedIds = []
+        this.$refs.dataAuthTree.setCheckedKeys([]);
+      }
+    },
+    saveSetting() {
+      if (!this.userOrRoleId) {
+        debugger
+        this.$message.warning("璇烽�夋嫨" + (this.authType === 'user' ? '鐢ㄦ埛' : '瑙掕壊'))
+        return;
+      }
+
+      let checkedNodes = this.$refs.dataAuthTree.getCheckedNodes(false, true);
+      let ids = checkedNodes.map(node => node.id);
+      setDataAuth(this.userOrRoleId, this.currentModelCode, this.authType, ids)
+          .then(response => {
+            if (response.code === 200) {
+              this.$message.success("璁剧疆鎴愬姛锛�");
+            } else {
+              this.$message.error("璁剧疆澶辫触锛�")
+            }
+          });
+    },
+    getAllChildren(node) {
+      const childNodes = node.root ? node.root.children : node.children;
+      if (childNodes && childNodes.length > 0) {
+        childNodes.forEach(child => {
+          if (this.currentCheckedIds.indexOf(child.id) < 0) {
+            this.currentCheckedIds.push(child.id);
+          }
+          if (child.children && child.children.length > 0) {
+            this.getAllChildren(child);
+          }
+        });
+      }
+    },
+    removeChildren(node) {
+      const childNodes = node.root ? node.root.children : node.children;
+      if (childNodes && childNodes.length > 0) {
+        childNodes.forEach(child => {
+          this.currentCheckedIds.splice(this.currentCheckedIds.indexOf(child.id), 1);
+          if (child.children && child.children.length > 0) {
+            this.removeChildren(child);
+          }
+        });
+      }
+    },
+    checkAllChildren(node) {
+      if (this.currentCheckedIds.indexOf(node.id) < 0) {
+        this.currentCheckedIds.push(node.id);
+      }
+      this.getAllChildren(node);
+      this.$refs.dataAuthTree.setCheckedKeys(this.currentCheckedIds);
+    },
+    uncheckAllChildren(node) {
+      this.currentCheckedIds.splice(this.currentCheckedIds.indexOf(node.id), 1);
+      this.removeChildren(node);
+      this.$refs.dataAuthTree.setCheckedKeys(this.currentCheckedIds);
+    },
+    checkChange(node, currentState) {
+      if (currentState) {
+        if (this.currentCheckedIds.indexOf(node.id) < 0) {
+          this.currentCheckedIds.push(node.id);
+        }
+      } else {
+        this.currentCheckedIds.splice(this.currentCheckedIds.indexOf(node.id), 1);
+      }
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/dataAuthSetting/index.vue b/energy_management_ui/src/views/basicsetting/dataAuthSetting/index.vue
new file mode 100644
index 0000000..4566256
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/dataAuthSetting/index.vue
@@ -0,0 +1,66 @@
+<template>
+  <el-row type="flex">
+    <el-col class="page-left">
+      <div>
+        <basic-container>
+          <el-select v-model="authType" placeholder="璇烽�夋嫨"
+                     style="width:300px"
+                     size="small"
+                     @change="changeSettingType">
+            <el-option key="user" label="鐢ㄦ埛鏉冮檺璁剧疆" value="user"/>
+            <el-option key="role" label="瑙掕壊鏉冮檺璁剧疆" value="role"/>
+          </el-select>
+        </basic-container>
+      </div>
+      <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+        <user-select ref="userDataSelect" v-if="authType === 'user'"
+                     @changeSelected="changeSelected"></user-select>
+        <role-select ref="roleDataSelect" v-if="authType === 'role'"
+                     @changeSelected="changeSelected"></role-select>
+      </basic-container>
+    </el-col>
+    <el-col class="page-right">
+      <data-auth-model-node ref="dataAuthModelNode"/>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import UserSelect from "./userSelect";
+import RoleSelect from "./roleSelect";
+import DataAuthModelNode from "./dataAuthModelNode";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  name: "dataAuthSetting",
+  components: {DataAuthModelNode, RoleSelect, UserSelect},
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 205 + 'px';
+    },
+    changeSettingType() {
+      this.$refs.dataAuthModelNode.changeSelected('', '', this.authType);
+    },
+    changeSelected(id, name) {
+      this.$refs.dataAuthModelNode.changeSelected(id, name, this.authType);
+    }
+  },
+  data() {
+    return {
+      authType: 'user'
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.page-left {
+  width: 45%;
+}
+
+.page-right {
+  width: 55%;
+  padding-left: 14px;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/dataAuthSetting/roleSelect.vue b/energy_management_ui/src/views/basicsetting/dataAuthSetting/roleSelect.vue
new file mode 100644
index 0000000..46edc5a
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/dataAuthSetting/roleSelect.vue
@@ -0,0 +1,67 @@
+<template>
+  <div>
+    <el-table v-loading="loading" :data="roleList" border
+              :highlight-current-row="true"
+              :height="height"
+              ref="roleDataTable"
+              @row-click="handleRowClick"
+    >
+      <el-table-column label="瑙掕壊鍚嶇О" prop="roleName" :show-overflow-tooltip="true"/>
+      <el-table-column label="鏉冮檺瀛楃" prop="roleKey" :show-overflow-tooltip="true"/>
+    </el-table>
+
+    <pagination
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import {listRole} from "../../../api/system/role";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "roleSelect",
+  mixins: [mixins],
+  created() {
+    this.getList();
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 405 + 'px';
+    },
+    getList() {
+      this.loading = true;
+      listRole(this.queryParams).then(response => {
+            this.roleList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          }
+      );
+    },
+    handleRowClick(row, column, event) {
+      this.$emit("changeSelected", row.roleId, row.roleName);
+    },
+  },
+  data() {
+    return {
+      roleList: null,
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      loading: false,
+      ids: [],
+      height: null
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/dataAuthSetting/userSelect.vue b/energy_management_ui/src/views/basicsetting/dataAuthSetting/userSelect.vue
new file mode 100644
index 0000000..915bd8b
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/dataAuthSetting/userSelect.vue
@@ -0,0 +1,69 @@
+<template>
+  <div>
+    <el-table v-loading="loading" :data="userList" border
+              :highlight-current-row="true"
+              ref="userDataTable"
+              :height="height"
+              @row-click="handleRowClick"
+    >
+      <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" prop="userName" :show-overflow-tooltip="true"/>
+      <el-table-column label="鐢ㄦ埛鏄电О" align="center" prop="nickName" :show-overflow-tooltip="true"/>
+      <el-table-column label="閮ㄩ棬" align="center" prop="dept.deptName"
+                       :show-overflow-tooltip="true"/>
+    </el-table>
+
+    <pagination
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import {listUser} from "../../../api/system/user";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "userSelect",
+  mixins: [mixins],
+  created() {
+    this.getList();
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 405 + 'px';
+    },
+    getList() {
+      this.loading = true;
+      listUser(this.queryParams).then(response => {
+            this.userList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          }
+      );
+    },
+    handleRowClick(row, column, event) {
+      this.$emit("changeSelected", row.userId, row.userName);
+    },
+  },
+  data() {
+    return {
+      userList: null,
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      loading: false,
+      ids: [],
+      height: null
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/device/deviceStorage.vue b/energy_management_ui/src/views/basicsetting/device/deviceStorage.vue
new file mode 100644
index 0000000..b9f5fd8
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/device/deviceStorage.vue
@@ -0,0 +1,194 @@
+<template>
+  <div class="app-container" style="padding-top: 0">
+    <el-form label-position="top" label-width="110px" :model="deviceFormlaData">
+      <el-form-item style="margin-bottom: 0">
+        <el-button size="mini" @click="saveDeviceStorage" class="fr" type="primary">淇濆瓨鏁版嵁瀛樺偍
+        </el-button>
+      </el-form-item>
+      <el-form-item>
+        <div slot="label">鎸囨爣璁$畻鍏紡&nbsp;&nbsp;&nbsp;&nbsp;
+          <el-button size="mini" @click="selectCalcFunction">閫夋嫨璁$畻鍑芥暟</el-button>
+        </div>
+        <el-input type="textarea" rows="3" v-model="deviceFormlaData.deviceFormula.formulaText"
+                  id="formulaText"
+                  @blur="parseFormula"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-table :data="deviceFormlaData.deviceFormula.deviceFormulaParams" style="width: 100%"
+                  border>
+          <el-table-column label="鍙傛暟鍚�" prop="paramName" width="200"></el-table-column>
+          <el-table-column label="鍙傛暟鍊�" prop="paramValue">
+            <template slot-scope="scope">
+              <el-autocomplete popper-class="my-autocomplete"
+                               v-model="scope.row['paramValue']"
+                               :fetch-suggestions="querySearch"
+                               placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�">
+                <template slot-scope="{ item }">
+                  <div class="name">{{ item.value }}</div>
+                  <span class="addr">{{ item.name }}</span>
+                </template>
+              </el-autocomplete>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+    </el-form>
+    <el-drawer title="閫夋嫨璁$畻鍑芥暟" :visible.sync="calcFunctionShow" direction="rtl"
+               @open="showCalcFunctionDialog"
+               size="35%">
+      <CalcFunction ref="calcFunction" :showOpt="false"
+                    @confirmCalcFunction="confirmCalcFunction"></CalcFunction>
+    </el-drawer>
+  </div>
+</template>
+<style type="text/css">
+  .el-autocomplete {
+    width: 100%;
+  }
+
+  .my-autocomplete li {
+    line-height: normal;
+    padding: 7px;
+  }
+
+  .my-autocomplete li .name {
+    text-overflow: ellipsis;
+    overflow: hidden;
+  }
+
+  .my-autocomplete li .addr {
+    font-size: 12px;
+    color: #b4b4b4;
+  }
+
+  .my-autocomplete li .highlighted .addr {
+    color: #ddd;
+  }
+</style>
+<script>
+  import CalcFunction from "../function/index";
+  import {
+    getNodeIndex,//杩欎釜鏄幏鍙栧綋鍓嶆ā鍨嬭妭鐐逛笅鐨勬墍鏈夐噰闆嗙偣鎴栨寚鏍�
+    parseFormula,//杩欎釜鏄绠楀叕寮忚В鏋愭柟娉�
+  } from "@/api/basicsetting/indexStorage";
+  import {
+    getDeviceStorage,//杩欎釜鏄幏鍙栧綋鍓� 妯″瀷鑺傜偣涓�   鎸囧畾鐘舵�佷笅鐨�   璁惧鐘舵�佸叕寮忛厤缃俊鎭�
+    saveDeviceStorage,//杩欎釜鏄繚瀛橀厤缃柟娉曪紝浼氭浛鎹㈡帀
+  } from "@/api/basicsetting/deviceStorage";
+  const  deviceCbk=undefined;
+  export default {
+    name: "IndexStorage",
+    props: ["nodeId"],
+    components: {CalcFunction},
+    data() {
+      return {
+        deviceFormlaData: undefined,
+        calcFunctionShow: false,
+        nodeIndex: [],
+        stateId: ''
+      }
+    },
+    created() {
+      this.initData();
+    },
+    methods: {
+      initData() {
+        this.deviceFormlaData = {
+          deviceFormula: {
+            id: '',
+            deviceId: '',
+            stateId: '',
+            formulaText: '',
+            calcText: '',
+            deviceFormulaParams: [],
+          }
+        }
+      },
+      showCalcFunctionDialog() {
+      },
+      selectCalcFunction() {
+        this.calcFunctionShow = true;
+      },
+      confirmCalcFunction(funcText) {
+        this.calcFunctionShow = false;
+        const elInput = document.getElementById('formulaText'); //鏍规嵁id閫夋嫨鍣ㄩ�変腑瀵硅薄
+        const startPos = elInput.selectionStart;// input 绗�0涓瓧绗﹀埌閫変腑鐨勫瓧绗�
+        const endPos = elInput.selectionEnd;// 閫変腑鐨勫瓧绗﹀埌鏈�鍚庣殑瀛楃
+        if (startPos === undefined || endPos === undefined) {
+          return;
+        }
+        const txt = elInput.value;
+        // 灏嗚〃鎯呮坊鍔犲埌閫変腑鐨勫厜鏍囦綅缃�
+        const result = txt.substring(0, startPos) + funcText + txt.substring(endPos);
+        elInput.value = result;// 璧嬪�肩粰input鐨剉alue
+        // 閲嶆柊瀹氫箟鍏夋爣浣嶇疆
+        elInput.focus();
+        elInput.selectionStart = startPos + funcText.length;
+        elInput.selectionEnd = startPos + funcText.length;
+        this.deviceFormlaData.deviceFormula.formulaText = result;
+      },
+      parseFormula() {
+        parseFormula({"calcText": this.deviceFormlaData.deviceFormula.formulaText}).then(
+          response => {
+            let newParamData = response.data;
+            let paramData = this.deviceFormlaData.deviceFormula.deviceFormulaParams.filter(f => {
+              let exist = newParamData.find(param => param === f.paramName);
+              return exist && exist.length > 0;
+            });
+
+            newParamData.forEach(item => {
+              let exist = paramData.find(param => param.paramName === item);
+              if (!exist || exist.length === 0) {
+                paramData.push({
+                  "paramName": item,
+                  "paramValue": ''
+                })
+              }
+            });
+
+            this.deviceFormlaData.deviceFormula.deviceFormulaParams = paramData;
+          });
+      },
+      querySearch(queryString, cb) {
+        let nodeIndex = this.nodeIndex;
+        let results = queryString ? nodeIndex.filter((index) => {
+          return index.code.toLowerCase().indexOf(queryString.toLowerCase()) === 0 ||
+            index.name.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+        }) : nodeIndex;
+        // 璋冪敤 callback 杩斿洖寤鸿鍒楄〃鐨勬暟鎹�
+        let values = [];
+        results.forEach(item => {
+          values.push({
+            value: item.code,
+            name: item.name
+          })
+        });
+        cb(values);
+      },
+      saveDeviceStorage() {
+        saveDeviceStorage(this.nodeId, this.stateId,this.deviceFormlaData).then((response) => {
+          if (response.code === 200) {
+            this.$message.success("鏁版嵁瀛樺偍鎴愬姛锛�");
+            getDeviceStorage(this.nodeId,this.stateId).then(response => this.deviceFormlaData = response.data);
+            this.deviceCbk();
+          } else {
+            this.$message.error("鏁版嵁瀛樺偍澶辫触锛�");
+          }
+        });
+      },
+      getIndexStorage(stateId,cbk) {
+        this.deviceCbk = cbk;
+        this.initData();
+        this.stateId = stateId;
+        getNodeIndex(this.nodeId).then((response) => {
+          this.nodeIndex = response.data;
+        });
+        getDeviceStorage(this.nodeId,stateId).then(response => this.deviceFormlaData = response.data);
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/device/deviceTabSetting.vue b/energy_management_ui/src/views/basicsetting/device/deviceTabSetting.vue
new file mode 100644
index 0000000..f85adac
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/device/deviceTabSetting.vue
@@ -0,0 +1,70 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label+'--鑺傜偣閰嶇疆':'鑺傜偣閰嶇疆'}}</span>
+      </div>
+
+      <el-tabs>
+        <el-tab-pane :disabled="disabledSetting">
+          <span slot="label"><i class="el-icon-setting"></i> 鐘舵�佺鐞�</span>
+          <devicestartstop ref="devicestartstop"></devicestartstop>
+        </el-tab-pane>
+<!--        <el-tab-pane :disabled="disabledSetting">-->
+<!--          <span slot="label"><i class="el-icon-setting"></i> 缁熻鎸囨爣绠$悊</span>-->
+<!--          <zbIndex ref="zbIndex"></zbIndex>-->
+<!--        </el-tab-pane>-->
+      </el-tabs>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import {
+    getModelNode,
+  } from '@/api/basicsetting/modelNode'
+  import devicestartstop from "./devicestartstop";
+  export default {
+    name: "modelTabSetting",
+    components:{devicestartstop},
+    data() {
+      return {
+        currentNode: '',
+        deviceDialog: false,
+        energyDialog: false,
+        productDialog: false,
+        collectIndexDialog: false,
+        indexLoading: false,
+        deviceLoading: false,
+        energyLoading: false,
+        productLoading: false,
+        settingEnergyList: [],
+        settingDeviceList: [],
+        settingProductList: [],
+        settingIndexList: [],
+        disabledSetting: true
+      }
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.settingDeviceList = [];
+        this.settingIndexList = [];
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+          getModelNode(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.$refs.devicestartstop.setModelNode(response.data);
+            } else {
+              this.$message.error(response.msg);
+            }
+          });
+        }
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/device/devicestartstop.vue b/energy_management_ui/src/views/basicsetting/device/devicestartstop.vue
new file mode 100644
index 0000000..c287200
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/device/devicestartstop.vue
@@ -0,0 +1,191 @@
+<template>
+  <div class="app-container item-style" style="padding:0">
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          size="mini"
+          :disabled="multiple"
+          @click='updateStateBtn("Y")'
+          v-hasPermi="['system:alarmitem:edit']"
+        >鍚敤
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          size="mini"
+          :disabled="multiple"
+          @click='updateStateBtn("P")'
+          v-hasPermi="['energyindex:energyindex:remove']"
+        >鍋滄
+        </el-button>
+      </el-col>
+    </el-row>
+
+    <!--琛ㄦ牸-->
+      <el-table v-loading="loading" :data="stateTable.stateTypeList" border @selection-change="handleSelectionChange" :default-sort = "{prop: 'date', order: 'descending'}">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="璁惧鐘舵��" align="center" prop="stateType.stateName"/>
+        <el-table-column label="鐘舵�佺紪鐮�" align="center" prop="stateType.stateCode"/>
+        <el-table-column label="鑹插彿" align="center" prop="stateType.colorNumber"  >
+          <template slot-scope="scope">
+            <el-tag :color="scope.row.stateType.colorNumber"  disable-transitions></el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍚仠鐘舵��" align="center" prop="isEnable" class-name="small-padding fixed-width" :formatter="isEnableFormat">
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" width="150" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="stateSet(scope.row)"
+              v-hasPermi="['basicsetting:template:edit']"
+            >閰嶇疆
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <el-drawer title="閰嶇疆璁惧鐘舵��" :visible.sync="deviceStorageShow" direction="rtl"
+               @open="showIndexStorageDialog"
+               size="45%"
+               :wrapperClosable="false">
+      <DeviceStorage ref="deviceStorage"
+                    :nodeId="currentNode===undefined?'':currentNode.nodeId"></DeviceStorage>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+  import {getDeviceStateByNodeIds,setIsEnable} from "@/api/basicsetting/deviceStorage"
+  import DeviceStorage from "./deviceStorage";
+  export default {
+    name: 'EnergyIndex',
+    components: {DeviceStorage},
+    data() {
+      return {
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        names: [],
+        isEnables: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        stateTable:{
+          // 璁惧鐘舵�佹暟鎹�
+          stateTypeList: [],
+          rules: {
+          },
+        },
+        //涓昏〃閫変腑鐨勫惎鍋滅姸鎬佹暟缁�
+        isEnableOptions:[],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          deviceId:undefined,
+        },
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined,
+        myModelNode: undefined,
+        deviceStorageShow:false
+      };
+    },
+    created() {
+      this.getDicts("sys_is_enable").then(response => {
+        this.isEnableOptions = response.data;
+      });
+    },
+    methods: {
+      /** 鎺ユ敹妯″瀷鏍戠殑鍙傛暟  鑺傜偣锛岃妭鐐圭被鍨� */
+      setModelNode(modelNode)
+      {
+        this.myModelNode=modelNode;
+        this.currentNode = modelNode;
+        this.getList();
+      },
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList() {
+        //鑺傜偣鏈夋晥涓旀槸
+        let   device_category=this.$route.query.device_category;
+        if (this.myModelNode && this.myModelNode.nodeCategory==device_category) {
+          this.loading = true;
+          this.queryParams.deviceId = this.myModelNode.nodeId;
+          //鍒濆鍖栬澶囩殑鐘舵�佸垪琛�
+          getDeviceStateByNodeIds(this.queryParams).then(response => {
+            this.stateTable.stateTypeList = response.rows;
+            this.loading = false;
+          });
+        } else {
+          this.stateTable.stateTypeList = [];
+        }
+      },
+      // 鏄惁鍚敤璁剧疆鐘舵�� 瀛楀吀缈昏瘧
+      isEnableFormat(row, column) {
+        return this.selectDictLabel(this.isEnableOptions, row.isEnable);
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.stateType.stateId);
+        this.names = selection.map(item => item.stateType.stateName);
+        this.isEnables = selection.map(item => item.isEnable);
+        this.multiple = !selection.length
+      },
+      updateStateBtn(isEnable){
+        let nDevice = this.names.filter((item,index)=>{return this.isEnables[index]=='N'});
+        if(nDevice!=null&&nDevice!="")
+        {
+          this.$confirm('銆�'+nDevice+'銆戞湭閰嶇疆鍏紡锛屼笉鑳借繘琛屾搷浣滐紒', "璀﹀憡", {
+            confirmButtonText: "纭畾",
+            type: "warning"
+          }).catch(function() {});
+        }else {//鏇存柊璁惧鐘舵�佺殑鍚仠璁剧疆
+          setIsEnable(this.myModelNode.nodeId,isEnable,this.ids).then(response => {
+            if (response.code === 200) {
+              this.getList();
+              this.multiple = false;
+              this.msgSuccess("鎴愬姛");
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+        }
+      },
+      //璁惧鐘舵�佺殑璁$畻鍏紡閰嶇疆灞曞紑
+      stateSet(row){
+        this.deviceStorageShow = true;
+        this.$nextTick(() => {
+          //璁惧鐘舵�侀〉闈㈡暟鎹垵濮嬪寲 浼犲叆鐘舵�両D
+          this.$refs.deviceStorage.getIndexStorage(row.stateType.stateId,this.getList);
+        })
+      },
+      showIndexStorageDialog() {
+      },
+    }
+  };
+</script>
+<style>
+  .item-style .el-form-item__content{
+    margin-left: 0px!important;
+  }
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/device/index.vue b/energy_management_ui/src/views/basicsetting/device/index.vue
new file mode 100644
index 0000000..7818eee
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/device/index.vue
@@ -0,0 +1,59 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'280px'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁惧鍚仠绠$悊
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <deviceTabSetting ref="deviceTabSetting"></deviceTabSetting>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import deviceTabSetting from "./deviceTabSetting";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+export default {
+  components: {deviceTabSetting, ModelNode},
+  created() {
+    this.modelCode=this.$route.query.modelCode;
+  },
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode:undefined,
+      isCollapse: false,
+    }
+  },
+  methods: {
+    changeNode: function (node) {
+      this.$refs.deviceTabSetting.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse () {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/energyIndex/energyIndex.vue b/energy_management_ui/src/views/basicsetting/energyIndex/energyIndex.vue
new file mode 100644
index 0000000..a4f07e6
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/energyIndex/energyIndex.vue
@@ -0,0 +1,546 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="0"
+             class="query-form">
+      <el-row :gutter="24">
+        <el-col :span="5">
+          <el-form-item>
+            <el-select v-model="queryParams.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" clearable
+                       size="small"
+                       @change="handleQuery">
+              <el-option
+                  v-for="dict in indexCategoryOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item>
+            <el-input
+                v-model="queryParams.name"
+                placeholder="璇疯緭鍏ユ寚鏍囧悕绉�/缂栫爜"
+                clearable
+                size="small"
+                @input="handleQuery"
+                @clear="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="14">
+          <el-form-item class="fr">
+            <el-button
+                type="primary"
+                icon="el-icon-plus"
+                size="mini"
+                @click="handleAdd"
+                v-hasPermi="['energyindex:energyindex:add']"
+            >鏂板
+            </el-button>
+            <el-button
+                type="success"
+                icon="el-icon-edit"
+                size="mini"
+                :disabled="single"
+                @click="handleUpdate"
+                v-hasPermi="['energyindex:energyindex:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                type="danger"
+                icon="el-icon-delete"
+                size="mini"
+                :disabled="multiple"
+                @click="handleDelete"
+                v-hasPermi="['energyindex:energyindex:remove']"
+            >鍒犻櫎
+            </el-button>
+            <el-button
+                type="info"
+                icon="el-icon-upload2"
+                size="mini"
+                @click="handleImport"
+            >瀵煎叆
+            </el-button>
+            <el-button type="text"
+                       icon="el-icon-setting"
+                       @click="collectIndexSetting"
+                       v-if="!statisticIndex">
+              閰嶇疆閲囬泦鐐�
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+
+    <el-table v-loading="loading" :data="energyindexList" border
+              @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="绯荤粺鎸囨爣鍒嗙被" align="center" prop="indexCategory"
+                       :formatter="indexCategoryFormat"/>
+      <el-table-column label="鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat"/>
+      <el-table-column label="鎿嶄綔" width="200" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['energyindex:energyindex:edit']"
+          >淇敼
+          </el-button>
+          <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="dataStorage(scope.row)"
+              v-hasPermi="['energyindex:energyindex:edit']"
+              v-if="statisticIndex"
+          >瀛樺偍
+          </el-button>
+          <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['energyindex:energyindex:remove']"
+          >鍒犻櫎
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="paginationQuery"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀规寚鏍囦俊鎭璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鎸囨爣鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"/>
+        </el-form-item>
+        <el-form-item label="鎸囨爣缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�"/>
+        </el-form-item>
+        <el-form-item label="鎸囨爣鍒嗙被">
+          <el-select v-model="form.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" prop="indexCategory">
+            <el-option
+                v-for="dict in indexCategoryOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍗曚綅">
+          <el-select v-model="form.unitId" placeholder="璇烽�夋嫨鍗曚綅">
+            <el-option
+                v-for="dict in unitIdOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="椤哄簭鍙�">
+          <el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
+        </el-form-item>
+        <el-form-item label="璁惧">
+          <el-select v-model="form.equipment" placeholder="璇烽�夋嫨璁惧">
+            <el-option
+                v-for="dict in fcilityArchives"
+                :key="dict.id"
+                :label="dict.facilityName"
+                :value="dict.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鑳芥簮鍝佺">
+          <el-select v-model="form.energyId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+            <el-option
+                v-for="dict in energyIdList"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <el-drawer title="閰嶇疆鎸囨爣瀛樺偍" :visible.sync="indexStorageShow" direction="rtl"
+               @open="showIndexStorageDialog"
+               size="45%"
+               :wrapperClosable="false">
+      <IndexStorage ref="indexStorage"
+                    :nodeId="currentNode===undefined?'':currentNode.id"></IndexStorage>
+    </el-drawer>
+    <!--閫夋嫨閲囬泦鎸囨爣-->
+    <el-drawer title="閫夋嫨閲囬泦鎸囨爣" :visible.sync="collectIndexDialog" direction="rtl"
+               @open="showCollectIndexDialog"
+               size="45%">
+      <CollectIndexSetting ref="collectIndexSetting"
+                           @collectIndexConfirmSelect="collectIndexConfirmSelect"></CollectIndexSetting>
+    </el-drawer>
+
+    <!-- 瀵煎叆瀵硅瘽妗� -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" :destroy-on-close="true"
+               width="400px">
+      <el-upload
+          ref="upload"
+          :limit="1"
+          accept=".xlsx, .xls"
+          :headers="upload.headers"
+          :action="upload.url + '?updateSupport=' + upload.updateSupport"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+          <em>鐐瑰嚮涓婁紶</em>
+        </div>
+        <div class="el-upload__tip" slot="tip">
+          <el-checkbox v-model="upload.updateSupport"/>
+          鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+          <el-link type="info" style="font-size:12px" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+        </div>
+        <div class="el-upload__tip" style="color:red" slot="tip">鎻愮ず锛氫粎鍏佽瀵煎叆鈥渪ls鈥濇垨鈥渪lsx鈥濇牸寮忔枃浠讹紒</div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+        <el-button @click="upload.open = false">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addEnergyindex,
+  delEnergyindex,
+  exportEnergyindex,
+  getEnergyindex,
+  importTemplate,
+  listEnergyindex,
+  updateEnergyindex
+} from "../../../api/basicsetting/energyindex";
+import {getToken} from "@/utils/auth";
+import {setNodeToIndex} from '@/api/basicsetting/modelNode'
+import IndexStorage from "./indexStorage";
+import CollectIndexSetting from "../nodeSetting/collectIndexSetting";
+import {getPointFacility} from "@/api/comprehensiveStatistics/comprehensive";
+
+export default {
+  name: 'EnergyIndex',
+  components: {CollectIndexSetting, IndexStorage},
+  props: ["indexType"],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+      energyindexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      indexIdOptions: [],
+      // 鎸囨爣鍚嶇О瀛楀吀
+      nameOptions: [],
+      // 鎸囨爣缂栫爜瀛楀吀
+      codeOptions: [],
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+      indexCategoryOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 鍗曚綅瀛楀吀
+      unitIdOptions: [],
+      energyIdList: [],//鑳芥簮鍝佺
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        indexCategory: undefined,
+        nodeId: undefined,
+        indexType: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        name: [
+          {required: true, message: "鎸囨爣鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+          {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+        ], code: [
+          {required: true, message: "鎸囨爣缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+          {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 30 涓瓧绗�', trigger: 'blur'},
+          {pattern: /^[a-zA-Z][A-Za-z0-9#_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��#銆�- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+        ], indexCategory: [
+          {required: true, message: "璇烽�夋嫨鎸囨爣鍒嗙被", trigger: "blur"}
+        ]
+      },
+      currentNode: undefined,
+      indexCategoryDefaultVal: undefined,
+      unitDefaultVal: undefined,
+      indexStorageShow: false,
+      statisticIndex: true,
+      collectIndexDialog: false,
+      fcilityArchives: [],
+      upload: {
+        open: false,
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: {Authorization: "Bearer " + getToken()},
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/basicsetting/energyindex/importData"
+      },
+    };
+  },
+  created() {
+    this.getDicts("sys_index_category").then(response => {
+      this.indexCategoryOptions = response.data;
+      this.indexCategoryDefaultVal = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+    });
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+      this.unitDefaultVal = this.unitIdOptions.find(f => f.isDefault === 'Y');
+    });
+    this.statisticIndex = this.$props.indexType === 'STATISTIC';
+    this.getDicts("energy_type").then(response => {
+      this.energyIdList = response.data;
+    });
+  },
+  methods: {
+    paginationQuery() {
+      this.getList(this.currentNode);
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList(modelNode) {
+      this.currentNode = modelNode;
+      if (modelNode) {
+        this.loading = true;
+        this.queryParams.nodeId = modelNode.id;
+        this.queryParams.indexType = this.$props.indexType;
+        listEnergyindex(this.queryParams).then(response => {
+          this.energyindexList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      } else {
+        this.energyindexList = [];
+      }
+    },
+    // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀缈昏瘧
+    indexCategoryFormat(row, column) {
+      return this.selectDictLabel(this.indexCategoryOptions, row.indexCategory);
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.unitId);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        indexId: undefined,
+        name: undefined,
+        code: undefined,
+        indexType: undefined,
+        indexCategory: undefined,
+        remark: undefined,
+        unitId: undefined,
+        orderNum: 0
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList(this.currentNode);
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.indexId);
+      this.names = selection.map(item => item.name);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length
+    },
+    getFacilityArchivesList() {
+      getPointFacility().then(response => {
+        this.fcilityArchives = response.data;
+        console.log(this.fcilityArchives);
+      });
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.getFacilityArchivesList();
+      if (this.indexCategoryDefaultVal) {
+        this.form.indexCategory = this.indexCategoryDefaultVal.dictValue;
+      }
+
+      if (this.unitDefaultVal) {
+        this.form.unitId = this.unitDefaultVal.dictValue;
+      }
+      this.open = true;
+      this.title = "娣诲姞鎸囨爣淇℃伅";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.getFacilityArchivesList();
+      const indexId = row.indexId || this.ids;
+      getEnergyindex(indexId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼" + response.data.name + "鎸囨爣淇℃伅";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.indexId !== undefined) {
+            updateEnergyindex(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList(this.currentNode);
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            this.form.indexType = this.$props.indexType;
+            addEnergyindex(this.currentNode.id, this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList(this.currentNode);
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const indexIds = row.indexId || this.ids;
+      const indexNames = row.name || this.names;
+      this.$confirm('鏄惁纭鍒犻櫎鎸囨爣鍚嶄负"' + indexNames + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(() => {
+        return delEnergyindex(this.currentNode.id, indexIds);
+      }).then(() => {
+        this.getList(this.currentNode);
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋寚鏍囦俊鎭暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportEnergyindex(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    dataStorage(row) {
+      this.indexStorageShow = true;
+      this.$nextTick(() => {
+        this.$refs.indexStorage.getIndexStorage(row.indexId);
+      })
+    },
+    showIndexStorageDialog() {
+    },
+    collectIndexSetting() {
+      this.collectIndexDialog = true;
+    },
+    showCollectIndexDialog() {
+      this.$nextTick(() => {
+        this.$refs.collectIndexSetting.init(this.currentNode);
+      })
+    },
+    collectIndexConfirmSelect(selectedIndex) {
+      let indexIds = selectedIndex.map(item => item.indexId);
+      setNodeToIndex(this.currentNode.id, indexIds, "COLLECT").then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      }).then(() => {
+        this.getList(this.currentNode);
+      });
+    },
+    handleImport() {
+      this.upload.title = "鎸囨爣瀵煎叆";
+      this.upload.open = true;
+    },// 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "瀵煎叆缁撴灉", {dangerouslyUseHTMLString: true});
+      this.getList(this.currentNode);
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      importTemplate().then(response => {
+        this.download(response.msg);
+      });
+    },
+    submitFileForm() {
+      this.$refs.upload.submit();
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/energyIndex/index.vue b/energy_management_ui/src/views/basicsetting/energyIndex/index.vue
new file mode 100644
index 0000000..6d1741f
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/energyIndex/index.vue
@@ -0,0 +1,76 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="鎸囨爣搴撶鐞�" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode"
+                   modelCode="statistic_index_model"
+                   :showOpt="true"
+                   :auth="false"/>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :title="currentNode ? currentNode.label+'--鑺傜偣閰嶇疆' : '鑺傜偣閰嶇疆'" :bodyStyle="bodyStyleRight">
+        <IndexNodeSetting ref="modelNodeSetting"/>
+      </basic-container>
+    </el-col>
+  </el-row>
+
+</template>
+<script>
+import ModelNode from "../modelNode/modelNode";
+import IndexNodeSetting from "./indexNodeSetting";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from '@/components/shrink/index.vue'
+
+export default {
+  components: {IndexNodeSetting, ModelNode,ShrinkCol},
+  mixins: [mixins],
+  created() {
+  },
+  data() {
+    return {
+      modelData: '',
+      isCollapse: false,
+      bodyStyleRight: {},
+      currentNode: ''
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + 'px';
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      if (node) {
+        this.currentNode = node
+      }
+      this.$refs.modelNodeSetting.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/energyIndex/indexNodeSetting.vue b/energy_management_ui/src/views/basicsetting/energyIndex/indexNodeSetting.vue
new file mode 100644
index 0000000..891b6f6
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/energyIndex/indexNodeSetting.vue
@@ -0,0 +1,290 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-tabs>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 鑳芥簮銆佷骇鍝併�佽澶囬厤缃�</span>
+        <el-collapse>
+          <el-collapse-item title="鑳芥簮閰嶇疆淇℃伅" :disabled="disabledSetting">
+            <el-button style="float: right; padding: 8px; margin-left:8px" type="text"
+                       icon="el-icon-setting"
+                       @click="energySetting">
+              閰嶇疆鑳芥簮
+            </el-button>
+            <el-table v-loading="energyLoading" :data="settingEnergyList" border
+                      @selection-change="handleSelectionChange">
+              <el-table-column label="鑳芥簮缂栫爜" align="center" prop="enersno"/>
+              <el-table-column label="鑳芥簮鍚嶇О" align="center" prop="enername"/>
+              <el-table-column label="鎿嶄綔" width="70" align="center"
+                               class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="delEnergy(scope.row)"
+                  ></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-collapse-item>
+          <el-collapse-item title="浜у搧閰嶇疆淇℃伅" :disabled="disabledSetting">
+            <el-button style="float: right; padding: 8px; margin-left:8px" type="text"
+                       icon="el-icon-setting"
+                       @click="productSetting">
+              閰嶇疆浜у搧
+            </el-button>
+            <el-table v-loading="productLoading" :data="settingProductList" border
+                      @selection-change="handleSelectionChange">
+              <el-table-column label="浜у搧缂栫爜" align="center" prop="productsno"/>
+              <el-table-column label="浜у搧鍚嶇О" align="center" prop="productname"/>
+              <el-table-column label="鎿嶄綔" width="70" align="center"
+                               class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="delProduct(scope.row)"
+                  ></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-collapse-item>
+          <el-collapse-item title="璁惧閰嶇疆淇℃伅" :disabled="disabledSetting">
+            <el-button style="float: right; padding: 8px; margin-bottom:8px" type="text"
+                       icon="el-icon-setting"
+                       @click="deviceSetting">
+              閰嶇疆璁惧
+            </el-button>
+            <el-table v-loading="deviceLoading" :data="settingDeviceList" border
+                      @selection-change="handleSelectionChange">
+              <el-table-column label="鍣ㄥ叿缂栫爜" align="center" prop="code"/>
+              <el-table-column label="鍣ㄥ叿鍚嶇О" align="center" prop="meterName"/>
+              <el-table-column label="鎿嶄綔" width="70" align="center"
+                               class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="delDevice(scope.row)"
+                  ></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-collapse-item>
+        </el-collapse>
+      </el-tab-pane>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 缁熻鎸囨爣绠$悊</span>
+        <EnergyIndex ref="energyIndex" indexType="STATISTIC"></EnergyIndex>
+      </el-tab-pane>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 閲囬泦鐐圭鐞�</span>
+        <EnergyIndex ref="collectIndex" indexType="COLLECT"></EnergyIndex>
+      </el-tab-pane>
+    </el-tabs>
+    <!--閫夋嫨璁惧-->
+    <el-drawer title="閫夋嫨璁惧" :visible.sync="deviceDialog" direction="rtl" @open="showDeviceDialog"
+               size="45%">
+      <DeviceSetting ref="deviceSetting" @deviceConfirmSelect="deviceConfirmSelect"></DeviceSetting>
+    </el-drawer>
+    <!--閫夋嫨鑳芥簮-->
+    <el-drawer title="閫夋嫨鑳芥簮" :visible.sync="energyDialog" direction="rtl" @open="showEnergyDialog"
+               size="45%">
+      <EnergySetting ref="energySetting" @energyConfirmSelect="energyConfirmSelect"></EnergySetting>
+    </el-drawer>
+    <!--閫夋嫨浜у搧-->
+    <el-drawer title="閫夋嫨浜у搧" :visible.sync="productDialog" direction="rtl" @open="showProductDialog"
+               size="45%">
+      <ProductSetting ref="productSetting"
+                      @productConfirmSelect="productConfirmSelect"></ProductSetting>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import {
+  delDevice,
+  delEnergy,
+  delProduct,
+  getSettingDevice,
+  getSettingEnergy,
+  getSettingIndex,
+  getSettingProduct,
+  setDevice,
+  setEnergy,
+  setProduct
+} from '@/api/basicsetting/modelNode'
+import DeviceSetting from "../nodeSetting/deviceSetting";
+import EnergySetting from "../nodeSetting/energySetting";
+import ProductSetting from "../nodeSetting/productSetting";
+import EnergyIndex from "./energyIndex";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "IndexNodeSetting",
+  components: {EnergyIndex, ProductSetting, EnergySetting, DeviceSetting},
+  mixins: [mixins],
+  data() {
+    return {
+      currentNode: '',
+      deviceDialog: false,
+      energyDialog: false,
+      productDialog: false,
+      indexLoading: false,
+      deviceLoading: false,
+      energyLoading: false,
+      productLoading: false,
+      settingEnergyList: [],
+      settingDeviceList: [],
+      settingProductList: [],
+      disabledSetting: true,
+      bodyStyleRight: {}
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + 'px';
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    modelNodeChange(modelNode) {
+      this.settingDeviceList = [];
+      this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+      if (modelNode) {
+        this.currentNode = modelNode;
+        this.deviceLoading = true;
+        getSettingDevice(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingDeviceList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.deviceLoading = false;
+        });
+
+        this.energyLoading = true;
+        getSettingEnergy(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingEnergyList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.energyLoading = false;
+        });
+
+        this.productLoading = true;
+        getSettingProduct(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingProductList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.productLoading = false;
+        });
+
+        this.indexLoading = true;
+        getSettingIndex(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.indexLoading = false;
+        });
+
+        this.$refs.energyIndex.getList(modelNode);
+        this.$refs.collectIndex.getList(modelNode);
+      }
+    },
+    deviceSetting() {
+      this.deviceDialog = true;
+    },
+    energySetting() {
+      this.energyDialog = true;
+    },
+    productSetting() {
+      this.productDialog = true;
+    },
+    showDeviceDialog() {
+      this.$nextTick(() => {
+        this.$refs.deviceSetting.init(this.settingDeviceList);
+      })
+    },
+    showEnergyDialog() {
+      this.$nextTick(() => {
+        this.$refs.energySetting.init(this.settingEnergyList);
+      })
+    },
+    showProductDialog() {
+      this.$nextTick(() => {
+        this.$refs.productSetting.init(this.settingProductList);
+      })
+    },
+    deviceConfirmSelect(selectedDevice) {
+      this.settingDeviceList = selectedDevice;
+      let deviceIds = selectedDevice.map(item => item.id);
+      setDevice(this.currentNode.id, deviceIds).then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    energyConfirmSelect(selectedEnergy) {
+      this.settingEnergyList = selectedEnergy;
+      let energyIds = selectedEnergy.map(item => item.enerid);
+      setEnergy(this.currentNode.id, energyIds).then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    productConfirmSelect(selectedProduct) {
+      this.settingProductList = selectedProduct;
+      let productIds = selectedProduct.map(item => item.productid);
+      setProduct(this.currentNode.id, productIds).then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    handleSelectionChange() {
+    },
+    delDevice(row) {
+      delDevice(this.currentNode.id, row.id).then((response) => {
+        if (response.code === 200) {
+          this.settingDeviceList = this.settingDeviceList.filter(f => f.id !== row.id);
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    delEnergy(row) {
+      delEnergy(this.currentNode.id, row.enerid).then((response) => {
+        if (response.code === 200) {
+          this.settingEnergyList = this.settingEnergyList.filter(f => f.enerid !== row.enerid);
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    delProduct(row) {
+      delProduct(this.currentNode.id, row.productid).then((response) => {
+        if (response.code === 200) {
+          this.settingProductList = this.settingProductList.filter(
+              f => f.productid !== row.productid);
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/energyIndex/indexStorage.vue b/energy_management_ui/src/views/basicsetting/energyIndex/indexStorage.vue
new file mode 100644
index 0000000..f820f0f
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/energyIndex/indexStorage.vue
@@ -0,0 +1,209 @@
+<template>
+  <div class="app-container" style="    margin-top: -15px;    padding: 0;">
+    <el-card class="index-storage-container"
+             shadow="never">
+      <el-form label-position="top" label-width="110px" :model="indexStorageData">
+        <el-form-item style="margin-bottom: 0">
+          <el-button size="mini" @click="saveIndexStorage" class="fr" type="primary">淇濆瓨鏁版嵁瀛樺偍
+          </el-button>
+        </el-form-item>
+        <el-form-item>
+          <div slot="label">鎸囨爣璁$畻鍏紡&nbsp;&nbsp;&nbsp;&nbsp;
+            <el-button size="mini" @click="selectCalcFunction">閫夋嫨璁$畻鍑芥暟</el-button>
+          </div>
+          <el-input type="textarea" rows="3" v-model="indexStorageData.indexFormula.formulaText"
+                    id="formulaText"
+                    @blur="parseFormula"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-table :data="indexStorageData.indexFormula.indexFormulaParams" style="width: 100%"
+                    border>
+            <el-table-column label="鍙傛暟鍚�" prop="paramName" width="200"></el-table-column>
+            <el-table-column label="鍙傛暟鍊�" prop="paramValue">
+              <template slot-scope="scope">
+                <el-autocomplete popper-class="my-autocomplete"
+                                 v-model="scope.row['paramValue']"
+                                 :fetch-suggestions="querySearch"
+                                 placeholder="璇疯緭鍏ユ寚鏍囩紪鐮�">
+                  <template slot-scope="{ item }">
+                    <div class="name">{{ item.value }}</div>
+                    <span class="addr">{{ item.name }}</span>
+                  </template>
+                </el-autocomplete>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+      </el-form>
+      <el-card class="box-card" header="鏁版嵁瀛樺偍">
+        <el-form label-width="110px">
+          <el-form-item v-for="period in indexStorageData.indexStorage">
+            <div slot="label">{{getTimeLabel(period.timeType)}} 鏁版嵁</div>
+            <el-radio-group v-model="period.calcType">
+              <el-radio-button label="CALC">鑷姩璁$畻</el-radio-button>
+              <el-radio-button label="INPUT">鎵嬪伐褰曞叆</el-radio-button>
+            </el-radio-group>
+          </el-form-item>
+        </el-form>
+      </el-card>
+      <el-drawer title="閫夋嫨璁$畻鍑芥暟" :visible.sync="calcFunctionShow" direction="rtl"
+                 @open="showCalcFunctionDialog"
+                 size="35%">
+        <CalcFunction ref="calcFunction" :showOpt="false"
+                      @confirmCalcFunction="confirmCalcFunction"></CalcFunction>
+      </el-drawer>
+    </el-card>
+  </div>
+</template>
+<script>
+  import CalcFunction from "../function/index";
+  import {
+    getIndexStorage,
+    getNodeIndex,
+    parseFormula,
+    saveIndexStorage
+  } from "@/api/basicsetting/indexStorage";
+
+  export default {
+    name: "IndexStorage",
+    props: ["nodeId"],
+    components: {CalcFunction},
+    data() {
+      return {
+        indexStorageData: undefined,
+        calcFunctionShow: false,
+        nodeIndex: [],
+        indexId: ''
+      }
+    },
+    created() {
+      this.initData();
+    },
+    methods: {
+      initData() {
+        this.indexStorageData = {
+          indexFormula: {
+            id: '',
+            indexId: '',
+            formulaText: '',
+            indexFormulaParams: [],
+          },
+          indexStorage: []
+        }
+      },
+      showCalcFunctionDialog() {
+      },
+      selectCalcFunction() {
+        this.calcFunctionShow = true;
+      },
+      confirmCalcFunction(funcText) {
+        this.calcFunctionShow = false;
+        const elInput = document.getElementById('formulaText'); //鏍规嵁id閫夋嫨鍣ㄩ�変腑瀵硅薄
+        const startPos = elInput.selectionStart;// input 绗�0涓瓧绗﹀埌閫変腑鐨勫瓧绗�
+        const endPos = elInput.selectionEnd;// 閫変腑鐨勫瓧绗﹀埌鏈�鍚庣殑瀛楃
+        if (startPos === undefined || endPos === undefined) {
+          return;
+        }
+        const txt = elInput.value;
+        // 灏嗚〃鎯呮坊鍔犲埌閫変腑鐨勫厜鏍囦綅缃�
+        const result = txt.substring(0, startPos) + funcText + txt.substring(endPos);
+        elInput.value = result;// 璧嬪�肩粰input鐨剉alue
+        // 閲嶆柊瀹氫箟鍏夋爣浣嶇疆
+        elInput.focus();
+        elInput.selectionStart = startPos + funcText.length;
+        elInput.selectionEnd = startPos + funcText.length;
+        this.indexStorageData.indexFormula.formulaText = result;
+      },
+      parseFormula() {
+        parseFormula({"calcText": this.indexStorageData.indexFormula.formulaText}).then(
+            response => {
+              let newParamData = response.data;
+              let paramData = this.indexStorageData.indexFormula.indexFormulaParams.filter(f => {
+                let exist = newParamData.find(param => param === f.paramName);
+                return exist && exist.length > 0;
+              });
+
+              newParamData.forEach(item => {
+                let exist = paramData.find(param => param.paramName === item);
+                if (!exist || exist.length === 0) {
+                  paramData.push({
+                    "paramName": item,
+                    "paramValue": ''
+                  })
+                }
+              });
+
+              this.indexStorageData.indexFormula.indexFormulaParams = paramData;
+            });
+      },
+      querySearch(queryString, cb) {
+        let nodeIndex = this.nodeIndex;
+        let results = queryString ? nodeIndex.filter((index) => {
+          return index.code.toLowerCase().indexOf(queryString.toLowerCase()) === 0 ||
+              index.name.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+        }) : nodeIndex;
+        // 璋冪敤 callback 杩斿洖寤鸿鍒楄〃鐨勬暟鎹�
+        let values = [];
+        results.forEach(item => {
+          values.push({
+            value: item.code,
+            name: item.name
+          })
+        });
+        cb(values);
+      },
+      saveIndexStorage() {
+        saveIndexStorage(this.indexId, this.indexStorageData).then((response) => {
+          if (response.code === 200) {
+            this.$message.success("鏁版嵁瀛樺偍鎴愬姛锛�");
+          } else {
+            this.$message.error("鏁版嵁瀛樺偍澶辫触锛�");
+          }
+        });
+      },
+      getIndexStorage(indexId) {
+        this.initData();
+        this.indexId = indexId;
+        getNodeIndex(this.nodeId).then((response) => {
+          this.nodeIndex = response.data;
+        });
+
+        getIndexStorage(indexId).then(response => this.indexStorageData = response.data);
+        // getCalcPeriod().then(response => this.indexStorageData.indexStorage = response.data);
+      },
+      getTimeLabel(timeType) {
+        return this.selectTimeTypeLabel(timeType);
+      }
+    }
+  }
+</script>
+
+<style scoped lang="scss">
+  .el-autocomplete {
+    width: 100%;
+  }
+
+  .my-autocomplete li {
+    line-height: normal;
+    padding: 7px;
+  }
+
+  .my-autocomplete li .name {
+    text-overflow: ellipsis;
+    overflow: hidden;
+  }
+
+  .my-autocomplete li .addr {
+    font-size: 12px;
+    color: #b4b4b4;
+  }
+
+  .my-autocomplete li .highlighted .addr {
+    color: #ddd;
+  }
+
+  .index-storage-container {
+    height: calc(100vh - 60px);
+    overflow: auto;
+  }
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/function/index.vue b/energy_management_ui/src/views/basicsetting/function/index.vue
new file mode 100644
index 0000000..5c8833d
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/function/index.vue
@@ -0,0 +1,252 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鍑芥暟鍚�" prop="funcName">
+              <el-input
+                  v-model="queryParams.funcName"
+                  placeholder="璇疯緭鍏ュ嚱鏁板悕"
+                  clearable
+                  size="small"
+                  @input="handleQuery"
+                  @clear="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-table :height="height" v-loading="loading" :data="functionList"
+                border
+                @row-click="handleCurrentChange"
+                highlight-current-row>
+        <el-table-column label="鍑芥暟鍚�" align="center" prop="funcName" width="200"/>
+        <el-table-column label="鍑芥暟鏂囨湰" align="center" prop="funcText" v-if="this.funcOpt"/>
+        <el-table-column label="浠嬬粛" align="center" prop="info"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="150"
+                         v-if="this.funcOpt">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['basicsetting:function:edit']"
+                v-if="false"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['basicsetting:function:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀硅绠楀嚱鏁板璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鍑芥暟鍚�" prop="funcName">
+          <el-input v-model="form.funcName" placeholder="璇疯緭鍏ュ嚱鏁板悕"/>
+        </el-form-item>
+        <el-form-item label="鍑芥暟鏂囨湰" prop="funcText">
+          <el-input v-model="form.funcText" placeholder="璇疯緭鍏ュ嚱鏁版枃鏈�"/>
+        </el-form-item>
+        <el-form-item label="浠嬬粛" prop="info">
+          <el-input v-model="form.info" placeholder="璇疯緭鍏ヤ粙缁�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listFunction,
+  getFunction,
+  delFunction,
+  addFunction,
+  updateFunction,
+  exportFunction
+} from "@/api/basicsetting/function";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "CalcFunction",
+  props: ["showOpt"],
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁$畻鍑芥暟琛ㄦ牸鏁版嵁
+      functionList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        funcName: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {},
+      funcOpt: true
+    };
+  },
+  created() {
+    this.getList();
+    this.funcOpt = this.$props.showOpt !== undefined ? this.$props.showOpt : true;
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 320;
+    },
+    /** 鏌ヨ璁$畻鍑芥暟鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listFunction(this.queryParams).then(response => {
+        this.functionList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        info: undefined,
+        funcName: undefined,
+        funcText: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleCurrentChange(currentRow) {
+      if (!this.funcOpt) {
+        this.$emit('confirmCalcFunction', currentRow.funcText);
+      }
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞璁$畻鍑芥暟";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      getFunction(row.id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼璁$畻鍑芥暟";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id !== undefined) {
+            updateFunction(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addFunction(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎璁$畻鍑芥暟涓�"' + row.funcName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delFunction(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎绠楀嚱鏁版暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportFunction(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/limitType/index.vue b/energy_management_ui/src/views/basicsetting/limitType/index.vue
new file mode 100644
index 0000000..2f48152
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/limitType/index.vue
@@ -0,0 +1,389 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="120px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="闄愬�肩被鍨嬪悕绉�" prop="limitName">
+              <el-input
+                  v-model="queryParams.limitName"
+                  placeholder="璇疯緭鍏ラ檺鍊肩被鍨嬪悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="18">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['basicsetting:limitType:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['basicsetting:limitType:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['basicsetting:limitType:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <!--      <el-col :span="1.5">-->
+        <!--        <el-button-->
+        <!--          type="warning"-->
+        <!--          icon="el-icon-download"-->
+        <!--          size="mini"-->
+        <!--          @click="handleExport"-->
+        <!--          v-hasPermi="['basicsetting:limitType:export']"-->
+        <!--        >瀵煎嚭</el-button>-->
+        <!--      </el-col>-->
+      </el-row>
+      <el-table :height="height" v-loading="loading" :data="limitTypeList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="闄愬�肩被鍨嬪悕绉�" align="center" prop="limitName"/>
+        <el-table-column label="闄愬�肩被鍨嬬紪鍙�" align="center" prop="limitCode"/>
+        <el-table-column label="鎶ヨ闄愬埗绫诲瀷" align="center" prop="alarmType" :formatter="typeFormat"/>
+        <el-table-column label="鑹插彿" align="center" prop="colorNumber">
+          <template slot-scope="scope">
+            <el-tag :color="scope.row.colorNumber" disable-transitions></el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="姣旇緝杩愮畻绗�" align="center" prop="comparatorOperator"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['basicsetting:limitType:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['basicsetting:limitType:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀规姤璀﹂檺鍊肩被鍨嬬淮鎶ゅ璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="闄愬�肩被鍨嬪悕绉�" prop="limitName">
+          <el-input v-model="form.limitName" placeholder="璇疯緭鍏ラ檺鍊肩被鍨嬪悕绉�"/>
+        </el-form-item>
+        <el-form-item label="闄愬�肩被鍨嬬紪鍙�" prop="limitCode">
+          <el-input v-model="form.limitCode" placeholder="璇疯緭鍏ラ檺鍊肩被鍨嬬紪鐮�"/>
+        </el-form-item>
+        <el-form-item label="鎶ヨ闄愬埗绫诲瀷" prop="alarmType">
+          <el-select v-model="form.alarmType" placeholder="璇烽�夋嫨鎶ヨ闄愬埗绫诲瀷" clearable size="small">
+            <el-option
+                v-for="item in alarmTypeList"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鑹插彿" prop="colorNumber">
+          <el-color-picker
+              v-model="form.colorNumber"
+              color-format="hex"
+              :predefine="predefineColors">
+          </el-color-picker>
+        </el-form-item>
+        <el-form-item label="姣旇緝杩愮畻绗�" prop="comparatorOperator">
+          <el-select v-model="form.comparatorOperator" placeholder="姣旇緝杩愮畻绗�" clearable size="small">
+            <el-option label="澶т簬" value=">"/>
+            <el-option label="澶т簬绛変簬" value=">="/>
+            <el-option label="灏忎簬" value="<"/>
+            <el-option label="灏忎簬绛変簬" value="<="/>
+            <el-option label="绛変簬" value="="/>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listLimitType,
+  getLimitType,
+  delLimitType,
+  addLimitType,
+  updateLimitType,
+  exportLimitType
+} from "@/api/basicsetting/limitType";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鎶ヨ闄愬�肩被鍨嬬淮鎶よ〃鏍兼暟鎹�
+      limitTypeList: [],
+
+      alarmTypeList: [],
+      alarmTypeDefaultVal: "",
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        limitName: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        limitName: [
+          {required: true, message: "闄愬�肩被鍨嬪悕绉颁笉鑳戒负绌�", trigger: "blur"}
+        ],
+        limitCode: [
+          {required: true, message: "闄愬�肩被鍨嬬紪鐮佷笉鑳戒负绌�", trigger: "blur"}
+        ],
+      },
+      //鑹插彿閫夋嫨鍣�
+      predefineColors: [
+        '#ff4500',
+        '#ff8c00',
+        '#ffd700',
+        '#90ee90',
+        '#00ced1',
+        '#1e90ff',
+        '#c71585'
+      ]
+    };
+  },
+  created() {
+    this.getDicts("alarm_type").then(response => {
+      this.alarmTypeList = response.data;
+      this.alarmTypeDefaultVal = this.alarmTypeList.find(f => f.isDefault === 'Y');
+    });
+    this.getList();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛� */
+    getList() {
+      this.loading = true;
+      listLimitType(this.queryParams).then(response => {
+        this.limitTypeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 瀛楀吀缈昏瘧
+    typeFormat(row, column) {
+      return this.selectDictLabel(this.alarmTypeList, row.alarmType);
+    },
+    // 鑹插彿鏍煎紡鍖�
+    colorNumberFormat(row, column) {
+      return "";
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        limitName: undefined,
+        limitCode: undefined,
+        colorNumber: undefined,
+        comparatorOperator: undefined,
+        alarmType: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.limitName = selection.map(item => item.limitName)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+      console.log(JSON.stringify(selection));
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.form.comparatorOperator = ">";
+      this.title = "娣诲姞鎶ヨ闄愬�肩被鍨嬬淮鎶�";
+      this.form.alarmType = this.alarmTypeDefaultVal.dictValue;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getLimitType(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鎶ヨ闄愬�肩被鍨嬬淮鎶�";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          // console.log(JSON.stringify(this.form))
+          if (this.form.id != undefined) {
+            updateLimitType(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addLimitType(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ悕绉颁负"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delLimitType(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋姤璀﹂檺鍊肩被鍨嬬淮鎶ゆ暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportLimitType(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    initAlarmType() {
+      for (let i = 0; i < this.model.energyindexList.length; i++) {
+        let ndy = "";
+        getAlarmType(this.model.energyindexList[i].indexId).then(response => {
+          if (response.code == '200') {
+            if (response.msg == "1") {
+              this.model.energyindexList[i].indexCategory = "鍚姩";
+            } else if (response.msg == "2") {
+              this.model.energyindexList[i].indexCategory = "鍋滄";
+            } else {
+              this.model.energyindexList[i].indexCategory = "灏氭湭璁剧疆";
+            }
+          } else {
+            this.model.energyindexList[i].indexCategory = "";
+          }
+        });
+      }
+    },
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/model/index.vue b/energy_management_ui/src/views/basicsetting/model/index.vue
new file mode 100644
index 0000000..d11a322
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/model/index.vue
@@ -0,0 +1,216 @@
+<template>
+  <div>
+    <basic-container :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['basicsetting:model:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+      </el-row>
+
+      <el-table v-loading="loading" :data="modelList" border :height="height">
+        <el-table-column label="搴忓彿" type="index" width="55" align="center"/>
+        <el-table-column label="妯″瀷缂栫爜" align="center" prop="modelCode"/>
+        <el-table-column label="妯″瀷鍚嶇О" align="center" prop="modelName"/>
+        <el-table-column label="绫诲瀷" align="center" prop="modelType" :formatter="modelTypeFormat"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="120px">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['basicsetting:model:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['basicsetting:model:remove']"
+                v-if="scope.row.isShow===1"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀规ā鍨嬪璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" :close-on-click-modal="false">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="妯″瀷缂栫爜" prop="modelCode">
+          <el-input v-model="form.modelCode" placeholder="璇疯緭鍏ユā鍨嬬紪鐮�" v-if="addOpt"/>
+          <span v-if="!addOpt">{{ this.form.modelCode }}</span>
+        </el-form-item>
+        <el-form-item label="妯″瀷鍚嶇О" prop="modelName">
+          <el-input v-model="form.modelName" placeholder="璇疯緭鍏ユā鍨嬪悕绉�"/>
+        </el-form-item>
+        <el-form-item label="妯″瀷绫诲瀷" prop="modelType">
+          <el-select v-model="form.modelType" placeholder="璇烽�夋嫨妯″瀷绫诲瀷" v-if="addOpt">
+            <el-option
+                v-for="dict in modelTypeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+          <span v-if="!addOpt">{{ this.selectDictLabel(this.modelTypeOptions, this.form.modelType) }}</span>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addModel, delModel, getModel, listModel, updateModel} from "@/api/basicsetting/model";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 妯″瀷琛ㄦ牸鏁版嵁
+      modelList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {},
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        modelCode: [
+          {required: true, message: "妯″瀷缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+          {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'},
+          {pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+        ], modelName: [
+          {required: true, message: "妯″瀷鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+          {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+        ], modelType: [
+          {required: true, message: "蹇呴』閫夋嫨妯″瀷绫诲瀷", trigger: "blur"}
+        ],
+      },
+      addOpt: true,
+      modelTypeOptions: [],
+      dictDefaultVal: undefined
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_model_type").then(response => {
+      this.modelTypeOptions = response.data;
+      this.dictDefaultVal = this.modelTypeOptions.find(f => f.isDefault === 'Y');
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 190 + 'px';
+      this.height = window.innerHeight - 290;
+    },
+    /** 鏌ヨ妯″瀷鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listModel(this.queryParams).then(response => {
+        this.modelList = response.data;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        modelCode: undefined,
+        modelName: undefined,
+        isShow: undefined,
+        modelType: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      if (this.dictDefaultVal) {
+        this.form.modelType = this.dictDefaultVal.dictValue;
+      }
+      this.addOpt = true;
+      this.open = true;
+      this.title = "娣诲姞妯″瀷";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.addOpt = false;
+      getModel(row.modelCode).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼妯″瀷";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (!this.addOpt) {
+            updateModel(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addModel(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎妯″瀷缂栧彿涓�"' + row.modelCode + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delModel(row.modelCode);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    modelTypeFormat(row, column) {
+      return this.selectDictLabel(this.modelTypeOptions, row.modelType);
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/modelNode/index.vue b/energy_management_ui/src/views/basicsetting/modelNode/index.vue
new file mode 100644
index 0000000..3595d05
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/modelNode/index.vue
@@ -0,0 +1,100 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="鏁版嵁妯″瀷绠$悊" :bodyStyle="bodyStyle">
+        <el-row :gutter="24">
+          <el-col :span="20">
+            <el-select v-model="modelData" placeholder="璇烽�夋嫨妯″瀷"
+                       size="small"
+                       filterable
+                       @change="changeModel">
+              <el-option
+                  v-for="model in modelInfoOptions"
+                  :key="model.modelCode"
+                  :label="model.modelName"
+                  :value="model.modelCode"
+              />
+            </el-select>
+          </el-col>
+          <el-col :span="4" style="margin-bottom: 16px">
+            <el-button icon="el-icon-setting" circle title="绠$悊妯″瀷" style="float:right;padding:8px"
+                       @click="manageModel"></el-button>
+          </el-col>
+        </el-row>
+        <ModelNode ref="modelNode" @changeNode="changeNode" :auth="false"></ModelNode>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :title="currentNode ? currentNode.label+'--鑺傜偣閰嶇疆' : '鑺傜偣閰嶇疆'" :bodyStyle="bodyStyleRight">
+        <ModelNodeSetting ref="modelNodeSetting"/>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+<script>
+import ModelNode from "../modelNode/modelNode";
+import {listModel} from "@/api/basicsetting/model";
+import ModelNodeSetting from "./modelNodeSetting";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from '@/components/shrink/index.vue'
+
+export default {
+  components: {ModelNodeSetting, ModelNode,ShrinkCol},
+  created() {
+    listModel({isShow: 1}).then(response => {
+      this.modelInfoOptions = response.data;
+      if (this.modelInfoOptions.length > 0) {
+        this.modelData = this.modelInfoOptions[0].modelCode;
+        this.$refs.modelNode.getList(this.modelData);
+      }
+    });
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      isCollapse: false,
+      bodyStyleRight: {},
+      currentNode: ''
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight -155 + 'px'
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      if (node) {
+        this.currentNode = node;
+      }
+      this.$refs.modelNodeSetting.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/modelNode/modelNode.vue b/energy_management_ui/src/views/basicsetting/modelNode/modelNode.vue
new file mode 100644
index 0000000..ca08fc3
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/modelNode/modelNode.vue
@@ -0,0 +1,439 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-input
+      placeholder="杈撳叆鍏抽敭瀛楄繘琛岃繃婊�"
+      prefix-icon="el-icon-search"
+      v-model="filterText"
+    >
+    </el-input>
+
+    <el-link
+      icon="el-icon-plus"
+      style="margin-top: 8px;width:100%"
+      @click="addNode"
+      v-if="nodeShowOpt && this.modelNodeData.length === 0"
+      >娣诲姞鏍硅妭鐐�
+    </el-link>
+    <el-tree
+      class="modelnode-tree"
+      :data="modelNodeData"
+      node-key="id"
+      highlight-current
+      :filter-node-method="filterNode"
+      :default-expanded-keys="treeExpandData"
+      :expand-on-click-node="false"
+      empty-text=""
+      ref="modelNodeTree"
+      @node-drop="handleDrop"
+      :allow-drop="allowDrop"
+      @node-click="changeNode"
+      :draggable="nodeShowOpt"
+      accordion
+    >
+      <span class="custom-tree-node" slot-scope="{ node, data }">
+        <span v-if="nodeShowOpt" id="a">
+          <el-tooltip
+            v-if="node.label.length > 8"
+            class="item"
+            effect="dark"
+            :content="node.label"
+            placement="top-end"
+          >
+            <span>{{ node.label.slice(0, 8) + "..." }}</span>
+          </el-tooltip>
+          <span v-else id="b">{{ node.label }}</span>
+        </span>
+        <span v-else id="c">
+          <el-tooltip
+            v-if="node.label.length > 11"
+            class="item"
+            effect="dark"
+            :content="node.label"
+            placement="top-end"
+          >
+            <span>
+              {{ node.label.slice(0, 11) + "..." }}
+            </span>
+          </el-tooltip>
+          <span v-else id="d">{{ node.label }}</span>
+        </span>
+        <span class="node-opt" v-if="nodeShowOpt">
+          <el-link
+            title="鏂板涓嬬骇鑺傜偣"
+            icon="el-icon-plus"
+            @click="() => addNode(node, data)"
+          >
+          </el-link>
+          <el-link
+            title="淇敼鑺傜偣"
+            icon="el-icon-edit"
+            @click="() => editNode(node, data)"
+          >
+          </el-link>
+          <el-link
+            title="鍒犻櫎鑺傜偣"
+            icon="el-icon-delete"
+            @click="() => delNode(node, data)"
+          >
+          </el-link>
+        </span>
+      </span>
+    </el-tree>
+    <!-- 娣诲姞鎴栦慨鏀规ā鍨嬭妭鐐瑰璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="500px"
+      :close-on-click-modal="false"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="鐖剁骇鑺傜偣" v-if="addOpt">
+          <span>{{ currentNode ? currentNode.name : "" }}</span>
+        </el-form-item>
+        <el-form-item label="鎸囨爣鑺傜偣缂栫爜" prop="code">
+          <el-input
+            v-if="addOpt"
+            v-model="form.code"
+            placeholder="璇疯緭鍏ョ紪鐮�"
+          />
+          <span v-if="!addOpt">{{ form.code }}</span>
+        </el-form-item>
+        <el-form-item label="鎸囨爣鑺傜偣鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
+        </el-form-item>
+        <el-form-item label="鑺傜偣绫诲瀷" prop="nodeType">
+          <el-select
+            v-model="form.nodeCategory"
+            placeholder="璇烽�夎妭鐐圭被鍨�"
+            prop="nodeCategory"
+            clearable
+          >
+            <el-option
+              v-for="dict in nodeCategoryOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addModelNode,
+  delModelNode,
+  getModelNode,
+  hasEnergyIndex,
+  modelNodeTree,
+  updateModelNode,
+  updateModelNodeOrder
+} from "../../../api/basicsetting/modelNode";
+
+export default {
+  name: "ModelNode",
+  props: ["modelCode", "showOpt", "auth", "isSelectFirstLeaf"],
+  watch: {
+    filterText(val) {
+      this.$refs.modelNodeTree.filter(val);
+    }
+  },
+  data() {
+    return {
+      filterText: "",
+      // 閬僵灞�
+      loading: true,
+      // 妯″瀷鑺傜偣琛ㄦ牸鏁版嵁
+      modelNodeData: [],
+      nodeCategoryOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      currentNode: undefined,
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        code: [
+          { required: true, message: "缂栫爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            min: 2,
+            max: 20,
+            message: "闀垮害鍦� 2 鍒� 20 涓瓧绗�",
+            trigger: "blur"
+          },
+          {
+            pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/,
+            message: "蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝"
+          }
+        ],
+        name: [
+          { required: true, message: "鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
+          { min: 2, max: 15, message: "闀垮害鍦� 2 鍒� 15 涓瓧绗�", trigger: "blur" }
+        ]
+      },
+      addOpt: true,
+      currentSelectNode: undefined,
+      treeExpandData: [],
+      currentModelCode: "",
+      nodeCategoryDefaultVal: "",
+      nodeShowOpt: true,
+      withAuth: false,
+      isFirstLeafNode: false // 閫変腑绗竴涓彾瀛愮粨鐐�
+    };
+  },
+  created() {
+    console.log("this.$props", this.$props);
+    let modelCode = this.$props.modelCode;
+    if (this.$props.auth !== undefined) {
+      this.withAuth = this.$props.auth;
+    }
+
+    if (modelCode) {
+      this.getList(modelCode);
+    }
+
+    this.nodeShowOpt =
+      this.$props.showOpt !== undefined ? this.$props.showOpt : true;
+    this.isFirstLeafNode =
+      this.$props.isSelectFirstLeaf !== undefined
+        ? this.$props.isSelectFirstLeaf
+        : false;
+  },
+  methods: {
+    filterNode(value, data) {
+      if (!value) {
+        return true;
+      }
+      return data.label.indexOf(value) !== -1;
+    },
+    /** 鏌ヨ妯″瀷鑺傜偣鍒楄〃 */
+    getList(modelCode) {
+      console.log("鏌ヨ妯″瀷鑺傜偣鍒楄〃", modelCode, this.modelCode);
+      this.currentModelCode = modelCode;
+      this.loading = true;
+
+      this.getDicts("sys_node_category").then(response => {
+        this.nodeCategoryOptions = response.data;
+        this.nodeCategoryDefaultVal = this.nodeCategoryOptions.find(
+          f => f.isDefault === "Y"
+        );
+      });
+
+      modelNodeTree({ modelCode: modelCode }, this.withAuth).then(response => {
+        this.modelNodeData = response.data;
+        this.loading = false;
+        let chooseNode = null;
+        if (this.modelNodeData.length > 0) {
+          // 閫変腑绗竴涓彾瀛愮粨鐐�
+          if (
+            this.modelNodeData[0].children &&
+            this.modelNodeData[0].children.length !== 0 &&
+            this.isFirstLeafNode
+          ) {
+            if (
+              this.modelNodeData[0].children[0].children &&
+              this.modelNodeData[0].children[0].children.length !== 0
+            ) {
+              chooseNode = this.modelNodeData[0].children[0].children[0];
+            } else {
+              chooseNode = this.modelNodeData[0].children[0];
+            }
+          } else {
+            chooseNode = this.modelNodeData[0];
+          }
+
+          this.treeExpandData.push(chooseNode.id);
+          this.$emit("changeNode", chooseNode);
+          this.$nextTick(() => {
+            this.$refs.modelNodeTree.setCurrentKey(chooseNode.id);
+          });
+        } else {
+          this.$emit("changeNode", "");
+        }
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.currentNode = undefined;
+      this.form = {
+        nodeId: undefined,
+        code: undefined,
+        name: undefined,
+        parentId: undefined,
+        address: undefined,
+        modelCode: undefined,
+        nodeCategory: undefined
+      };
+      this.resetForm("form");
+    },
+    addNode(node, data) {
+      this.reset();
+      this.addOpt = true;
+      if (data) {
+        this.currentSelectNode = data;
+        getModelNode(data.id).then(response => {
+          this.open = true;
+          this.title = "娣诲姞妯″瀷鑺傜偣";
+          this.currentNode = response.data;
+        });
+      } else {
+        this.open = true;
+      }
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    editNode(node, data) {
+      this.currentSelectNode = data;
+      this.reset();
+      this.addOpt = false;
+      getModelNode(data.id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼妯″瀷鑺傜偣";
+      });
+    },
+    delNode(node, data) {
+      if (data.children && data.children.length > 0) {
+        this.msgWarning("鍖呭惈瀛愯妭鐐癸紝涓嶈兘杩涜鍒犻櫎锛�");
+        return;
+      }
+
+      hasEnergyIndex(data.id).then(response => {
+        if (response.data) {
+          this.msgWarning("褰撳墠鑺傜偣涓嬪瓨鍦ㄦ寚鏍囷紝涓嶈兘杩涜鍒犻櫎锛�");
+        } else {
+          this.$confirm('鏄惁纭鍒犻櫎鍚嶄负"' + data.label + '"鐨勮妭鐐�?', "璀﹀憡", {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning"
+          })
+            .then(function() {
+              return delModelNode(data.id);
+            })
+            .then(() => {
+              let parent = node.parent;
+              let children = parent.data.children || parent.data;
+              let index = children.findIndex(d => d.id === data.id);
+              children.splice(index, 1);
+
+              this.$nextTick(() => {
+                if (parent.data && parent.data.id) {
+                  this.$emit("changeNode", parent.data);
+                } else {
+                  this.$emit("changeNode", null);
+                }
+              });
+
+              this.msgSuccess("鍒犻櫎鎴愬姛");
+            })
+            .catch(function() {});
+        }
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.nodeId !== undefined) {
+            updateModelNode(this.form).then(response => {
+              if (response.code === 200) {
+                this.currentSelectNode.label = this.form.name;
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            this.form.parentId = this.currentNode
+              ? this.currentNode.nodeId
+              : "";
+            this.form.address =
+              (this.currentNode ? this.currentNode.address : "") +
+              this.form.code +
+              ",";
+            this.form.modelCode = this.currentModelCode;
+            addModelNode(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                const addedNode = response.data;
+                const newChild = {
+                  id: addedNode.nodeId,
+                  label: addedNode.name,
+                  children: []
+                };
+                if (this.currentSelectNode) {
+                  if (!this.currentSelectNode.children) {
+                    this.$set(this.currentSelectNode, "children", []);
+                  }
+                  this.currentSelectNode.children.push(newChild);
+                } else {
+                  this.modelNodeData.push(newChild);
+                }
+
+                this.treeExpandData.push(addedNode.nodeId);
+                this.$nextTick(() => {
+                  this.$refs.modelNodeTree.setCurrentNode(newChild);
+                  this.$emit("changeNode", newChild);
+                });
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    allowDrop(draggingNode, dropNode, ev) {
+      return dropNode.level !== 1;
+    },
+    handleDrop(draggingNode, dropNode, dropType, ev) {
+      let updateData = {
+        nodeId: draggingNode.data.id,
+        parentId: dropNode.parent.data.id,
+        children: []
+      };
+      for (let item of dropNode.parent.childNodes) {
+        updateData.children.push(item.data.id);
+      }
+      updateModelNodeOrder(updateData).then();
+    },
+    changeNode(data, node, ev) {
+      this.$emit("changeNode", data);
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep {
+  .el-tree-node__content {
+    margin-top: 10px;
+    height: 35px;
+  }
+  // .is-current {
+  //   .el-tree-node__content {
+  //     border: 1px solid red;
+  //   }
+  // }
+  .el-tree--highlight-current
+    .el-tree-node.is-current
+    > .el-tree-node__content {
+    background-color: #f7f7f7;
+    border: 1px solid #38bcbf;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/modelNode/modelNodeSetting.vue b/energy_management_ui/src/views/basicsetting/modelNode/modelNodeSetting.vue
new file mode 100644
index 0000000..6ef6d48
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/modelNode/modelNodeSetting.vue
@@ -0,0 +1,397 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-tabs>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 鑳芥簮銆佷骇鍝併�佽澶囬厤缃�</span>
+        <el-collapse>
+          <el-collapse-item title="鑳芥簮閰嶇疆淇℃伅" :disabled="disabledSetting">
+            <el-button style="float: right; padding: 8px; margin-left:8px" type="text"
+                       icon="el-icon-setting"
+                       @click="energySetting">
+              閰嶇疆鑳芥簮
+            </el-button>
+            <el-table v-loading="energyLoading" :data="settingEnergyList" border
+                      @selection-change="handleSelectionChange">
+              <el-table-column label="鑳芥簮缂栫爜" align="center" prop="enersno"/>
+              <el-table-column label="鑳芥簮鍚嶇О" align="center" prop="enername"/>
+              <el-table-column label="鎿嶄綔" width="70" align="center"
+                               class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="delEnergy(scope.row)"
+                  ></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-collapse-item>
+          <el-collapse-item title="浜у搧閰嶇疆淇℃伅" :disabled="disabledSetting">
+            <el-button style="float: right; padding: 8px; margin-left:8px" type="text"
+                       icon="el-icon-setting"
+                       @click="productSetting">
+              閰嶇疆浜у搧
+            </el-button>
+            <el-table v-loading="productLoading" :data="settingProductList" border
+                      @selection-change="handleSelectionChange">
+              <el-table-column label="浜у搧缂栫爜" align="center" prop="productsno"/>
+              <el-table-column label="浜у搧鍚嶇О" align="center" prop="productname"/>
+              <el-table-column label="鎿嶄綔" width="70" align="center"
+                               class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="delProduct(scope.row)"
+                  ></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-collapse-item>
+          <el-collapse-item title="璁惧閰嶇疆淇℃伅" :disabled="disabledSetting">
+            <el-button style="float: right; padding: 8px; margin-bottom:8px" type="text"
+                       icon="el-icon-setting"
+                       @click="deviceSetting">
+              閰嶇疆璁惧
+            </el-button>
+            <el-table v-loading="deviceLoading" :data="settingDeviceList" border
+                      @selection-change="handleSelectionChange">
+              <el-table-column label="鍣ㄥ叿缂栫爜" align="center" prop="code"/>
+              <el-table-column label="鍣ㄥ叿鍚嶇О" align="center" prop="meterName"/>
+              <el-table-column label="鎿嶄綔" width="70" align="center"
+                               class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="delDevice(scope.row)"
+                  ></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-collapse-item>
+        </el-collapse>
+      </el-tab-pane>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 缁熻鎸囨爣</span>
+        <el-button style="float: right; padding: 8px; margin-bottom:8px" type="text"
+                   icon="el-icon-setting"
+                   @click="statisticIndexSetting">
+          閰嶇疆缁熻鎸囨爣
+        </el-button>
+        <el-table border v-loading="indexLoading" :data="settingStatisticIndexList"
+                  @select="handleSelectionChange">
+          <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+          <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"/>
+          <el-table-column label="鎿嶄綔" width="70" align="center"
+                           class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="delIndex(scope.row,'statistic')"
+              ></el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 閲囬泦鎸囨爣</span>
+        <el-button style="float: right; padding: 8px; margin-bottom:8px" type="text"
+                   icon="el-icon-setting"
+                   @click="collectIndexSetting">
+          閰嶇疆閲囬泦鐐�
+        </el-button>
+        <el-table border v-loading="indexLoading" :data="settingCollectIndexList"
+                  @select="handleSelectionChange">
+          <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+          <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"/>
+          <el-table-column label="鎿嶄綔" width="70" align="center"
+                           class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="delIndex(scope.row,'collect')"
+              ></el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+    </el-tabs>
+    <!--閫夋嫨璁惧-->
+    <el-drawer title="閫夋嫨璁惧" :visible.sync="deviceDialog" direction="rtl" @open="showDeviceDialog"
+               size="45%">
+      <DeviceSetting ref="deviceSetting" @deviceConfirmSelect="deviceConfirmSelect"></DeviceSetting>
+    </el-drawer>
+    <!--閫夋嫨鑳芥簮-->
+    <el-drawer title="閫夋嫨鑳芥簮" :visible.sync="energyDialog" direction="rtl" @open="showEnergyDialog"
+               size="45%">
+      <EnergySetting ref="energySetting" @energyConfirmSelect="energyConfirmSelect"></EnergySetting>
+    </el-drawer>
+    <!--閫夋嫨浜у搧-->
+    <el-drawer title="閫夋嫨浜у搧" :visible.sync="productDialog" direction="rtl" @open="showProductDialog"
+               size="45%">
+      <ProductSetting ref="productSetting"
+                      @productConfirmSelect="productConfirmSelect"></ProductSetting>
+    </el-drawer>
+    <!--閫夋嫨缁熻鎸囨爣-->
+    <el-drawer title="閫夋嫨缁熻鎸囨爣" :visible.sync="statisticIndexDialog" direction="rtl"
+               @open="showStatisticIndexDialog"
+               size="55%">
+      <StatisticIndexSetting ref="statisticIndexSetting" indexType="STATISTIC"
+                             @statisticIndexConfirmSelect="statisticIndexConfirmSelect"></StatisticIndexSetting>
+    </el-drawer>
+    <!--閫夋嫨閲囬泦鎸囨爣-->
+    <el-drawer title="閫夋嫨閲囬泦鎸囨爣" :visible.sync="collectIndexDialog" direction="rtl"
+               @open="showCollectIndexDialog"
+               size="55%">
+      <StatisticIndexSetting ref="collectIndexSetting" indexType="COLLECT"
+                             @statisticIndexConfirmSelect="collectIndexConfirmSelect"></StatisticIndexSetting>
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import {
+  delDevice,
+  delEnergy,
+  delIndex,
+  delProduct,
+  getSettingDevice,
+  getSettingEnergy,
+  getSettingIndex,
+  getSettingProduct,
+  setDevice,
+  setEnergy,
+  setNodeToIndex,
+  setProduct
+} from '@/api/basicsetting/modelNode'
+import DeviceSetting from "../nodeSetting/deviceSetting";
+import EnergySetting from "../nodeSetting/energySetting";
+import ProductSetting from "../nodeSetting/productSetting";
+import CollectIndexSetting from "../nodeSetting/collectIndexSetting";
+import StatisticIndexSetting from "../nodeSetting/statisticIndexSetting";
+
+export default {
+  name: "ModelNodeSetting",
+  components: {
+    StatisticIndexSetting,
+    CollectIndexSetting,
+    ProductSetting,
+    EnergySetting,
+    DeviceSetting
+  },
+  data() {
+    return {
+      currentNode: '',
+      deviceDialog: false,
+      energyDialog: false,
+      productDialog: false,
+      collectIndexDialog: false,
+      statisticIndexDialog: false,
+      indexLoading: false,
+      deviceLoading: false,
+      energyLoading: false,
+      productLoading: false,
+      settingEnergyList: [],
+      settingDeviceList: [],
+      settingProductList: [],
+      settingCollectIndexList: [],
+      settingStatisticIndexList: [],
+      disabledSetting: true
+    }
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.settingDeviceList = [];
+      this.settingCollectIndexList = [];
+      this.settingStatisticIndexList = [];
+      this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+      if (modelNode) {
+        this.currentNode = modelNode;
+        this.deviceLoading = true;
+        getSettingDevice(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingDeviceList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.deviceLoading = false;
+        });
+
+        this.energyLoading = true;
+        getSettingEnergy(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingEnergyList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.energyLoading = false;
+        });
+
+        this.productLoading = true;
+        getSettingProduct(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            this.settingProductList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.productLoading = false;
+        });
+
+        this.indexLoading = true;
+        getSettingIndex(modelNode.id).then((response) => {
+          if (response.code === 200) {
+            let result = response.data;
+            this.settingCollectIndexList = result.filter(f => f.indexType === 'COLLECT');
+            this.settingStatisticIndexList = result.filter(f => f.indexType === 'STATISTIC');
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.indexLoading = false;
+        });
+      }
+    },
+    deviceSetting() {
+      this.deviceDialog = true;
+    },
+    energySetting() {
+      this.energyDialog = true;
+    },
+    productSetting() {
+      this.productDialog = true;
+    },
+    collectIndexSetting() {
+      this.collectIndexDialog = true;
+    },
+    statisticIndexSetting() {
+      this.statisticIndexDialog = true;
+    },
+    showDeviceDialog() {
+      this.$nextTick(() => {
+        this.$refs.deviceSetting.init(this.settingDeviceList);
+      })
+    },
+    showEnergyDialog() {
+      this.$nextTick(() => {
+        this.$refs.energySetting.init(this.settingEnergyList);
+      })
+    },
+    showProductDialog() {
+      this.$nextTick(() => {
+        this.$refs.productSetting.init(this.settingProductList);
+      })
+    },
+    showCollectIndexDialog() {
+      this.$nextTick(() => {
+        this.$refs.collectIndexSetting.init(this.currentNode, this.settingCollectIndexList);
+      })
+    },
+    showStatisticIndexDialog() {
+      this.$nextTick(() => {
+        this.$refs.statisticIndexSetting.init(this.currentNode, this.settingStatisticIndexList);
+      })
+    },
+    deviceConfirmSelect(selectedDevice) {
+      this.settingDeviceList = selectedDevice;
+      let deviceIds = selectedDevice.map(item => item.id);
+      setDevice(this.currentNode.id, deviceIds).then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    energyConfirmSelect(selectedEnergy) {
+      this.settingEnergyList = selectedEnergy;
+      let energyIds = selectedEnergy.map(item => item.enerid);
+      setEnergy(this.currentNode.id, energyIds).then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    productConfirmSelect(selectedProduct) {
+      this.settingProductList = selectedProduct;
+      let productIds = selectedProduct.map(item => item.productid);
+      setProduct(this.currentNode.id, productIds).then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    collectIndexConfirmSelect(selectedIndex) {
+      this.settingCollectIndexList = selectedIndex;
+      let indexIds = selectedIndex.map(item => item.indexId);
+      setNodeToIndex(this.currentNode.id, indexIds, "COLLECT").then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    statisticIndexConfirmSelect(selectedIndex) {
+      this.settingStatisticIndexList = selectedIndex;
+      let indexIds = selectedIndex.map(item => item.indexId);
+      setNodeToIndex(this.currentNode.id, indexIds, "STATISTIC").then((response) => {
+        if (response.code !== 200) {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    handleSelectionChange() {
+    },
+    delDevice(row) {
+      delDevice(this.currentNode.id, row.id).then((response) => {
+        if (response.code === 200) {
+          this.settingDeviceList = this.settingDeviceList.filter(f => f.id !== row.id);
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    delEnergy(row) {
+      delEnergy(this.currentNode.id, row.enerid).then((response) => {
+        if (response.code === 200) {
+          this.settingEnergyList = this.settingEnergyList.filter(f => f.enerid !== row.enerid);
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    delProduct(row) {
+      delProduct(this.currentNode.id, row.productid).then((response) => {
+        if (response.code === 200) {
+          this.settingProductList = this.settingProductList.filter(
+              f => f.productid !== row.productid);
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    },
+    delIndex(row, type) {
+      delIndex(this.currentNode.id, row.indexId).then((response) => {
+        if (response.code === 200) {
+          if (type === 'collect') {
+            this.settingCollectIndexList = this.settingCollectIndexList.filter(
+                f => f.indexId !== row.indexId);
+          } else if (type === 'statistic') {
+            this.settingStatisticIndexList = this.settingStatisticIndexList.filter(
+                f => f.indexId !== row.indexId);
+          }
+        } else {
+          this.$message.error(response.msg);
+        }
+      });
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/nodeSetting/collectIndexSetting.vue b/energy_management_ui/src/views/basicsetting/nodeSetting/collectIndexSetting.vue
new file mode 100644
index 0000000..cfaa986
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/nodeSetting/collectIndexSetting.vue
@@ -0,0 +1,126 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="" prop="meterType" style="float: right">
+        <el-select v-model="queryParams.deviceId" size="small"
+                   @change="getList">
+          <el-option
+            v-for="device in settingDeviceList"
+            :key="device.id"
+            :label="device.meterName"
+            :value="device.id"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+
+    <el-table border v-loading="loading" :data="collectIndexList" @select="handleSelectionChange"
+              :header-cell-class-name="hideCheckAll"
+              ref="energySettingTable">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="缂栫爜" align="center" prop="code"/>
+      <el-table-column label="鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat"/>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  import {listCollectIndex} from "@/api/basicsetting/energyindex";
+  import {getSettingDevice, getSettingCollectIndex} from '@/api/basicsetting/modelNode'
+
+  export default {
+    name: "CollectIndexSetting",
+    data() {
+      return {
+        collectIndexList: [],
+        selectedCollectIndex: [],
+        settingDeviceList: [],
+        loading: false,
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          deviceId: undefined,
+        },
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: []
+      }
+    },
+    created() {
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+      });
+    },
+    methods: {
+      init(modelNode) {
+        getSettingCollectIndex(modelNode.id).then((response) => {
+          this.selectedCollectIndex = response.data;
+        }).then(() => {
+          getSettingDevice(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingDeviceList = response.data;
+              if (this.settingDeviceList && this.settingDeviceList.length > 0) {
+                this.queryParams.deviceId = this.settingDeviceList[0].id;
+              }
+            } else {
+              this.$message.error(response.msg);
+            }
+
+            this.getList();
+          });
+        });
+      },
+      getList() {
+        this.loading = true;
+        listCollectIndex(this.queryParams).then(response => {
+          this.collectIndexList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+          this.$nextTick(function () {
+            this.$refs.energySettingTable.data.forEach(rowData => {
+              let exist = this.selectedCollectIndex.filter(
+                f => f.indexId === rowData.indexId).length;
+              if (exist > 0) {
+                this.$refs.energySettingTable.toggleRowSelection(rowData, true);
+              }
+            });
+          });
+        });
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection, row) {
+        let rowStatus = selection.filter(f => f.indexId === row.indexId).length;
+        if (rowStatus > 0) {
+          this.selectedCollectIndex.push({
+            "indexId": row.indexId,
+            "code": row.code,
+            "name": row.name
+          });
+        } else {
+          this.selectedCollectIndex = this.selectedCollectIndex.filter(
+            f => f.indexId !== row.indexId);
+        }
+
+        this.$emit('collectIndexConfirmSelect', this.selectedCollectIndex);
+      },
+      unitIdFormat(row) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/nodeSetting/deviceSetting.vue b/energy_management_ui/src/views/basicsetting/nodeSetting/deviceSetting.vue
new file mode 100644
index 0000000..cfdbeea
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/nodeSetting/deviceSetting.vue
@@ -0,0 +1,141 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="" prop="code" style="float: right">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="杈撳叆缂栫爜鏌ヨ"
+          clearable
+          size="small"
+          @input="handleQuery"
+          @clear="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="" prop="meterType" style="float: right">
+        <el-select v-model="queryParams.meterType" placeholder="閫夋嫨绉嶇被鏌ヨ" clearable size="small"
+                   @change="handleQuery">
+          <el-option
+            v-for="dict in meterTypeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+    </el-form>
+
+    <el-table border v-loading="loading" :data="implementList" @select="handleSelectionChange"
+              :header-cell-class-name="hideCheckAll"
+              ref="deviceSettingTable">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="鍣ㄥ叿缂栫爜" align="center" prop="code"/>
+      <el-table-column label="鍣ㄥ叿鍚嶇О" align="center" prop="meterName"/>
+      <el-table-column label="鍣ㄥ叿绉嶇被" align="center" prop="meterType" :formatter="meterTypeFormat"/>
+      <el-table-column label="瑙勬牸鍨嬪彿" align="center" prop="modelNumber"/>
+      <el-table-column label="瀹夎浣嶇疆" align="center" prop="installactionLocation"/>
+      <el-table-column label="鐘舵��" align="center" prop="meterStatus" :formatter="meterStatusFormat"/>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  import {listImplement,} from "@/api/meter/implement";
+
+  export default {
+    name: "DeviceSetting",
+    data() {
+      return {
+        // 閬僵灞�
+        loading: true,
+        // 閫変腑鏁扮粍
+        selectedDevice: [],
+        // 鎬绘潯鏁�
+        total: 0,
+        // 璁¢噺鍣ㄥ叿妗f缁存姢琛ㄦ牸鏁版嵁
+        implementList: [],
+        // 绉嶇被瀛楀吀
+        meterTypeOptions: [],
+        // 鐘舵�佸瓧鍏�
+        meterStatusOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          code: undefined,
+          meterType: undefined,
+        }
+      };
+    },
+    methods: {
+      init(currentSelected) {
+        this.queryParams = {
+          pageNum: 1,
+          pageSize: 10,
+          code: undefined,
+          meterType: undefined,
+        };
+        this.selectedDevice = currentSelected;
+        this.getList();
+        this.getDicts("sys_device_type").then(response => {
+          this.meterTypeOptions = response.data;
+        });
+        this.getDicts("meter_status").then(response => {
+          this.meterStatusOptions = response.data;
+        });
+      },
+      /** 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃 */
+      getList() {
+        this.loading = true;
+        listImplement(this.queryParams).then(response => {
+          this.implementList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+          this.$nextTick(function () {
+            this.$refs.deviceSettingTable.data.forEach(rowData => {
+              let exist = this.selectedDevice.filter(f => f.id === rowData.id).length;
+              if (exist > 0) {
+                this.$refs.deviceSettingTable.toggleRowSelection(rowData, true);
+              }
+            });
+          });
+        });
+      },
+      // 绉嶇被瀛楀吀缈昏瘧
+      meterTypeFormat(row, column) {
+        return this.selectDictLabel(this.meterTypeOptions, row.meterType);
+      },
+      // 鐘舵�佸瓧鍏哥炕璇�
+      meterStatusFormat(row, column) {
+        return this.selectDictLabel(this.meterStatusOptions, row.meterStatus);
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection, row) {
+        let rowStatus = selection.filter(f => f.id === row.id).length;
+        if (rowStatus > 0) {
+          this.selectedDevice.push({
+            "id": row.id,
+            "code": row.code,
+            "meterName": row.meterName
+          });
+        } else {
+          this.selectedDevice = this.selectedDevice.filter(f => f.id !== row.id);
+        }
+
+        this.$emit('deviceConfirmSelect', this.selectedDevice);
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/nodeSetting/energySetting.vue b/energy_management_ui/src/views/basicsetting/nodeSetting/energySetting.vue
new file mode 100644
index 0000000..48b8321
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/nodeSetting/energySetting.vue
@@ -0,0 +1,70 @@
+<template>
+  <div class="app-container">
+    <el-table border v-loading="loading" :data="energyList" @select="handleSelectionChange"
+              :header-cell-class-name="hideCheckAll"
+              ref="energySettingTable">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="鑳芥簮缂栧彿" align="center" prop="enersno"/>
+      <el-table-column label="鑳芥簮鍚嶇О" align="center" prop="enername"/>
+      <el-table-column label="璁¢噺鍗曚綅" align="center" prop="muidName"/>
+      <el-table-column label="鑳芥簮绫诲埆" align="center" prop="enerclassname"/>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {listEnergy} from "@/api/enerInfoManage/energy";
+
+  export default {
+    name: "EnergySetting",
+    data() {
+      return {
+        energyList: [],
+        selectedEnergy: [],
+        loading: false
+      }
+    },
+    methods: {
+      init(currentSelected) {
+        this.selectedEnergy = currentSelected;
+        this.getList();
+      },
+      getList() {
+        this.loading = true;
+
+        listEnergy({}).then(response => {
+          this.energyList = response.rows;
+          this.loading = false;
+          this.$nextTick(function () {
+            this.$refs.energySettingTable.data.forEach(rowData => {
+              let exist = this.selectedEnergy.filter(f => f.enerid === rowData.enerid).length;
+              if (exist > 0) {
+                this.$refs.energySettingTable.toggleRowSelection(rowData, true);
+              }
+            });
+          });
+        });
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection, row) {
+        debugger
+        let rowStatus = selection.filter(f => f.enerid === row.enerid).length;
+        if (rowStatus > 0) {
+          this.selectedEnergy.push({
+            "enerid": row.enerid,
+            "enersno": row.enersno,
+            "enername": row.enername
+          });
+        } else {
+          this.selectedEnergy = this.selectedEnergy.filter(f => f.ennerid !== row.ennerid);
+        }
+
+        this.$emit('energyConfirmSelect', this.selectedEnergy);
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/nodeSetting/productSetting.vue b/energy_management_ui/src/views/basicsetting/nodeSetting/productSetting.vue
new file mode 100644
index 0000000..688261b
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/nodeSetting/productSetting.vue
@@ -0,0 +1,76 @@
+<template>
+  <div class="app-container">
+    <el-table border v-loading="loading" :data="productList" @select="handleSelectionChange"
+              :header-cell-class-name="hideCheckAll"
+              ref="productSettingTable">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="浜у搧缂栧彿" align="center" prop="productsno"/>
+      <el-table-column label="浜у搧鍚嶇О" align="center" prop="productname"/>
+      <el-table-column label="璁¢噺鍗曚綅" align="center" prop="muid" :formatter="muidFormat"/>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {listProduct} from "@/api/enerInfoManage/product";
+
+  export default {
+    name: "ProductSetting",
+    data() {
+      return {
+        productList: [],
+        selectedProduct: [],
+        loading: false,
+        muidOptions: []
+      }
+    },
+    methods: {
+      init(currentSelected) {
+        this.selectedProduct = currentSelected;
+        this.getList();
+        this.getDicts("sys_unit").then(response => {
+          this.muidOptions = response.data;
+        });
+      },
+      getList() {
+        this.loading = true;
+
+        listProduct({}).then(response => {
+          this.productList = response.rows;
+          this.loading = false;
+          this.$nextTick(function () {
+            this.$refs.productSettingTable.data.forEach(rowData => {
+              let exist = this.selectedProduct.filter(f => f.productid === rowData.productid).length;
+              if (exist > 0) {
+                this.$refs.productSettingTable.toggleRowSelection(rowData, true);
+              }
+            });
+          });
+        });
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection, row) {
+        let rowStatus = selection.filter(f => f.productid === row.productid).length;
+        if (rowStatus > 0) {
+          this.selectedProduct.push({
+            "productid": row.productid,
+            "productsno": row.productsno,
+            "productname": row.productname
+          });
+        } else {
+          this.selectedProduct = this.selectedProduct.filter(f => f.productid !== row.productid);
+        }
+
+        this.$emit('productConfirmSelect', this.selectedProduct);
+      },
+      // 璁¢噺鍗曚綅瀛楀吀缈昏瘧
+      muidFormat(row, column) {
+        return this.selectDictLabel(this.muidOptions, row.muid);
+      },
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/nodeSetting/statisticIndexSetting.vue b/energy_management_ui/src/views/basicsetting/nodeSetting/statisticIndexSetting.vue
new file mode 100644
index 0000000..3c43c6f
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/nodeSetting/statisticIndexSetting.vue
@@ -0,0 +1,169 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" style="width: 260px">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鎸囨爣搴�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     modelCode="statistic_index_model"
+                     :showOpt="false" :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:8px">
+          <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"
+                   class="query-form">
+            <el-form-item label="" prop="indexCategory">
+              <el-select v-model="queryParams.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" clearable
+                         style="width:160px"
+                         size="small"
+                         @change="handleQuery">
+                <el-option
+                  v-for="dict in indexCategoryOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="name">
+              <el-input
+                v-model="queryParams.name"
+                placeholder="璇疯緭鍏ユ寚鏍囧悕绉�/缂栫爜"
+                clearable
+                size="small"
+                @input="handleQuery"
+                @clear="handleQuery"
+                style="width:190px"
+              />
+            </el-form-item>
+          </el-form>
+
+          <el-table v-loading="loading" :data="energyindexList" border
+                    @select="handleSelectionChange"
+                    :header-cell-class-name="hideCheckAll" ref="energySettingTable">
+            <el-table-column type="selection" width="55" align="center"/>
+            <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+            <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"/>
+            <el-table-column label="鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat"/>
+          </el-table>
+
+          <pagination
+            v-show="total>0"
+            :total="total"
+            :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize"
+            @pagination="getList"
+          />
+
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import {listEnergyindex} from "@/api/basicsetting/energyindex";
+  import ModelNode from "../modelNode/modelNode";
+
+  export default {
+    name: "StatisticIndexSetting",
+    components: {ModelNode},
+    props: ["indexType"],
+    data() {
+      return {
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        energyindexList: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined,
+          indexType: ''
+        },
+        indexCategoryOptions: [],
+        unitIdOptions: [],
+        currentNode: undefined,
+        loading: false,
+        selectedStatisticIndex: []
+      }
+    },
+    created() {
+      this.getDicts("sys_index_category").then(response => {
+        this.indexCategoryOptions = response.data;
+      });
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+      });
+    },
+    methods: {
+      init(modelNode, currentSelected) {
+        this.selectedStatisticIndex = currentSelected;
+      },
+      changeNode: function (modelNode) {
+        this.currentNode=modelNode;
+        this.getList();
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList() {
+       let modelNode = this.currentNode ;
+        if (modelNode) {
+          this.loading = true;
+          this.queryParams.nodeId = modelNode.id;
+          this.queryParams.indexType = this.$props.indexType;
+          listEnergyindex(this.queryParams).then(response => {
+            this.energyindexList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+            this.$nextTick(function () {
+              this.$refs.energySettingTable.data.forEach(rowData => {
+                let exist = this.selectedStatisticIndex.filter(
+                  f => f.indexId === rowData.indexId).length;
+                if (exist > 0) {
+                  this.$refs.energySettingTable.toggleRowSelection(rowData, true);
+                }
+              });
+            });
+          });
+        } else {
+          this.energyindexList = [];
+        }
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      handleSelectionChange(selection, row) {
+        let rowStatus = selection.filter(f => f.indexId === row.indexId).length;
+        if (rowStatus > 0) {
+          this.selectedStatisticIndex.push({
+            "indexId": row.indexId,
+            "code": row.code,
+            "name": row.name
+          });
+        } else {
+          this.selectedStatisticIndex = this.selectedStatisticIndex.filter(
+            f => f.indexId !== row.indexId);
+        }
+
+        this.$emit('statisticIndexConfirmSelect', this.selectedStatisticIndex);
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/stateIndex/index.vue b/energy_management_ui/src/views/basicsetting/stateIndex/index.vue
new file mode 100644
index 0000000..ff9cee2
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/stateIndex/index.vue
@@ -0,0 +1,68 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            <el-select v-model="modelData" placeholder="璇烽�夋嫨妯″瀷"
+                       style="width:220px"
+                       size="small"
+                       @change="changeModel">
+              <el-option
+                v-for="model in modelInfoOptions"
+                :key="model.modelCode"
+                :label="model.modelName"
+                :value="model.modelCode"
+              />
+            </el-select>
+           <!-- <el-button icon="el-icon-setting" circle title="绠$悊妯″瀷" style="float:right;padding:8px"
+                       @click="manageModel"></el-button>-->
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+          <StateSetting ref="StateSetting"></StateSetting>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import StateSetting from "./indexStateSetting";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+  import {listModel} from "@/api/basicsetting/model";
+
+  export default {
+    components: {StateSetting, ModelNode},
+    created() {
+      listModel({isShow: 1}).then(response => {
+        this.modelInfoOptions = response.data;
+        if (this.modelInfoOptions.length > 0) {
+          this.modelData = this.modelInfoOptions[0].modelCode;
+          this.$refs.modelNode.getList(this.modelData);
+        }
+      });
+    },
+
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: []
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.StateSetting.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/stateIndex/indexStateSetting.vue b/energy_management_ui/src/views/basicsetting/stateIndex/indexStateSetting.vue
new file mode 100644
index 0000000..c53620a
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/stateIndex/indexStateSetting.vue
@@ -0,0 +1,247 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label:''}}--鑺傜偣璁剧疆</span>
+      </div>
+      <el-tabs>
+        <el-tab-pane :disabled="disabledSetting">
+          <span slot="label"><i class="el-icon-s-data"></i>瀹炴椂鐩戞祴</span>
+              <el-table v-loading="energyLoading" :data="settingIndexList" border @selection-change="handleSelectionChange">
+                <el-table-column label="璁惧鍚嶇О"  align="center"  prop="indexId"/>
+                <el-table-column label="鎸囨爣缂栫爜"  align="center"  prop=""/>
+                <el-table-column label="鎸囨爣鍚嶇О"  align="center"  prop=""/>
+                <el-table-column label="寮�濮嬫椂闂�"  align="center"  prop=""/>
+                <el-table-column label="鐘舵��"      align="center"  prop=""/>
+            </el-table>
+        </el-tab-pane>
+        <el-tab-pane :disabled="disabledSetting">
+          <span slot="label"><i class="el-icon-reading"></i>鍘嗗彶鐩戞祴</span>
+          <StateIndex ref="stateIndex"></StateIndex>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+  </div>
+</template>
+<script>
+  import {
+    delDevice,
+    delEnergy,
+    delIndex,
+    delProduct,
+    getSettingDevice,
+    getSettingEnergy,
+    getSettingIndex,
+    getSettingProduct,
+    setNodeToIndex,
+    setDevice,
+    setEnergy,
+    setProduct
+  } from '@/api/basicsetting/modelNode'
+  import StateIndex from "./stateIndex";
+  import {List} from "@/api/basicsetting/state"
+
+  export default {
+    name: "stateIndex",
+    components: {StateIndex},
+    data() {
+      return {
+        currentNode: '',
+        deviceDialog: false,
+        energyDialog: false,
+        productDialog: false,
+        collectIndexDialog: false,
+        indexLoading: false,
+        deviceLoading: false,
+        energyLoading: false,
+        productLoading: false,
+        settingEnergyList: [],
+        settingDeviceList: [],
+        settingProductList: [],
+        settingIndexList: [],
+        disabledSetting: true,
+        nodeId:undefined
+      }
+    },
+    created() {
+      setInterval( this.getList() , 3000);
+
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.nodeId = modelNode.id;
+        this.getList(this.nodeId);
+        this.settingDeviceList = [];
+        this.settingIndexList = [];
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+          this.deviceLoading = true;
+          getSettingDevice(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingDeviceList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.deviceLoading = false;
+          });
+
+          this.energyLoading = true;
+          getSettingEnergy(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingEnergyList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.energyLoading = false;
+          });
+
+          this.productLoading = true;
+          getSettingProduct(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingProductList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.productLoading = false;
+          });
+
+          this.indexLoading = true;
+          getSettingIndex(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingIndexList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.indexLoading = false;
+          });
+
+          // this.$refs.energyIndex.getList(modelNode);
+        }
+      },
+
+      getList(e)
+      {
+        List("STATISTIC",e).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.indexLoading = false;
+        });
+
+      },
+      deviceSetting() {
+        this.deviceDialog = true;
+      },
+      energySetting() {
+        this.energyDialog = true;
+      },
+      productSetting() {
+        this.productDialog = true;
+      },
+      collectIndexSetting() {
+        this.collectIndexDialog = true;
+      },
+      showDeviceDialog() {
+        this.$nextTick(() => {
+          this.$refs.deviceSetting.init(this.settingDeviceList);
+        })
+      },
+      showEnergyDialog() {
+        this.$nextTick(() => {
+          this.$refs.energySetting.init(this.settingEnergyList);
+        })
+      },
+      showProductDialog() {
+        this.$nextTick(() => {
+          this.$refs.productSetting.init(this.settingProductList);
+        })
+      },
+      showCollectIndexDialog() {
+        this.$nextTick(() => {
+          this.$refs.collectIndexSetting.init(this.currentNode, this.settingIndexList);
+        })
+      },
+      deviceConfirmSelect(selectedDevice) {
+        this.settingDeviceList = selectedDevice;
+        let deviceIds = selectedDevice.map(item => item.id);
+        setDevice(this.currentNode.id, deviceIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      energyConfirmSelect(selectedEnergy) {
+        this.settingEnergyList = selectedEnergy;
+        let energyIds = selectedEnergy.map(item => item.enerid);
+        setEnergy(this.currentNode.id, energyIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      productConfirmSelect(selectedProduct) {
+        this.settingProductList = selectedProduct;
+        let productIds = selectedProduct.map(item => item.productid);
+        setProduct(this.currentNode.id, productIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      collectIndexConfirmSelect(selectedIndex) {
+        this.settingIndexList = selectedIndex;
+        let indexIds = selectedIndex.map(item => item.indexId);
+        setNodeToIndex(this.currentNode.id, indexIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      handleSelectionChange() {
+      },
+      delDevice(row) {
+        delDevice(this.currentNode.id, row.id).then((response) => {
+          if (response.code === 200) {
+            this.settingDeviceList = this.settingDeviceList.filter(f => f.id !== row.id);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      delEnergy(row) {
+        delEnergy(this.currentNode.id, row.enerid).then((response) => {
+          if (response.code === 200) {
+            this.settingEnergyList = this.settingEnergyList.filter(f => f.enerid !== row.enerid);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      delProduct(row) {
+        delProduct(this.currentNode.id, row.productid).then((response) => {
+          if (response.code === 200) {
+            this.settingProductList = this.settingProductList.filter(f => f.productid !== row.productid);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      delIndex(row) {
+        delIndex(this.currentNode.id, row.indexId).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = this.settingIndexList.filter(f => f.indexId !== row.indexId);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/basicsetting/stateIndex/stateIndex.vue b/energy_management_ui/src/views/basicsetting/stateIndex/stateIndex.vue
new file mode 100644
index 0000000..851d89d
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/stateIndex/stateIndex.vue
@@ -0,0 +1,193 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <el-form-item label="鏃堕棿鏌ヨ">
+        <el-date-picker
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="璁惧鍚嶇О" prop="code">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="璇疯緭鍏ヨ澶囧悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          style="width:160px"
+        />
+      </el-form-item>
+      <el-form-item label="鎸囨爣鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+          style="width:160px"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table   :data="List"  v-loading="loading"    border @selection-change=""  >
+      <!--<el-table-column type="selection" width="55" align="center"/>-->
+      <el-table-column label="璁惧鍚嶇О"  align="center"  prop="" >111111111</el-table-column>
+      <el-table-column label="鎸囨爣缂栫爜"  align="center"  prop="" />
+      <el-table-column label="鎸囨爣鍚嶇О"  align="center"  prop="" />
+      <el-table-column label="鏃堕棿鐐�"    align="center"  prop="" />
+      <el-table-column label="鎸佺画鏃堕棿"    align="center"  prop="" />
+      <el-table-column label="鐘舵��"      align="center"  prop="" />
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+<script>
+  import {
+    addEnergyindex,
+    delEnergyindex,
+    exportEnergyindex,
+    getEnergyindex,
+    listEnergyindex,
+    updateEnergyindex
+  } from "@/api/basicsetting/energyindex";
+
+  export default {
+    name: 'energyIndex',
+    data() {
+      return {
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        dateRange: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        List: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+        indexCategoryOptions: [],
+        // 澶囨敞瀛楀吀
+        remarkOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined
+        },
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          name: [
+            {required: true, message: "鎸囨爣鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+          ], code: [
+            {required: true, message: "鎸囨爣缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'},
+            {pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+          ], indexCategory: [
+            {required: true, message: "璇烽�夋嫨鎸囨爣鍒嗙被", trigger: "blur"}
+          ]
+        },
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+
+    created() {
+     /*  this.getList();*/
+      this.getDicts("sys_index_category").then(response => {
+        this.indexCategoryOptions = response.data;
+        this.indexCategoryDefaultVal = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+      });
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+        this.unitDefaultVal = this.unitIdOptions.find(f => f.isDefault === 'Y');
+      });
+    },
+    methods: {
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList(modelNode) {
+        this.currentNode = modelNode;
+        if (modelNode) {
+          this.loading = true;
+          this.queryParams.nodeId = modelNode.id;
+          listEnergyindex(this.queryParams).then(response => {
+            this.List = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          });
+        } else {
+          this.List = [];
+        }
+
+      },
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀缈昏瘧
+      indexCategoryFormat(row, column) {
+        return this.selectDictLabel(this.indexCategoryOptions, row.indexCategory);
+      },
+
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.currentNode);
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/statetype/index.vue b/energy_management_ui/src/views/basicsetting/statetype/index.vue
new file mode 100644
index 0000000..834eb26
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/statetype/index.vue
@@ -0,0 +1,308 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鐘舵�佸悕绉�" prop="stateName">
+        <el-input
+          v-model="queryParams.stateName"
+          placeholder="璇疯緭鍏ョ姸鎬佸悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['basicsetting:statetype:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['basicsetting:statetype:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['basicsetting:statetype:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="statetypeList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鐘舵�佸悕绉�" align="center" prop="stateName" />
+      <el-table-column label="鐘舵�佺紪鐮�" align="center" prop="stateCode" />
+      <el-table-column label="鑹插彿" align="center" prop="colorNumber"  >
+        <template slot-scope="scope">
+          <el-tag :color="scope.row.colorNumber"  disable-transitions></el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['basicsetting:statetype:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['basicsetting:statetype:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀圭郴缁熺姸鎬佺淮鎶ゅ璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鐘舵�佸悕绉�" prop="stateName">
+          <el-input v-model="form.stateName" placeholder="璇疯緭鍏ョ姸鎬佸悕绉�" />
+        </el-form-item>
+        <el-form-item label="鐘舵�佺紪鐮�" prop="stateCode">
+          <el-input v-model="form.stateCode" placeholder="璇疯緭鍏ョ姸鎬佺紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鑹插彿" prop="colorNumber">
+          <el-color-picker
+            v-model="form.colorNumber"
+            color-format="hex"
+            :predefine="predefineColors">
+          </el-color-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listStatetype, getStatetype, delStatetype, addStatetype, updateStatetype, exportStatetype } from "@/api/basicsetting/statetype";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 閫変腑鍚嶅瓧鏁扮粍
+      stateNames: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 绯荤粺鐘舵�佺淮鎶よ〃鏍兼暟鎹�
+      statetypeList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鐘舵�佷富閿甶d瀛楀吀
+      stateIdOptions: [],
+      // 鐘舵�佸悕绉板瓧鍏�
+      stateNameOptions: [],
+      // 鐘舵�佺紪鐮佸瓧鍏�
+      stateCodeOptions: [],
+      // 鑹插彿瀛楀吀
+      colorNumberOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 寤虹珛浜哄瓧鍏�
+      createByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        stateName: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        stateName: [
+          { required: true, message: "鐘舵�佸悕绉颁笉鑳戒负绌�", trigger: "blur" }
+        ],
+        stateCode: [
+          { required: true, message: "鐘舵�佸悕绉颁笉鑳戒负绌�", trigger: "blur" }
+        ],
+        colorNumber: [
+          { required: true, message: "鑹插彿涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+      },
+      //鑹插彿閫夋嫨鍣�
+      predefineColors: [
+        '#ff4500',
+        '#ff8c00',
+        '#ffd700',
+        '#90ee90',
+        '#00ced1',
+        '#1e90ff',
+        '#c71585'
+      ]
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ绯荤粺鐘舵�佺淮鎶ゅ垪琛� */
+    getList() {
+      this.loading = true;
+      listStatetype(this.queryParams).then(response => {
+        this.statetypeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        stateId: undefined,
+        stateName: undefined,
+        stateCode: undefined,
+        colorNumber: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.stateId)
+      this.stateNames = selection.map(item => item.stateName)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞绯荤粺鐘舵�佺淮鎶�";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const stateId = row.stateId || this.ids
+      getStatetype(stateId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼绯荤粺鐘舵�佺淮鎶�";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.stateId != undefined) {
+            updateStatetype(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addStatetype(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const stateIds = row.stateId || this.ids;
+      const stateLNames = row.stateName || this.stateNames;
+      this.$confirm('鏄惁纭鍒犻櫎绯荤粺鐘舵�佺淮鎶ょ姸鎬佸悕绉颁负"' + stateLNames + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delStatetype(stateIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夌郴缁熺姸鎬佺淮鎶ゆ暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportStatetype(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/basicsetting/template/index.vue b/energy_management_ui/src/views/basicsetting/template/index.vue
new file mode 100644
index 0000000..11a351b
--- /dev/null
+++ b/energy_management_ui/src/views/basicsetting/template/index.vue
@@ -0,0 +1,437 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        label-width="72px"
+        class="special-form"
+      >
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鍙傛暟缂栫爜" prop="code">
+              <el-input
+                v-model="queryParams.code"
+                placeholder="璇疯緭鍏ュ弬鏁扮紪鐮�"
+                clearable
+                size="small"
+                @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍙傛暟鍚嶇О" prop="name">
+              <el-input
+                v-model="queryParams.name"
+                placeholder="璇疯緭鍏ュ弬鏁板悕绉�"
+                clearable
+                size="small"
+                @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="璁惧绫诲瀷" prop="deviceType">
+              <el-select
+                v-model="queryParams.deviceType"
+                placeholder="璇烽�夋嫨璁惧绫诲瀷"
+                clearable
+                size="small"
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="dict in deviceTypeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button
+                type="primary"
+                icon="el-icon-search"
+                size="mini"
+                @click="handleQuery"
+                >鎼滅储</el-button
+              >
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            icon="el-icon-plus"
+            size="mini"
+            @click="handleAdd"
+            v-hasPermi="['basicsetting:template:add']"
+            >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="success"
+            icon="el-icon-edit"
+            size="mini"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['basicsetting:template:edit']"
+            >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="danger"
+            icon="el-icon-delete"
+            size="mini"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['basicsetting:template:remove']"
+            >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="warning"
+            icon="el-icon-download"
+            size="mini"
+            @click="handleExport"
+            v-hasPermi="['basicsetting:template:export']"
+            >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table
+        :height="height"
+        v-loading="loading"
+        :data="templateList"
+        border
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="鍙傛暟缂栫爜" align="center" prop="code" />
+        <el-table-column label="鍙傛暟鍚嶇О" align="center" prop="name" />
+        <el-table-column
+          label="鍗曚綅"
+          align="center"
+          prop="unit"
+          :formatter="unitFormat"
+        />
+        <el-table-column
+          label="璁惧绫诲瀷"
+          align="center"
+          prop="deviceType"
+          :formatter="deviceTypeFormat"
+        />
+        <el-table-column
+          label="鎿嶄綔"
+          width="150"
+          align="center"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['basicsetting:template:edit']"
+              >淇敼
+            </el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['basicsetting:template:remove']"
+              >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀归噰闆嗗弬鏁版ā鏉垮璇濇 -->
+    <el-dialog
+      :title="title"
+      :visible.sync="open"
+      width="500px"
+      :close-on-click-modal="false"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鍙傛暟缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ュ弬鏁扮紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鍙傛暟鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ弬鏁板悕绉�" />
+        </el-form-item>
+        <el-form-item label="鍗曚綅" prop="unit">
+          <el-select v-model="form.unit" placeholder="璇烽�夋嫨鍗曚綅" filterable>
+            <el-option
+              v-for="dict in unitOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璁惧绫诲瀷" prop="deviceType">
+          <el-select v-model="form.deviceType" placeholder="璇烽�夋嫨璁惧绫诲瀷">
+            <el-option
+              v-for="dict in deviceTypeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listTemplate,
+  getTemplate,
+  delTemplate,
+  addTemplate,
+  updateTemplate,
+  exportTemplate
+} from "@/api/basicsetting/template";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 閫変腑鐨勯」缂栫爜
+      codes: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 閲囬泦鍙傛暟妯℃澘琛ㄦ牸鏁版嵁
+      templateList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鍙傛暟鎵�灞炵被鍨嬪瓧鍏�
+      deviceTypeOptions: [],
+      unitOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        name: undefined,
+        deviceType: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        code: [
+          { required: true, message: "璇疯緭鍙傛暟缂栫爜", trigger: "blur" },
+          {
+            min: 2,
+            max: 10,
+            message: "闀垮害鍦� 2 鍒� 10 涓瓧绗�",
+            trigger: "blur"
+          },
+          {
+            pattern: /^[a-zA-Z][A-Za-z0-9]+$/,
+            message: "蹇呴』涓烘暟瀛楁垨瀛楁瘝锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝"
+          }
+        ],
+        name: [
+          { required: true, message: "璇疯緭鍙傛暟鍚嶇О", trigger: "blur" },
+          { min: 2, max: 10, message: "闀垮害鍦� 2 鍒� 10 涓瓧绗�", trigger: "blur" }
+        ],
+        deviceType: [
+          { required: true, message: "璇烽�夋嫨璁惧绫诲瀷", trigger: "blur" }
+        ]
+      },
+      dictDefaultVal: undefined
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_unit").then(response => {
+      this.unitOptions = response.data;
+    });
+    this.getDicts("sys_device_type").then(response => {
+      this.deviceTypeOptions = response.data;
+      this.dictDefaultVal = this.deviceTypeOptions.find(
+        f => f.isDefault === "Y"
+      );
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + "px",
+        overflow: "hidden"
+      };
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ閲囬泦鍙傛暟妯℃澘鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listTemplate(this.queryParams).then(response => {
+        this.templateList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙傛暟鎵�灞炵被鍨嬪瓧鍏哥炕璇�
+    deviceTypeFormat(row, column) {
+      return this.selectDictLabel(this.deviceTypeOptions, row.deviceType);
+    },
+    unitFormat(row, column) {
+      return this.selectDictLabel(this.unitOptions, row.unit);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        deviceType: undefined,
+        unit: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.codes = selection.map(item => item.code);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      if (this.dictDefaultVal) {
+        this.form.deviceType = this.dictDefaultVal.dictValue;
+      }
+      this.open = true;
+      this.title = "娣诲姞閲囬泦鍙傛暟妯℃澘";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getTemplate(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼閲囬泦鍙傛暟妯℃澘";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateTemplate(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addTemplate(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const codes = row.code || this.codes;
+      this.$confirm(
+        '鏄惁纭鍒犻櫎閲囬泦鍙傛暟妯℃澘缂栧彿涓�"' + codes + '"鐨勬暟鎹」?',
+        "璀﹀憡",
+        {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }
+      )
+        .then(function() {
+          return delTemplate(ids);
+        })
+        .then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭鎵�鏈夐噰闆嗗弬鏁版ā鏉挎暟鎹」?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(function() {
+          return exportTemplate(queryParams);
+        })
+        .then(response => {
+          this.download(response.msg);
+        })
+        .catch(function() {});
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/benchmarking/BenchmarkingManagement/benchmarking.vue b/energy_management_ui/src/views/benchmarking/BenchmarkingManagement/benchmarking.vue
new file mode 100644
index 0000000..86e34b6
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/BenchmarkingManagement/benchmarking.vue
@@ -0,0 +1,204 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" >{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dateTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['energyEenchmarking:energyEenchmarking:add']"
+        >淇濆瓨</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table v-loading="loading" :data="energyEenchmarkingList" @selection-change="handleSelectionChange" ref="multipleTable">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="label">{{label}}</el-table-column>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName"  />
+      <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat" />
+      <el-table-column label="鏍囨潌鍊�" align="center" prop="value">
+        <template scope="scope">
+          <el-input size="mini"  v-model="scope.row.value"></el-input>
+        </template>
+      </el-table-column>
+      <el-table-column label="瀹為檯鍊�" align="center" prop="actualValue">
+        <template scope="scope">
+          <el-input size="mini"  v-model="scope.row.actualValue"></el-input>
+        </template>
+      </el-table-column>
+      <el-table-column label="鏍囨潌鑼冨洿" align="center" >
+        <template scope="scope">
+          <el-select v-model="scope.row.benchmarkingRange" placeholder="璇烽�夋嫨鏍囨潌鑼冨洿" clearable prop="benchmarkingRange">
+            <el-option
+              v-for="dict in benchmarkingRangeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </template>
+      </el-table-column>
+      <el-table-column label="鏍囨潌绫诲瀷" align="center" >
+        <template scope="scope" prop="benchmarkingType" :formatter="benchmarkingTypeFormat">
+          <el-select v-model="scope.row.benchmarkingType" placeholder="璇烽�夋嫨鏍囨潌绫诲瀷" clearable prop="benchmarkingType"  >
+            <el-option
+              v-for="dict in benchmarkingTypeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import { listBenchmarkingManagement,addBenchmarkingManagement} from "@/api/benchmarking/BenchmarkingManagement";
+
+  export default {
+  name: 'enchmarking',
+  name: 'Index',
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList: [],
+      // 鏈夋晥鏈熷瓧鍏�
+      unitIdOptions:[],
+      dateTypeOptions:[],
+      // 鏍囨潌鑼冨洿瀛楀吀
+      benchmarkingRangeOptions: [],
+      // 鏍囨潌绫诲瀷瀛楀吀
+      benchmarkingTypeOptions: [],
+      dateRange:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dateTime: undefined,
+        indexId: undefined,
+        timeType:"DAY"
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      label:"",
+
+    };
+  },
+  created() {
+    //this.getList();
+    this.getTime();
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+    this.getDicts("energyPlan").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getDicts("benchmarkingRange").then(response => {
+      this.benchmarkingRangeOptions = response.data;
+    });
+    this.getDicts("benchmarkingType").then(response => {
+      this.benchmarkingTypeOptions = response.data;
+    })
+  },
+    methods: {
+      /** 鏌ヨenergy_benchmarking鍒楄〃 */
+      modelNodeChange(modelNode) {
+        this.queryParams.indexId=modelNode.id;
+        this.label=modelNode.label;
+        this.getList(this.queryParams)
+      },
+      getList() {
+        this.loading = true;
+        listBenchmarkingManagement(this.queryParams).then(response => {
+          this.energyEenchmarkingList=response.data
+          this.loading = false;
+        });
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      benchmarkingTypeFormat(row, column) {
+        return this.selectDictLabel(this.benchmarkingTypeOptions, row.benchmarkingType);
+      },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.$nextTick(() => {
+        this.$refs['multipleTable'].data.forEach(rowData => {
+          rowData.timeType=this.queryParams.timeType
+          rowData.dateTime=this.queryParams.dateTime
+        });
+        this.form.configInfo=JSON.stringify( this.$refs['multipleTable'].data);
+        console.log(this.form.configInfo);
+        addBenchmarkingManagement(this.form.configInfo).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("淇濆瓨鎴愬姛");
+            this.getList();
+          } else {
+            this.msgError(response.msg);
+          }
+        })
+      });
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dateTime = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/benchmarking/BenchmarkingManagement/index.vue b/energy_management_ui/src/views/benchmarking/BenchmarkingManagement/index.vue
new file mode 100644
index 0000000..3ec2ce8
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/BenchmarkingManagement/index.vue
@@ -0,0 +1,56 @@
+
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鏍囨潌绠$悊
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <benchmarking ref="benchmarking" style="padding:10px"></benchmarking>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import benchmarking from "./benchmarking";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: {ModelNode,benchmarking},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.benchmarking.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/benchmarking/phaseBenchmarking/LineChart.vue b/energy_management_ui/src/views/benchmarking/phaseBenchmarking/LineChart.vue
new file mode 100644
index 0000000..94a1168
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/phaseBenchmarking/LineChart.vue
@@ -0,0 +1,130 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons')
+  import resize from '../../dashboard/mixins/resize'
+  const animationDuration = 6000
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null,
+        seriesData: [],
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData,actualData,expecteData} = {}) {
+        this.chart.setOption({
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          title: {
+            x: 'center',
+            y: 'top',
+            textStyle: {
+              color: "#333"
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 40,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          legend: {
+            data:['鏍囨潌鍊�','瀹為檯鍊�'],
+            left: '60%',
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisPointer: {
+              type: 'shadow'
+            }
+          }],
+          yAxis: [{
+            //name: '缁煎悎鑳借��',
+            type: 'value',
+            nameTextStyle: {
+              color: "#333",
+            },
+            axisLabel: {
+              formatter: '{value}'
+            },
+            axisTick: {
+              show: false
+            },
+          }],
+          series: [{
+            name:"鏍囨潌鍊�",
+            type: 'bar',
+            data: expectedData,
+            //stack: 'vistors',
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          },{
+            name:"瀹為檯鍊�",
+            type: 'bar',
+            data: expecteData,
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          }]
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/benchmarking/phaseBenchmarking/index.vue b/energy_management_ui/src/views/benchmarking/phaseBenchmarking/index.vue
new file mode 100644
index 0000000..9778c7f
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/phaseBenchmarking/index.vue
@@ -0,0 +1,56 @@
+
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            闃舵瀵规爣
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <phaseBenchmarking ref="phaseBenchmarking" style="padding:10px"></phaseBenchmarking>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import phaseBenchmarking from "./phaseBenchmarking";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: {ModelNode,phaseBenchmarking},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.phaseBenchmarking.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/benchmarking/phaseBenchmarking/phaseBenchmarking.vue b/energy_management_ui/src/views/benchmarking/phaseBenchmarking/phaseBenchmarking.vue
new file mode 100644
index 0000000..3aa1488
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/phaseBenchmarking/phaseBenchmarking.vue
@@ -0,0 +1,182 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿">
+        <el-date-picker
+          v-model="dateRange"
+          :type="dateTypes"
+          :value-format="valueFormat"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="鎸囨爣鍚嶇О">
+        <el-select v-model="queryParams.indexId" placeholder="璇烽�夋嫨鎸囨爣">
+          <el-option style="width: 150px"
+                     v-for="dict in arraylist"
+                     :key="dict.indexId"
+                     :label="dict.name"
+                     :value="dict.indexId"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+      <line-chart  ref="LineChart" :chart-data="lineChartData"/>
+    </el-row>
+    <el-table :data="energyEenchmarkingList">
+      <el-table-column label="鏃ユ湡" align="center" prop="dateTime">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.dateTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName"  />
+      <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat" />
+      <el-table-column label="鏍囨潌鍊�" align="center" prop="value"/>
+      <el-table-column label="瀹為檯鍊�" align="center" prop="actualValue"/>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import { listPhaseBenchmarking} from "@/api/benchmarking/phaseBenchmarking";
+  import LineChart from './LineChart'
+  import {getSettingIndex} from '@/api/basicsetting/modelNode'
+  export default {
+  components: {LineChart},
+  name: 'enchmarking',
+  name: 'Index',
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      dateRange:[],
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList: [],
+      arraylist:[],
+      // 鏈夋晥鏈熷瓧鍏�
+      unitIdOptions:[],
+      dateTypeOptions:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dateTime: undefined,
+        indexId: undefined,
+        timeType:"DAY"
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      label:"",
+      lineChartData:{},
+      dateTypes: 'daterange',
+      valueFormat:"yyyy-MM-dd",
+    };
+  },
+  created() {
+    //this.getList();
+    this.getTime();
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+      this.getDicts("energyPlan").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+  },
+  methods: {
+    /** 鏌ヨenergy_benchmarking鍒楄〃 */
+    modelNodeChange(modelNode) {
+      this.queryParams.indexId=modelNode.id;
+      this.label=modelNode.label;
+      this.getList(this.queryParams)
+      //鑾峰彇妯″瀷鑾峰彇鎸囨爣
+      getSettingIndex(modelNode.id).then(response => {
+        if(response.data.length>0){
+          this.arraylist=response.data;
+          this.queryParams.indexId=this.arraylist[0].indexId;
+        }
+      })
+    },
+    getList() {
+      listPhaseBenchmarking(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.energyEenchmarkingList=response.data
+        let actualData=[];
+        let expectedData=[];
+        let expecteData=[];
+        let title=[];
+        this.energyEenchmarkingList.forEach(item => {
+          actualData.push(this.parseTime(item.dateTime));
+          expectedData.push(item.value);
+          expecteData.push(item.actualValue);
+        })
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.expecteData=expecteData;
+        this.$refs.LineChart.initChart(this.lineChartData);
+      });
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.unitId);
+    },
+
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      let startTime = year + '-' + month + '-' + (date-1)
+      let endTime = year + '-' + month + '-' + date
+      this.dateRange=[startTime,endTime]
+    },
+    handleTime(date){
+      if(date=='YEAR'){
+        this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+      }else if(date=='MONTH'){
+        this.dateTypes= 'monthrange',
+        this.valueFormat='yyyy-MM'
+      }else{
+        this.dateTypes= 'daterange',
+        this.valueFormat='yyyy-MM-dd'
+      }
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/LineChart.vue b/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/LineChart.vue
new file mode 100644
index 0000000..94a1168
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/LineChart.vue
@@ -0,0 +1,130 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons')
+  import resize from '../../dashboard/mixins/resize'
+  const animationDuration = 6000
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null,
+        seriesData: [],
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData,actualData,expecteData} = {}) {
+        this.chart.setOption({
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          title: {
+            x: 'center',
+            y: 'top',
+            textStyle: {
+              color: "#333"
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 40,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          legend: {
+            data:['鏍囨潌鍊�','瀹為檯鍊�'],
+            left: '60%',
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisPointer: {
+              type: 'shadow'
+            }
+          }],
+          yAxis: [{
+            //name: '缁煎悎鑳借��',
+            type: 'value',
+            nameTextStyle: {
+              color: "#333",
+            },
+            axisLabel: {
+              formatter: '{value}'
+            },
+            axisTick: {
+              show: false
+            },
+          }],
+          series: [{
+            name:"鏍囨潌鍊�",
+            type: 'bar',
+            data: expectedData,
+            //stack: 'vistors',
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          },{
+            name:"瀹為檯鍊�",
+            type: 'bar',
+            data: expecteData,
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          }]
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/index.vue b/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/index.vue
new file mode 100644
index 0000000..186cdec
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/index.vue
@@ -0,0 +1,56 @@
+
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            瀹炴椂瀵规爣
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <realTimeBenchmarking ref="realTimeBenchmarking" style="padding:10px"></realTimeBenchmarking>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import realTimeBenchmarking from "./realTimeBenchmarking";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: {ModelNode,realTimeBenchmarking},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.realTimeBenchmarking.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/realTimeBenchmarking.vue b/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/realTimeBenchmarking.vue
new file mode 100644
index 0000000..c2dff94
--- /dev/null
+++ b/energy_management_ui/src/views/benchmarking/realTimeBenchmarking/realTimeBenchmarking.vue
@@ -0,0 +1,104 @@
+<template>
+  <div class="app-container">
+    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+      <line-chart  ref="LineChart" :chart-data="lineChartData"/>
+    </el-row>
+    <el-table :data="energyEenchmarkingList">
+      <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="label">{{label}}</el-table-column>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName"  />
+      <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat" />
+      <el-table-column label="鏍囨潌鍊�" align="center" prop="value"/>
+      <el-table-column label="瀹為檯鍊�" align="center" prop="actualValue"/>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import { listRealTimeListrealTime} from "@/api/benchmarking/phaseBenchmarking";
+  import LineChart from './LineChart'
+  export default {
+  components: {LineChart},
+  name: 'enchmarking',
+  name: 'Index',
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList: [],
+      // 鏈夋晥鏈熷瓧鍏�
+      unitIdOptions:[],
+      dateTypeOptions:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dateTime: undefined,
+        indexId: undefined,
+        timeType:"DAY"
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      label:"",
+      lineChartData:{},
+    };
+  },
+  created() {
+    //this.getList();
+    this.getTime();
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+    this.getDicts("energyPlan").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+  },
+  methods: {
+    /** 鏌ヨenergy_benchmarking鍒楄〃 */
+    modelNodeChange(modelNode) {
+      this.queryParams.indexId=modelNode.id;
+      this.label=modelNode.label;
+      this.getList(this.queryParams)
+    },
+    getList() {
+      listRealTimeListrealTime(this.queryParams).then(response => {
+        this.energyEenchmarkingList=response.data
+        let actualData=[];
+        let expectedData=[];
+        let expecteData=[];
+        this.energyEenchmarkingList.forEach(item => {
+          actualData.push(item.indexName);
+          expectedData.push(item.value);
+          expecteData.push(item.actualValue);
+        })
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.expecteData=expecteData;
+        this.$refs.LineChart.initChart(this.lineChartData);
+      });
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.unitId);
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dateTime = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/components/icons/element-icons.js b/energy_management_ui/src/views/components/icons/element-icons.js
new file mode 100644
index 0000000..df72201
--- /dev/null
+++ b/energy_management_ui/src/views/components/icons/element-icons.js
@@ -0,0 +1,74 @@
+const elementIcons = [
+  'info',
+  'error',
+  'success',
+  'warning',
+  'question',
+  'back',
+  'arrow-left',
+  'arrow-down',
+  'arrow-right',
+  'arrow-up',
+  'caret-left',
+  'caret-bottom',
+  'caret-top',
+  'caret-right',
+  'd-arrow-left',
+  'd-arrow-right',
+  'minus',
+  'plus',
+  'remove',
+  'circle-plus',
+  'remove-outline',
+  'circle-plus-outline',
+  'close',
+  'check',
+  'circle-close',
+  'circle-check',
+  'circle-close-outline',
+  'circle-check-outline',
+  'zoom-out',
+  'zoom-in',
+  'd-caret',
+  'sort',
+  'sort-down',
+  'sort-up',
+  'tickets',
+  'document',
+  'goods',
+  'sold-out',
+  'news',
+  'message',
+  'date',
+  'printer',
+  'time',
+  'bell',
+  'mobile-phone',
+  'service',
+  'view',
+  'menu',
+  'more',
+  'more-outline',
+  'star-on',
+  'star-off',
+  'location',
+  'location-outline',
+  'phone',
+  'phone-outline',
+  'picture',
+  'picture-outline',
+  'delete',
+  'search',
+  'edit',
+  'edit-outline',
+  'rank',
+  'refresh',
+  'share',
+  'setting',
+  'upload',
+  'upload2',
+  'download',
+  'loading'
+]
+
+export default elementIcons
diff --git a/energy_management_ui/src/views/components/icons/index.vue b/energy_management_ui/src/views/components/icons/index.vue
new file mode 100644
index 0000000..d3c9a71
--- /dev/null
+++ b/energy_management_ui/src/views/components/icons/index.vue
@@ -0,0 +1,87 @@
+<template>
+  <div class="icons-container">
+    <aside>
+      <a href="#" target="_blank">Add and use
+      </a>
+    </aside>
+    <el-tabs type="border-card">
+      <el-tab-pane label="Icons">
+        <div v-for="item of svgIcons" :key="item">
+          <el-tooltip placement="top">
+            <div slot="content">
+              {{ generateIconCode(item) }}
+            </div>
+            <div class="icon-item">
+              <svg-icon :icon-class="item" class-name="disabled" />
+              <span>{{ item }}</span>
+            </div>
+          </el-tooltip>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="Element-UI Icons">
+        <div v-for="item of elementIcons" :key="item">
+          <el-tooltip placement="top">
+            <div slot="content">
+              {{ generateElementIconCode(item) }}
+            </div>
+            <div class="icon-item">
+              <i :class="'el-icon-' + item" />
+              <span>{{ item }}</span>
+            </div>
+          </el-tooltip>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import svgIcons from './svg-icons'
+import elementIcons from './element-icons'
+
+export default {
+  name: 'Icons',
+  data() {
+    return {
+      svgIcons,
+      elementIcons
+    }
+  },
+  methods: {
+    generateIconCode(symbol) {
+      return `<svg-icon icon-class="${symbol}" />`
+    },
+    generateElementIconCode(symbol) {
+      return `<i class="el-icon-${symbol}" />`
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.icons-container {
+  margin: 10px 20px 0;
+  overflow: hidden;
+
+  .icon-item {
+    margin: 20px;
+    height: 85px;
+    text-align: center;
+    width: 100px;
+    float: left;
+    font-size: 30px;
+    color: #24292e;
+    cursor: pointer;
+  }
+
+  span {
+    display: block;
+    font-size: 16px;
+    margin-top: 10px;
+  }
+
+  .disabled {
+    pointer-events: none;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/components/icons/svg-icons.js b/energy_management_ui/src/views/components/icons/svg-icons.js
new file mode 100644
index 0000000..724cd8e
--- /dev/null
+++ b/energy_management_ui/src/views/components/icons/svg-icons.js
@@ -0,0 +1,10 @@
+const req = require.context('../../../assets/icons/svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys()
+
+const re = /\.\/(.*)\.svg/
+
+const svgIcons = requireAll(req).map(i => {
+  return i.match(re)[1]
+})
+
+export default svgIcons
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/BarChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/BarChart.vue
new file mode 100644
index 0000000..cc9a0a7
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 30,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/LineChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/comprehensive.vue b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/comprehensive.vue
new file mode 100644
index 0000000..6245c6c
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/comprehensive.vue
@@ -0,0 +1,419 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑳芥簮绫诲瀷">
+        <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+          <el-option
+            v-for="dict in indexCategoryOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷" >
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>-->
+      <el-form-item label="缁熻鏃堕棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        :type="dateTypes"
+                        :value-format="valueFormat"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <!--<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>-->
+      </el-form-item>
+    </el-form>
+    <el-table :data="energyList" border style="width: 100%; margin-top: 20px" class="tableList" >
+      <el-table-column label="鏇茬嚎閫夋嫨">
+        <template slot-scope="scope">
+          <el-button icon="el-icon-search" circle @click="selectChange(scope.row.indexId)" style="font-size: 10px"></el-button>
+        </template>
+      </el-table-column>
+      <el-table-column prop="indexName" align="center" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+      <el-table-column label="1鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value1)}}</template></el-table-column>
+      <el-table-column label="2鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value2)}}</template></el-table-column>
+      <el-table-column label="3鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value3)}}</template></el-table-column>
+      <el-table-column label="4鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value4)}}</template></el-table-column>
+      <el-table-column label="5鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value5)}}</template></el-table-column>
+      <el-table-column label="6鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value6)}}</template></el-table-column>
+      <el-table-column label="7鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value7)}}</template></el-table-column>
+      <el-table-column label="8鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value8)}}</template></el-table-column>
+      <el-table-column label="9鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value9)}}</template></el-table-column>
+      <el-table-column label="10鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value10)}}</template></el-table-column>
+      <el-table-column label="11鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value11)}}</template></el-table-column>
+      <el-table-column label="12鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value12)}}</template></el-table-column>
+      <el-table-column label="13鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value13)}}</template></el-table-column>
+      <el-table-column label="14鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value14)}}</template></el-table-column>
+      <el-table-column label="15鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value15)}}</template></el-table-column>
+      <el-table-column label="16鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value16)}}</template></el-table-column>
+      <el-table-column label="17鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value17)}}</template></el-table-column>
+      <el-table-column label="18鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value18)}}</template></el-table-column>
+      <el-table-column label="19鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value19)}}</template></el-table-column>
+      <el-table-column label="10鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value20)}}</template></el-table-column>
+      <el-table-column label="21鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value21)}}</template></el-table-column>
+      <el-table-column label="22鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value22)}}</template></el-table-column>
+      <el-table-column label="23鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value23)}}</template></el-table-column>
+      <el-table-column label="24鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value24)}}</template></el-table-column>
+    </el-table>
+    <!--<div class="el-table el-table&#45;&#45;fit el-table&#45;&#45;scrollable-x el-table&#45;&#45;enable-row-hover el-table&#45;&#45;medium" >
+      <div class="el-table__body-wrapper is-scrolling-left">
+        <table class="el-table__body tableList" cellspacing="0" cellpadding="0" style="width: 1400px;" >
+          <tr v-for="item in tableHead">
+            <td>鏇茬嚎閫夋嫨</td>
+            <td>鑳芥簮鎸囨爣鍚嶇О</td>
+            <td v-if="item.value1 !=null">{{item.value1}}</td>
+            <td v-if="item.value2 !=null">{{item.value2}}</td>
+            <td v-if="item.value3 !=null">{{item.value3}}</td>
+            <td v-if="item.value4 !=null">{{item.value4}}</td>
+            <td v-if="item.value5 !=null">{{item.value5}}</td>
+            <td v-if="item.value6 !=null">{{item.value6}}</td>
+            <td v-if="item.value7 !=null">{{item.value7}}</td>
+            <td v-if="item.value8 !=null">{{item.value8}}</td>
+            <td v-if="item.value9 !=null">{{item.value9}}</td>
+            <td v-if="item.value10 !=null">{{item.value10}}</td>
+            <td v-if="item.value11 !=null">{{item.value11}}</td>
+            <td v-if="item.value12 !=null">{{item.value12}}</td>
+            <td v-if="item.value13 !=null">{{item.value13}}</td>
+            <td v-if="item.value14 !=null">{{item.value14}}</td>
+            <td v-if="item.value15 !=null">{{item.value15}}</td>
+            <td v-if="item.value16 !=null">{{item.value16}}</td>
+            <td v-if="item.value17 !=null">{{item.value17}}</td>
+            <td v-if="item.value18 !=null">{{item.value18}}</td>
+            <td v-if="item.value19 !=null">{{item.value19}}</td>
+            <td v-if="item.value20 !=null">{{item.value20}}</td>
+            <td v-if="item.value21 !=null">{{item.value21}}</td>
+            <td v-if="item.value22 !=null">{{item.value22}}</td>
+            <td v-if="item.value23 !=null">{{item.value23}}</td>
+            <td v-if="item.value24 !=null">{{item.value24}}</td>
+            <td v-if="item.value25 !=null">{{item.value25}}</td>
+            <td v-if="item.value26 !=null">{{item.value26}}</td>
+            <td v-if="item.value27 !=null">{{item.value27}}</td>
+            <td v-if="item.value28 !=null">{{item.value28}}</td>
+            <td v-if="item.value29 !=null">{{item.value29}}</td>
+            <td v-if="item.value30 !=null">{{item.value30}}</td>
+            <td v-if="item.value31 !=null">{{item.value31}}</td>
+          </tr>
+          <tr  v-for="(item ,index) in tableData">
+            <td><el-button icon="el-icon-search" circle @click="selectChange(item.indexId)" style="font-size: 10px"></el-button></td>
+            <td>{{item.indexName}}</td>
+            <td v-if="item.value1 !=null">{{numFilter(item.value1)}}</td>
+            <td v-if="item.value2 !=null">{{numFilter(item.value2)}}</td>
+            <td v-if="item.value3 !=null">{{numFilter(item.value3)}}</td>
+            <td v-if="item.value4 !=null">{{numFilter(item.value4)}}</td>
+            <td v-if="item.value5 !=null">{{numFilter(item.value5)}}</td>
+            <td v-if="item.value6 !=null">{{numFilter(item.value6)}}</td>
+            <td v-if="item.value7 !=null">{{numFilter(item.value7)}}</td>
+            <td v-if="item.value8 !=null">{{numFilter(item.value8)}}</td>
+            <td v-if="item.value9 !=null">{{numFilter(item.value9)}}</td>
+            <td v-if="item.value10 !=null">{{numFilter(item.value10)}}</td>
+            <td v-if="item.value11 !=null">{{numFilter(item.value11)}}</td>
+            <td v-if="item.value12 !=null">{{numFilter(item.value12)}}</td>
+            <td v-if="item.value13 !=null">{{numFilter(item.value13)}}</td>
+            <td v-if="item.value14 !=null">{{numFilter(item.value14)}}</td>
+            <td v-if="item.value15 !=null">{{numFilter(item.value15)}}</td>
+            <td v-if="item.value16 !=null">{{numFilter(item.value16)}}</td>
+            <td v-if="item.value17 !=null">{{numFilter(item.value17)}}</td>
+            <td v-if="item.value18 !=null">{{numFilter(item.value18)}}</td>
+            <td v-if="item.value19 !=null">{{numFilter(item.value19)}}</td>
+            <td v-if="item.value20 !=null">{{numFilter(item.value20)}}</td>
+            <td v-if="item.value21 !=null">{{numFilter(item.value21)}}</td>
+            <td v-if="item.value22 !=null">{{numFilter(item.value22)}}</td>
+            <td v-if="item.value23 !=null">{{numFilter(item.value23)}}</td>
+            <td v-if="item.value24 !=null">{{numFilter(item.value24)}}</td>
+            <td v-if="item.value25 !=null">{{numFilter(item.value25)}}</td>
+            <td v-if="item.value26 !=null">{{numFilter(item.value26)}}</td>
+            <td v-if="item.value27 !=null">{{numFilter(item.value27)}}</td>
+            <td v-if="item.value28 !=null">{{numFilter(item.value28)}}</td>
+            <td v-if="item.value29 !=null">{{numFilter(item.value29)}}</td>
+            <td v-if="item.value30 !=null">{{numFilter(item.value30)}}</td>
+            <td v-if="item.value31 !=null">{{numFilter(item.value31)}}</td>
+          </tr>
+        </table>
+      </div>
+    </div>-->
+    <el-row :gutter="32" style="margin:30px 0">
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <line-chart ref="LineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <bar-chart ref="BarChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import {getDataList,exportList,getlistChart} from "@/api/comprehensiveStatistics/comprehensive";
+  import LineChart from './LineChart'
+  import BarChart from "./BarChart";
+  export default {
+    components: {
+      LineChart,
+      BarChart
+    },
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange:[],
+      dateTypeOptions:[],
+      energyList: [],
+      tableData: [],
+      tableHead:[],
+      indexCategoryOptions:[],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        dataTime:undefined,
+        timeType:"HOUR",
+        indexType:undefined,
+        indexStorageId:undefined,
+      },
+      skinName:"",
+      dateTypes: 'date',
+      valueFormat:"yyyy-MM-dd",
+      lineChartData:{expectedData: [],actualData: []},
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName=response.msg;
+    });
+    this.getDicts("energy_type").then(response => {
+      this.indexCategoryOptions = response.data;
+      //this.queryParams.indexStorageId = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      getDataList(this.queryParams).then(response => {
+        /*this.tableData=response.data.tabledata;
+        this.tableHead=response.data.tablehead;*/
+        this.energyList = response.data;
+      })
+    },
+    selectChange(data){
+      this.queryParams.indexId=data;
+      getlistChart(this.queryParams).then(response => {
+        let actualData=[];
+        let expectedData=[];
+        let title="";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(item.timeCode.slice(item.timeCode.length-2,item.timeCode.length));
+          title=item.indexName;
+        })
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.title=title
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      })
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭缁煎悎鑳借��?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportList(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    getSummaries(param) {
+      const {columns, data} = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '';
+          return;
+        }
+        if (index === 1) {
+          sums[index] = '鍚堣';
+          return;
+        }
+        const values = data.map(item => Number(item[column.property]));
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          //sums[index];
+          sums[index] = this.numFilter(sums[index])
+        } else {
+          sums[index] = '0';
+        }
+      });
+      return sums;
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '';
+      if (!isNaN(value) && value !== '') {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '0'
+      }
+      return realVal
+    },
+    getTime() {
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime=year + '-' + month + '-' + date
+      /*let startTime = year + '-' + month + '-' + date
+      let endTime = year + '-' + month + '-' + (date + 1)
+      this.dateRange = [startTime, endTime]*/
+    },
+
+    handleTime(date){
+      if(date=='MONTH'){
+        this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+      }else if(date=='DAY'){
+        this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+      }else{
+        this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+      }
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+ .el-table__body{
+    border: 1px solid #000000 !important;
+  }
+ .el-table th.is-leaf, .el-table td {
+   border-bottom: 1px solid #000000 !important;
+   border-right: 1px solid #000000 !important;
+ }
+.tableList tr td{
+    text-align: center;
+  }
+.dashboard-editor-container {
+ padding: 32px;
+ background-color: rgb(240, 242, 245);
+ position: relative;
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+  }
+
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+  @keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+
+  @-webkit-keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/index.vue b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/index.vue
new file mode 100644
index 0000000..131beec
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'280px'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            缁煎悎鎸囨爣
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <comprehensive ref="comprehensive"></comprehensive>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import comprehensive from "./comprehensive";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: {comprehensive, ModelNode},
+    data() {
+      return {
+        modelData: '',
+        modelCode: undefined,
+        modelInfoOptions: [],
+        isCollapse: false,
+      }
+    },
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.comprehensive.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/workshop.vue b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/workshop.vue
new file mode 100644
index 0000000..a2722dd
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/comprehensiveStatistics/workshop.vue
@@ -0,0 +1,133 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷" >
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿" prop="dataTime">
+        <el-date-picker v-model="queryParams.dataTime" type="date" placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="缁熻鑼冨洿" prop="indexCode">
+        <el-select v-model="queryParams.indexCode" placeholder="璇烽�夋嫨缁熻鑼冨洿" clearable size="small">
+          <el-option
+            v-for="dict in statisticalRangeOptions"
+            :key="dict.id"
+            :label="dict.label"
+            :value="dict.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="energyList" show-summary @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="80" align="center" />
+      <el-table-column label="鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="鐢佃�楅噺(鍗冪摝鏃�)" align="center" prop="electricityQuantity" />
+      <el-table-column label="姘磋�楅噺锛堢珛鏂圭背锛�" align="center" prop="waterQuantity" />
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {modelNodeTree} from "../../../api/basicsetting/modelNode";
+  import {energyList} from "@/api/comprehensiveStatistics/comprehensive";
+  export default {
+    data() {
+      return {
+        // 閬僵灞�
+        //loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        dateTypeOptions:[],
+        energyList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          indexCode: undefined,
+          dataTime:undefined,
+          timeType:"DAY",
+        },
+        statisticalRangeOptions:[],
+      };
+    },
+    created() {
+      this.getList();
+      this.getTime();
+      this.getDicts("statisticalType").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+    },
+    methods: {
+      getList() {
+        modelNodeTree({modelCode: this.$route.query.modelCode}).then(response => {
+          this.statisticalRangeOptions = response.data[0].children;
+          energyList(this.queryParams).then(response => {
+            this.energyList=response.data;
+          })
+        });
+      },
+      getTime(){
+        var date = new Date()
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1
+        var date = date.getDate()
+        month = month < 10 ? '0' + month : month
+        date = date < 10 ? '0' + date : date
+        this.queryParams.dataTime = year + '-' + month + '-' + date
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          name: undefined,
+          codeId: undefined,
+          unit: undefined,
+          range: undefined,
+          type: undefined,
+          value: undefined,
+          termValidity: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.id)
+        this.single = selection.length!=1
+        this.multiple = !selection.length
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/BarChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/BarChart.vue
new file mode 100644
index 0000000..e5ca2ca
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/BarChart.vue
@@ -0,0 +1,119 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+import resize from "../../dashboard/mixins/resize";
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "320px"
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions({ expectedData, actualData, title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: "left",
+          textStyle: {
+            color: "#606266"
+          }
+        },
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+            type: "shadow" // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+          }
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        xAxis: [
+          {
+            type: "category",
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }
+        ],
+        yAxis: [
+          {
+            type: "value",
+            axisTick: {
+              show: false
+            }
+          }
+        ],
+        series: [
+          {
+            name: title,
+            type: "bar",
+            stack: "vistors",
+            barWidth: "60%",
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: "cubicInOut"
+          }
+        ]
+      });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/LineChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/LineChart.vue
new file mode 100644
index 0000000..38d565a
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/LineChart.vue
@@ -0,0 +1,122 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+import resize from "../../dashboard/mixins/resize";
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "320px"
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions({ expectedData, actualData, title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: "left",
+          textStyle: {
+            color: "#606266"
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: "category"
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "cross"
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [
+          {
+            name: title,
+            itemStyle: {
+              normal: {
+                color: "#FF005A",
+                lineStyle: {
+                  color: "#FF005A",
+                  width: 2
+                }
+              }
+            },
+            smooth: true,
+            type: "line",
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: "cubicInOut"
+          }
+        ]
+      });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/index.vue b/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/index.vue
new file mode 100644
index 0000000..2591907
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/dailyComprehensive/index.vue
@@ -0,0 +1,449 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        label-width="68px"
+        class="special-form"
+      >
+        <el-row :gutter="24">
+          <el-col :span="5">
+            <el-form-item label="鑳芥簮绫诲瀷">
+              <el-select
+                v-model="queryParams.indexStorageId"
+                size="small"
+                placeholder="璇烽�夋嫨鑳芥簮鍝佺"
+                style="width: 100%"
+                clearable
+              >
+                <el-option
+                  v-for="dict in indexCategoryOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="6">
+            <el-form-item label="鎸囨爣鍚嶇О">
+              <el-input
+                v-model="queryParams.indexName"
+                placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+                clearable
+              ></el-input>
+            </el-form-item>
+          </el-col> -->
+          <el-col :span="5">
+            <el-form-item label="缁熻鏃堕棿">
+              <el-date-picker
+                clearable
+                size="small"
+                v-model="queryParams.dataTime"
+                type="date"
+                :clearable="false"
+                style="width: 100%"
+                value-format="yyyy-MM-dd"
+                placeholder="閫夋嫨鏃ユ湡"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item class="" label-width="0">
+              <el-button
+                type="primary"
+                icon="el-icon-search"
+                size="mini"
+                @click="handleQuery"
+                >鏌ヨ</el-button
+              >
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+                >閲嶇疆</el-button
+              >
+              <el-button
+                type="warning"
+                icon="el-icon-download"
+                size="mini"
+                @click="handleExport"
+                >瀵煎嚭</el-button
+              >
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-table
+        :data="energyList"
+        border
+        style="width: 100%;"
+        class="tableList"
+        max-height="380px"
+      >
+        <el-table-column
+          fixed
+          prop="indexName"
+          label="鎸囨爣鍚嶇О"
+          min-width="180px"
+        >
+          <template slot-scope="scope">
+            <div style="width: 100%; text-align: left">
+              <el-button
+                v-if="scope.row.indexId == queryParams.indexId"
+                icon="el-icon-search"
+                circle
+                @click="selectChange(scope.row)"
+                style="color: #fff; background: #478ef7;margin-right: 8px"
+              ></el-button>
+              <el-button
+                v-else
+                icon="el-icon-search"
+                circle
+                @click="selectChange(scope.row)"
+                style="margin-right: 8px"
+              ></el-button>
+              <el-tooltip
+                v-if="scope.row.indexName.length > 9"
+                class="item"
+                effect="dark"
+                :content="scope.row.indexName"
+                placement="top-end"
+              >
+                <span>
+                  {{ scope.row.indexName.substr(0, 9) + "..." }}
+                </span>
+              </el-tooltip>
+              <span v-else>{{ scope.row.indexName }}</span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-for="index in 24"
+          :key="index"
+          :label="index - 1 + '鏃�'"
+          align="center"
+          min-width="50"
+        >
+          <template slot-scope="scope">{{
+            numFilter(scope.row[`value${index - 1}`])
+          }}</template>
+        </el-table-column>
+      </el-table>
+      <el-row :gutter="32" style="margin:30px 0">
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <line-chart ref="LineChart" :chart-data="lineChartData" />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <bar-chart ref="BarChart" :chart-data="lineChartData" />
+          </div>
+        </el-col>
+      </el-row>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {
+  getDataList,
+  getlistChart
+} from "@/api/comprehensiveStatistics/dailyComprehensive/dailyComprehensive";
+import LineChart from "./LineChart";
+import BarChart from "./BarChart";
+import mixins from "@/layout/mixin/getHeight";
+import { exportList } from "@/api/reportForm/dailyReport/dailyReport";
+
+export default {
+  components: {
+    LineChart,
+    BarChart
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange: [],
+      dateTypeOptions: [],
+      energyList: [],
+      tableData: [],
+      tableHead: [],
+      indexCategoryOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        indexName: undefined,
+        dataTime: undefined,
+        timeType: "HOUR",
+        indexType: undefined,
+        indexStorageId: undefined
+      },
+      skinName: "",
+      dateTypes: "date",
+      valueFormat: "yyyy-MM-dd",
+      lineChartData: { expectedData: [], actualData: [] }
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(
+        f => f.isDefault === "Y"
+      ).dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName = response.msg;
+    });
+    this.getDicts("energy_type").then(response => {
+      this.indexCategoryOptions = response.data;
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 210 + "px";
+    },
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      getDataList(this.queryParams).then(response => {
+        this.energyList = response.data;
+        if (response.data && response.data.length !== 0) {
+          this.selectChange(response.data[0]);
+        }
+      });
+    },
+    selectChange(row) {
+      this.queryParams.indexId = row ? row.indexId : undefined;
+      getlistChart(this.queryParams).then(response => {
+        let actualData = [];
+        let expectedData = [];
+        let title = "";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(
+            item.timeCode.slice(
+              item.timeCode.length - 2,
+              item.timeCode.length
+            ) + "鏃�"
+          );
+          title = item.indexName + "(" + item.unitId + ")";
+        });
+        this.lineChartData.actualData = actualData;
+        this.lineChartData.expectedData = expectedData;
+        this.lineChartData.title = title;
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        indexName: undefined,
+        dataTime: undefined,
+        timeType: "HOUR",
+        indexType: undefined,
+        indexStorageId: undefined
+      };
+      this.getTime();
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭缁煎悎鑳借��?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(function() {
+          return exportList(queryParams);
+        })
+        .then(response => {
+          this.download(response.msg);
+        })
+        .catch(function() {});
+    },
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "";
+          return;
+        }
+        if (index === 1) {
+          sums[index] = "鍚堣";
+          return;
+        }
+        const values = data.map(item => Number(item[column.property]));
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          //sums[index];
+          sums[index] = this.numFilter(sums[index]);
+        } else {
+          sums[index] = "0";
+        }
+      });
+      return sums;
+    },
+    numFilter(value) {
+      // 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = "";
+      if (!isNaN(value) && value !== "" && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName);
+      } else {
+        realVal = "--";
+      }
+      return realVal;
+    },
+    getTime() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var date = date.getDate();
+      month = month < 10 ? "0" + month : month;
+      date = date < 10 ? "0" + date : date;
+      this.queryParams.dataTime = year + "-" + month + "-" + date;
+    },
+
+    handleTime(date) {
+      if (date == "MONTH") {
+        (this.dateTypes = "year"), (this.valueFormat = "yyyy");
+      } else if (date == "DAY") {
+        (this.dateTypes = "month"), (this.valueFormat = "yyyy-MM");
+      } else {
+        (this.dateTypes = "date"), (this.valueFormat = "yyyy-MM-dd");
+      }
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 0;
+}
+
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+
+///deep/ .tableList {
+//  .el-table__body-wrapper .el-table__body tr.hover-row > td {
+//    background-color: red !important
+//  }
+//}
+</style>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/BarChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/BarChart.vue
new file mode 100644
index 0000000..7198e0f
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            left: 10,
+            right: 10,
+            bottom: 20,
+            top: 40,
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/LineChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/index.vue b/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/index.vue
new file mode 100644
index 0000000..5a74d90
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/monthlyComprehensive/index.vue
@@ -0,0 +1,442 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        label-width="68px"
+        class="special-form"
+      >
+        <el-row :gutter="24">
+          <el-col :span="5">
+            <el-form-item label="鑳芥簮绫诲瀷">
+              <el-select
+                v-model="queryParams.indexStorageId"
+                size="small"
+                placeholder="璇烽�夋嫨鑳芥簮鍝佺"
+                style="width: 100%"
+                clearable
+              >
+                <el-option
+                  v-for="dict in indexCategoryOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="6">
+            <el-form-item label="鎸囨爣鍚嶇О">
+              <el-input
+                v-model="queryParams.indexName"
+                placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+                clearable
+              ></el-input>
+            </el-form-item>
+          </el-col> -->
+          <el-col :span="5">
+            <el-form-item label="缁熻鏃堕棿">
+              <el-date-picker
+                clearable
+                size="small"
+                style="width: 100%"
+                v-model="queryParams.dataTime"
+                type="month"
+                :clearable="false"
+                value-format="yyyy-MM"
+                placeholder="閫夋嫨鏃ユ湡"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item class="" label-width="0">
+              <el-button
+                type="primary"
+                icon="el-icon-search"
+                size="mini"
+                @click="handleQuery"
+                >鏌ヨ</el-button
+              >
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+                >閲嶇疆</el-button
+              >
+              <el-button
+                type="warning"
+                icon="el-icon-download"
+                size="mini"
+                @click="handleExport"
+                >瀵煎嚭</el-button
+              >
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container :bodyStyle="bodyStyle" style="margin-top: 16px">
+      <el-table
+        :data="tableData"
+        border
+        style="width: 100%;"
+        class="tableList"
+        max-height="380px"
+      >
+        <el-table-column
+          prop="indexName"
+          align="left"
+          label="鎸囨爣鍚嶇О"
+          width="130px"
+        >
+          <template slot-scope="scope">
+            <div style="width: 100%; text-align: left">
+              <el-button
+                v-if="scope.row.indexId == queryParams.indexId"
+                icon="el-icon-search"
+                circle
+                @click="selectChange(scope.row)"
+                style="color: #fff; background: #478ef7;margin-right: 4px"
+              ></el-button>
+              <el-button
+                v-else
+                icon="el-icon-search"
+                circle
+                @click="selectChange(scope.row)"
+                style="margin-right: 4px"
+              ></el-button>
+              <el-tooltip
+                v-if="scope.row.indexName.length > 5"
+                class="item"
+                effect="dark"
+                :content="scope.row.indexName"
+                placement="top-end"
+              >
+                <span>
+                  {{ scope.row.indexName.substr(0, 5) + "..." }}
+                </span>
+              </el-tooltip>
+              <span v-else>{{ scope.row.indexName }}</span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-for="index in 31"
+          :key="index"
+          :label="`${index}鏃"
+          align="center"
+          min-width="40"
+        >
+          <template slot-scope="scope">
+            <span style="font-size: 12px">
+              {{ numFilter(scope.row[`value${index}`]) || "--" }}
+            </span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-row :gutter="32" style="margin:30px 0">
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <line-chart ref="LineChart" :chart-data="lineChartData" />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <bar-chart ref="BarChart" :chart-data="lineChartData" />
+          </div>
+        </el-col>
+      </el-row>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {
+  getDataList,
+  exportList,
+  getlistChart
+} from "@/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive";
+import LineChart from "./LineChart";
+import BarChart from "./BarChart";
+import mixins from "@/layout/mixin/getHeight";
+import { exportListMonth } from "@/api/reportForm/dailyReport/dailyReport";
+
+export default {
+  components: {
+    LineChart,
+    BarChart
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange: [],
+      dateTypeOptions: [],
+      energyList: [],
+      tableData: [],
+      tableHead: [],
+      indexCategoryOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        indexName: undefined,
+        dataTime: undefined,
+        timeType: "DAY",
+        indexType: undefined,
+        indexStorageId: undefined
+      },
+      skinName: "",
+      lineChartData: { expectedData: [], actualData: [] }
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      //this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName = response.msg;
+    });
+    this.getDicts("energy_type").then(response => {
+      this.indexCategoryOptions = response.data;
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 210 + "px";
+    },
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      getDataList(this.queryParams).then(response => {
+        this.tableData = response.data.tabledata;
+        // this.tableHead = response.data.tablehead;
+        if (this.tableData && this.tableData.length !== 0) {
+          this.selectChange(response.data[0]);
+        }
+      });
+    },
+    selectChange(data) {
+      this.queryParams.indexId = data.indexId;
+      getlistChart(this.queryParams).then(response => {
+        let actualData = [];
+        let expectedData = [];
+        let title = "";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(
+            item.timeCode.slice(
+              item.timeCode.length - 2,
+              item.timeCode.length
+            ) + "鏃�"
+          );
+          title = item.indexName + "(" + item.unitId + ")";
+        });
+        this.lineChartData.actualData = actualData;
+        this.lineChartData.expectedData = expectedData;
+        this.lineChartData.title = title;
+        console.log(actualData);
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        indexName: undefined,
+        dataTime: undefined,
+        timeType: "HOUR",
+        indexType: undefined,
+        indexStorageId: undefined
+      };
+      this.getTime();
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭缁煎悎鑳借��?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(function() {
+          return exportListMonth(queryParams);
+        })
+        .then(response => {
+          this.download(response.msg);
+        })
+        .catch(function() {});
+    },
+
+    numFilter(value) {
+      // 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = "";
+      if (!isNaN(value) && value !== "" && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName);
+      } else {
+        realVal = "--";
+      }
+      return realVal;
+    },
+    getTime() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var date = date.getDate();
+      month = month < 10 ? "0" + month : month;
+      date = date < 10 ? "0" + date : date;
+      this.queryParams.dataTime = year + "-" + month;
+      /*let startTime = year + '-' + month + '-' + date
+      let endTime = year + '-' + month + '-' + (date + 1)
+      this.dateRange = [startTime, endTime]*/
+    },
+
+    handleTime(date) {
+      if (date == "MONTH") {
+        (this.dateTypes = "year"), (this.valueFormat = "yyyy");
+      } else if (date == "DAY") {
+        (this.dateTypes = "month"), (this.valueFormat = "yyyy-MM");
+      } else {
+        (this.dateTypes = "date"), (this.valueFormat = "yyyy-MM-dd");
+      }
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 0;
+}
+
+::v-deep {
+  .el-table--scrollable-x .el-table__body-wrapper {
+    overflow-x: hidden !important;
+  }
+}
+
+// .tableList tr > td:first-child {
+//   position: sticky;
+//   left: 0;
+//   z-index: 1;
+//   background: #fff;
+// }
+
+// .tableList tr > td:nth-child(2) {
+//   position: sticky;
+//   left: 80px;
+//   z-index: 1;
+//   background: #fff;
+// }
+
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+.el-table--enable-row-hover .el-table__body tr:hover > td {
+  background: #cfdcf5;
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/processEnergy/index.vue b/energy_management_ui/src/views/comprehensiveStatistics/processEnergy/index.vue
new file mode 100644
index 0000000..d36b538
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/processEnergy/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'280px'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            宸ュ簭鑳芥簮浠嬭川鍗曡�楀垎鏋�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <processEnergy ref="processEnergy"></processEnergy>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import processEnergy from "./processEnergy";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: {processEnergy, ModelNode},
+    data() {
+      return {
+        modelData: '',
+        modelCode: undefined,
+        modelInfoOptions: [],
+        isCollapse: false,
+      }
+    },
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.processEnergy.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/processEnergy/processEnergy.vue b/energy_management_ui/src/views/comprehensiveStatistics/processEnergy/processEnergy.vue
new file mode 100644
index 0000000..4f3f133
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/processEnergy/processEnergy.vue
@@ -0,0 +1,164 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷" >
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿" prop="dataTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="energyList" show-summary :summary-method="getSummaries" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="80" align="center" />
+      <el-table-column label="鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="鐢佃�楅噺(鍗冪摝鏃�)" align="center" prop="electric">
+        <template slot-scope="scope">
+          <span>{{numFilter(scope.row.electric)}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鐓ゆ皵锛堢珛鏂圭背锛�" align="center" prop="coal">
+        <template slot-scope="scope">
+          <span>{{numFilter(scope.row.coal)}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="钂告苯鑰楅噺锛堝惃锛�" align="center" prop="steam">
+        <template slot-scope="scope">
+          <span>{{numFilter(scope.row.steam)}}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {getEnergyList} from "@/api/comprehensiveStatistics/comprehensive";
+  export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      dateTypeOptions:[],
+      energyList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        dataTime:undefined,
+        timeType:"DAY",
+      },
+      skinName:"",
+    };
+  },
+  created() {
+    this.getList();
+    this.getTime();
+    this.getDicts("statisticalType").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("processEnergy").then(response => {
+      this.skinName=response.msg;
+    });
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.queryParams.indexCode=modelNode.id;
+      this.getList(this.queryParams)
+    },
+    getList(){
+      this.queryParams.indexType=this.$route.query.modelCode;
+      getEnergyList(this.queryParams).then(response => {
+        this.energyList=response.data;
+      })
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '';
+          return;
+        }
+        if (index === 1) {
+          sums[index] = '鍚堣';
+          return;
+        }
+        const values = data.map(item => Number(item[column.property]));
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          //sums[index];
+          sums[index]=this.numFilter(sums[index])
+        } else {
+          sums[index] = '0';
+        }
+      });
+      return sums;
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '' ;
+      if (!isNaN(value) && value !== '') {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '0'
+      }
+      return realVal
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()-1
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/BarChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/BarChart.vue
new file mode 100644
index 0000000..ab6a75f
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            left: 10,
+            right: 10,
+            bottom: 20,
+            top: 40,
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: ['1鏈�','2鏈�','3鏈�','4鏈�','5鏈�','6鏈�','7鏈�','8鏈�','9鏈�','10鏈�','11鏈�','12鏈�'],
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/LineChart.vue b/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/LineChart.vue
new file mode 100644
index 0000000..655c96d
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: ['1鏈�','2鏈�','3鏈�','4鏈�','5鏈�','6鏈�','7鏈�','8鏈�','9鏈�','10鏈�','11鏈�','12鏈�'],
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/index.vue b/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/index.vue
new file mode 100644
index 0000000..eda0962
--- /dev/null
+++ b/energy_management_ui/src/views/comprehensiveStatistics/yearComprehensive/index.vue
@@ -0,0 +1,486 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form
+        :model="queryParams"
+        ref="queryForm"
+        label-width="68px"
+        class="special-form"
+      >
+        <el-row :gutter="24">
+          <el-col :span="5">
+            <el-form-item label="鑳芥簮绫诲瀷">
+              <el-select
+                v-model="queryParams.indexStorageId"
+                size="small"
+                placeholder="璇烽�夋嫨鑳芥簮鍝佺"
+                style="width: 100%"
+                clearable
+              >
+                <el-option
+                  v-for="dict in indexCategoryOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- <el-col :span="6">
+            <el-form-item label="鎸囨爣鍚嶇О">
+              <el-input
+                v-model="queryParams.indexName"
+                placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+                clearable
+              ></el-input>
+            </el-form-item>
+          </el-col> -->
+          <el-col :span="5">
+            <el-form-item label="缁熻鏃堕棿">
+              <el-date-picker
+                clearable
+                size="small"
+                style="width: 100%"
+                v-model="queryParams.dataTime"
+                type="year"
+                :clearable="false"
+                value-format="yyyy"
+                placeholder="閫夋嫨鏃ユ湡"
+              >
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item class="" label-width="0">
+              <el-button
+                type="primary"
+                icon="el-icon-search"
+                size="mini"
+                @click="handleQuery"
+                >鏌ヨ</el-button
+              >
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+                >閲嶇疆</el-button
+              >
+              <el-button
+                type="warning"
+                icon="el-icon-download"
+                size="mini"
+                @click="handleExport"
+                >瀵煎嚭</el-button
+              >
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container :bodyStyle="bodyStyle" style="margin-top: 16px">
+      <el-table
+        :data="energyList"
+        border
+        style="width: 100%;"
+        class="tableList"
+        max-height="380px"
+      >
+        <el-table-column
+          fixed
+          prop="indexName"
+          align="left"
+          label="鎸囨爣鍚嶇О"
+          min-width="200"
+        >
+          <template slot-scope="scope">
+            <div style="width: 100%; text-align: left">
+              <el-button
+                v-if="scope.row.indexId == queryParams.indexId"
+                icon="el-icon-search"
+                circle
+                @click="selectChange(scope.row)"
+                style="font-size: 10px; color: #fff; background: #478ef7"
+              ></el-button>
+              <el-button
+                v-else
+                icon="el-icon-search"
+                circle
+                @click="selectChange(scope.row)"
+                style="font-size: 10px"
+              ></el-button>
+              <span>{{ scope.row.indexName }}</span>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="1鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value1)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="2鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value2)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="3鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value3)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="4鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value4)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="5鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value5)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="6鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value6)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="7鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value7)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="8鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value8)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="9鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value9)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="10鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value10)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="11鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value11)
+          }}</template>
+        </el-table-column>
+        <el-table-column label="12鏈�" align="center">
+          <template slot-scope="scope">{{
+            numFilter(scope.row.value12)
+          }}</template>
+        </el-table-column>
+      </el-table>
+      <el-row :gutter="32" style="margin:30px 0">
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <line-chart ref="LineChart" :chart-data="lineChartData" />
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <bar-chart ref="BarChart" :chart-data="lineChartData" />
+          </div>
+        </el-col>
+      </el-row>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {
+  getDataList,
+  exportList,
+  getlistChart
+} from "@/api/comprehensiveStatistics/yearComprehensive/yearComprehensive";
+import LineChart from "./LineChart";
+import BarChart from "./BarChart";
+import mixins from "@/layout/mixin/getHeight";
+import { exportListYear } from "@/api/reportForm/dailyReport/dailyReport";
+export default {
+  components: {
+    LineChart,
+    BarChart
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange: [],
+      dateTypeOptions: [],
+      energyList: [],
+      tableData: [],
+      tableHead: [],
+      indexCategoryOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        indexName: undefined,
+        dataTime: undefined,
+        timeType: "MONTH",
+        indexType: undefined,
+        indexStorageId: undefined
+      },
+      skinName: "",
+      lineChartData: { expectedData: [], actualData: [] }
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      //this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName = response.msg;
+    });
+    this.getDicts("energy_type").then(response => {
+      this.indexCategoryOptions = response.data;
+      //this.queryParams.indexStorageId = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 210 + "px";
+    },
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      if (this.queryParams.dataTime == undefined) {
+        this.queryParams.dataTime = year + "-" + month;
+      }
+      let times = this.queryParams.dataTime.slice(0, 4);
+      this.queryParams.beginTime = times + "-01-01 00:00:00";
+      this.queryParams.endTime = times + "-12-31 00:00:00";
+      getDataList(this.queryParams).then(response => {
+        /*this.tableData=response.data.tabledata;
+        this.tableHead=response.data.tablehead;*/
+        this.energyList = response.data;
+        if (response.data && response.data.length !== 0) {
+          this.selectChange(response.data[0]);
+        }
+      });
+    },
+    selectChange(row) {
+      this.queryParams.indexId = row ? row.indexId : undefined;
+      getlistChart(this.queryParams).then(response => {
+        let actualData = [];
+        let expectedData = [];
+        let title = "";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          //actualData.push(item.timeCode.slice(item.timeCode.length-2,item.timeCode.length)+"鏈�");
+          title = item.indexName + "(" + item.unitId + ")";
+        });
+        console.log(actualData);
+        this.lineChartData.actualData = actualData;
+        this.lineChartData.expectedData = expectedData;
+        this.lineChartData.title = title;
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      // this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexName: undefined,
+        indexId: undefined,
+        dataTime: undefined,
+        timeType: "HOUR",
+        indexType: undefined,
+        indexStorageId: undefined
+      };
+      this.getTime();
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭缁煎悎鑳借��?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(function() {
+          return exportListYear(queryParams);
+        })
+        .then(response => {
+          this.download(response.msg);
+        })
+        .catch(function() {});
+    },
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "";
+          return;
+        }
+        if (index === 1) {
+          sums[index] = "鍚堣";
+          return;
+        }
+        const values = data.map(item => Number(item[column.property]));
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          //sums[index];
+          sums[index] = this.numFilter(sums[index]);
+        } else {
+          sums[index] = "0";
+        }
+      });
+      return sums;
+    },
+    numFilter(value) {
+      // 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = "";
+      if (!isNaN(value) && value !== "" && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName);
+      } else {
+        realVal = "--";
+      }
+      return realVal;
+    },
+    getTime() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var date = date.getDate();
+      month = month < 10 ? "0" + month : month;
+      date = date < 10 ? "0" + date : date;
+      this.queryParams.dataTime = year + "-" + month;
+    },
+
+    handleTime(date) {
+      if (date == "MONTH") {
+        (this.dateTypes = "year"), (this.valueFormat = "yyyy");
+      } else if (date == "DAY") {
+        (this.dateTypes = "month"), (this.valueFormat = "yyyy-MM");
+      } else {
+        (this.dateTypes = "date"), (this.valueFormat = "yyyy-MM-dd");
+      }
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 0;
+}
+
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/comreport/frreport/reportiframe.vue b/energy_management_ui/src/views/comreport/frreport/reportiframe.vue
new file mode 100644
index 0000000..13a231d
--- /dev/null
+++ b/energy_management_ui/src/views/comreport/frreport/reportiframe.vue
@@ -0,0 +1,47 @@
+<template>
+  <div class="app-container":style="'height:'+ height">
+    <iframe :src="srcUrl" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
+  </div>
+</template>
+
+<script>
+  //import { getUserProfile } from "@/api/system/user";
+    export default {
+      data() {
+        return {
+          user: {},
+          srcUrl:"",
+          height: document.documentElement.clientHeight - 94.5 + "px;",
+          loading: false
+        }
+      },
+      created() {
+        this.getUser();
+      },
+      mounted: function() {
+        const that = this;
+        window.onresize = function temp() {
+          that.height = document.documentElement.clientHeight - 94.5 + "px;";
+        };
+      },
+      methods: {
+        //鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅骞朵綔涓哄弬鏁颁紶鍏ユ姤琛�
+        getUser() {
+          let reg=new RegExp('amp;','g');
+          let tourl = this.$route.query.modelCode.replace(reg,"");
+          //tourl+="&username="+this.user.userName;
+          // console.log("璺宠浆url="+tourl);
+          this.srcUrl=tourl;
+          // getUserProfile().then(response => {
+          //   this.user = response.data;
+          //   // console.log("鐢ㄦ埛璐﹀彿="+this.user.userName);
+          //   let reg=new RegExp('amp;','g');
+          //   let tourl = this.$route.query.modelCode.replace(reg,"");
+          //   tourl+="&username="+this.user.userName;
+          //   // console.log("璺宠浆url="+tourl);
+          //   this.srcUrl=tourl;
+          // });
+        }
+      }
+    }
+</script>
diff --git a/energy_management_ui/src/views/costaccounting/frreport/reportiframe.vue b/energy_management_ui/src/views/costaccounting/frreport/reportiframe.vue
new file mode 100644
index 0000000..39f2dca
--- /dev/null
+++ b/energy_management_ui/src/views/costaccounting/frreport/reportiframe.vue
@@ -0,0 +1,42 @@
+<template>
+  <div class="app-container":style="'height:'+ height">
+    <iframe :src="srcUrl" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
+  </div>
+</template>
+
+<script>
+  import { getUserProfile } from "@/api/system/user";
+    export default {
+      data() {
+        return {
+          user: {},
+          srcUrl:"",
+          height: document.documentElement.clientHeight - 94.5 + "px;",
+          loading: false
+        }
+      },
+      created() {
+        this.getUser();
+      },
+      mounted: function() {
+        const that = this;
+        window.onresize = function temp() {
+          that.height = document.documentElement.clientHeight - 94.5 + "px;";
+        };
+      },
+      methods: {
+        //鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛淇℃伅骞朵綔涓哄弬鏁颁紶鍏ユ姤琛�
+        getUser() {
+          getUserProfile().then(response => {
+            this.user = response.data;
+            // console.log("鐢ㄦ埛璐﹀彿="+this.user.userName);
+            let reg=new RegExp('amp;','g');
+            let tourl = this.$route.query.modelCode.replace(reg,"");
+            //tourl+="&username="+this.user.userName;
+            // console.log("璺宠浆url="+tourl);
+            this.srcUrl=tourl;
+          });
+        }
+      }
+    }
+</script>
diff --git a/energy_management_ui/src/views/dashboard/BarChart.vue b/energy_management_ui/src/views/dashboard/BarChart.vue
new file mode 100644
index 0000000..e39c7cb
--- /dev/null
+++ b/energy_management_ui/src/views/dashboard/BarChart.vue
@@ -0,0 +1,159 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+import resize from "./mixins/resize";
+import moment from "moment";
+
+const animationDuration = 6000;
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "310px"
+    },
+    chartData: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      chart: null
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+
+      // this.chart.setOption({
+      //   tooltip: {
+      //     trigger: 'axis',
+      //     axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+      //       type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+      //     }
+      //   },
+      //   grid: {
+      //     top: 10,
+      //     left: '2%',
+      //     right: '2%',
+      //     bottom: '3%',
+      //     containLabel: true
+      //   },
+      //   xAxis: [{
+      //     type: 'category',
+      //     data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+      //     axisTick: {
+      //       alignWithLabel: true
+      //     }
+      //   }],
+      //   yAxis: [{
+      //     type: 'value',
+      //     axisTick: {
+      //       show: false
+      //     }
+      //   }],
+      //   series: [{
+      //     name: 'pageA',
+      //     type: 'bar',
+      //     stack: 'vistors',
+      //     barWidth: '60%',
+      //     data: [79, 52, 200, 334, 390, 330, 220],
+      //     animationDuration
+      //   }, {
+      //     name: 'pageB',
+      //     type: 'bar',
+      //     stack: 'vistors',
+      //     barWidth: '60%',
+      //     data: [80, 52, 200, 334, 390, 330, 220],
+      //     animationDuration
+      //   }, {
+      //     name: 'pageC',
+      //     type: 'bar',
+      //     stack: 'vistors',
+      //     barWidth: '60%',
+      //     data: [30, 52, 200, 334, 390, 330, 220],
+      //     animationDuration
+      //   }]
+      // })
+      this.setOptions(this.chartData);
+    },
+    setOptions({ expectedData, actualData, xData, type } = {}) {
+      let option = {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "shadow"
+          }
+        },
+        legend: {
+          right: "1"
+        },
+        grid: {
+          left: "1",
+          right: "3%",
+          bottom: "3%",
+          containLabel: true
+        },
+        xAxis: {
+          type: "category",
+          data: xData
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, 0.01]
+        },
+        series: [
+          {
+            name: moment(new Date())
+              .subtract(1, "day")
+              .format("yyyy-MM-DD"),
+            type: "bar",
+            data: expectedData,
+            color: "#e6e6e6"
+          },
+          {
+            name: moment(new Date()).format("yyyy-MM-DD"),
+            type: "bar",
+            data: actualData
+          }
+        ]
+      };
+      this.chart.setOption(option);
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/dashboard/LineChart.vue b/energy_management_ui/src/views/dashboard/LineChart.vue
new file mode 100644
index 0000000..e654168
--- /dev/null
+++ b/energy_management_ui/src/views/dashboard/LineChart.vue
@@ -0,0 +1,135 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from './mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData } = {}) {
+      this.chart.setOption({
+        xAxis: {
+          data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+          boundaryGap: false,
+          axisTick: {
+            show: false
+          }
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 30,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: ['expected', 'actual']
+        },
+        series: [{
+          name: 'expected', itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        },
+        {
+          name: 'actual',
+          smooth: true,
+          type: 'line',
+          itemStyle: {
+            normal: {
+              color: '#3888fa',
+              lineStyle: {
+                color: '#3888fa',
+                width: 2
+              },
+              areaStyle: {
+                color: '#f3f8ff'
+              }
+            }
+          },
+          data: actualData,
+          animationDuration: 2800,
+          animationEasing: 'quadraticOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/dashboard/PanelGroup.vue b/energy_management_ui/src/views/dashboard/PanelGroup.vue
new file mode 100644
index 0000000..1a1081f
--- /dev/null
+++ b/energy_management_ui/src/views/dashboard/PanelGroup.vue
@@ -0,0 +1,181 @@
+<template>
+  <el-row :gutter="40" class="panel-group">
+    <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
+      <div class="card-panel" @click="handleSetLineChartData('newVisitis')">
+        <div class="card-panel-icon-wrapper icon-people">
+          <svg-icon icon-class="peoples" class-name="card-panel-icon" />
+        </div>
+        <div class="card-panel-description">
+          <div class="card-panel-text">
+            璁垮
+          </div>
+          <count-to :start-val="0" :end-val="102400" :duration="2600" class="card-panel-num" />
+        </div>
+      </div>
+    </el-col>
+    <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
+      <div class="card-panel" @click="handleSetLineChartData('messages')">
+        <div class="card-panel-icon-wrapper icon-message">
+          <svg-icon icon-class="message" class-name="card-panel-icon" />
+        </div>
+        <div class="card-panel-description">
+          <div class="card-panel-text">
+            娑堟伅
+          </div>
+          <count-to :start-val="0" :end-val="81212" :duration="3000" class="card-panel-num" />
+        </div>
+      </div>
+    </el-col>
+    <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
+      <div class="card-panel" @click="handleSetLineChartData('purchases')">
+        <div class="card-panel-icon-wrapper icon-money">
+          <svg-icon icon-class="money" class-name="card-panel-icon" />
+        </div>
+        <div class="card-panel-description">
+          <div class="card-panel-text">
+            閲戦
+          </div>
+          <count-to :start-val="0" :end-val="9280" :duration="3200" class="card-panel-num" />
+        </div>
+      </div>
+    </el-col>
+    <el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
+      <div class="card-panel" @click="handleSetLineChartData('shoppings')">
+        <div class="card-panel-icon-wrapper icon-shopping">
+          <svg-icon icon-class="shopping" class-name="card-panel-icon" />
+        </div>
+        <div class="card-panel-description">
+          <div class="card-panel-text">
+            璁㈠崟
+          </div>
+          <count-to :start-val="0" :end-val="13600" :duration="3600" class="card-panel-num" />
+        </div>
+      </div>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import CountTo from 'vue-count-to'
+
+export default {
+  components: {
+    CountTo
+  },
+  methods: {
+    handleSetLineChartData(type) {
+      this.$emit('handleSetLineChartData', type)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.panel-group {
+  margin-top: 18px;
+
+  .card-panel-col {
+    margin-bottom: 32px;
+  }
+
+  .card-panel {
+    height: 108px;
+    cursor: pointer;
+    font-size: 12px;
+    position: relative;
+    overflow: hidden;
+    color: #666;
+    background: #fff;
+    box-shadow: 4px 4px 40px rgba(0, 0, 0, .05);
+    border-color: rgba(0, 0, 0, .05);
+
+    &:hover {
+      .card-panel-icon-wrapper {
+        color: #fff;
+      }
+
+      .icon-people {
+        background: #40c9c6;
+      }
+
+      .icon-message {
+        background: #36a3f7;
+      }
+
+      .icon-money {
+        background: #f4516c;
+      }
+
+      .icon-shopping {
+        background: #34bfa3
+      }
+    }
+
+    .icon-people {
+      color: #40c9c6;
+    }
+
+    .icon-message {
+      color: #36a3f7;
+    }
+
+    .icon-money {
+      color: #f4516c;
+    }
+
+    .icon-shopping {
+      color: #34bfa3
+    }
+
+    .card-panel-icon-wrapper {
+      float: left;
+      margin: 14px 0 0 14px;
+      padding: 16px;
+      transition: all 0.38s ease-out;
+      border-radius: 6px;
+    }
+
+    .card-panel-icon {
+      float: left;
+      font-size: 48px;
+    }
+
+    .card-panel-description {
+      float: right;
+      font-weight: bold;
+      margin: 26px;
+      margin-left: 0px;
+
+      .card-panel-text {
+        line-height: 18px;
+        color: rgba(0, 0, 0, 0.45);
+        font-size: 16px;
+        margin-bottom: 12px;
+      }
+
+      .card-panel-num {
+        font-size: 20px;
+      }
+    }
+  }
+}
+
+@media (max-width:550px) {
+  .card-panel-description {
+    display: none;
+  }
+
+  .card-panel-icon-wrapper {
+    float: none !important;
+    width: 100%;
+    height: 100%;
+    margin: 0 !important;
+
+    .svg-icon {
+      display: block;
+      margin: 14px auto !important;
+      float: none !important;
+    }
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/dashboard/PieChart.vue b/energy_management_ui/src/views/dashboard/PieChart.vue
new file mode 100644
index 0000000..8d3e20a
--- /dev/null
+++ b/energy_management_ui/src/views/dashboard/PieChart.vue
@@ -0,0 +1,118 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+import resize from "./mixins/resize";
+
+export default {
+  mixins: [resize],
+  props: {
+    pieTitle: {
+      type: String,
+      default: "chart"
+    },
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "363px"
+    },
+    chartData: {
+      type: Array,
+      default: () => []
+    },
+    legend: {
+      type: String,
+      default: ""
+    }
+  },
+  data() {
+    return {
+      chart: null
+    };
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions(val) {
+      this.chart.setOption({
+        tooltip: {
+          trigger: "item",
+          // formatter: "{a} <br/>{b} : {c} ({d}%)"
+          formatter: a => {
+            return `${a.seriesName} <br/> ${a.data.name} : ${a.data.value} ${
+              a.data.unit
+            } (${a.percent}%)`;
+          }
+        },
+        legend: {
+          left: this.legend == "right" ? "auto" : "center",
+          top: "0",
+          right: this.legend == "right" ? "40" : "auto",
+          orient: this.legend == "right" ? "vertical" : "horizontal"
+          // data: ["Industries", "Technology", "Forex", "Gold", "Forecasts"]
+        },
+        label: {
+          alignTo: "edge",
+          // formatter: "{b}:{c}"
+          formatter: a => {
+            return `${a.name} : ${a.data.value}${
+              a.data.value > 0 ? a.data.unit || "" : ""
+            } (${a.percent}%)`;
+          },
+          fontSize: this.legend == "right" ? "16" : "14"
+          // minMargin: 5,
+          // edgeDistance: 10,
+          // lineHeight: 5
+        },
+        series: [
+          {
+            name: this.pieTitle,
+            type: "pie",
+            // top: "-100",
+            // left: 0,
+            // roseType: 'radius',
+            // radius: ["50%", "80%"],
+            radius: this.legend == "right" ? ["50%", "80%"] : [40, 75],
+            // center: ["50%", "38%"],
+            data: val
+            // animationEasing: "cubicInOut",
+            // animationDuration: 2600
+          }
+        ]
+      });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/dashboard/RaddarChart.vue b/energy_management_ui/src/views/dashboard/RaddarChart.vue
new file mode 100644
index 0000000..6823af3
--- /dev/null
+++ b/energy_management_ui/src/views/dashboard/RaddarChart.vue
@@ -0,0 +1,116 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from './mixins/resize'
+
+const animationDuration = 3000
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+
+      this.chart.setOption({
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+            type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+          }
+        },
+        radar: {
+          radius: '66%',
+          center: ['50%', '42%'],
+          splitNumber: 8,
+          splitArea: {
+            areaStyle: {
+              color: 'rgba(127,95,132,.3)',
+              opacity: 1,
+              shadowBlur: 45,
+              shadowColor: 'rgba(0,0,0,.5)',
+              shadowOffsetX: 0,
+              shadowOffsetY: 15
+            }
+          },
+          indicator: [
+            { name: 'Sales', max: 10000 },
+            { name: 'Administration', max: 20000 },
+            { name: 'Information Techology', max: 20000 },
+            { name: 'Customer Support', max: 20000 },
+            { name: 'Development', max: 20000 },
+            { name: 'Marketing', max: 20000 }
+          ]
+        },
+        legend: {
+          left: 'center',
+          bottom: '10',
+          data: ['Allocated Budget', 'Expected Spending', 'Actual Spending']
+        },
+        series: [{
+          type: 'radar',
+          symbolSize: 0,
+          areaStyle: {
+            normal: {
+              shadowBlur: 13,
+              shadowColor: 'rgba(0,0,0,.2)',
+              shadowOffsetX: 0,
+              shadowOffsetY: 10,
+              opacity: 1
+            }
+          },
+          data: [
+            {
+              value: [5000, 7000, 12000, 11000, 15000, 14000],
+              name: 'Allocated Budget'
+            },
+            {
+              value: [4000, 9000, 15000, 15000, 13000, 11000],
+              name: 'Expected Spending'
+            },
+            {
+              value: [5500, 11000, 12000, 15000, 12000, 12000],
+              name: 'Actual Spending'
+            }
+          ],
+          animationDuration: animationDuration
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/dashboard/mixins/resize.js b/energy_management_ui/src/views/dashboard/mixins/resize.js
new file mode 100644
index 0000000..ae02e64
--- /dev/null
+++ b/energy_management_ui/src/views/dashboard/mixins/resize.js
@@ -0,0 +1,52 @@
+import { debounce } from '@/utils'
+
+export default {
+  data() {
+    return {
+      $_sidebarElm: null
+    }
+  },
+  mounted() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  beforeDestroy() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  activated() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  deactivated() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  methods: {
+    $_resizeHandler() {
+      return debounce(() => {
+        if (this.chart) {
+          this.chart.resize()
+        }
+      }, 100)()
+    },
+    $_initResizeEvent() {
+      window.addEventListener('resize', this.$_resizeHandler)
+    },
+    $_destroyResizeEvent() {
+      window.removeEventListener('resize', this.$_resizeHandler)
+    },
+    $_sidebarResizeHandler(e) {
+      if (e.propertyName === 'width') {
+        this.$_resizeHandler()
+      }
+    },
+    $_initSidebarResizeEvent() {
+      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+      this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+    },
+    $_destroySidebarResizeEvent() {
+      this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+    }
+  }
+}
diff --git a/energy_management_ui/src/views/dataEntry/stagseDataEntry/index.vue b/energy_management_ui/src/views/dataEntry/stagseDataEntry/index.vue
new file mode 100644
index 0000000..97851ab
--- /dev/null
+++ b/energy_management_ui/src/views/dataEntry/stagseDataEntry/index.vue
@@ -0,0 +1,84 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="闃舵鏁版嵁褰曞叆" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode"
+                   :modelCode="modelCode"
+                   :showOpt="true"
+                   :auth="false"/>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :bodyStyle="bodyStyleRight">
+        <el-tabs>
+          <el-tab-pane>
+            <span slot="label"> 闃舵鏁版嵁褰曞叆</span>
+            <stagseDataEntry ref="stagseDataEntry"></stagseDataEntry>
+          </el-tab-pane>
+          <!--<el-tab-pane>
+            <span slot="label"> 闃舵鏁版嵁淇敼</span>
+            <stagseDataEdit ref="stagseDataEdit"></stagseDataEdit>
+          </el-tab-pane>-->
+        </el-tabs>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+<script>
+import ModelNode from "../../basicsetting/modelNode/modelNode"
+import stagseDataEntry from "./stagseDataEntry";
+import stagseDataEdit from "./stagseDataEdit";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from '@/components/shrink/index.vue'
+
+export default {
+  components: {ModelNode, stagseDataEntry, stagseDataEdit,ShrinkCol},
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: '',
+      modelCode: undefined,
+      isCollapse: false,
+      bodyStyleRight: {}
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + 'px'
+      this.bodyStyleRight = {
+        height: window.innerHeight - 100 + 'px',
+        overflow: 'hidden'
+      };
+    },
+    changeNode: function (node) {
+      this.$refs.stagseDataEntry.modelNodeChange(node);
+      //this.$refs.stagseDataEdit.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEdit.vue b/energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEdit.vue
new file mode 100644
index 0000000..0ffb9e6
--- /dev/null
+++ b/energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEdit.vue
@@ -0,0 +1,192 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏃ユ湡绫诲瀷" prop="timeType">
+        <el-select v-model="queryParams.timeType" placeholder="鏃ユ湡绫诲瀷" clearable size="small" style="width: 100px"
+                   @change="handleTime">
+          <el-option
+            v-for="dict in entryDataTimeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="閫夋嫨鏃堕棿" prop="dataTime">
+        <el-date-picker size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        :type="dateTypes"
+                        :value-format="valueFormat"
+                        :format="showFormat"
+                        @change="handleQuery"
+                        :clearable="false"
+                        placeholder="閫夋嫨鏃堕棿">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          v-hasPermi="['dataEntry:stagseDataEntry:add']"
+          @click="handleAdd"
+        >淇濆瓨閰嶇疆
+        </el-button>
+      </el-form-item>
+    </el-form>
+    <el-form refs="form" :model="form">
+      <el-table v-loading="loading" :data="stagseDataEntryList" border ref="multipleTable">
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"></el-table-column>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"></el-table-column>
+        <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId"></el-table-column>
+        <el-table-column label="鏃堕棿" align="center" prop="dataTime">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.dataTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍊�" align="center">
+          <template slot-scope="scope">
+            <el-input size="mini" v-model="scope.row.value"></el-input>
+            <el-input type="hidden" v-model="scope.row.timeType"></el-input>
+            <el-input type="hidden" v-model="scope.row.indexId"></el-input>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-form>
+  </div>
+</template>
+
+<script>
+import {listStagseDataEdit, addStagseDataEntry} from "@/api/dataEntry/stagseDataEntry";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      dateRange: [],
+      form: {},
+      // stagseDataEntry琛ㄦ牸鏁版嵁
+      stagseDataEntryList: [],
+      list: [],
+      entryDataTimeOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexId: undefined,
+        dataTime: undefined,
+        beginTime: undefined,
+        endTime: undefined,
+        nodeId: undefined,
+        timeType: "HOUR",
+        calcType: undefined,
+      },
+      dateTypes: "date",
+      valueFormat: "yyyy-MM-dd HH",
+      showFormat: "yyyy-MM-dd HH",
+      configInfo: [],
+      currentNode: ""
+    };
+  },
+  created() {
+    this.getDicts("entryDataTime").then(response => {
+      this.entryDataTimeOptions = response.data;
+      this.queryParams.timeType = this.entryDataTimeOptions.find(f => f.isDefault === 'Y').dictValue;
+      console.log(response.data)
+      debugger
+      this.setTime();
+    });
+  },
+  methods: {
+    /** 鏌ヨstagseDataEntry鍒楄〃 */
+    modelNodeChange(modelNode) {
+      this.currentNode = modelNode.id;
+      //this.getList();
+      this.loading = false;
+    },
+    getList() {
+      this.loading = true;
+      this.queryParams.nodeId = this.currentNode;
+      this.queryParams.calcType = "INPUT";
+      this.queryParams.beginTime = this.dateRange[0];
+      this.queryParams.endTime = this.dateRange[1];
+      listStagseDataEdit(this.queryParams).then(response => {
+        this.stagseDataEntryList = response.rows;
+        this.loading = false;
+      });
+    },
+    handleAdd() {
+      this.$nextTick(() => {
+        this.form.configInfo = JSON.stringify(this.$refs['multipleTable'].data);
+        console.log(this.form.configInfo);
+        addStagseDataEntry(this.form.configInfo,).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("淇濆瓨閰嶇疆鎴愬姛");
+            this.getList();
+          } else {
+            this.msgError(response.msg);
+          }
+        })
+      });
+    },
+    handleTime(selVal) {
+      if (selVal == 'YEAR') {
+        this.dateTypes = 'year';
+        this.valueFormat = 'yyyy';
+        this.showFormat = 'yyyy';
+      } else if (selVal == 'MONTH') {
+        this.dateTypes = 'month';
+        this.valueFormat = 'yyyy-MM';
+        this.showFormat = 'yyyy-MM';
+        //this.queryParams.dataTime=(new Date().getFullYear())+'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+      } else if (selVal == 'DAY') {
+        this.dateTypes = 'date';
+        this.valueFormat = 'yyyy-MM-dd';
+        this.showFormat = 'yyyy-MM-dd';
+        //this.queryParams.dataTime=(new Date().getFullYear())+'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1))+'-'+(new Date().getDate()>9?new Date().getDate():"0"+new Date().getDate());
+      } else if (selVal == 'HOUR') {
+        this.dateTypes = 'datetime';
+        this.valueFormat = 'yyyy-MM-dd HH';
+        this.showFormat = 'yyyy-MM-dd HH';
+      }
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.queryParams.id = this.queryParams.nodeId;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    getTime() {
+      debugger
+      let nowDate = new Date();
+      let date = {
+        year: nowDate.getFullYear(),
+        month: nowDate.getMonth() + 1,
+        day: nowDate.getDate(),
+      }
+      let h = nowDate.getHours();
+      h = h < 10 ? ('0' + h) : h;
+      this.queryParams.dataTime = date.year + '-' + this.gshRq(date.month) + '-' + this.gshRq(date.day) + " " + h;
+      console.log(this.queryParams)
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEntry.vue b/energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEntry.vue
new file mode 100644
index 0000000..bbede8e
--- /dev/null
+++ b/energy_management_ui/src/views/dataEntry/stagseDataEntry/stagseDataEntry.vue
@@ -0,0 +1,230 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" label-width="68px" class="special-form" style="margin-bottom: 8px">
+      <el-row :gutter="24">
+        <el-col :span="8">
+          <el-form-item label="鏃ユ湡绫诲瀷" prop="timeType">
+            <el-select v-model="queryParams.timeType" placeholder="鏃ユ湡绫诲瀷" size="small" style="width: 100%"
+                       @change="handleTime">
+              <el-option
+                  v-for="dict in entryDataTimeOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+              />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="閫夋嫨鏃堕棿" prop="dataTime">
+            <el-date-picker size="small" style="width:100%"
+                            v-model="queryParams.dataTime"
+                            :type="dateTypes"
+                            :value-format="valueFormat"
+                            :format="showFormat"
+                            @change="handleQuery"
+                            :clearable="false"
+                            placeholder="閫夋嫨鏃堕棿">
+            </el-date-picker>
+
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item class="operation" label-width="0px">
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+            <el-button
+                type="primary"
+                icon="el-icon-plus"
+                size="mini"
+                v-hasPermi="['dataEntry:stagseDataEntry:add']"
+                @click="handleAdd"
+            >淇濆瓨閰嶇疆
+            </el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-form refs="form" :model="form">
+      <el-table v-loading="loading" :data="stagseDataEntryList" border ref="multipleTable"
+                :height="height"
+      >
+        <el-table-column label="搴忓彿" align="center" type="index" width="50"></el-table-column>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name" min-width="150px"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+        <el-table-column label="鎸囨爣绫诲瀷" align="center" prop="categoryName"/>
+        <el-table-column label="鑳芥簮鍝佺" align="center" prop="energyName"/>
+        <el-table-column label="鍊�" align="center" prop="value" min-width="170px">
+          <template slot-scope="scope">
+            <el-input-number v-model="scope.row.value" size="small" controls-position="right" @change="checkNum(scope.row.value)" placeholder="璇疯緭鍏ュ��"
+                             clearable></el-input-number>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍗曚綅" align="center" prop="unit"/>
+        <el-table-column label="鎵�灞炴棩鏈�" align="center" prop="dataTimeStr"/>
+        <el-table-column label="褰曞叆鏃堕棿" align="center" prop="createTimeStr"/>
+        <el-table-column label="褰曞叆浜�" align="center" prop="createBy"/>
+      </el-table>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import {listStagseDataEntry, addStagseDataEntry} from "@/api/dataEntry/stagseDataEntry";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      form: {},
+      // stagseDataEntry琛ㄦ牸鏁版嵁
+      stagseDataEntryList: [],
+      list: [],
+      entryDataTimeOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexId: undefined,
+        dataTime: undefined,
+        beginTime: undefined,
+        endTime: undefined,
+        nodeId: undefined,
+        timeType: "HOUR",
+        calcType: undefined,
+      },
+      dateTypes: "datetime",
+      valueFormat: "yyyy-MM-dd HH",
+      showFormat: "yyyy-MM-dd HH",
+      configInfo: [],
+      dateRange: [],
+      hourList: "",
+      currentNode: "",
+      height: null
+    };
+  },
+  created() {
+    this.getDicts("entryDataTime").then(response => {
+      this.entryDataTimeOptions = response.data;
+      this.queryParams.timeType = this.entryDataTimeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.setTime();
+    //this.queryParams.dataTime=(new Date().getFullYear())+'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1))+'-'+(new Date().getDate()>9?new Date().getDate():"0"+new Date().getDate());
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 275 + 'px';
+    },
+    /** 鏌ヨstagseDataEntry鍒楄〃 */
+    modelNodeChange(modelNode) {
+      this.currentNode = modelNode.id;
+      this.getList();
+      this.loading = false;
+    },
+    getList() {
+      this.loading = true;
+      this.queryParams.nodeId = this.currentNode;
+      this.queryParams.dataTimeStr = this.queryParams.dataTime;
+      this.queryParams.calcType = "INPUT";
+      listStagseDataEntry(this.queryParams).then(response => {
+        this.stagseDataEntryList = response.rows;
+        this.loading = false;
+      });
+    },
+    checkNum(value) {
+      let reg = /(^(-?([1-9]{1}\d*)|(0{1}))(\.\d{1,2,3})?$)/;
+      if (undefined == value || "" == value) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊间笉鑳戒负绌�'
+        });
+      } else if (!reg.test(value)) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊兼渶澶氫繚鐣�3浣嶅皬鏁�'
+        });
+      }
+    },
+    handleAdd() {
+      this.$nextTick(() => {
+        this.form.configInfo = JSON.stringify(this.$refs['multipleTable'].data);
+        addStagseDataEntry(this.form.configInfo).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("淇濆瓨閰嶇疆鎴愬姛");
+            this.getList();
+          } else {
+            this.msgError(response.msg);
+          }
+        })
+      });
+    },
+    handleTime(selVal) {
+      let nowDate = new Date();
+      let date = {
+        year: nowDate.getFullYear(),
+        month: nowDate.getMonth() + 1,
+        day: nowDate.getDate(),
+      }
+      let h = nowDate.getHours();
+      h = h < 10 ? ('0' + h) : h;
+      if (selVal == 'YEAR') {
+        this.dateTypes = 'year';
+        this.valueFormat = 'yyyy';
+        this.showFormat = 'yyyy';
+        this.queryParams.dataTime = date.year + ""
+      } else if (selVal == 'MONTH') {
+        this.dateTypes = 'month';
+        this.valueFormat = 'yyyy-MM';
+        this.showFormat = 'yyyy-MM';
+        this.queryParams.dataTime = date.year + '-' + this.gshRq(date.month);
+      } else if (selVal == 'DAY') {
+        this.dateTypes = 'date';
+        this.valueFormat = 'yyyy-MM-dd';
+        this.showFormat = 'yyyy-MM-dd';
+        this.queryParams.dataTime = date.year + '-' + this.gshRq(date.month) + '-' + this.gshRq(date.day);
+      } else if (selVal == 'HOUR') {
+        this.dateTypes = 'datetime';
+        this.valueFormat = 'yyyy-MM-dd HH';
+        this.showFormat = 'yyyy-MM-dd HH';
+        this.setTime()
+      }
+      this.handleQuery()
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.queryParams.id = this.queryParams.nodeId;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    gshRq(rq) {
+      return ((rq * 1) < 10) ? '0' + rq : rq;
+    },
+    setTime() {
+      let nowDate = new Date();
+      let date = {
+        year: nowDate.getFullYear(),
+        month: nowDate.getMonth() + 1,
+        day: nowDate.getDate(),
+      }
+      let h = nowDate.getHours();
+      h = h < 10 ? ('0' + h) : h;
+      this.queryParams.dataTime = date.year + '-' + this.gshRq(date.month) + '-' + this.gshRq(date.day) + " " + h;
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/index.vue b/energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/index.vue
new file mode 100644
index 0000000..bde374a
--- /dev/null
+++ b/energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/index.vue
@@ -0,0 +1,53 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'280px'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鎸囨爣搴撶鐞�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     modelCode="statistic_index_model"
+                     :showOpt="false" :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <stagseDataEntry ref="stagseDataEntry"></stagseDataEntry>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+<script>
+  import ModelNode from "../../basicsetting/modelNode/modelNode"
+  import stagseDataEntry from "./stagseDataEntryEdit";
+  export default {
+    components: {ModelNode,stagseDataEntry},
+    created() {},
+    data() {
+      return {
+        modelData: '',
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.stagseDataEntry.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/stagseDataEntryEdit.vue b/energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/stagseDataEntryEdit.vue
new file mode 100644
index 0000000..70f0628
--- /dev/null
+++ b/energy_management_ui/src/views/dataEntry/stagseDataEntryEdit/stagseDataEntryEdit.vue
@@ -0,0 +1,203 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏃ユ湡绫诲瀷" prop="timeType">
+        <el-select v-model="queryParams.timeType" placeholder="鏃ユ湡绫诲瀷" clearable size="small" @change="handleTime">
+          <el-option
+            v-for="dict in entryDataTimeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="閫夋嫨鎸囨爣" prop="code">
+        <el-select v-model="code" multiple style="width: 300px">
+          <el-option
+            v-for="item in list"
+            :key="item.code"
+            :label="item.name"
+            :value="item.code">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="閫夋嫨鏃堕棿" prop="dataTime">
+        <!--<el-date-picker
+          v-model="queryParams.dataTime"
+          :type="dateTypes"
+          :value-format="valueFormat"
+          placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>-->
+        <el-date-picker
+          v-model="dateRange"
+          :type="dateTypes"
+          :value-format="valueFormat"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          v-hasPermi="['dataEntry:stagseDataEntry:add']"
+          @click="handleAdd"
+        >淇濆瓨閰嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-form refs="form" :model="form" >
+    <el-table v-loading="loading" :data="stagseDataEntryList" border ref="multipleTable">
+      <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"></el-table-column>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"></el-table-column>
+      <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId"></el-table-column>
+      <el-table-column label="鏃堕棿" align="center" prop="dataTime" >
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.dataTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鍊�" align="center">
+        <template scope="scope">
+        <el-input size="mini" v-model="scope.row.value"></el-input>
+        <el-input type="hidden" v-model="scope.row.timeType"></el-input>
+        <el-input type="hidden" v-model="scope.row.indexId"></el-input>
+      </template>
+      </el-table-column>
+    </el-table>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import {addStagseDataEntry,getSettingIndex,stagseDataEntryEdit} from "@/api/dataEntry/stagseDataEntry";
+
+export default {
+  props: ["modelCode"],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      dateRange:[],
+      form:{},
+      // stagseDataEntry琛ㄦ牸鏁版嵁
+      stagseDataEntryList: [],
+      list:[],
+      entryDataTimeOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexId: undefined,
+        dataTime: undefined,
+        nodeId:undefined,
+        timeType:"HOUR",
+        calcType:undefined,
+        indexCode: undefined,
+      },
+      dateTypes:"datetimerange",
+      valueFormat:"yyyy-MM-dd HH:mm:ss",
+      configInfo:[],
+      code: [],
+      currentNode:""
+    };
+  },
+  created() {
+    this.getDicts("entryDataTime").then(response => {
+      this.entryDataTimeOptions = response.data;
+      this.queryParams.timeType = this.entryDataTimeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getTime();
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.currentNode = modelNode.id;
+      this.getEnergy();
+      this.code= [];
+    },
+    getEnergy(){
+      getSettingIndex(this.currentNode).then(response => {
+        let result = response.data;
+        this.list=result.filter(f => f.indexType === 'STATISTIC');
+      })
+    },
+    getList() {
+      if (this.code !=undefined && this.code.length>0) {
+        this.loading = true;
+        this.queryParams.indexCode=this.code.join(',');
+        this.queryParams.calcType="CALC";
+        this.queryParams.nodeId=this.currentNode;
+        stagseDataEntryEdit(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+          this.stagseDataEntryList = response.data;
+          this.loading = false;
+        });
+        this.loading = false;
+      }else{
+        this.msgSuccess("璇烽�夋嫨鎸囨爣");
+      }
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList()
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    handleAdd(){
+      this.$nextTick(() => {
+        this.form.configInfo=JSON.stringify( this.$refs['multipleTable'].data);
+        addStagseDataEntry(this.form.configInfo).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("淇濆瓨閰嶇疆鎴愬姛");
+            this.getList();
+          } else {
+            this.msgError(response.msg);
+          }
+        })
+      });
+    },
+    handleTime(selVal){
+      if(selVal=='YEAR'){
+        this.dateTypes= 'monthrange';
+        this.valueFormat='yyyy-MM';
+      }else if(selVal=='MONTH'){
+        this.dateTypes= 'monthrange';
+        this.valueFormat='yyyy-MM';
+      }else if(selVal=='DAY'){
+        this.dateTypes= 'daterange';
+        this.valueFormat='yyyy-MM-dd';
+      }else if(selVal=='HOUR'){
+        this.dateTypes= 'datetime';
+        this.valueFormat='yyyy-MM-dd HH:mm:ss';
+      }
+    },
+    getTime(){
+      this.startTime = new Date().setHours(0, 0, 0, 0);
+      this.endTime = new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1;
+      this.dateRange = [this.formatDate(this.startTime),this.formatDate(this.endTime)];
+      this.queryParams.dataTime=this.formatDate(new Date().getTime());
+    },
+    formatDate: function (value) {
+      let date = new Date(value);
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? ('0' + MM) : MM;
+      let d = date.getDate();
+      d = d < 10 ? ('0' + d) : d;
+      let h = date.getHours();
+      h = h < 10 ? ('0' + h) : h;
+      let m = date.getMinutes();
+      m = m < 10 ? ('0' + m) : m;
+      let s = date.getSeconds();
+      s = s < 10 ? ('0' + s) : s;
+      return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/dataMonitoring/energyPercent/energyPercent.vue b/energy_management_ui/src/views/dataMonitoring/energyPercent/energyPercent.vue
new file mode 100644
index 0000000..848d02d
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/energyPercent/energyPercent.vue
@@ -0,0 +1,381 @@
+<template>
+  <div>
+    <div class="dashboard-editor-container">
+      <el-card>
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          :inline="true"
+          label-width="68px"
+        >
+          <el-form-item label="" label-width="0px">
+            <el-radio-group
+              v-model="queryParams.timeType"
+              size="small"
+              @change="handleTime"
+            >
+              <el-radio-button
+                v-for="dict in dateTypeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictValue"
+                >{{ dict.dictLabel }}</el-radio-button
+              >
+            </el-radio-group>
+            <el-date-picker
+              style="margin-left: 8px"
+              :clearable="true"
+              size="small"
+              v-model="beginTime"
+              :type="dateType == 'date' ? 'date' : 'datetime'"
+              :value-format="valueFormat"
+              placeholder="寮�濮嬫棩鏈�"
+              :picker-options="{ disabledDate: disabledDateStart }"
+              :default-time="['12:00:00']"
+            ></el-date-picker>
+            -
+            <el-date-picker
+              :clearable="true"
+              size="small"
+              v-model="endTime"
+              :type="dateType == 'date' ? 'date' : 'datetime'"
+              :value-format="valueFormat"
+              placeholder="缁撴潫鏃ユ湡"
+              :picker-options="{ disabledDate: disabledDateEnd }"
+              :default-time="['12:00:00']"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="鑳芥簮鍝佺">
+            <el-select
+              size="small"
+              v-model="queryParams.energyType"
+              placeholder="璇烽�夋嫨鑳芥簮"
+              @change="changeEnergyType"
+            >
+              <el-option
+                style="width: 150px"
+                v-for="dict in powerTypeOptions"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery"
+              >鏌ヨ</el-button
+            >
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </el-card>
+    </div>
+    <div :style="bodyStyle">
+      <div>
+        <div class="table-wrapper">
+          <el-card>
+            <div slot="header" class="clearfix">
+              <span
+                >鐢▄{ queryParams.energyTypeName }}閲弡{
+                  `锛堝悎璁″��${
+                    tableData.length ? "锛�" + tableData[0].sumValue : "0"
+                  }锛塦
+                }}</span
+              >
+            </div>
+            <div>
+              <pie-chart
+                :chart-data="firstPieData"
+                height="500px"
+                legend="right"
+                pieTitle="鑳借�楀崰姣斿垎鏋�"
+              />
+            </div>
+            <el-table :data="tableData" height="400">
+              <el-table-column
+                prop="energyUnitName"
+                label="鐢ㄨ兘鍗曞厓"
+                align="center"
+                show-overflow-tooltip
+              ></el-table-column>
+              <el-table-column prop="value" :label="`娑堣�楅噺`" align="center">
+                <!-- <template slot-scope="scope">
+                  <span>{{ scope.row.value }}</span>
+                </template> -->
+              </el-table-column>
+              <el-table-column prop="ratio" label="鍗犳瘮" align="center">
+                <template slot-scope="scope">
+                  <span>{{ scope.row.ratio }}%</span>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-card>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import mixins from "@/layout/mixin/getHeight";
+import PieChart from "../../dashboard/PieChart";
+import { getElectricityShareAnalysis } from "@/api/dataMonitoring/energyPercent/index.js";
+import { listEnergyType } from "@/api/home/home";
+import moment from "moment";
+export default {
+  mixins: [mixins],
+  components: {
+    PieChart
+  },
+  data() {
+    return {
+      pickerOptions: {
+        // 涓嶈閫夋嫨浠婂ぉ浠ュ墠鐨�
+      },
+      dateTypeOptions: [
+        // { dictValue: "YEAR", dictLabel: "骞�" },
+        // { dictValue: "MONTH", dictLabel: "鏈�" },
+        { dictValue: "DAY", dictLabel: "鏃�" },
+        { dictValue: "HOUR", dictLabel: "灏忔椂" }
+      ],
+      modelCode: "",
+      firstPieData: [],
+      timeValue: [],
+      beginTime: "",
+      endTime: "",
+      queryParams: {
+        timeType: "DAY",
+        time: "",
+        energyType: "",
+        energyTypeName: "",
+        modelCode: ""
+      },
+      powerTypeOptions: [
+        { value: "electric", label: "鐢�", modelCode: "ElectricShareAnalysis" },
+        // { value: "water", label: "姘�", modelCode: "WaterShareAnalysis" },
+        { value: "steam", label: "钂告苯", modelCode: "SteamShareAnalysis" }
+      ],
+      tableData: [],
+      dateType: "date",
+      valueFormat: ""
+    };
+  },
+  created() {
+    this.modelCode = this.$route.query.modelCode || "Composite_Indicators";
+    this.queryParams.time = moment().format("yyyy-MM-DD");
+    this.beginTime = moment()
+      .subtract("day", 30)
+      .format("yyyy-MM-DD");
+    this.endTime = moment().format("yyyy-MM-DD");
+
+    // this.getEnergyType();
+    this.changeEnergyType("electric");
+  },
+  methods: {
+    disabledDateStart(time) {
+      if (this.endTime && this.dateType == "date") {
+        let endTime = moment(this.endTime).valueOf();
+        return (
+          time.getTime() < endTime - 24 * 30 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      if (this.endTime && this.dateType == "hour") {
+        let endTime = moment(this.endTime).valueOf();
+        return (
+          time.getTime() < endTime - 24 * 7 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      return time.getTime() > Date.now();
+    },
+    disabledDateEnd(time) {
+      if (this.beginTime && this.dateType == "date") {
+        let beginTime = moment(this.beginTime).valueOf();
+        return (
+          time.getTime() > beginTime + 24 * 30 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      if (this.beginTime && this.dateType == "hour") {
+        let beginTime = moment(this.beginTime).valueOf();
+        return (
+          time.getTime() > beginTime + 24 * 7 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      return time.getTime() > Date.now();
+    },
+    changeEnergyType(e) {
+      console.log(e);
+      for (let i = 0; i < this.powerTypeOptions.length; i++) {
+        if (e == this.powerTypeOptions[i].value) {
+          this.queryParams.energyType = e;
+          this.queryParams.energyTypeName = this.powerTypeOptions[i].label;
+          this.queryParams.modelCode = this.powerTypeOptions[i].modelCode;
+        }
+      }
+      this.handleQuery();
+    },
+    handleTime(date) {
+      console.log(date, moment().year());
+      this.queryParams.timeType = date;
+      this.beginTime = "";
+      this.endTime = "";
+      if (date == "YEAR") {
+        this.dateType = "year";
+        this.valueFormat = "yyyy";
+        this.queryParams.time = moment()
+          .year()
+          .toString();
+      } else if (date == "MONTH") {
+        this.dateType = "month";
+        this.valueFormat = "yyyy-MM";
+        this.queryParams.time = moment().format("yyyy-MM");
+      } else if (date == "DAY") {
+        this.dateType = "date";
+        this.valueFormat = "yyyy-MM-dd";
+        this.queryParams.time = moment().format("yyyy-MM-DD");
+        this.beginTime = moment()
+          .subtract("day", 30)
+          .format("yyyy-MM-DD");
+        this.endTime = moment().format("yyyy-MM-DD");
+      } else {
+        this.dateType = "hour";
+        this.valueFormat = "yyyy-MM-dd HH:mm:ss";
+        this.queryParams.time = moment().format("yyyy-MM-DD HH:mm:ss");
+        this.beginTime = moment()
+          .subtract("day", 7)
+          .format("yyyy-MM-DD HH:mm:ss");
+        this.endTime = moment().format("yyyy-MM-DD HH:mm:ss");
+      }
+      this.getList();
+    },
+    getTime() {
+      let timeType = this.queryParams.timeType;
+      var date = new Date(this.queryParams.time);
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var date = date.getDate();
+      month = month < 10 ? "0" + month : month;
+      date = date < 10 ? "0" + date : date;
+      let dataTime = [];
+      let startTime, endTime;
+      if (timeType == "YEAR") {
+        startTime = year + "-01-01 00:00:00";
+        endTime = year + "-12-31 23:59:59";
+      } else if (timeType == "MONTH") {
+        startTime = year + "-" + month + "-01 00:00:00";
+        endTime = year + "-" + month + "-31 23:59:59";
+      } else {
+        startTime = year + "-" + month + "-" + date + " 00:00:00";
+        endTime = year + "-" + month + "-" + date + " 23:59:59";
+      }
+      dataTime = [startTime, endTime];
+      return dataTime;
+    },
+    getList() {
+      // let rangeDate = this.getTime();
+      if (!this.beginTime || !this.endTime) {
+        this.$message({
+          message: "璇峰厛閫夋嫨鏌ヨ鏃ユ湡",
+          type: "warning"
+        });
+        return false;
+      }
+      let valueFormat =
+        this.dateType == "date" ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm:ss";
+      // let params = {
+      //   ...this.queryParams,
+      //   beginTime: this.dateType == "date" ? moment(this.beginTime).format('YYYY-MM-DD')
+      // }
+      getElectricityShareAnalysis({
+        ...this.queryParams,
+        // modelCode: this.modelCode,
+        // beginTime: rangeDate[0],
+        // endTime: rangeDate[1]
+        beginTime: moment(this.beginTime).format(valueFormat),
+        endTime: moment(this.endTime).format(valueFormat)
+      }).then(res => {
+        this.firstPieData = res.data
+          ? res.data.map(item => {
+              return {
+                name: item.energyUnitName,
+                value: item.value || 0,
+                unit: item.unit || ""
+              };
+            })
+          : [];
+
+        this.tableData = res.data;
+      });
+    },
+    getEnergyType() {
+      listEnergyType()
+        .then(res => {
+          if (res.code === 200) {
+            this.powerTypeOptions =
+              res.data.map(item => ({
+                ...item,
+                value: item.energy,
+                label: item.energyName
+              })) || [];
+            this.queryParams.energyType =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].value
+                : "";
+            this.queryParams.energyTypeName =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].label
+                : "";
+            this.getList();
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇鑳芥簮绫诲瀷鍒楄〃", e);
+        });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.queryParams = {
+        time: moment().format("yyyy-MM")
+      };
+      this.handleQuery();
+    },
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + "px";
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 100 + "px"
+      };
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.dashboard-editor-container {
+  margin-bottom: 16px;
+  ::v-deep {
+    .el-card__body {
+      padding: 20px 12px 0 12px;
+    }
+  }
+  .pdf-wrapper {
+    width: 80%;
+    margin: 0 auto;
+  }
+  .table-wrapper {
+    margin-top: 16px;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/dataMonitoring/energyPercent/waterPercent.vue b/energy_management_ui/src/views/dataMonitoring/energyPercent/waterPercent.vue
new file mode 100644
index 0000000..2cdab26
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/energyPercent/waterPercent.vue
@@ -0,0 +1,423 @@
+<template>
+  <div>
+    <div class="dashboard-editor-container">
+      <el-card>
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          :inline="true"
+          label-width="68px"
+        >
+          <el-form-item label="" label-width="0px">
+            <el-radio-group
+              v-model="queryParams.timeType"
+              size="small"
+              @change="handleTime"
+            >
+              <el-radio-button
+                v-for="dict in dateTypeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictValue"
+                >{{ dict.dictLabel }}</el-radio-button
+              >
+            </el-radio-group>
+            <el-date-picker
+              style="margin-left: 8px"
+              :clearable="true"
+              size="small"
+              v-model="beginTime"
+              :type="dateType == 'date' ? 'date' : 'datetime'"
+              :value-format="valueFormat"
+              placeholder="寮�濮嬫棩鏈�"
+              :picker-options="{ disabledDate: disabledDateStart }"
+              :default-time="['12:00:00']"
+            ></el-date-picker>
+            -
+            <el-date-picker
+              :clearable="true"
+              size="small"
+              v-model="endTime"
+              :type="dateType == 'date' ? 'date' : 'datetime'"
+              :value-format="valueFormat"
+              placeholder="缁撴潫鏃ユ湡"
+              :picker-options="{ disabledDate: disabledDateEnd }"
+              :default-time="['12:00:00']"
+            ></el-date-picker>
+          </el-form-item>
+          <!-- <el-form-item label="鑳芥簮鍝佺">
+            <el-select
+              size="small"
+              v-model="queryParams.energyType"
+              placeholder="璇烽�夋嫨鑳芥簮"
+              @change="changeEnergyType"
+            >
+              <el-option
+                style="width: 150px"
+                v-for="dict in powerTypeOptions"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              ></el-option>
+            </el-select>
+          </el-form-item> -->
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery"
+              >鏌ヨ</el-button
+            >
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </el-card>
+    </div>
+    <div :style="bodyStyle">
+      <div>
+        <div class="table-wrapper">
+          <el-tabs
+            v-model="queryParams.energyType"
+            class="demo-tabs"
+            @tab-click="changeTabs"
+          >
+            <el-tab-pane
+              v-for="dict in powerTypeOptions"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+              :name="dict.value"
+            ></el-tab-pane>
+          </el-tabs>
+          <el-card shadow="never">
+            <div slot="header" class="clearfix">
+              <span
+                >鐢▄{ queryParams.energyTypeName }}閲弡{
+                  `锛堝悎璁″��${
+                    tableData.length ? "锛�" + tableData[0].sumValue : "0"
+                  }锛塦
+                }}</span
+              >
+            </div>
+            <div>
+              <pie-chart
+                :chart-data="firstPieData"
+                height="500px"
+                legend="right"
+                pieTitle="鑳借�楀崰姣斿垎鏋�"
+              />
+            </div>
+            <el-table :data="tableData" height="400">
+              <el-table-column
+                prop="energyUnitName"
+                label="鐢ㄨ兘鍗曞厓"
+                align="center"
+                show-overflow-tooltip
+              ></el-table-column>
+              <el-table-column prop="value" :label="`娑堣�楅噺`" align="center">
+                <!-- <template slot-scope="scope">
+                  <span>{{ scope.row.value }}</span>
+                </template> -->
+              </el-table-column>
+              <el-table-column prop="ratio" label="鍗犳瘮" align="center">
+                <template slot-scope="scope">
+                  <span>{{ scope.row.ratio }}%</span>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-card>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import mixins from "@/layout/mixin/getHeight";
+import PieChart from "../../dashboard/PieChart";
+import { getElectricityShareAnalysis } from "@/api/dataMonitoring/energyPercent/index.js";
+import { listEnergyType } from "@/api/home/home";
+import moment from "moment";
+export default {
+  mixins: [mixins],
+  components: {
+    PieChart
+  },
+  data() {
+    return {
+      pickerOptions: {
+        // 涓嶈閫夋嫨浠婂ぉ浠ュ墠鐨�
+      },
+      dateTypeOptions: [
+        // { dictValue: "YEAR", dictLabel: "骞�" },
+        // { dictValue: "MONTH", dictLabel: "鏈�" },
+        { dictValue: "DAY", dictLabel: "鏃�" },
+        { dictValue: "HOUR", dictLabel: "灏忔椂" }
+      ],
+      modelCode: "",
+      firstPieData: [],
+      timeValue: [],
+      beginTime: "",
+      endTime: "",
+      queryParams: {
+        timeType: "DAY",
+        time: "",
+        energyType: "water",
+        energyTypeName: "",
+        modelCode: ""
+      },
+      powerTypeOptions: [
+        { value: "water", label: "鎬绘按琛�", modelCode: "WaterShareAnalysis" },
+        {
+          value: "water1",
+          label: "鐢熸椿姘�",
+          modelCode: "WaterShareAnalysis_1"
+        },
+        {
+          value: "water2",
+          label: "宸ヨ壓姘寸",
+          modelCode: "WaterShareAnalysis_2"
+        }
+      ],
+      tableData: [],
+      dateType: "date",
+      valueFormat: ""
+    };
+  },
+  created() {
+    this.modelCode = this.$route.query.modelCode || "WaterShareAnalysis";
+    this.queryParams.time = moment().format("yyyy-MM-DD");
+    this.beginTime = moment()
+      .subtract("day", 30)
+      .format("yyyy-MM-DD");
+    this.endTime = moment().format("yyyy-MM-DD");
+
+    // this.changeEnergyType("water");
+    this.changeTabs({ index: 0 });
+  },
+  methods: {
+    disabledDateStart(time) {
+      if (this.endTime && this.dateType == "date") {
+        let endTime = moment(this.endTime).valueOf();
+        return (
+          time.getTime() < endTime - 24 * 30 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      if (this.endTime && this.dateType == "hour") {
+        let endTime = moment(this.endTime).valueOf();
+        return (
+          time.getTime() < endTime - 24 * 7 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      return time.getTime() > Date.now();
+    },
+    disabledDateEnd(time) {
+      if (this.beginTime && this.dateType == "date") {
+        let beginTime = moment(this.beginTime).valueOf();
+        return (
+          time.getTime() > beginTime + 24 * 30 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      if (this.beginTime && this.dateType == "hour") {
+        let beginTime = moment(this.beginTime).valueOf();
+        return (
+          time.getTime() > beginTime + 24 * 7 * 60 * 60 * 1000 ||
+          time.getTime() > Date.now()
+        );
+      }
+      return time.getTime() > Date.now();
+    },
+    changeEnergyType(e) {
+      console.log(e);
+      for (let i = 0; i < this.powerTypeOptions.length; i++) {
+        if (e == this.powerTypeOptions[i].value) {
+          this.queryParams.energyType = e;
+          this.queryParams.energyTypeName = this.powerTypeOptions[i].label;
+          this.queryParams.modelCode = this.powerTypeOptions[i].modelCode;
+        }
+      }
+      this.handleQuery();
+    },
+    changeTabs(tab, e) {
+      let index = tab.index;
+      // this.queryParams.energyType = index;
+      this.queryParams.energyTypeName = this.powerTypeOptions[index].label;
+      this.queryParams.modelCode = this.powerTypeOptions[index].modelCode;
+      this.handleQuery();
+    },
+    handleTime(date) {
+      console.log(date, moment().year());
+      this.queryParams.timeType = date;
+      this.beginTime = "";
+      this.endTime = "";
+      if (date == "YEAR") {
+        this.dateType = "year";
+        this.valueFormat = "yyyy";
+        this.queryParams.time = moment()
+          .year()
+          .toString();
+      } else if (date == "MONTH") {
+        this.dateType = "month";
+        this.valueFormat = "yyyy-MM";
+        this.queryParams.time = moment().format("yyyy-MM");
+      } else if (date == "DAY") {
+        this.dateType = "date";
+        this.valueFormat = "yyyy-MM-dd";
+        this.queryParams.time = moment().format("yyyy-MM-DD");
+        this.beginTime = moment()
+          .subtract("day", 30)
+          .format("yyyy-MM-DD");
+        this.endTime = moment().format("yyyy-MM-DD");
+      } else {
+        this.dateType = "hour";
+        this.valueFormat = "yyyy-MM-dd HH:mm:ss";
+        this.queryParams.time = moment().format("yyyy-MM-DD HH:mm:ss");
+        this.beginTime = moment()
+          .subtract("day", 7)
+          .format("yyyy-MM-DD HH:mm:ss");
+        this.endTime = moment().format("yyyy-MM-DD HH:mm:ss");
+      }
+      this.getList();
+    },
+    getTime() {
+      let timeType = this.queryParams.timeType;
+      var date = new Date(this.queryParams.time);
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var date = date.getDate();
+      month = month < 10 ? "0" + month : month;
+      date = date < 10 ? "0" + date : date;
+      let dataTime = [];
+      let startTime, endTime;
+      if (timeType == "YEAR") {
+        startTime = year + "-01-01 00:00:00";
+        endTime = year + "-12-31 23:59:59";
+      } else if (timeType == "MONTH") {
+        startTime = year + "-" + month + "-01 00:00:00";
+        endTime = year + "-" + month + "-31 23:59:59";
+      } else {
+        startTime = year + "-" + month + "-" + date + " 00:00:00";
+        endTime = year + "-" + month + "-" + date + " 23:59:59";
+      }
+      dataTime = [startTime, endTime];
+      return dataTime;
+    },
+    getList() {
+      // let rangeDate = this.getTime();
+      if (!this.beginTime || !this.endTime) {
+        this.$message({
+          message: "璇峰厛閫夋嫨鏌ヨ鏃ユ湡",
+          type: "warning"
+        });
+        return false;
+      }
+      let valueFormat =
+        this.dateType == "date" ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm:ss";
+      // let params = {
+      //   ...this.queryParams,
+      //   beginTime: this.dateType == "date" ? moment(this.beginTime).format('YYYY-MM-DD')
+      // }
+      getElectricityShareAnalysis({
+        ...this.queryParams,
+        // modelCode: this.modelCode,
+        // beginTime: rangeDate[0],
+        // endTime: rangeDate[1]
+        beginTime: moment(this.beginTime).format(valueFormat),
+        endTime: moment(this.endTime).format(valueFormat)
+      }).then(res => {
+        this.firstPieData = res.data
+          ? res.data.map(item => {
+              return {
+                name: item.energyUnitName,
+                value: item.value || 0,
+                unit: item.unit || ""
+              };
+            })
+          : [];
+
+        this.tableData = res.data;
+      });
+    },
+    getEnergyType() {
+      listEnergyType()
+        .then(res => {
+          if (res.code === 200) {
+            this.powerTypeOptions =
+              res.data.map(item => ({
+                ...item,
+                value: item.energy,
+                label: item.energyName
+              })) || [];
+            this.queryParams.energyType =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].value
+                : "";
+            this.queryParams.energyTypeName =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].label
+                : "";
+            this.getList();
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇鑳芥簮绫诲瀷鍒楄〃", e);
+        });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.queryParams = {
+        time: moment().format("yyyy-MM")
+      };
+      this.handleQuery();
+    },
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + "px";
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 100 + "px"
+      };
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.dashboard-editor-container {
+  margin-bottom: 16px;
+  ::v-deep {
+    .el-card__body {
+      padding: 20px 12px 0 12px;
+    }
+  }
+  .pdf-wrapper {
+    width: 80%;
+    margin: 0 auto;
+  }
+  .table-wrapper {
+    margin-top: 16px;
+    background: #fff;
+  }
+}
+.table-wrapper {
+  // margin-top: 16px;
+  padding-top: 16px;
+  background: #fff;
+  .demo-tabs {
+    padding: 0 16px;
+  }
+  ::v-deep {
+    .el-card {
+      border: none;
+    }
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/dataMonitoring/historyDataTrend/historyMonitoringSetting.vue b/energy_management_ui/src/views/dataMonitoring/historyDataTrend/historyMonitoringSetting.vue
new file mode 100644
index 0000000..ea7b6b2
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/historyDataTrend/historyMonitoringSetting.vue
@@ -0,0 +1,347 @@
+<template>
+  <div class="" style="width: 100%">
+    <div class="search-wrapper">
+      <el-select
+        v-model="queryParams.indexId"
+        placeholder="璇烽�夋嫨鐐逛綅"
+        style="width:200px;margin-right: 6px"
+        size="small"
+      >
+        <el-option
+          v-for="i in indexList"
+          :key="i.indexId"
+          :label="i.indexName"
+          :value="i.indexId"
+        />
+      </el-select>
+      <el-radio-group
+        size="small"
+        v-model="queryParams.timeType"
+        @change="changeRadio"
+      >
+        <el-radio-button label="DAY">鏃�</el-radio-button>
+        <el-radio-button label="HOUR">灏忔椂</el-radio-button>
+      </el-radio-group>
+      <el-date-picker
+        size="small"
+        style="width: 160px;margin-left: 6px"
+        v-model="queryParams.dataTime"
+        type="date"
+        :clearable="false"
+        placeholder="閫夋嫨鏃ユ湡"
+        value-format="yyyy-MM-dd"
+      >
+      </el-date-picker>
+      <el-select
+        v-show="queryParams.timeType == 'HOUR'"
+        v-model="queryParams.hourTime"
+        placeholder="璇烽�夋嫨"
+        style="width:80px;margin-left: 6px"
+        size="small"
+        clearable
+      >
+        <el-option
+          v-for="i in 25"
+          :key="i"
+          :label="i < 11 ? '0' + (i - 1) + '鏃�' : i - 1 + '鏃�'"
+          :value="i - 1"
+        />
+      </el-select>
+      <el-button
+        type="primary"
+        icon="el-icon-search"
+        size="small"
+        @click="handleQuery"
+        style="margin-left: 6px"
+        >鏌ヨ</el-button
+      >
+      <el-button icon="el-icon-refresh" size="small" @click="resetQuery"
+        >閲嶇疆</el-button
+      >
+      <el-button
+        type="warning"
+        icon="el-icon-download"
+        size="mini"
+        @click="handleExport"
+        >瀵煎嚭</el-button
+      >
+    </div>
+    <basic-container :bodyStyle="bodyStyle">
+      <div>
+        <el-table
+          :data="tableData"
+          border
+          max-height="380px"
+          v-loading="loading"
+        >
+          <el-table-column
+            prop="indexName"
+            label="鐐逛綅鍚嶇О"
+            align="center"
+            show-overflow-tooltip
+          ></el-table-column>
+          <el-table-column
+            prop="value"
+            label="鐐逛綅鍊�"
+            align="center"
+          ></el-table-column>
+          <el-table-column
+            prop="usedValue"
+            label="浣跨敤鍊�"
+            align="center"
+          ></el-table-column>
+          <el-table-column
+            prop="dataTime"
+            label="鏃堕棿"
+            align="center"
+          ></el-table-column>
+          <!-- <el-table-column
+          prop="ratio"
+          label="鍚屾瘮"
+          align="center"
+        ></el-table-column> -->
+        </el-table>
+      </div>
+      <div style="margin-top: 30px">
+        <el-button-group>
+          <el-button
+            :type="lineValue == 'usedValue' ? 'default' : 'primary'"
+            @click="handleLine('value')"
+            >鐐逛綅鍊�</el-button
+          >
+          <el-button
+            :type="lineValue == 'usedValue' ? 'primary' : 'default'"
+            @click="handleLine('usedValue')"
+            >浣跨敤鍊�</el-button
+          >
+        </el-button-group>
+        <div id="lineChartId" :style="{ height: '350px', width: '100%' }" />
+      </div>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import moment from "moment";
+import {
+  getCodeList,
+  getIndexList,
+  exportHistoryDataTrend
+} from "@/api/dataMonitoring/historyDataTrend/historyDataTrend";
+import echarts from "echarts";
+// require("echarts/theme/macarons"); // echarts theme
+export default {
+  name: "historyMonitoringSetting",
+  data() {
+    return {
+      valueFormat: "yyyy-MM-dd",
+      currentNode: undefined,
+      queryParams: {
+        nodeId: undefined,
+        indexId: "",
+        pickerType: "date",
+        dataTime: undefined,
+        timeType: "DAY", // YEAR,MONTH,DAY,HOUR
+        hourTime: 0
+      },
+      chart: null,
+      chartData: {
+        xData: [],
+        legendArr: [],
+        titleName: ""
+      },
+      indexList: [],
+      tableData: [],
+      lineValue: "usedValue",
+      pickerType: "date"
+    };
+  },
+  props: {
+    bodyStyle: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  mounted() {
+    this.pickerType = "date";
+    this.valueFormat = "yyyy-MM-dd";
+    this.queryParams.dataTime = moment().format("yyyy-MM-DD");
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    changeRadio(e) {
+      if (e == "DAY") {
+        this.pickerType = "date";
+        this.valueFormat = "yyyy-MM-dd";
+        this.queryParams.dataTime = moment().format("yyyy-MM-DD");
+      } else {
+        this.pickerType = "datetime";
+        this.valueFormat = "yyyy-MM-dd HH:mm:ss";
+        // this.queryParams.dataTime = moment().format("yyyy-MM-DD HH:mm:ss");
+        this.queryParams.dataTime = moment().format("yyyy-MM-DD");
+        this.queryParams.hourTime = moment().hour();
+      }
+      this.getList();
+    },
+
+    modelNodeChange(modelNode) {
+      this.queryParams.nodeId = modelNode.id;
+      this.disabledSetting =
+        modelNode === undefined || modelNode === "" || modelNode === null;
+      if (modelNode) {
+        this.currentNode = modelNode;
+        this.getIndexList();
+      }
+    },
+    // 鑾峰彇鐐逛綅鍒楄〃
+    getIndexList() {
+      getIndexList(this.queryParams.nodeId).then(res => {
+        this.indexList = res.data;
+        this.queryParams.indexId = res.data[0].indexId;
+        this.getList();
+      });
+    },
+    handleQuery() {
+      this.getList();
+    },
+    getList() {
+      let query = this.queryParams;
+      if (this.queryParams.timeType == "HOUR") {
+        let dataTime = moment(this.queryParams.dataTime).format("yyyy-MM-DD");
+        let hour =
+          this.queryParams.hourTime < 10
+            ? "0" + this.queryParams.hourTime
+            : this.queryParams.hourTime;
+        query.dataTime = dataTime + " " + hour + ":00:00";
+      } else {
+        query.dataTime = moment(this.queryParams.dataTime).format("yyyy-MM-DD");
+      }
+      console.log("query", query);
+      this.loading = true;
+      getCodeList(this.queryParams).then(response => {
+        this.tableData = response.data;
+        this.total = response.total;
+        this.loading = false;
+        // chart
+        let titleName = this.tableData.length
+          ? this.tableData[0].indexName
+          : "";
+        let xData = this.tableData.map(item => {
+          return this.queryParams.timeType == "DAY"
+            ? moment(item.dataTime).hour() + "鏃�"
+            : moment(item.dataTime).hour() +
+                ":" +
+                moment(item.dataTime).minute();
+        });
+        this.lineValue = "usedValue";
+        let legendArr = this.tableData.map(item => {
+          return item.usedValue === "--" ? null : item.usedValue;
+        });
+        this.chartData = {
+          xData,
+          legendArr,
+          titleName
+        };
+        this.$nextTick(() => {
+          this.initChart();
+        });
+      });
+    },
+    handleLine(type) {
+      this.lineValue = type;
+      let legendArr = this.tableData.map(item => {
+        return item[type] === "--" ? null : item[type];
+      });
+      this.chartData = {
+        ...this.chartData,
+        legendArr
+      };
+      this.setOptions(this.chartData);
+    },
+    resetQuery() {
+      this.queryParams.timeType = "DAY";
+      this.pickerType = "date";
+      this.valueFormat = "yyyy-MM-dd";
+      this.queryParams.dataTime = moment().format("yyyy-MM-DD");
+      this.handleQuery();
+    },
+    initChart() {
+      let chartDom = document.getElementById("lineChartId");
+      this.chart = echarts.init(chartDom);
+      this.setOptions(this.chartData);
+    },
+    setOptions({ xData, legendArr, titleName } = {}) {
+      this.chart.clear();
+      let option = {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "shadow"
+          }
+        },
+        legend: {
+          right: "center"
+        },
+        grid: {
+          left: "1",
+          right: "3%",
+          bottom: "3%",
+          containLabel: true
+        },
+        xAxis: {
+          type: "category",
+          data: xData
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, 0.01]
+        },
+        series: [
+          {
+            name: titleName,
+            type: "line",
+            data: legendArr
+            // color: "#919191"
+          }
+        ]
+      };
+      this.chart.setOption(option);
+    },
+    handleExport() {
+      let query = this.queryParams;
+      if (this.queryParams.timeType == "HOUR") {
+        let dataTime = moment(this.queryParams.dataTime).format(
+          "yyyy-MM-DD HH"
+        );
+        query.dataTime = dataTime + ":00:00";
+      }
+      console.log("query", query);
+      exportHistoryDataTrend(query).then(response => {
+        this.download(response.msg);
+      });
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.search-wrapper {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  height: 100px;
+  z-index: 1000;
+  background: #fff;
+  border-radius: 4px;
+  margin-bottom: 12px;
+  padding: 0 24px;
+  box-shadow: 0 7px 14px 0 rgba(0, 0, 0, 0.1);
+  margin-top: 6px;
+}
+</style>
diff --git a/energy_management_ui/src/views/dataMonitoring/historyDataTrend/index.vue b/energy_management_ui/src/views/dataMonitoring/historyDataTrend/index.vue
new file mode 100644
index 0000000..8c54747
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/historyDataTrend/index.vue
@@ -0,0 +1,96 @@
+<template>
+  <div>
+    <el-row type="flex">
+      <el-col
+        :style="{ width: isCollapse ? '0' : '280px', position: 'relative' }"
+        v-show="!isCollapse"
+      >
+        <basic-container title="鍘嗗彶鏁版嵁鏌ヨ" :bodyStyle="bodyStyle">
+          <ModelNode
+            ref="modelNode"
+            @changeNode="changeNode"
+            :showOpt="false"
+            :modelCode="modelCode"
+            :isSelectFirstLeaf="true"
+          ></ModelNode>
+        </basic-container>
+        <img
+          src="~@/assets/image/rectangle.png"
+          alt=""
+          class="shrink-col-block"
+          @click="toggleCollapse"
+        />
+      </el-col>
+      <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse" />
+      <el-col
+        :style="{
+          width: isCollapse ? 'calc(100% - 48px)' : 'calc(100% - 280px)',
+          paddingLeft: isCollapse ? 0 : '14px'
+        }"
+      >
+        <div>
+          <history-monitoring-setting
+            ref="historyMonitoringSetting"
+            :bodyStyle="bodyStyleRight"
+          ></history-monitoring-setting>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+// import trendSetting from "./trendSetting";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from "@/components/shrink/index.vue";
+import historyMonitoringSetting from "./historyMonitoringSetting";
+
+export default {
+  components: { ModelNode, ShrinkCol, historyMonitoringSetting },
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: "",
+      modelInfoOptions: [],
+      modelCode: undefined,
+      deviceCategory: "",
+      isCollapse: false,
+      bodyStyleRight: {}
+    };
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + "px";
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 212 + "px"
+      };
+    },
+    changeNode: function(node) {
+      this.$refs.historyMonitoringSetting.modelNodeChange(node);
+    },
+    manageModel: function() {
+      this.$router.push("/model");
+    },
+    changeModel: function(item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse;
+    }
+  }
+};
+</script>
+<style scoped>
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart copy.vue b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart copy.vue
new file mode 100644
index 0000000..242556d
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart copy.vue
@@ -0,0 +1,107 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+// import resize from './mixins/resize'
+
+export default {
+  // mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "350px"
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object
+      // required: true
+    }
+  },
+  data() {
+    return {
+      chart: null,
+      alarmLimitName: undefined
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions({ datas, timeList, title } = {}) {
+      let option = {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "shadow"
+          }
+        },
+        legend: {
+          right: "1"
+        },
+        grid: {
+          left: "1",
+          right: "3%",
+          bottom: "3%",
+          containLabel: true
+        },
+        xAxis: {
+          type: "category",
+          data: timeList
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, 0.01]
+        },
+        series: [
+          {
+            name: title,
+            type: "line",
+            data: datas,
+            color: "#FF005A"
+          }
+        ]
+      };
+      this.chart.setOption(option);
+    },
+
+    closeLineChar() {
+      this.chart.clear();
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart.vue b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart.vue
new file mode 100644
index 0000000..0b831d0
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/LineChart.vue
@@ -0,0 +1,118 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+// import resize from './mixins/resize'
+
+export default {
+  // mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "350px"
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object
+      // required: true
+    }
+  },
+  data() {
+    return {
+      chart: null,
+      alarmLimitName: undefined
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions({ datas, timeList, titleList } = {}) {
+      if (datas.length === 0) {
+        this.chart.clear();
+        return;
+      }
+      let option = {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "shadow"
+          }
+        },
+        legend: {
+          right: "1"
+        },
+        grid: {
+          left: "1",
+          right: "3%",
+          bottom: "3%",
+          containLabel: true
+        },
+        xAxis: {
+          type: "category",
+          data: timeList
+        },
+        yAxis: {
+          type: "value",
+          boundaryGap: [0, 0.01]
+        },
+        series: datas.map((item, index) => {
+          return {
+            name: titleList[index],
+            type: "line",
+            data: item.value
+          };
+        })
+        // [
+        //   {
+        //     name: title,
+        //     type: "line",
+        //     data: datas,
+        //     color: "#FF005A"
+        //   }
+        // ]
+      };
+      this.chart.setOption(option);
+    },
+
+    closeLineChar() {
+      this.chart.clear();
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/dataMonitoring/realTimeTrend/index.vue b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/index.vue
new file mode 100644
index 0000000..10e428e
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/index.vue
@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <el-row type="flex">
+      <el-col
+        :style="{ width: isCollapse ? '0' : '280px', position: 'relative' }"
+        v-show="!isCollapse"
+      >
+        <basic-container title="瀹炴椂瓒嬪娍鐩戞祴" :bodyStyle="bodyStyle">
+          <ModelNode
+            ref="modelNode"
+            @changeNode="changeNode"
+            :showOpt="false"
+            :modelCode="modelCode"
+            :isSelectFirstLeaf="true"
+          ></ModelNode>
+        </basic-container>
+        <img
+          src="~@/assets/image/rectangle.png"
+          alt=""
+          class="shrink-col-block"
+          @click="toggleCollapse"
+        />
+      </el-col>
+      <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse" />
+      <el-col
+        :style="{
+          width: isCollapse ? 'calc(100% - 48px)' : 'calc(100% - 280px)',
+          paddingLeft: isCollapse ? 0 : '14px'
+        }"
+      >
+        <div>
+          <trend-setting ref="trendSetting" :bodyStyle="bodyStyleRight" />
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import trendSetting from "./trendSetting";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from "@/components/shrink/index.vue";
+
+export default {
+  components: { ModelNode, trendSetting, ShrinkCol },
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: "",
+      modelInfoOptions: [],
+      modelCode: undefined,
+      deviceCategory: "",
+      isCollapse: false,
+      bodyStyleRight: {}
+    };
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + "px";
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 100 + "px"
+      };
+    },
+    changeNode: function(node) {
+      this.$refs.trendSetting.modelNodeChange(node);
+    },
+    manageModel: function() {
+      this.$router.push("/model");
+    },
+    changeModel: function(item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse;
+    }
+  }
+};
+</script>
+<style scoped>
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/dataMonitoring/realTimeTrend/trendSetting.vue b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/trendSetting.vue
new file mode 100644
index 0000000..058fce3
--- /dev/null
+++ b/energy_management_ui/src/views/dataMonitoring/realTimeTrend/trendSetting.vue
@@ -0,0 +1,281 @@
+<template>
+  <basic-container :bodyStyle="bodyStyle" class="realTimeTrend-right">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      label-width="68px"
+      class="special-form"
+      style="margin-bottom: 20px"
+    >
+      <el-row :gutter="24">
+        <el-col :span="24">
+          <el-form-item class="operation" style="text-align: right">
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery"
+              >鏌ヨ</el-button
+            >
+            <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              >瀵煎嚭</el-button
+            >
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div class="tableStyle">
+      <el-table
+        :data="tableData"
+        ref="dataTable"
+        border
+        style="width: 100%; margin-top: 20px"
+        :max-height="height"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column
+          type="selection"
+          align="center"
+          width="50"
+        ></el-table-column>
+        <!-- <el-table-column label="鏇茬嚎閫夋嫨" width="100" align="center">
+          <template slot-scope="scope">
+            <el-button
+              v-if="scope.row.code == queryParams.indexCode"
+              icon="el-icon-search"
+              circle
+              @click="selectChange(scope.row)"
+              style="font-size: 10px; color: #fff; background: #478ef7"
+            ></el-button>
+            <el-button
+              v-else
+              icon="el-icon-search"
+              circle
+              @click="selectChange(scope.row)"
+              style="font-size: 10px"
+            ></el-button>
+          </template>
+        </el-table-column> -->
+        <el-table-column prop="indexName" align="center" label="鐐逛綅鍚嶇О" />
+        <el-table-column prop="value" align="center" label="褰撳墠鍊�" />
+        <el-table-column prop="indexUnit" align="center" label="鍗曚綅" />
+        <el-table-column prop="timeString" align="center" label="鏃堕棿" />
+      </el-table>
+    </div>
+    <real-time-line
+      ref="liveLineChart"
+      :chart-data="{
+        ...liveLineChartData,
+        titleList: queryParams.indexName
+      }"
+      style="margin-top: 20px"
+    />
+  </basic-container>
+</template>
+
+<script>
+import {
+  getTrendSettingIndex,
+  getTrendSettingIndexLineData,
+  exportRealTimeTrend
+} from "@/api/dataMonitoring/realTimeTrend/realTimeTrend";
+import realTimeLine from "./LineChart";
+import mixins from "@/layout/mixin/getHeight";
+import moment from "moment";
+
+export default {
+  name: "energyIndex",
+  components: { realTimeLine },
+  mixins: [mixins],
+  props: {
+    bodyStyle: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    return {
+      timeArr: [],
+      currentNode: "",
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      dateRange: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 鎬绘潯鏁�
+      total: 10,
+      // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+      List: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "鍘嗗彶鏇茬嚎鏌ヨ",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      queryParams: {
+        indexCode: "",
+        nodeId: undefined
+      },
+      tableData: [],
+      lineData: [],
+      //閫変腑code
+      codes: [],
+      // //閫変腑鎸囨爣鍚嶇О
+      indexNames: [],
+      datas: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      addTableSelect: [],
+      liveLineChartData: {
+        datas: [],
+        timeList: [],
+        title: ""
+      },
+      height: 400,
+      rows: [],
+      code: "",
+      activeName: "",
+      multipleSelection: []
+    };
+  },
+  created() {},
+  beforeDestroy() {
+    //椤甸潰閿�姣佹椂 瑕佸仠姝㈣鏃跺櫒锛屽惁鍒欓�夐」鍗″垏鎹㈣鏃跺櫒涓嶅仠姝紝浼氳秺鏉ヨ秺蹇紝澶氫釜绾跨▼
+    if (this.timer) {
+      clearInterval(this.timer);
+      this.timer = null;
+    }
+  },
+  methods: {
+    setCharts() {
+      // this.height = window.innerHeight - 220 + "px";
+    },
+    modelNodeChange(modelNode) {
+      // this.$refs.liveLineChart.closeLineChar();
+      this.queryParams.nodeId = modelNode.id;
+      this.getList();
+      this.disabledSetting =
+        modelNode === undefined || modelNode === "" || modelNode === null;
+      if (modelNode) {
+        this.currentNode = modelNode;
+      }
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      var search = this.queryParams;
+      //琛ㄦ牸鏁版嵁
+      getTrendSettingIndex(search).then(response => {
+        this.tableData = response.data;
+        this.total = response.total;
+        this.loading = false;
+        this.cleanLineData();
+        // if (this.tableData && this.tableData.length !== 0) {
+        //   this.selectChange(this.tableData[0]);
+        // }
+      });
+    },
+
+    selectChange(row) {
+      this.queryParams.indexCode = row ? row.code : undefined;
+      this.liveLineChartData.title = row ? row.indexName : "";
+      this.getLineDataList();
+    },
+
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+      this.queryParams.indexCode = val.map(item => {
+        return item.code;
+      });
+      this.queryParams.indexName = val.map(item => {
+        return item.indexName;
+      });
+      if (val.length) {
+        this.getLineDataList();
+      } else {
+        this.cleanLineData();
+      }
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+
+    getLineDataList() {
+      this.cleanLineData();
+      //鎶樼嚎鍥炬暟鎹�
+      getTrendSettingIndexLineData(
+        this.queryParams.indexCode,
+        this.queryParams.minute || 20,
+        this.count || 10
+      ).then(response => {
+        //鏁版嵁娣诲姞
+        this.liveLineChartData.datas = response.data.map(item => {
+          return {
+            value: item.map(val => {
+              return val.value;
+            }),
+            time: item.map(val => {
+              return moment(val.showDataTime).format("HH:mm");
+            })
+          };
+        });
+        // x杞存椂闂存坊鍔�
+        this.liveLineChartData.timeList = response.data[0].map(item => {
+          return moment(item.showDataTime).format("HH:mm");
+        });
+      });
+    },
+
+    cleanLineData() {
+      this.liveLineChartData.timeList = [];
+      this.liveLineChartData.datas = [];
+    },
+    closeDialog() {
+      this.activeName = "";
+    },
+    openDialog(e) {
+      if (e) {
+        this.code = e.code;
+        this.open = true;
+        this.activeName = "second";
+      }
+    },
+    cancelDialog() {
+      this.open = false;
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitFormat(row, column) {
+      return this.selectDictLabel(this.unitOptions, row.indexUnit);
+    },
+    handleExport() {
+      exportRealTimeTrend({
+        nodeId: this.queryParams.nodeId
+      }).then(response => {
+        this.download(response.msg);
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.realTimeTrend-right {
+  height: 100%;
+  overflow: hidden;
+}
+
+.tableStyle .el-table__header-wrapper .el-checkbox {
+  display: none;
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/demo/index.vue b/energy_management_ui/src/views/demo/index.vue
new file mode 100644
index 0000000..529d32b
--- /dev/null
+++ b/energy_management_ui/src/views/demo/index.vue
@@ -0,0 +1,297 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ュ悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="璇疯緭鍏ョ紪鐮�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" prop="createDate">
+        <el-date-picker clearable size="small" style="width: 200px"
+          v-model="queryParams.createDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:demo:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:demo:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:demo:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:demo:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="demoList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="涓婚敭" align="center" prop="id" />
+      <el-table-column label="鍚嶇О" align="center" prop="name" />
+      <el-table-column label="缂栫爜" align="center" prop="code" />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createDate) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="澶囨敞" align="center" prop="remark" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:demo:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:demo:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀广�愯濉啓鍔熻兘鍚嶇О銆戝璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
+        </el-form-item>
+        <el-form-item label="缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鏃ユ湡" prop="createDate">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.createDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listDemo, getDemo, delDemo, addDemo, updateDemo, exportDemo } from "@/api/demo/demo";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 銆愯濉啓鍔熻兘鍚嶇О銆戣〃鏍兼暟鎹�
+      demoList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        code: undefined,
+        createDate: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛� */
+    getList() {
+      this.loading = true;
+      listDemo(this.queryParams).then(response => {
+        this.demoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        code: undefined,
+        remark: undefined,
+        createDate: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞銆愭祴璇曟暟鎹��";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getDemo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼銆愭祴璇曟暟鎹��";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateDemo(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addDemo(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎銆愭祴璇曟暟鎹�戠紪鍙蜂负"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delDemo(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夈�愭祴璇曟暟鎹�戞暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportDemo(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/electricityPrice/electricity/history.vue b/energy_management_ui/src/views/electricityPrice/electricity/history.vue
new file mode 100644
index 0000000..6f7f8e2
--- /dev/null
+++ b/energy_management_ui/src/views/electricityPrice/electricity/history.vue
@@ -0,0 +1,123 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="120px">
+      <el-form-item label="鐢熸晥鏃堕棿" prop="effectiveName">
+        <el-select v-model="queryParams.effectiveDate" placeholder="璇烽�夋嫨鐢熸晥鏃堕棿" clearable size="small">
+          <el-option
+            v-for="dict in list"
+            :key="changeTime(parseTime(dict.effectiveDate))"
+            :label="changeTime(parseTime(dict.effectiveDate))"
+            :value="changeTime(parseTime(dict.effectiveDate))"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table v-loading="loading" :data="electricityList">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鏃舵鍚嶇О" align="center" prop="effectiveName" :formatter="effectiveNameFormat" />
+      <el-table-column label="鍗曚环" align="center" prop="price"/>
+      <el-table-column label="鏃舵寮�濮嬫椂闂�" align="center" prop="beginDate" width="180"/>
+      <el-table-column label="鏃舵缁撴潫鏃堕棿" align="center" prop="endDate" width="180"/>
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  import { listHistory, listDate } from "@/api/electricityPrice/electricity";
+  export default {
+    data() {
+      return {
+        // 鎬绘潯鏁�
+        total: 0,
+        // electricityPrice琛ㄦ牸鏁版嵁
+        electricityList: [],
+        list:[],
+        // 鏃舵鍚嶇О瀛楀吀
+        effectiveNameOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          effectiveDate: undefined,
+        },
+      };
+    },
+    created() {
+      this.getList();
+      this.getLists();
+      this.getDicts("electricity_price").then(response => {
+        this.effectiveNameOptions = response.data;
+      });
+    },
+    methods: {
+      /** 鏌ヨelectricityPrice鍒楄〃 */
+      getList() {
+        this.loading = true;
+        listHistory(this.queryParams).then(response => {
+          this.electricityList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      getLists() {
+        this.loading = true;
+        listDate(this.queryParams).then(response => {
+          this.list = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      // 鏃舵鍚嶇О瀛楀吀缈昏瘧
+      effectiveNameFormat(row, column) {
+        return this.selectDictLabel(this.effectiveNameOptions, row.effectiveName);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.time = false;
+        this.openPrice = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          effectiveDate: undefined,
+          priceId: undefined,
+          beginDate: undefined,
+          endDate: undefined,
+          effectiveName: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+    changeTime(time) {
+      if (time !== null && time !== undefined && time !== "") {
+        return time.substring(0, 10);
+      } else {
+        return "";
+      }
+    }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/electricityPrice/electricity/index.vue b/energy_management_ui/src/views/electricityPrice/electricity/index.vue
new file mode 100644
index 0000000..a318b00
--- /dev/null
+++ b/energy_management_ui/src/views/electricityPrice/electricity/index.vue
@@ -0,0 +1,461 @@
+<style scoped>
+  .el-row {
+    margin-bottom: 20px;
+  }
+  .el-col {
+    border-radius: 4px;
+  }
+  .row-bg {
+      padding: 10px 0;
+      background-color: #f9fafc;
+    }
+</style>
+<template>
+  <div class="app-container">
+    <el-form :model="forms" label-width="100px">
+      <el-row :gutter="24" class="mb8">
+        <el-col :span="16">
+          <el-form-item prop="effective_date" label="鐢熸晥鏃堕棿锛�" label-width="100px">
+            <!--{{changeTime(parseTime(effective_date))}}-->
+            <el-date-picker clearable size="small" style="width: 200px"
+                            v-model="forms.effectiveDate"
+                            type="date"
+                            value-format="yyyy-MM-dd"
+                            :picker-options="pickerOptions"
+                            placeholder="璁剧疆鐢熸晥鏃堕棿">
+            </el-date-picker>
+           <!-- <el-input :disabled="isDisabled" v-model="item.effectiveDate"></el-input>-->
+            <!--<el-button size="mini" @click="addDate">璁剧疆鐢熸晥鏃堕棿</el-button>-->
+          </el-form-item>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            size="mini"
+            @click="handleAdd()"
+            v-hasPermi="['electricityPrice:electricity:add']"
+          >鏂板鏃舵</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button plain
+            size="mini"
+            @click="handlePrice()"
+            v-hasPermi="['electricityPrice:price:add']"
+          >璁剧疆鍗曚环</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <router-link :to="'/electricityPrice/listHistory'"  class="link-type">
+            <el-button plain size="mini">鏌ョ湅鍘嗗彶</el-button>
+          </router-link>
+        </el-col>
+      </el-row>
+      <el-table v-loading="loading" :data="electricityList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="鏃舵鍚嶇О" align="center" prop="effectiveName" :formatter="effectiveNameFormat" />
+        <el-table-column label="鍗曚环" align="center" prop="price"/>
+        <el-table-column label="鏃舵寮�濮嬫椂闂�" align="center" prop="beginDate" width="180"/>
+        <el-table-column label="鏃舵缁撴潫鏃堕棿" align="center" prop="endDate" width="180"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['electricityPrice:electricity:remove']"
+            >鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <!-- 娣诲姞鎴栦慨鏀筫lectricityPrice瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="time" width="500px">
+      <el-form ref="form" :model="form" :rulesTime="rulesTime" label-width="120px">
+        <el-form-item label="鐢熸晥鏃ユ湡" prop="effectiveDate">
+          <el-date-picker clearable size="small" style="width: 200px"
+                          v-model="form.effectiveDate"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          :picker-options="pickerOptions"
+                          placeholder="閫夋嫨鐢熸晥鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 娣诲姞鎴栦慨鏀筫lectricityPrice瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="鐢熸晥鏃堕棿" prop="effectiveDate">{{changeTime(parseTime(form.effectiveDate))}}</el-form-item>
+        <el-form-item label="鏃舵鍚嶇О" prop="effectiveName">
+          <el-select v-model="form.effectiveName" placeholder="璇烽�夋嫨鏃舵鍚嶇О">
+            <el-option
+              v-for="dict in effectiveNameOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏃舵寮�濮嬫椂闂�" prop="beginDate">
+          <el-time-picker
+            v-model="form.beginDate"
+            class="date-box"
+            format='HH:mm'
+            value-format="HH:mm"
+            placeholder="閫夋嫨鏃舵寮�濮嬫椂闂�"
+            >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="鏃舵缁撴潫鏃堕棿" prop="endDate">
+          <el-time-picker
+            v-model="form.endDate"
+            class="date-box"
+            format='HH:mm'
+            value-format="HH:mm"
+            placeholder="閫夋嫨鏃舵寮�濮嬫椂闂�"
+          ></el-time-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 娣诲姞鎴栦慨鏀筫lectricity瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="openPrice" width="500px">
+      <el-form ref="formPrice" :model="formPrice" :rulesPrice="rulesPrice">
+        <el-input type="hidden" v-model="formPrice.effectiveDate"></el-input>
+        <el-table :data="effective_name" ref="multipleTable" tooltip-effect="dark">
+          <el-table-column align="center" property="dictLabel" label="鏃舵鍚嶇О" ></el-table-column>
+          <el-table-column align="center" property="price" label="鍗曚环(鍏�)">
+           <template scope="scope">
+             <el-input step="0.1" v-model="scope.row.price" placeholder="璇疯緭鍏ュ崟浠�(鍏�)"></el-input>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitPrice">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { listElectricity, getElectricity, delElectricity, addElectricity, updateElectricity, exportElectricity,listDate} from "@/api/electricityPrice/electricity";
+
+  import { listPrice, getPrice, delPrice, addPrice, updatePrice ,EdictType,dictTypeList } from "@/api/electricityPrice/price";
+
+  export default {
+    data() {
+      return {
+        // 閬僵灞�
+        loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // electricityPrice琛ㄦ牸鏁版嵁
+        electricityList: [],
+        list: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        time: false,
+        openPrice: false,
+        // 鏃舵鍚嶇О瀛楀吀
+        effectiveNameOptions: [],
+        effective_name: [],
+        ifeffective: [],
+        effective:{
+          dictLabel:'',
+          dictValue:'',
+          price:''
+        },
+        dictType:"",
+        effective_date:"",
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          effectiveDate: undefined,
+          priceId: undefined,
+          beginDate: undefined,
+          endDate: undefined,
+          effectiveName: undefined,
+          dictType: undefined,
+        },
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        forms:{},
+        formPrice:{},
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          effectiveDate: [
+            { required: true, message: "鐢熸晥鏃ユ湡涓嶈兘涓虹┖", trigger: "blur" }
+          ],
+          beginDate: [
+            { required: true, message: "鏃舵寮�濮嬫椂闂翠笉鑳戒负绌�", trigger: "blur" }
+          ],
+          endDate: [
+            { required: true, message: "鏃舵缁撴潫鏃堕棿涓嶈兘涓虹┖", trigger: "blur" }
+          ],
+          effectiveName: [
+            { required: true, message: "鏃舵鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+          ]
+        },
+        rulesTime: {
+          effectiveDate: [
+            { required: true, message: "鐢熸晥鏃ユ湡涓嶈兘涓虹┖", trigger: "blur" }
+          ]
+        },
+        rulesPrice: {
+          timePeriod: [
+            { required: true, message: "鏃舵涓嶈兘涓虹┖", trigger: "blur" }
+          ],
+          price:[{ required: true, message: "鍗曚环涓嶈兘涓虹┖", trigger: "blur" }]
+        },
+        pickerOptions: { // 涓嶈閫夋嫨浠婂ぉ浠ュ墠鐨�
+          disabledDate(time) {
+            return time.getTime() < Date.now() - 24 * 60 * 60 * 1000
+          }
+        }
+      };
+    },
+
+    created() {
+      this.getList();
+      this.getLists();
+      this.getDicts("electricity_price").then(response => {
+        this.effectiveNameOptions = response.data;
+      });
+    },
+    methods: {
+      /** 鏌ヨelectricityPrice鍒楄〃 */
+      getList() {
+        this.loading = true;
+        listDate(this.queryParams).then(response => {
+          this.list= response.rows;
+          if(this.list.length>0){
+            this.forms.effectiveDate=this.list[0].effectiveDate;
+            this.effective_date=this.list[0].effectiveDate;
+          }
+          this.loading = false;
+        });
+      },
+      getLists(){
+        listElectricity(this.queryParams).then(response => {
+          this.electricityList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      // 鏃舵鍚嶇О瀛楀吀缈昏瘧
+      effectiveNameFormat(row, column) {
+        return this.selectDictLabel(this.effectiveNameOptions, row.effectiveName);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.time = false;
+        this.openPrice = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          effectiveDate: undefined,
+          priceId: undefined,
+          beginDate: undefined,
+          endDate: undefined,
+          effectiveName: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        console.log(selection);
+        this.ids = selection.map(item => item.id)
+        this.single = selection.length!=1
+        this.multiple = !selection.length
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        this.queryParams.effectiveDate = this.forms.effectiveDate;
+        listPrice(this.queryParams).then(response => {
+          this.reset();
+          this.ifeffective = response.rows;
+          if (this.ifeffective.length > 0) {
+            this.form.effectiveDate = this.forms.effectiveDate;
+            this.open = true;
+            this.title = "娣诲姞鏂板鏃舵";
+          } else {
+            this.msgSuccess("璇峰厛璁剧疆浠锋牸");
+          }
+        });
+      },
+      handlePrice(){
+        this.queryParams.effectiveDate = this.forms.effectiveDate.substring(0, 10);
+        this.queryParams.dictType="electricity_price",
+        dictTypeList(this.queryParams).then(response => {
+          this.reset();
+          this.formPrice.effectiveDate=this.forms.effectiveDate;
+          this.effective_name=response.data;
+          this.openPrice = true;
+          this.title = "璁剧疆鍗曚环";
+        });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitPrice: function() {
+        this.formPrice.effectiveDate;
+        this.$nextTick(() => {
+          this.formPrice.TimeJson=this.$refs['multipleTable'].data
+          let tourId = '';
+          let tourLabels = '';
+          let tourValue = '';
+          let tourPrice = '';
+          for (let i = 0; i < this.formPrice.TimeJson.length; i++) {
+            tourLabels +=this.formPrice.TimeJson[i].dictLabel+",";
+            tourValue +=this.formPrice.TimeJson[i].dictValue+",";
+            tourPrice +=this.formPrice.TimeJson[i].price+",";
+            tourId +=this.formPrice.TimeJson[i].id+",";
+          }
+          this.formPrice.dictLabel=tourLabels.substring(0, tourLabels.lastIndexOf(','));
+          this.formPrice.dictValue=tourValue.substring(0, tourValue.lastIndexOf(','));
+          this.formPrice.price=tourPrice.substring(0, tourPrice.lastIndexOf(','));
+          this.formPrice.id=tourId.substring(0, tourId.lastIndexOf(','));
+          //console.log(this.formPrice.TimeJson[0].id);
+         if (this.formPrice.TimeJson[0].id != undefined) {
+           updatePrice(this.formPrice).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("淇敼鎴愬姛");
+              this.openPrice = false;
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+        }else{
+          addPrice(this.formPrice).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("鏂板鎴愬姛");
+              this.openPrice = false;
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+        }
+        })
+        this.loading = false;
+      },
+      addDate() {
+        this.reset();
+        this.time = true;
+        this.title = "娣诲姞鐢熸晥鏃ユ湡";
+      },
+      /** 淇敼鎸夐挳鎿嶄綔 */
+      handleUpdate() {
+        this.reset();
+        const id =this.ids
+        getElectricity(id).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "淇敼鏂板鏃舵";
+        });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitForm: function() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.id != undefined) {
+              updateElectricity(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇敼鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                  this.getLists();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              addElectricity(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("鏂板鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                  this.getLists();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+      handleDelete(row) {
+        const ids = row.id || this.ids;
+        this.$confirm('鏄惁纭鍒犻櫎鏂板鏃舵缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delElectricity(ids);
+        }).then(() => {
+          this.getList();
+          this.getLists();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈塭lectricityPrice鏁版嵁椤�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportElectricity(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+      },
+      changeTime(time) {
+        if (time !== null && time !== undefined && time !== "") {
+          return time.substring(0, 10);
+        } else {
+          return "";
+        }
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/electricityPrice/statistics/electricityIndex.vue b/energy_management_ui/src/views/electricityPrice/statistics/electricityIndex.vue
new file mode 100644
index 0000000..258cccc
--- /dev/null
+++ b/energy_management_ui/src/views/electricityPrice/statistics/electricityIndex.vue
@@ -0,0 +1,234 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item>
+        <el-radio-group v-model="queryParams.eierarchyFlag">
+          <el-radio label="B" style="margin-right: 10px!important;" onselect="true">鏈骇</el-radio>
+          <el-radio label="ALL">鍖呭惈涓嬬骇</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" label-width="40px">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio style="margin-right: 10px" v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+        <el-date-picker
+          v-model="queryParams.beginTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="寮�濮嬫棩鏈�">
+        </el-date-picker>
+        鍒�
+        <el-date-picker
+          v-model="queryParams.endTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <!--<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>-->
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24" >
+        <el-table border style="width: 100%" :data=tabledata>
+          <el-table-column prop="name" label="鍚嶇О/鏃ユ湡" width="150"></el-table-column>
+          <template v-for="item in  tablehead ">
+            <el-table-column :label=item.lable :prop=item.prop>
+              <template v-for="(child,index) in item.childNodes">
+                <el-table-column :label=child.lable>
+                  <el-table-column :label=child.value :prop=child.valueProp></el-table-column>
+                  <el-table-column :label=child.price :prop=child.priceProp></el-table-column>
+                </el-table-column>
+              </template>
+            </el-table-column>
+          </template>
+        </el-table>
+      </el-col>
+    </el-row>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24" >
+        <div class="chart-wrapper" style="margin-top: 20px;">
+          <pie-chart ref="pieChart" :chart-data="pieChartData"/>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+  import { getStatisticsList,getDataStatistics} from "@/api/electricityPrice/statistics";
+  import pieChart from './pieChart'
+  export default {
+    components: {pieChart},
+    data() {
+      return {
+        tablehead:[],
+        tabledata:[],
+        dateTypeOptions:[],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          beginTime: undefined,
+          endTime: undefined,
+          timeType:"MONTH",
+          eierarchyFlag:"B",
+          nodeId:undefined,
+          nodeName:undefined,
+        },
+        dateTypes: 'date',
+        valueFormat:'yyyy-MM-dd',
+        pieChartData:{},
+        resultList:[],
+        skinName:"",
+      }
+    },
+    created() {
+      this.getDicts("electricDate").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+      this.getConfigKey("peak_valley_statistics").then(response => {
+        this.skinName=response.msg;
+      });
+      this.getTime();
+    },
+    methods: {
+      modelNodeChange(node){
+        this.queryParams.nodeId=node.id;
+        this.queryParams.nodeName=node.label;
+        this.getList();
+      },
+      getList() {
+        if(this.queryParams.timeType=="YEAR"){
+          this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 7)+"-01"
+          this.queryParams.endTime=this.getCurrentMonthLast(this.queryParams.endTime);
+        }
+        getStatisticsList(this.queryParams).then(response => {
+          this.tablehead=response.data.tablehead;
+          this.tabledata=response.data.tabledataMap;
+        });
+        getDataStatistics(this.queryParams).then(response => {
+          this.resultList=response.data.tabledataMap;
+          let legend=[];
+          let data=[];
+          this.resultList.forEach(item => {
+            if(item.name !=undefined || item.value !=undefined){
+              legend.push(item.name);
+              data.push({"value":this.numFilter(item.value),"name":item.name});
+            }
+          });
+          this.pieChartData.legend=legend;
+          this.pieChartData.data=data;
+          this.$refs.pieChart.initChart(this.pieChartData);
+        });
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '') {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '0.00'
+        }
+        return realVal
+      },
+      handleTime(date){
+        if(date=='YEAR'){
+          this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+        }else if(date=='MONTH'){
+          this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+        }
+      },
+      getTime(){
+        var  myDate = new Date();
+        var monthFirst = new Date(myDate.getFullYear(), parseInt(myDate.getMonth()));
+        this.queryParams.beginTime=this.formatDate(monthFirst);
+        //this.queryParams.endTime=this.formatDate(monthFirst);
+        this.queryParams.endTime=this.getCurrentMonthLast(monthFirst)
+      },
+      //鑾峰彇鏈堜唤鏈�鍚庝竴澶�
+      getCurrentMonthLast (endTime) {
+        var date = new Date(endTime)
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1
+        month = month < 10 ? '0' + month : month
+        var day = new Date(year, month, 0)
+        let endTimes="";
+        endTimes = year + '-' + month + '-' + day.getDate()
+        return endTimes;
+      },
+      formatDate: function (value) {
+        let date = new Date(value);
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? ('0' + MM) : MM;
+        let d = date.getDate();
+        d = d < 10 ? ('0' + d) : d;
+        let h = date.getHours();
+        h = h < 10 ? ('0' + h) : h;
+        let m = date.getMinutes();
+        m = m < 10 ? ('0' + m) : m;
+        let s = date.getSeconds();
+        s = s < 10 ? ('0' + s) : s;
+        return y + '-' + MM;
+      },
+    }
+  }
+</script>
+<style lang="scss">
+  .el-table td,.el-table th{
+    text-align: center !important;
+  }
+  .el-table thead.is-group th {
+    background: #fff;
+  }
+  .el-table thead.is-group tr:first-of-type th:first-of-type:before {
+    content: '鍚嶇О';
+    text-align: center;
+    position: absolute;
+    width: 152px;
+    height: 1px;
+    bottom: 30px;
+    right: 0;
+  }
+  .el-table thead.is-group tr:first-of-type th:first-of-type:after {
+    content: '鏃ユ湡';
+    text-align: center;
+    position: absolute;
+    width: 152px;
+    top: 10px;
+    left: 0;
+  }
+  .el-table thead.is-group tr:first-of-type th:first-of-type .cell {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 152px;
+    height: 1px;
+    background-color: #EBEEF5;
+    display: block;
+    text-align: center;
+    transform: rotate(38deg);
+    transform-origin: top left;
+    -ms-transform: rotate(38deg);
+    -ms-transform-origin: top left;
+    -webkit-transform: rotate(38deg);
+    -webkit-transform-origin: top left;
+  }
+</style>
diff --git a/energy_management_ui/src/views/electricityPrice/statistics/index.vue b/energy_management_ui/src/views/electricityPrice/statistics/index.vue
new file mode 100644
index 0000000..0bbc68d
--- /dev/null
+++ b/energy_management_ui/src/views/electricityPrice/statistics/index.vue
@@ -0,0 +1,55 @@
+
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            宄板钩璋锋暟鎹粺璁�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+         <electricityIndex ref="electricityIndex" style="padding:10px"></electricityIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+  import electricityIndex from "./electricityIndex";
+  export default {
+    components: { ModelNode,electricityIndex},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.electricityIndex.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/electricityPrice/statistics/mixins/resize.js b/energy_management_ui/src/views/electricityPrice/statistics/mixins/resize.js
new file mode 100644
index 0000000..ae02e64
--- /dev/null
+++ b/energy_management_ui/src/views/electricityPrice/statistics/mixins/resize.js
@@ -0,0 +1,52 @@
+import { debounce } from '@/utils'
+
+export default {
+  data() {
+    return {
+      $_sidebarElm: null
+    }
+  },
+  mounted() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  beforeDestroy() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  activated() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  deactivated() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  methods: {
+    $_resizeHandler() {
+      return debounce(() => {
+        if (this.chart) {
+          this.chart.resize()
+        }
+      }, 100)()
+    },
+    $_initResizeEvent() {
+      window.addEventListener('resize', this.$_resizeHandler)
+    },
+    $_destroyResizeEvent() {
+      window.removeEventListener('resize', this.$_resizeHandler)
+    },
+    $_sidebarResizeHandler(e) {
+      if (e.propertyName === 'width') {
+        this.$_resizeHandler()
+      }
+    },
+    $_initSidebarResizeEvent() {
+      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+      this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+    },
+    $_destroySidebarResizeEvent() {
+      this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+    }
+  }
+}
diff --git a/energy_management_ui/src/views/electricityPrice/statistics/pieChart.vue b/energy_management_ui/src/views/electricityPrice/statistics/pieChart.vue
new file mode 100644
index 0000000..6af9841
--- /dev/null
+++ b/energy_management_ui/src/views/electricityPrice/statistics/pieChart.vue
@@ -0,0 +1,100 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from './mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+        //required: true
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({legend,data} = {}) {
+        this.chart.setOption({
+          title: {
+            text: '鏁版嵁鍒嗘瀽',
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'item',
+            formatter: '{a} <br/>{b} : {c} ({d}%)'
+          },
+          legend: {
+            //bottom: 10,
+            top:"30",
+            orient: 'vertical',
+            left: '10',
+            data: legend,
+          },
+          series: [
+            {
+              type: 'pie',
+              radius: '65%',
+              center: ['50%', '50%'],
+              selectedMode: 'single',
+              data:data,
+              emphasis: {
+                itemStyle: {
+                  shadowBlur: 10,
+                  shadowOffsetX: 0,
+                  shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+              }
+            }
+          ]
+        })
+      },
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/enerInfoManage/enerclass/index.vue b/energy_management_ui/src/views/enerInfoManage/enerclass/index.vue
new file mode 100644
index 0000000..20377eb
--- /dev/null
+++ b/energy_management_ui/src/views/enerInfoManage/enerclass/index.vue
@@ -0,0 +1,359 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鑳芥簮绫诲瀷" prop="enerclassname">
+              <el-input
+                  v-model="queryParams.enerclassname"
+                  placeholder="璇疯緭鍏ヨ兘婧愮被鍒悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="18">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['enerInfoManage:enerclass:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['enerInfoManage:enerclass:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['enerInfoManage:enerclass:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <!--      <el-col :span="1.5">-->
+        <!--        <el-button-->
+        <!--          type="warning"-->
+        <!--          icon="el-icon-download"-->
+        <!--          size="mini"-->
+        <!--          @click="handleExport"-->
+        <!--          v-hasPermi="['enerInfoManage:enerclass:export']"-->
+        <!--        >瀵煎嚭</el-button>-->
+        <!--      </el-col>-->
+      </el-row>
+      <el-table :height="height" v-loading="loading" :data="enerclassList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鑳芥簮绫诲埆鍚嶇О" align="center" prop="enerclassname"/>
+        <el-table-column label="鎿嶄綔浜�" align="center" prop="oprMan"/>
+        <el-table-column label="鎿嶄綔鏃堕棿" align="center" prop="oprTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.oprTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鏇存柊浜�" align="center" prop="modMan"/>
+        <el-table-column label="鏇存柊鏃堕棿" align="center" prop="modTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.modTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="澶囨敞" align="center" prop="note"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['enerInfoManage:enerclass:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['enerInfoManage:enerclass:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀硅兘婧愬搧绉嶈缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鑳芥簮绫诲瀷" prop="enerclassname">
+          <el-input v-model="form.enerclassname" placeholder="璇疯緭鍏ヨ兘婧愮被鍒悕绉�"/>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="note">
+          <el-input v-model="form.note" placeholder="璇疯緭鍏ュ娉�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listEnerclass,
+  getEnerclass,
+  delEnerclass,
+  addEnerclass,
+  updateEnerclass,
+  exportEnerclass
+} from "@/api/enerInfoManage/enerclass";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鑳芥簮鍝佺璁剧疆琛ㄦ牸鏁版嵁
+      enerclassList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鑳芥簮绫诲埆ID瀛楀吀
+      enerclassidOptions: [],
+      // 鑳芥簮绫诲埆鍚嶇О瀛楀吀
+      enerclassnameOptions: [],
+      // 鎿嶄綔浜哄瓧鍏�
+      oprManOptions: [],
+      // 鎿嶄綔鏃堕棿瀛楀吀
+      oprTimeOptions: [],
+      // 鏇存柊浜哄瓧鍏�
+      modManOptions: [],
+      // 鏇存柊鏃堕棿瀛楀吀
+      modTimeOptions: [],
+      // 澶囨敞瀛楀吀
+      noteOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        enerclassname: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        enerclassname: [
+          {required: true, message: "鑳芥簮绫诲埆鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ鑳芥簮鍝佺璁剧疆鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listEnerclass(this.queryParams).then(response => {
+        this.enerclassList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鑳芥簮绫诲埆ID瀛楀吀缈昏瘧
+    enerclassidFormat(row, column) {
+      return this.selectDictLabel(this.enerclassidOptions, row.enerclassid);
+    },
+    // 鑳芥簮绫诲埆鍚嶇О瀛楀吀缈昏瘧
+    enerclassnameFormat(row, column) {
+      return this.selectDictLabel(this.enerclassnameOptions, row.enerclassname);
+    },
+    // 鎿嶄綔浜哄瓧鍏哥炕璇�
+    oprManFormat(row, column) {
+      return this.selectDictLabel(this.oprManOptions, row.oprMan);
+    },
+    // 鎿嶄綔鏃堕棿瀛楀吀缈昏瘧
+    oprTimeFormat(row, column) {
+      return this.selectDictLabel(this.oprTimeOptions, row.oprTime);
+    },
+    // 鏇存柊浜哄瓧鍏哥炕璇�
+    modManFormat(row, column) {
+      return this.selectDictLabel(this.modManOptions, row.modMan);
+    },
+    // 鏇存柊鏃堕棿瀛楀吀缈昏瘧
+    modTimeFormat(row, column) {
+      return this.selectDictLabel(this.modTimeOptions, row.modTime);
+    },
+    // 澶囨敞瀛楀吀缈昏瘧
+    noteFormat(row, column) {
+      return this.selectDictLabel(this.noteOptions, row.note);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        enerclassid: undefined,
+        enerclassname: undefined,
+        oprMan: undefined,
+        oprTime: undefined,
+        modMan: undefined,
+        modTime: undefined,
+        note: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.enerclassid)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑳芥簮鍝佺璁剧疆";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const enerclassid = row.enerclassid || this.ids
+      getEnerclass(enerclassid).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑳芥簮鍝佺璁剧疆";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.enerclassid != undefined) {
+            updateEnerclass(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnerclass(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const enerclassname = row.enerclassname || this.enerclassname;
+      const enerclassids = row.enerclassid || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑳芥簮绫诲瀷鍚嶇О涓�"' + enerclassname + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delEnerclass(enerclassids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘婧愬搧绉嶈缃暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportEnerclass(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/enerInfoManage/enercoefficient/index.vue b/energy_management_ui/src/views/enerInfoManage/enercoefficient/index.vue
new file mode 100644
index 0000000..a03f054
--- /dev/null
+++ b/energy_management_ui/src/views/enerInfoManage/enercoefficient/index.vue
@@ -0,0 +1,330 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鑳芥簮鍚嶇О" prop="enername">
+              <el-input
+                  v-model="queryParams.enername"
+                  placeholder="璇疯緭鍏ヨ兘婧愬悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="18">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-table :height="height" v-loading="loading" :data="enercoefficientList"
+                @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鑳芥簮鍚嶇О" align="center" prop="enername"/>
+        <el-table-column label="绛変环鎶樻爣绯绘暟" align="center" prop="coefficient"/>
+        <el-table-column label="褰撻噺鎶樻爣绯绘暟" align="center" prop="coefficient2"/>
+        <el-table-column label="鎵ц鏃ユ湡" align="center" prop="execdate" width="180">
+          <template slot-scope="scope">
+            <span>{{ changeTime(parseTime(scope.row.execdate)) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="澶囨敞" align="center" prop="note"/>
+        <!--      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">-->
+        <!--        <template slot-scope="scope">-->
+        <!--          <el-button-->
+        <!--            size="mini"-->
+        <!--            type="text"-->
+        <!--            icon="el-icon-edit"-->
+        <!--            @click="handleUpdate(scope.row)"-->
+        <!--            v-hasPermi="['enerInfoManage:enercoefficient:edit']"-->
+        <!--          >淇敼</el-button>-->
+        <!--          <el-button-->
+        <!--            size="mini"-->
+        <!--            type="text"-->
+        <!--            icon="el-icon-delete"-->
+        <!--            @click="handleDelete(scope.row)"-->
+        <!--            v-hasPermi="['enerInfoManage:enercoefficient:remove']"-->
+        <!--          >鍒犻櫎</el-button>-->
+        <!--        </template>-->
+        <!--      </el-table-column>-->
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+
+    <!--    <el-row :gutter="10" class="mb8">-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="primary"-->
+    <!--          icon="el-icon-plus"-->
+    <!--          size="mini"-->
+    <!--          @click="handleAdd"-->
+    <!--          v-hasPermi="['enerInfoManage:enercoefficient:add']"-->
+    <!--        >鏂板</el-button>-->
+    <!--      </el-col>-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="success"-->
+    <!--          icon="el-icon-edit"-->
+    <!--          size="mini"-->
+    <!--          :disabled="single"-->
+    <!--          @click="handleUpdate"-->
+    <!--          v-hasPermi="['enerInfoManage:enercoefficient:edit']"-->
+    <!--        >淇敼</el-button>-->
+    <!--      </el-col>-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="danger"-->
+    <!--          icon="el-icon-delete"-->
+    <!--          size="mini"-->
+    <!--          :disabled="multiple"-->
+    <!--          @click="handleDelete"-->
+    <!--          v-hasPermi="['enerInfoManage:enercoefficient:remove']"-->
+    <!--        >鍒犻櫎</el-button>-->
+    <!--      </el-col>-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="warning"-->
+    <!--          icon="el-icon-download"-->
+    <!--          size="mini"-->
+    <!--          @click="handleExport"-->
+    <!--          v-hasPermi="['enerInfoManage:enercoefficient:export']"-->
+    <!--        >瀵煎嚭</el-button>-->
+    <!--      </el-col>-->
+    <!--    </el-row>-->
+
+
+    <!-- 娣诲姞鎴栦慨鏀硅兘婧愭姌鏍囩郴鏁板璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listEnercoefficient,
+  getEnercoefficient,
+  delEnercoefficient,
+  addEnercoefficient,
+  updateEnercoefficient,
+  exportEnercoefficient
+}
+  from "@/api/enerInfoManage/enercoefficient";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鑳芥簮鎶樻爣绯绘暟琛ㄦ牸鏁版嵁
+      enercoefficientList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鎶樻爣绯绘暟ID瀛楀吀
+      ecidOptions: [],
+      // 鑳芥簮ID瀛楀吀
+      eneridOptions: [],
+      // 绛変环鎶樻爣绯绘暟瀛楀吀
+      coefficientOptions: [],
+      // 褰撻噺鎶樻爣绯绘暟瀛楀吀
+      coefficient2Options: [],
+      // 鎵ц鏃ユ湡瀛楀吀
+      execdateOptions: [],
+      // 鎿嶄綔浜哄瓧鍏�
+      oprManOptions: [],
+      // 鎿嶄綔鏃堕棿瀛楀吀
+      oprTimeOptions: [],
+      // 鏇存柊浜哄瓧鍏�
+      modManOptions: [],
+      // 鏇存柊鏃堕棿瀛楀吀
+      modTimeOptions: [],
+      // 澶囨敞瀛楀吀
+      noteOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        enername: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {}
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 320;
+    },
+    /** 鏌ヨ鑳芥簮鎶樻爣绯绘暟鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listEnercoefficient(this.queryParams).then(response => {
+        this.enercoefficientList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        ecid: undefined,
+        enerid: undefined,
+        coefficient: undefined,
+        coefficient2: undefined,
+        execdate: undefined,
+        oprMan: undefined,
+        oprTime: undefined,
+        modMan: undefined,
+        modTime: undefined,
+        note: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.ecid)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑳芥簮鎶樻爣绯绘暟";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const ecid = row.ecid || this.ids
+      getEnercoefficient(ecid).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑳芥簮鎶樻爣绯绘暟";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.ecid != undefined) {
+            updateEnercoefficient(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnercoefficient(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ecids = row.ecid || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑳芥簮鎶樻爣绯绘暟缂栧彿涓�"' + ecids + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delEnercoefficient(ecids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘婧愭姌鏍囩郴鏁版暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportEnercoefficient(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    changeTime(time) {
+      if (time !== null && time !== undefined && time !== "") {
+        return time.substring(0, 10);
+      } else {
+        return "";
+      }
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/enerInfoManage/energy/index.vue b/energy_management_ui/src/views/enerInfoManage/energy/index.vue
new file mode 100644
index 0000000..ac66205
--- /dev/null
+++ b/energy_management_ui/src/views/enerInfoManage/energy/index.vue
@@ -0,0 +1,629 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鑳芥簮鍚嶇О" prop="enername">
+              <el-input
+                  v-model="queryParams.enername"
+                  placeholder="璇疯緭鍏ヨ兘婧愬悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鑳芥簮绫诲瀷" prop="enerclassname">
+              <el-select
+                  v-model="queryParams.enerclassname"
+                  placeholder="鑳芥簮绫诲瀷鍚嶇О"
+                  clearable
+                  size="small"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="SysEnergy in enerclassnameOptions"
+                    :key="SysEnergy.enerclassid"
+                    :label="SysEnergy.dictLabel"
+                    :value="SysEnergy.enerclassname"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['enerInfoManage:energy:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['enerInfoManage:energy:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['enerInfoManage:energy:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <!--      <el-col :span="1.5">-->
+        <!--        <el-button-->
+        <!--          type="warning"-->
+        <!--          icon="el-icon-download"-->
+        <!--          size="mini"-->
+        <!--          @click="handleExport"-->
+        <!--          v-hasPermi="['enerInfoManage:energy:export']"-->
+        <!--        >瀵煎嚭</el-button>-->
+        <!--      </el-col>-->
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-edit"
+              :disabled="single"
+              size="mini"
+              @click="Updateenergyprice"
+              v-hasPermi="['enerInfoManage:energy:updateEnergyPrice']"
+          >鍗曚环璁剧疆
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-edit"
+              :disabled="single"
+              size="mini"
+              @click="Updateenergycoefficient"
+              v-hasPermi="['enerInfoManage:energy:updateEnergycoefficient']"
+          >鎶樻爣绯绘暟璁剧疆
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table :height="height" v-loading="loading" :data="energyList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" fixed="left"/>
+        <el-table-column label="鑳芥簮鍚嶇О" align="center" prop="enername" fixed="left" show-overflow-tooltip/>
+        <el-table-column label="璁¢噺鍗曚綅" align="center" prop="muidName"/>
+        <el-table-column label="鑳芥簮绫诲埆" align="center" prop="enerclassname"/>
+        <el-table-column label="鑳芥簮缂栧彿" align="center" prop="enersno"/>
+        <el-table-column label="鏄惁瀛樺偍" align="center" prop="isstorageString"/>
+        <el-table-column label="鎿嶄綔浜�" align="center" prop="oprMan"/>
+        <el-table-column label="鎿嶄綔鏃堕棿" align="center" prop="oprTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.oprTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="淇敼浜�" align="center" prop="modMan"/>
+        <el-table-column label="淇敼鏃堕棿" align="center" prop="modTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.modTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="澶囨敞" align="center" prop="note"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" fixed="right"
+                         width="120">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['enerInfoManage:energy:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['enerInfoManage:energy:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀筫nergy瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鑳芥簮鍚嶇О" prop="enername">
+          <el-input v-model="form.enername" placeholder="璇疯緭鍏ヨ兘婧愬悕绉�"/>
+        </el-form-item>
+        <el-form-item label="璁¢噺鍗曚綅" prop="muidStringOptions">
+          <el-select
+              v-model="form.muidString"
+              placeholder="璁¢噺鍗曚綅鍚嶇О"
+              clearable
+              size="small"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="SysEnergy in muidStringOptions"
+                :key="SysEnergy.dictLabel"
+                :label="SysEnergy.dictLabel"
+                :value="SysEnergy.dictCode"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鑳芥簮缂栧彿" prop="enersno">
+          <el-input v-model="form.enersno" placeholder="璇疯緭鍏ヨ兘婧愮紪鍙�"/>
+        </el-form-item>
+        <el-form-item label="鑳芥簮绫诲瀷" prop="enerclassname">
+          <el-select
+              v-model="form.enerclassname"
+              placeholder="鑳芥簮绫诲瀷鍚嶇О"
+              clearable
+              size="small"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="SysEnergy in enerclassnameOptions"
+                :key="SysEnergy.enerclassname"
+                :label="SysEnergy.dictLabel"
+                :value="SysEnergy.enerclassname"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏄惁瀛樺偍" prop="isstorageString">
+          <el-select
+              v-model="form.isstorageString"
+              placeholder="鏄惁瀛樺偍"
+              clearable
+              size="small"
+              style="width: 240px"
+          >
+            <el-option
+                value="鏄�"
+            >鏄�
+            </el-option>
+            <el-option
+                value="鍚�"
+            >鍚�
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="note">
+          <el-input v-model="form.note" placeholder="璇疯緭鍏ュ娉�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 鍗曚环璁剧疆瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="openenergyprice" width="500px">
+      <el-form ref="priceForm" :model="priceForm" :rules="pricerules" label-width="80px">
+        <el-form-item label="浠锋牸" prop="price">
+          <el-input type="number" v-model="priceForm.price" placeholder="璇疯緭鍏ュ崟浠�"/>
+        </el-form-item>
+        <el-form-item label="鎵ц鏃ユ湡">
+          <el-date-picker
+              v-model="priceForm.execdate"
+              size="small"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="date"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="pricenote">
+          <el-input v-model="priceForm.pricenote" placeholder="璇疯緭鍏ュ娉�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="priceSubmitForm">淇� 瀛�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 鎶樻爣绯绘暟璁剧疆瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="openenergyCoefficient" width="500px">
+      <el-form ref="CoefficientForm" :model="CoefficientForm" :rules="Coefficientrules" label-width="80px">
+        <el-form-item label="绛変环鎶樻爣绯绘暟" prop="coefficient">
+          <el-input type="number" v-model="CoefficientForm.coefficient" placeholder="璇疯緭鍏ョ瓑浠锋姌鏍囩郴鏁�"/>
+        </el-form-item>
+        <el-form-item label="褰撻噺鎶樻爣绯绘暟" prop="coefficient2">
+          <el-input type="number" v-model="CoefficientForm.coefficient2" placeholder="璇疯緭鍏ュ綋閲忔姌鏍囩郴鏁�"/>
+        </el-form-item>
+        <el-form-item label="鎵ц鏃ユ湡">
+          <el-date-picker
+              v-model="CoefficientForm.coefficientexecdate"
+              size="small"
+              style="width: 240px"
+              value-format="yyyy-MM-dd"
+              type="date"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="coefficientnote">
+          <el-input v-model="CoefficientForm.coefficientnote" placeholder="璇疯緭鍏ュ娉�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="coefficientSubmitForm">淇� 瀛�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listEnergy, getEnergy, delEnergy, addEnergy, updateEnergy, exportEnergy, classselect,
+  updateEnergyPrice, updateEnergyCoefficient
+} from "@/api/enerInfoManage/energy";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // energy琛ㄦ牸鏁版嵁
+      energyList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      //鏄惁鏄剧ず璁剧疆鍗曚环灞�
+      openenergyprice: false,
+      //鏄惁鏄剧ず璁剧疆鎶樻爣绯绘暟灞�
+      openenergyCoefficient: false,
+      // 鎿嶄綔浜哄瓧鍏�
+      oprManOptions: [],
+      // 鎿嶄綔鏃堕棿瀛楀吀
+      oprTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      modManOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      modTimeOptions: [],
+      // 鑳芥簮ID瀛楀吀
+      eneridOptions: [],
+      // 鑳芥簮鍚嶇О瀛楀吀
+      enernameOptions: [],
+      // 璁¢噺鍗曚綅ID瀛楀吀
+      muidStringOptions: [],
+      // 鑳芥簮绫诲埆ID瀛楀吀
+      enerclassidOptions: [],
+      // 鑳芥簮缂栧彿瀛楀吀
+      enersnoOptions: [],
+      // 鏄惁瀛樺偍瀛楀吀
+      isstorageStringOptions: undefined,
+      priceOptions: undefined,
+      // 澶囨敞瀛楀吀
+      noteOptions: [],
+      unitDefaultVal: undefined,
+      //鑳芥簮绫诲瀷瀛楀吀
+      enerclassnameOptions: undefined,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        enername: undefined,
+        enerclassname: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      //price琛ㄥ崟鍙傛暟
+      priceForm: {},
+      //鎶樻爣绯绘暟琛ㄥ崟鍙傛暟
+      CoefficientForm: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        enername: [
+          {required: true, message: "鑳芥簮鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ], muidString: [
+          {required: true, message: "璁¢噺鍗曚綅ID涓嶈兘涓虹┖", trigger: "blur"}
+        ], enerclassname: [
+          {required: true, message: "鑳芥簮绫诲埆涓嶈兘涓虹┖", trigger: "blur"}
+        ], enersno: [
+          {required: true, message: "鑳芥簮缂栧彿涓嶈兘涓虹┖", trigger: "blur"}
+        ], isstorageString: [
+          {required: true, message: "鏄惁瀛樺偍涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      },
+      pricerules: {
+        price: [
+          {required: true, message: "鍗曚环涓嶈兘涓虹┖", trigger: "blur"},
+        ], execdate: [
+          {required: true, message: "鎵ц鏃ユ湡涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      },
+      Coefficientrules: {
+        coefficient: [
+          {required: true, message: "鎶樻爣绯绘暟涓嶈兘涓虹┖", trigger: "blur"},
+        ], coefficient2: [
+          {required: true, message: "鎶樻爣绯绘暟涓嶈兘涓虹┖", trigger: "blur"},
+        ], coefficientexecdate: [
+          {required: true, message: "鎵ц鏃ユ湡涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      },
+    };
+  },
+  created() {
+    this.getList();
+    this.getclassselect();
+    this.getDicts("sys_unit").then(response => {
+      this.muidStringOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    //琛ㄥ崟鏍¢獙鏄惁涓烘暟瀛�
+
+    /** 鏌ヨenergy鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listEnergy(this.queryParams).then(response => {
+        this.energyList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.openenergyprice = false;
+      this.openenergyCoefficient = false;
+      this.reset();
+      this.priceReset();
+      this.coefficientReset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        oprMan: undefined,
+        oprTime: undefined,
+        modMan: undefined,
+        modTime: undefined,
+        enerid: undefined,
+        enername: undefined,
+        muidString: undefined,
+        enerclassid: undefined,
+        enersno: undefined,
+        isstorageString: undefined,
+        note: undefined,
+        price: undefined,
+        execdate: undefined,
+        pricenote: undefined,
+      };
+      this.resetForm("form");
+    },
+    priceReset(enerid) {
+      this.priceForm = {
+        enerid: enerid[0],
+        price: undefined,
+        execdate: undefined,
+        pricenote: undefined,
+      };
+      this.resetForm("priceForm");
+    },
+    coefficientReset() {
+      this.form = {
+        coefficient: undefined,
+        coefficient2: undefined,
+        coefficientexecdate: undefined,
+        coefficientnote: undefined,
+      };
+      this.resetForm("CoefficientForm");
+    },
+
+    /** 鏌ヨ鑳芥簮绫诲瀷涓嬫媺缁撴瀯 */
+    getclassselect() {
+      classselect().then(response => {
+        this.enerclassnameOptions = response.data;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.enerid)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑳芥簮";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const enerid = row.enerid || this.ids;
+      getEnergy(enerid).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑳芥簮淇℃伅";
+      });
+    },
+    /** 璁剧疆鍗曚环鎸夐挳鎿嶄綔 */
+    Updateenergyprice(row) {
+      this.reset();
+      const enerid = row.enerid || this.ids;
+      this.priceReset(enerid);
+      //鑳藉湪杩欓噷缁檈nerid璧嬪�煎悧锛�
+      this.openenergyprice = true;
+      this.title = "鑳芥簮鍗曚环璁剧疆";
+    },
+    // 璁剧疆鎶樻爣绯绘暟鎿嶄綔鎸夐挳
+    Updateenergycoefficient(row) {
+      this.coefficientReset();
+      const enerid = row.enerid || this.ids;
+      getEnergy(enerid).then(response => {
+        this.CoefficientForm = response.data;
+        this.openenergyCoefficient = true;
+        this.title = "鑳芥簮鎶樻爣绯绘暟淇℃伅";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.enerid != undefined) {
+            updateEnergy(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnergy(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** price鎻愪氦鎸夐挳 */
+    priceSubmitForm: function () {
+      console.log("1111");
+      this.$refs['priceForm'].validate(valid => {
+        console.log("222");
+        if (valid) {
+          console.log("333");
+          console.log("this.priceForm.enerid=" + this.priceForm.enerid);
+          //妯℃澘鐢熸垚鐨勬彁浜� 杩欎箞鍐欏簲璇ヨ繕鏈変竴涓猠lse锛屾剰鎬濇槸 褰� 鏈� id璇存槑鏄仛鏇存柊鎿嶄綔锛屾病鏈塈d鏄仛鍒犻櫎鎿嶄綔锛岃繖涓猧d鏄寚瑕佹搷浣滅殑琛ㄧ殑涓婚敭
+          //浣犺繖閲屽氨寰楄�冭檻涓� 棣栧厛  鍗曚环瑕佸拰浣犲垰鎵嶅垪琛ㄤ腑閫夋嫨鐨勬暟鎹叧鑱旓紝涔熷氨鏄綘杩欓噷瑕佹湁涓や釜Id
+          //1銆� 涓昏〃鐨処d   2銆佸瓧琛↖d..   褰撶劧鎴戜笉鐭ラ亾浣犺繖鏄笉鏄敤鐨勪富瀛愯〃杩樻槸浠�涔堬紝濡傛灉鏄竴涓〃锛岄偅灏辩敤涓�涓猧d锛岀劧鍚庝綘杩欐槸鍋� 鏂板 杩樻槸 鏇存柊锛岀湅浣犱笟鍔″畾
+          if (this.priceForm.enerid != undefined) {//灏辫繖閲岋紝浣犺繖閲宔nerid 鏈夊�� 鎴栬�� 鍏朵粬浠�涔堬紝杩欓噷浣犳槸瑕佸仛 鏇存柊 杩樻槸 鏂板锛岃繖涓垽鏂鍐欏浜嗐�傜煡閬撳惂銆傚墿涓嬩綘鑷繁鎵�
+            console.log("444");
+            updateEnergyPrice(this.priceForm).then(response => {
+              console.log("555");
+              if (response.code === 200) {
+                this.msgSuccess("淇濆瓨鎴愬姛");
+                this.openenergyprice = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    //鎶樻爣绯绘暟淇濆瓨
+    coefficientSubmitForm: function () {
+      this.$refs["CoefficientForm"].validate(valid => {
+        if (valid) {
+          if (this.CoefficientForm.enerid != undefined) {
+            updateEnergyCoefficient(this.CoefficientForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇濆瓨鎴愬姛");
+                this.openenergyCoefficient = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            }).catch(function () {
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const enerids = row.enerid || this.ids;
+      const enername = row.enername;
+      this.$confirm('鏄惁纭鍒犻櫎鑳芥簮鍚嶇О涓�"' + enername + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delEnergy(enerids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈塭nergy鏁版嵁椤�?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportEnergy(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/enerInfoManage/price/index.vue b/energy_management_ui/src/views/enerInfoManage/price/index.vue
new file mode 100644
index 0000000..ac481ff
--- /dev/null
+++ b/energy_management_ui/src/views/enerInfoManage/price/index.vue
@@ -0,0 +1,320 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鑳芥簮鍚嶇О" prop="enername">
+              <el-input
+                  v-model="queryParams.enername"
+                  placeholder="璇疯緭鍏ヨ兘婧愬悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="18">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-table :height="height" v-loading="loading" :data="priceList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鑳芥簮鍚嶇О" align="center" prop="enername"/>
+        <el-table-column label="鍗曚环" align="center" prop="price"/>
+        <el-table-column label="鎵ц鏃ユ湡" align="center" prop="execdate" width="180">
+          <template slot-scope="scope">
+            <span>{{ changeTime(parseTime(scope.row.execdate)) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="澶囨敞" align="center" prop="note"/>
+        <!--      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">-->
+        <!--        <template slot-scope="scope">-->
+        <!--          <el-button-->
+        <!--            size="mini"-->
+        <!--            type="text"-->
+        <!--            icon="el-icon-edit"-->
+        <!--            @click="handleUpdate(scope.row)"-->
+        <!--            v-hasPermi="['price:price:edit']"-->
+        <!--          >淇敼</el-button>-->
+        <!--          <el-button-->
+        <!--            size="mini"-->
+        <!--            type="text"-->
+        <!--            icon="el-icon-delete"-->
+        <!--            @click="handleDelete(scope.row)"-->
+        <!--            v-hasPermi="['price:price:remove']"-->
+        <!--          >鍒犻櫎</el-button>-->
+        <!--        </template>-->
+        <!--      </el-table-column>-->
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+
+    <!--    <el-row :gutter="10" class="mb8">-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="primary"-->
+    <!--          icon="el-icon-plus"-->
+    <!--          size="mini"-->
+    <!--          @click="handleAdd"-->
+    <!--          v-hasPermi="['price:price:add']"-->
+    <!--        >鏂板</el-button>-->
+    <!--      </el-col>-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="success"-->
+    <!--          icon="el-icon-edit"-->
+    <!--          size="mini"-->
+    <!--          :disabled="single"-->
+    <!--          @click="handleUpdate"-->
+    <!--          v-hasPermi="['price:price:edit']"-->
+    <!--        >淇敼</el-button>-->
+    <!--      </el-col>-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="danger"-->
+    <!--          icon="el-icon-delete"-->
+    <!--          size="mini"-->
+    <!--          :disabled="multiple"-->
+    <!--          @click="handleDelete"-->
+    <!--          v-hasPermi="['price:price:remove']"-->
+    <!--        >鍒犻櫎</el-button>-->
+    <!--      </el-col>-->
+    <!--      <el-col :span="1.5">-->
+    <!--        <el-button-->
+    <!--          type="warning"-->
+    <!--          icon="el-icon-download"-->
+    <!--          size="mini"-->
+    <!--          @click="handleExport"-->
+    <!--          v-hasPermi="['price:price:export']"-->
+    <!--        >瀵煎嚭</el-button>-->
+    <!--      </el-col>-->
+    <!--    </el-row>-->
+
+
+    <!-- 娣诲姞鎴栦慨鏀瑰崟浠疯缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listPrice, getPrice, delPrice, addPrice, updatePrice, exportPrice} from "@/api/enerInfoManage/price";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鍗曚环璁剧疆琛ㄦ牸鏁版嵁
+      priceList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鍗曚环ID瀛楀吀
+      priceidOptions: [],
+      // ObjectID_瀵硅薄ID锛氳兘婧怚D銆佸師鏂橧D鎴栦骇鍝両D瀛楀吀
+      objectidOptions: [],
+      // ObjectType_瀵硅薄绫诲瀷1=鑳芥簮(Energy琛�)锛�2=鍘熸枡(Material琛�)锛�3=浜у搧(Product琛�)瀛楀吀
+      objecttypeOptions: [],
+      // 鍗曚环瀛楀吀
+      priceOptions: [],
+      // 鎵ц鏃ユ湡瀛楀吀
+      execdateOptions: [],
+      // 鎿嶄綔浜哄瓧鍏�
+      oprManOptions: [],
+      // 鎿嶄綔鏃堕棿瀛楀吀
+      oprTimeOptions: [],
+      // 鏇存柊浜哄瓧鍏�
+      modManOptions: [],
+      // 鏇存柊鏃堕棿瀛楀吀
+      modTimeOptions: [],
+      // 澶囨敞瀛楀吀
+      noteOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        objectid: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {}
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 320;
+    },
+    /** 鏌ヨ鍗曚环璁剧疆鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listPrice(this.queryParams).then(response => {
+        this.priceList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        priceid: undefined,
+        objectid: undefined,
+        objecttype: undefined,
+        price: undefined,
+        execdate: undefined,
+        oprMan: undefined,
+        oprTime: undefined,
+        modMan: undefined,
+        modTime: undefined,
+        note: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.priceid)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鍗曚环璁剧疆";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const priceid = row.priceid || this.ids
+      getPrice(priceid).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鍗曚环璁剧疆";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.priceid != undefined) {
+            updatePrice(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addPrice(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const priceids = row.priceid || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鍗曚环璁剧疆缂栧彿涓�"' + priceids + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delPrice(priceids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夊崟浠疯缃暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportPrice(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    changeTime(time) {
+      if (time !== null && time !== undefined && time !== "") {
+        return time.substring(0, 10);
+      } else {
+        return "";
+      }
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/enerInfoManage/product/index.vue b/energy_management_ui/src/views/enerInfoManage/product/index.vue
new file mode 100644
index 0000000..e695e93
--- /dev/null
+++ b/energy_management_ui/src/views/enerInfoManage/product/index.vue
@@ -0,0 +1,470 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="浜у搧鍚嶇О" prop="productname">
+              <el-input
+                  v-model="queryParams.productname"
+                  placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="18">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['enerInfoManage:product:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['enerInfoManage:product:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['enerInfoManage:product:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <!--      <el-col :span="1.5">-->
+        <!--        <el-button-->
+        <!--          type="warning"-->
+        <!--          icon="el-icon-download"-->
+        <!--          size="mini"-->
+        <!--          @click="handleExport"-->
+        <!--          v-hasPermi="['enerInfoManage:product:export']"-->
+        <!--        >瀵煎嚭</el-button>-->
+        <!--      </el-col>-->
+      </el-row>
+      <el-table :height="height" v-loading="loading" :data="productList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="浜у搧鍚嶇О" align="center" prop="productname"/>
+        <el-table-column label="浜у搧缂栧彿" align="center" prop="productsno"/>
+        <el-table-column label="璁¢噺鍗曚綅" align="center" prop="muid" :formatter="muidFormat"/>
+        <el-table-column label="鐖剁骇浜у搧" align="center" prop="superidname"/>
+        <el-table-column label="鏄惁涓哄瓙绾�" align="center" prop="issub" :formatter="issubFormat"/>
+        <el-table-column label="鎶樼畻绯绘暟" align="center" prop="procofficient"/>
+        <el-table-column label="鏄惁鏄剧ず" align="center" prop="isshow" :formatter="isshowFormat"/>
+        <el-table-column label="鏄惁涓昏浜у搧" align="center" prop="iscpnyproduct" :formatter="iscpnyproductFormat"/>
+        <el-table-column label="浠锋牸" align="center" prop="price"/>
+        <el-table-column label="澶囨敞" align="center" prop="note"/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" fixed="right">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['enerInfoManage:product:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['enerInfoManage:product:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀逛骇鍝佸璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="浜у搧鍚嶇О" prop="productname">
+          <el-input v-model="form.productname" placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"/>
+        </el-form-item>
+        <el-form-item label="浜у搧缂栧彿" prop="productsno">
+          <el-input v-model="form.productsno" placeholder="璇疯緭鍏ヤ骇鍝佺紪鍙�"/>
+        </el-form-item>
+        <el-form-item label="璁¢噺鍗曚綅" prop="muid">
+          <el-select v-model="form.muid" placeholder="璇烽�夋嫨璁¢噺鍗曚綅">
+            <el-option
+                v-for="dict in muidOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏄惁涓哄瓙绾�" prop="issub">
+          <el-select v-model="form.issub" placeholder="璇烽�夋嫨鏄惁涓哄瓙绾�" @change="obtainValue">
+            <el-option
+                v-for="dict in issubOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <div v-show="fatherCp">
+          <el-form-item label="鐖剁骇浜у搧" prop="superid">
+            <el-select
+                v-model="form.superid"
+                placeholder="鐖剁骇浜у搧鍚嶇О"
+                clearable
+                size="small"
+                style="width: 240px"
+            >
+              <el-option
+                  v-for="product in superNameOptions"
+                  :key="product.productname"
+                  :label="product.productname"
+                  :value="product.productid"
+              />
+            </el-select>
+          </el-form-item>
+        </div>
+        <el-form-item label="鎶樼畻绯绘暟" prop="procofficient">
+          <el-input v-model="form.procofficient" placeholder="璇疯緭鍏ユ姌绠楃郴鏁�"/>
+        </el-form-item>
+        <el-form-item label="鏄惁鏄剧ず" prop="isshow">
+          <el-select v-model="form.isshow" placeholder="璇烽�夋嫨鏄惁鏄剧ず">
+            <el-option
+                v-for="dict in isshowOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏄惁涓昏浜у搧" prop="iscpnyproduct">
+          <el-select v-model="form.iscpnyproduct" placeholder="璇烽�夋嫨鏄惁涓昏浜у搧">
+            <el-option
+                v-for="dict in iscpnyproductOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="浠锋牸" prop="price">
+          <el-input type="number" v-model="form.price" placeholder="璇疯緭鍏ュ崟浠�"/>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="note">
+          <el-input v-model="form.note" placeholder="璇疯緭鍏ュ娉�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listProduct, getProduct, delProduct, addProduct, updateProduct, exportProduct, getFatherCP}
+  from "@/api/enerInfoManage/product";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 浜у搧琛ㄦ牸鏁版嵁
+      productList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      fatherCp: false,
+      // 浜у搧ID瀛楀吀
+      productidOptions: [],
+      // 浜у搧鍚嶇О瀛楀吀
+      productnameOptions: [],
+      // 浜у搧缂栧彿瀛楀吀
+      productsnoOptions: [],
+      // 璁¢噺鍗曚綅瀛楀吀
+      muidOptions: [],
+      // 鐖剁骇浜у搧ID瀛楀吀
+      superNameOptions: [],
+      // 鏄惁涓哄瓙绾у瓧鍏�
+      issubOptions: [],
+      // 鎶樼畻绯绘暟瀛楀吀
+      procofficientOptions: [],
+      // 鏄惁鏄剧ず瀛楀吀
+      isshowOptions: [],
+      // 鏄惁涓昏浜у搧瀛楀吀
+      iscpnyproductOptions: [],
+      // 鎿嶄綔浜哄瓧鍏�
+      oprManOptions: [],
+      // 鎿嶄綔鏃堕棿瀛楀吀
+      oprTimeOptions: [],
+      // 鏇存柊浜哄瓧鍏�
+      modManOptions: [],
+      // 鏇存柊鏃堕棿瀛楀吀
+      modTimeOptions: [],
+      // 澶囨敞瀛楀吀
+      noteOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        productname: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        productname: [
+          {required: true, message: "浜у搧鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ], productsno: [
+          {required: true, message: "浜у搧缂栧彿涓嶈兘涓虹┖", trigger: "blur"}
+        ], muid: [
+          {required: true, message: "璁¢噺鍗曚綅涓嶈兘涓虹┖", trigger: "blur"}
+        ], issub: [
+          {required: true, message: "鏄惁涓哄瓙绾т笉鑳戒负绌�", trigger: "blur"}
+        ], procofficient: [
+          {required: true, message: "鎶樼畻绯绘暟涓嶈兘涓虹┖", trigger: "blur"}
+        ], isshow: [
+          {required: true, message: "鏄惁鏄剧ず涓嶈兘涓虹┖", trigger: "blur"}
+        ], iscpnyproduct: [
+          {required: true, message: "鏄惁涓昏浜у搧涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getFatherCP();
+    this.getDicts("sys_unit").then(response => {
+      this.muidOptions = response.data;
+    });
+    this.getDicts("sys_yes_no").then(response => {
+      this.issubOptions = response.data;
+    });
+    this.getDicts("sys_yes_no").then(response => {
+      this.isshowOptions = response.data;
+    });
+    this.getDicts("sys_yes_no").then(response => {
+      this.iscpnyproductOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ浜у搧鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listProduct(this.queryParams).then(response => {
+        this.productList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 璁¢噺鍗曚綅瀛楀吀缈昏瘧
+    muidFormat(row, column) {
+      return this.selectDictLabel(this.muidOptions, row.muid);
+    },
+    // 鏄惁涓哄瓙绾у瓧鍏哥炕璇�
+    issubFormat(row, column) {
+      return this.selectDictLabel(this.issubOptions, row.issub);
+    },
+    // 鏄惁鏄剧ず瀛楀吀缈昏瘧
+    isshowFormat(row, column) {
+      return this.selectDictLabel(this.isshowOptions, row.isshow);
+    },
+    // 鏄惁涓昏浜у搧瀛楀吀缈昏瘧
+    iscpnyproductFormat(row, column) {
+      return this.selectDictLabel(this.iscpnyproductOptions, row.iscpnyproduct);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        productid: undefined,
+        productname: undefined,
+        productsno: undefined,
+        muid: undefined,
+        superid: undefined,
+        issub: undefined,
+        procofficient: undefined,
+        isshow: undefined,
+        iscpnyproduct: undefined,
+        oprMan: undefined,
+        oprTime: undefined,
+        modMan: undefined,
+        modTime: undefined,
+        price: undefined,
+        note: undefined
+      };
+      this.resetForm("form");
+    },
+    obtainValue(value) {
+      if (value === "Y") {
+        this.fatherCp = true;
+      } else {
+        this.fatherCp = false;
+        this.form.superid = undefined;
+      }
+    },
+    getFatherCP() {
+      listProduct().then(response => {
+        this.superNameOptions = response.rows;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.productid)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞浜у搧";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const productid = row.productid || this.ids
+      getProduct(productid).then(response => {
+        this.form = response.data;
+        this.open = true;
+        if (this.form.issub === 'Y') {
+          this.fatherCp = true;
+        } else {
+          this.fatherCp = false;
+          this.form.superid = undefined;
+        }
+        this.title = "淇敼浜у搧";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.productid != undefined) {
+            updateProduct(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addProduct(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const productids = row.productid || this.ids;
+      const productnames = row.productname || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎浜у搧鍚嶄负"' + productnames + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delProduct(productids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈変骇鍝佹暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportProduct(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/energyAlarm/historicalAlarm/LChart.vue b/energy_management_ui/src/views/energyAlarm/historicalAlarm/LChart.vue
new file mode 100644
index 0000000..ff1e935
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/historicalAlarm/LChart.vue
@@ -0,0 +1,138 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+/*import resize from './mixins/resize'*/
+
+export default {
+  /*mixins: [resize],*/
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData } = {}) {
+      this.chart.setOption({
+        xAxis: {
+          data: ['04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00' , '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00'],
+          boundaryGap: false,
+          axisTick: {
+            show: false
+          }
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 30,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: ['棰勮鍊�','闄愬��']
+        },
+        series: [{
+          name: '棰勮鍊�', itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2,
+
+              },
+
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data:[200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200],
+          animationDuration: 1000,
+          animationEasing: 'cubicInOut'
+        },
+          {
+            name: '闄愬��',
+            smooth: true,
+            type: 'line',
+            itemStyle: {
+              normal: {
+                color: '#3888fa',
+                lineStyle: {
+                  color: '#3888fa',
+                  width: 2
+                },
+                areaStyle: {
+                  color: '#f3f8ff'
+                }
+              }
+            },
+            data:[200, 200, 181, 224,210, 172, 181, 224,210, 172, 181, 224,210, 172, 181, 224,210, 172, 181, 224,210, 172, 181],
+            animationDuration: 800,
+            animationEasing: 'quadraticOut'
+          }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyAlarm/historicalAlarm/historyAlarmNote.vue b/energy_management_ui/src/views/energyAlarm/historicalAlarm/historyAlarmNote.vue
new file mode 100644
index 0000000..9e28403
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/historicalAlarm/historyAlarmNote.vue
@@ -0,0 +1,323 @@
+<!-- 瀹炴椂妫�娴� 缁勬�佸浘 鍔熻兘 鐨勫 sheet椤� 涓� 鎶ヨ璁板綍  灞曠ず 娴嬬偣 鎶ヨ淇℃伅 鐨刅UE缁勪欢-->
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+        <el-form-item label="闄愬�肩被鍨�" prop="limitType">
+          <el-select v-model="queryParams.limitType"    placeholder="闄愬�肩被鍨�" clearable>
+            <el-option
+              v-for="dict in limitTypeOptions"
+              :key="dict.limitCode"
+              :label="dict.limitName"
+              :value="dict.limitCode">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎶ヨ绾у埆" prop="alarmLevel">
+          <el-select v-model="queryParams.alarmLevel" placeholder="鎶ヨ绾у埆" clearable>
+            <el-option
+              v-for="dict in alarmLevelOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎸囨爣鍚嶇О" prop="indexName">
+          <el-input
+            v-model="queryParams.indexName"
+            placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+            style="width:160px"
+          />
+        </el-form-item>
+        <el-form-item label="璧锋鏃堕棿">
+          <el-date-picker
+            v-model="dateRange"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        </el-form-item>
+
+      </el-form>
+      <el-row :gutter="10" class="mb8">
+<!--        <el-col :span="1.5">-->
+<!--          <el-button-->
+<!--            type="warning"-->
+<!--            icon="el-icon-download"-->
+<!--            size="mini"-->
+<!--            @click="handleExport"-->
+<!--            v-hasPermi="['energyAlarm:historicalAlarm:export']"-->
+<!--          >瀵煎嚭-->
+<!--          </el-button>-->
+<!--        </el-col>-->
+      </el-row>
+      <el-form>
+      <el-table :data="JkHistoryAlarmList" v-loading="loading" border @selection-change="" @cell-click="openDialog"  >
+        <el-table-column label="搴忓彿" type="index"  align="center"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName">
+          <template slot-scope="scope">
+            <div style="color:blue;text-decoration:underline ;cursor:pointer">{{scope.row.indexName}}</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId"  />
+        <el-table-column label="鎶ヨ绾у埆" align="center" prop="alarmLevel" />
+        <el-table-column label="闄愬�肩被鍨�" align="center" prop="limitType"  />
+        <el-table-column label="闄愬��"     align="center" prop="limitingValue"/>
+        <el-table-column label="鎶ヨ鏃堕棿璧�" align="center" prop="alarmBeginTime"/>
+        <el-table-column label="鎶ヨ鏃堕棿姝�" align="center" prop="alarmEndTime"/>
+        <el-table-column label="鎶ヨ鍊�"   align="center" prop="alarmValue" />
+        <el-table-column label="鎸佺画鏃堕暱(鍒嗛挓)" align="center" prop="duration" width="96px" />
+      </el-table>
+      </el-form>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+      <!--寮规-->
+      <el-dialog :title="title" :visible.sync="open" width="1000px" :close-on-click-modal="false">
+        <el-row style="background:#fff;margin-bottom:32px;">
+          <el-tabs v-model="activeName" @tab-click="handleClick" >
+            <el-tab-pane label="鍘嗗彶鏁版嵁鏇茬嚎鍥�" name="second">
+              <history-alarm-view ref="historyAlarmView" :code="code" :activeName="activeName" :limitVal="limitVal"></history-alarm-view>
+            </el-tab-pane>
+            <el-tab-pane label="鍘嗗彶鏁版嵁鏌ヨ" name="third">
+              <history-alarm-table ref="historyAlarmTable" :code="code" :indexName="indexName" :activeName="activeName" :indexUnit="indexUnit" :limitVal="limitVal"></history-alarm-table>
+            </el-tab-pane>
+          </el-tabs>
+        </el-row>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+    </el-card>
+  </div>
+</template>
+
+<script>
+
+  import {listHistoryAlarmNote,exportHistoricalAlarm } from  "@/api/basicsetting/historyAlarm";
+  import {listLimitType} from "@/api/basicsetting/limitType"
+  import historyAlarmView from "../realTimeAlarm/historyAlarmView"
+  import historyAlarmTable from "../realTimeAlarm/historyAlarmTable"
+
+  export default {
+    components: {historyAlarmView,historyAlarmTable},
+    name: 'historyAlarmNote',
+    props:['svgId','tagId'],
+    data() {
+      return {
+        num: 20,
+        num1:5,
+        code:undefined,
+        value:'',
+        options:undefined,
+        radio: 'B',
+        activeName: 'second',
+        indexId:undefined,
+        indexName:undefined,
+        indexUnit:undefined,
+        limitVal:undefined,
+        hiddenTableHeader:false,
+        limitTypeOptions:[],
+        alarmLevelOptions:[],
+        resposeList:[],
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        dateRange: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 10,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        List: [],
+        energyindexList: [],
+        // 寮瑰嚭灞傛爣棰�
+        JkHistoryAlarmList:[],
+        title: "鍘嗗彶鏁版嵁鏌ヨ",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        // 鏌ヨ鍙傛暟
+        lineChartData:{
+          newVisitis:null,
+        },
+        queryParams: {
+           pageNum: 1,
+           pageSize: 10,
+          indexType:'COLLECT',
+          code: undefined,
+          indexName:undefined,
+          limitType: undefined,
+          alarmLevel: undefined,
+          nodeId:undefined,
+          beginTime: undefined,
+          endTime:undefined,
+          svgId:undefined,
+          nodeId:undefined,
+        },
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+    created() {
+      if (this.$props.tagId) {
+        this.queryParams.nodeId = this.$props.tagId;
+      }
+      //this.queryParams.svgId=this.svgId;
+      this.getDicts("alarm_level").then(response => {
+        this.alarmLevelOptions = response.data;
+      });
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+      });
+      listLimitType(this.queryParams).then(response => {
+        this.limitTypeOptions = response.rows;
+      });
+    },
+    methods: {
+      show(nodeId)
+      {
+        this.queryParams.nodeId = nodeId;
+        this.getList();
+      },
+      getList() {
+        this.loading = true;
+        listHistoryAlarmNote(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+          this.JkHistoryAlarmList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        const indexId = row.indexId || this.ids;
+        this.open = true;
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      // 鎶ヨ绾у埆瀛楀吀缈昏瘧
+      alarmLevelFormat(row, column) {
+        return this.selectDictLabel(this.alarmLevelOptions, row.alarmLevel);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+      // modelNodeChange(modelNode) {
+      //   this.queryParams.nodeId = modelNode.id;
+      //   this.getList();
+      // },
+      formatDate: function (value) {
+        let date = new Date(value);
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? ('0' + MM) : MM;
+        let d = date.getDate();
+        d = d < 10 ? ('0' + d) : d;
+        let h = date.getHours();
+        h = h < 10 ? ('0' + h) : h;
+        let m = date.getMinutes();
+        m = m < 10 ? ('0' + m) : m;
+        let s = date.getSeconds();
+        s = s < 10 ? ('0' + s) : s;
+        return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+      },
+
+
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.dateRange = [];
+        this.resetForm("queryForm");
+      },
+
+      handleSelectionChange() {
+      },
+      openDialog(row,column,event,cell){
+        if("indexName"==column.property){
+          this.open = true;
+        }
+        this.code = row.code;
+        this.indexName = row.indexName;
+        this.indexId = row.indexId;
+        this.activeName = "second";
+        this.indexUnit = row.unitId;
+        this.limitVal = row.limitingValue;
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋姤璀︽暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportHistoricalAlarm(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+
+      },
+      //闄愬埗绫诲瀷缈昏瘧
+      limitTypeFormat(row,column){
+        var actions = [];
+        Object.keys(this.limitTypeOptions).map((key) => {
+          if (this.limitTypeOptions[key].limitCode == ('' + row.limitType)) {
+            actions.push(this.limitTypeOptions[key].limitName);
+          }
+        });
+        return actions.join('');
+      },
+      handleClick(tab, event){
+        this.activeName = tab.name;
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyAlarm/historicalAlarm/index.vue b/energy_management_ui/src/views/energyAlarm/historicalAlarm/index.vue
new file mode 100644
index 0000000..86b6092
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/historicalAlarm/index.vue
@@ -0,0 +1,77 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="鍘嗗彶鎶ヨ" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :title="currentNode ? currentNode.label+'--鑺傜偣閰嶇疆' : '鑺傜偣閰嶇疆'" :bodyStyle="bodyStyleRight">
+        <RealIndex ref="RealIndex"></RealIndex>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import RealIndex from "./realIndex";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from '@/components/shrink/index.vue'
+
+
+export default {
+  components: {RealIndex, ModelNode,ShrinkCol},
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: '',
+      modelCode: undefined,
+      modelInfoOptions: [],
+      isCollapse: false,
+      bodyStyleRight: {},
+      currentNode: ''
+    }
+  },
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight -155 + 'px'
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      if (node) {
+        this.currentNode = node
+      }
+      this.$refs.RealIndex.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/energyAlarm/historicalAlarm/realIndex.vue b/energy_management_ui/src/views/energyAlarm/historicalAlarm/realIndex.vue
new file mode 100644
index 0000000..84debe2
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/historicalAlarm/realIndex.vue
@@ -0,0 +1,375 @@
+<template>
+  <div class="historicalAlarm-right">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <el-form-item>
+        <el-radio-group v-model="queryParams.eierarchyFlag">
+          <el-radio label="B" style="margin-right: 10px!important;" onselect="true">鏈骇</el-radio>
+          <el-radio label="ALL">鍖呭惈涓嬬骇</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="闄愬�肩被鍨�" prop="limitType">
+        <el-select v-model="queryParams.limitType" placeholder="闄愬�肩被鍨�" clearable>
+          <el-option
+              v-for="dict in limitTypeOptions"
+              :key="dict.limitCode"
+              :label="dict.limitName"
+              :value="dict.limitCode">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎶ヨ绾у埆" prop="alarmLevel">
+        <el-select v-model="queryParams.alarmLevel" placeholder="鎶ヨ绾у埆" clearable>
+          <el-option
+              v-for="dict in alarmLevelOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鎸囨爣鍚嶇О" prop="indexName">
+        <el-input
+            v-model="queryParams.indexName"
+            placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+            style="width:160px"
+        />
+      </el-form-item>
+      <el-form-item label="璧锋鏃堕棿">
+        <el-date-picker
+            v-model="dateRange"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button
+            type="warning"
+            icon="el-icon-download"
+            size="mini"
+            @click="handleExport"
+            v-hasPermi="['energyAlarm:historicalAlarm:export']"
+        >瀵煎嚭
+        </el-button>
+      </el-form-item>
+
+    </el-form>
+    <el-form>
+      <el-table :data="JkHistoryAlarmList" v-loading="loading" border @selection-change="" @cell-click="openDialog"
+                :height="height"
+      >
+        <el-table-column label="搴忓彿" type="index" align="center"/>
+        <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="modelName"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName">
+          <template slot-scope="scope">
+            <div style="color:blue;text-decoration:underline ;cursor:pointer">{{ scope.row.indexName }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat"/>
+        <el-table-column label="鎶ヨ绾у埆" align="center" prop="alarmLevel" :formatter="alarmLevelFormat"/>
+        <el-table-column label="闄愬�肩被鍨�" align="center" prop="limitType" :formatter="limitTypeFormat"/>
+        <el-table-column label="闄愬��" align="center" prop="limitingValue"/>
+        <el-table-column label="鎶ヨ鏃堕棿璧�" align="center" prop="alarmBeginTime"/>
+        <el-table-column label="鎶ヨ鏃堕棿姝�" align="center" prop="alarmEndTime"/>
+        <el-table-column label="棰勮鍊�" align="center" prop="alarmValue"/>
+        <el-table-column label="鎸佺画鏃堕暱(鍒嗛挓)" align="center" prop="duration" width="96px"/>
+      </el-table>
+    </el-form>
+    <pagination
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+    />
+    <!--寮规-->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" :close-on-click-modal="false">
+      <el-row style="background:#fff;margin-bottom:32px;">
+        <el-tabs v-model="activeName" @tab-click="handleClick">
+          <el-tab-pane label="鍘嗗彶鏁版嵁鏇茬嚎鍥�" name="second">
+            <history-alarm-view ref="historyAlarmView" :code="code" :activeName="activeName"
+                                :limitVal="limitVal"></history-alarm-view>
+          </el-tab-pane>
+          <el-tab-pane label="鍘嗗彶鏁版嵁鏌ヨ" name="third">
+            <history-alarm-table ref="historyAlarmTable" :code="code" :indexName="indexName" :activeName="activeName"
+                                 :indexUnit="indexUnit" :limitVal="limitVal"></history-alarm-table>
+          </el-tab-pane>
+        </el-tabs>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import {listHistoryAlarm, exportHistoricalAlarm, getHistoricalAlarm} from "@/api/basicsetting/historyAlarm";
+import {listLimitType} from "@/api/basicsetting/limitType"
+import historyAlarmView from "../realTimeAlarm/historyAlarmView"
+import historyAlarmTable from "../realTimeAlarm/historyAlarmTable"
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {historyAlarmView, historyAlarmTable},
+  name: 'historyAlarm',
+  mixins: [mixins],
+  data() {
+    return {
+      num: 20,
+      num1: 5,
+      pickerOptions: {
+        /*  value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],*/
+      },
+      code: undefined,
+      value: '',
+      options: undefined,
+      // handleClick:'simple',
+      radio: 'B',
+      activeName: 'second',
+      indexId: undefined,
+      indexName: undefined,
+      indexUnit: undefined,
+      limitVal: undefined,
+      hiddenTableHeader: false,
+      /* lineChartData: lineChartData.newVisitis,*/
+      limitTypeOptions: [],
+      alarmLevelOptions: [],
+      resposeList: [],
+      /* formatDate:undefined,*/
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      dateRange: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 10,
+      // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+      List: [],
+      energyindexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      JkHistoryAlarmList: [],
+      title: "鍘嗗彶鏁版嵁鏌ヨ",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      indexIdOptions: [],
+      // 鎸囨爣鍚嶇О瀛楀吀
+      nameOptions: [],
+      // 鎸囨爣缂栫爜瀛楀吀
+      codeOptions: [],
+      // 鍗曚綅瀛楀吀
+      unitIdOptions: [],
+      // 鏌ヨ鍙傛暟
+      lineChartData: {
+        newVisitis: null,
+      },
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        eierarchyFlag: 'B',
+        indexType: 'COLLECT',
+        code: undefined,
+        indexName: undefined,
+        /* unitId: undefined,*/
+        limitType: undefined,
+        alarmLevel: undefined,
+        /*alarmValue:undefined,*/
+        /* limitingValue:undefined,*/
+        nodeId: undefined,
+        beginTime: undefined,
+        endTime: undefined,
+
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      currentNode: undefined,
+      indexCategoryDefaultVal: undefined,
+      unitDefaultVal: undefined,
+      height: null
+    };
+  },
+  created() {
+    this.getDicts("alarm_level").then(response => {
+      this.alarmLevelOptions = response.data;
+    });
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+    listLimitType(this.queryParams).then(response => {
+      this.limitTypeOptions = response.rows;
+    });
+    this.getTime();
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 370 + 'px'
+    },
+    getList() {
+      this.loading = true;
+      listHistoryAlarm(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.JkHistoryAlarmList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const indexId = row.indexId || this.ids;
+      this.open = true;
+      /*this.title = "鍘嗗彶鏁版嵁鏌ヨ";*/
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.unitId);
+    },
+    /*      // 闄愬�肩被鍨嬪瓧鍏哥炕璇�
+          limitTypeFormat(row, column) {
+            return this.selectDictLabel(this.limitTypeOptions, row.limitType);
+          },*/
+    // 鎶ヨ绾у埆瀛楀吀缈昏瘧
+    alarmLevelFormat(row, column) {
+      return this.selectDictLabel(this.alarmLevelOptions, row.alarmLevel);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        indexId: undefined,
+        name: undefined,
+        code: undefined,
+        indexCategory: undefined,
+        remark: undefined,
+        unitId: undefined
+      };
+      this.resetForm("form");
+    },
+    modelNodeChange(modelNode) {
+      this.queryParams.nodeId = modelNode.id;
+      this.settingDeviceList = [];
+      this.settingIndexList = [];
+      this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+      if (modelNode) {
+        this.currentNode = modelNode;
+        this.deviceLoading = true;
+        this.energyLoading = true;
+        this.productLoading = true;
+        this.indexLoading = true;
+      }
+      this.getList();
+    },
+    // formatDate: function (value) {
+    //   let date = new Date(value);
+    //   let y = date.getFullYear();
+    //   let MM = date.getMonth() + 1;
+    //   MM = MM < 10 ? ('0' + MM) : MM;
+    //   let d = date.getDate();
+    //   d = d < 10 ? ('0' + d) : d;
+    //   let h = date.getHours();
+    //   h = h < 10 ? ('0' + h) : h;
+    //   let m = date.getMinutes();
+    //   m = m < 10 ? ('0' + m) : m;
+    //   let s = date.getSeconds();
+    //   s = s < 10 ? ('0' + s) : s;
+    //   return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+    // },
+
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+    },
+
+    handleSelectionChange() {
+    },
+    openDialog(row, column, event, cell) {
+      if ("indexName" == column.property) {
+        this.open = true;
+        this.code = row.code;
+        this.indexName = row.indexName;
+        this.indexId = row.indexId;
+        this.activeName = "second";
+        this.indexUnit = this.selectDictLabel(this.unitIdOptions, row.unitId);
+        this.limitVal = row.limitingValue;
+      }
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋姤璀︽暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportHistoricalAlarm(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+
+    },
+    //闄愬埗绫诲瀷缈昏瘧
+    limitTypeFormat(row, column) {
+      var actions = [];
+      Object.keys(this.limitTypeOptions).map((key) => {
+        if (this.limitTypeOptions[key].limitCode == ('' + row.limitType)) {
+          actions.push(this.limitTypeOptions[key].limitName);
+        }
+      });
+      return actions.join('');
+    },
+    handleClick(tab, event) {
+      this.activeName = tab.name;
+    },
+    getTime() {
+      var myDate = new Date();
+      var monthFirst = new Date(myDate.getFullYear(), parseInt(myDate.getMonth()), 1);
+      this.dateRange = [this.formatDate(monthFirst), this.formatDate(myDate)];
+    },
+    formatDate: function (value) {
+      let date = new Date(value);
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? ('0' + MM) : MM;
+      let d = date.getDate();
+      d = d < 10 ? ('0' + d) : d;
+      let h = date.getHours();
+      h = h < 10 ? ('0' + h) : h;
+      let m = date.getMinutes();
+      m = m < 10 ? ('0' + m) : m;
+      let s = date.getSeconds();
+      s = s < 10 ? ('0' + s) : s;
+      return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+    },
+  }
+};
+</script>
+<style scoped lang="scss">
+.historicalAlarm-right {
+  height: 100%;
+  overflow: hidden;
+}
+</style>
diff --git a/energy_management_ui/src/views/energyAlarm/realTimeAlarm/LineChart.vue b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/LineChart.vue
new file mode 100644
index 0000000..5299027
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/LineChart.vue
@@ -0,0 +1,144 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons'); // echarts theme
+// import resize from './mixins/resize'
+
+export default {
+  // mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      // required: true
+    },
+
+  },
+  data() {
+    return {
+      chart: null,
+      alarmLimitName:undefined
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose();
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons');
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,timeList } = {}) {
+      if(expectedData.length>0){
+        this.alarmLimitName = "鎶ヨ闄愬��";
+      }else {
+        this.alarmLimitName = " ";
+      }
+      this.chart.setOption({
+        xAxis: {
+          data: timeList,
+          boundaryGap: false,
+          axisTick: {
+            show: false
+          }
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 30,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: [this.alarmLimitName, '瀹炴椂鍊�']
+        },
+        series: [{
+          symbol: "none",
+          name: '鎶ヨ闄愬��',
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        },
+        {
+          name: '瀹炴椂鍊�',
+          smooth: true,
+          type: 'line',
+          itemStyle: {
+            normal: {
+              color: '#3888fa',
+              lineStyle: {
+                color: '#3888fa',
+                width: 2
+              },
+              areaStyle: {
+                color: '#f3f8ff'
+              }
+            }
+          },
+          data: actualData,
+          animationDuration: 2800,
+          animationEasing: 'quadraticOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmTable.vue b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmTable.vue
new file mode 100644
index 0000000..bf7a5a4
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmTable.vue
@@ -0,0 +1,198 @@
+<template>
+  <div class="app-container pastTable" style="padding:0">
+    <el-form :model="pastQueryParams" ref="historyTable" :inline="true" label-width="68px" class="query-form" style="margin-bottom: 20px">
+      <el-form-item>
+        <el-date-picker
+          v-model="timeArr"
+          type="datetimerange"
+          :clearable="false"
+          value-format="timestamp"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="" prop="total" :rules="rules.numRule">
+        鏄剧ず <el-input v-model="pastQueryParams.total" :min="1" :max="1000" style="width: 120px" type="number"></el-input> 涓��
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="historyDataSelect">鏌ヨ</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-document"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['energyAlarm:realTimeAlarm:list']"
+        >瀵煎嚭Excel
+        </el-button>
+      </el-col>
+    </el-row>
+    <el-table :data="tableData" v-loading="loading" border @selection-change="" max-height="350">
+      <el-table-column label="鎶ヨ鏃堕棿" align="center" prop="showDataTime"/>
+      <el-table-column label="鎸囨爣缂栫爜" align="center" prop="tagCode"/>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName"/>
+      <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitName"/>
+      <el-table-column label="瀹炴椂鍊�" align="center" prop="value"/>
+    </el-table>
+    <!--<pagination-->
+      <!--v-show="total>0"-->
+      <!--:total="total"-->
+      <!--:page.sync="pastQueryParams.pageNum"-->
+      <!--:limit.sync="pastQueryParams.pageSize"-->
+    <!--/>-->
+  </div>
+</template>
+
+<script>
+  import {getHistoryData,exportHistoryTable} from "@/api/energyAlarm/realTimeAlarm/liveHistoryAssembly"
+    export default {
+      props: ["code","activeName","indexName","indexUnit"],
+      name: "historyAlarmTable",
+      data(){
+        const checkNum = (rule, value, callback) => {
+          let reg =  /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/;
+          if (""==value&&!reg.test(value)) {
+            callback(new Error('涓暟闇�鏁板瓧骞朵笖涓嶈兘涓虹┖'));
+          } else if(0>value||1000<value){
+            callback(new Error('鏁板瓧鑼冨洿1~1000鐨勬鏁存暟'));
+          }else{
+            callback();
+          }
+        };
+        return{
+          loading: false,
+          total:10,
+          startTime:undefined,
+          endTime:undefined,
+          timeArr:undefined,
+          interval:undefined,
+          resposeList:[],
+          //鍘嗗彶
+          pastQueryParams:{
+            time:undefined,
+            total:60,
+            code:undefined,
+            indexId:undefined,
+            pageNum:1,
+            pageSize:10,
+          },
+          tableData:[],
+          rules:{
+            numRule: [
+              {type:"number",validator: checkNum,trigger: "change"},
+            ],
+          }
+        }
+      },
+      created() {
+        // this.getTime();
+        // this.historyDataSelect();
+        this.getConfigKey("energyAlarm.historyTimeAlarm.pastHour").then(response => {
+          this.interval = response.msg;
+          this.getConfigKey("energyAlarm.historyTimeAlarm.pointCount").then(response => {
+            this.pastQueryParams.total = response.msg;
+            this.getTime();
+          });
+        });
+      },
+      mounted(){
+        this.getTime();
+        // this.historyDataSelect();
+      },
+      watch:{
+        activeName:function (a,b) {
+          if("third"==a){
+            this.getTime();
+            this.historyDataSelect();
+          }
+        }
+      },
+      methods:{
+        historyDataSelect(){
+          this.$refs["historyTable"].validate(valid => {
+            if (valid) {
+              this.tableData = [];
+              let start = undefined;
+              let end = undefined;
+              if (this.timeArr) {
+                start = this.timeArr[0];
+                end = this.timeArr[1];
+              }
+              getHistoryData(this.code, this.formatDate(start), this.formatDate(end), this.pastQueryParams.total.toString()).then(response => {
+
+                for (let i = 0; i < response.data.length; i++) {
+                  let item = {
+                    showDataTime: response.data[i].showDataTime,
+                    tagCode: response.data[i].tagCode,
+                    indexName: this.indexName,
+                    unitName: this.indexUnit,
+                    value: response.data[i].value
+                  };
+                  this.tableData.push(item);
+                }
+              });
+            }
+          })
+        },
+        getTime(){
+          this.startTime = new Date().getTime()- 1000*60*60*this.interval;
+          this.endTime = new Date();
+          //鏄剧ず鏃堕棿
+          this.timeArr = [this.startTime,this.endTime];
+        },
+        formatDate: function (value) {
+          let date = new Date(value);
+          let y = date.getFullYear();
+          let MM = date.getMonth() + 1;
+          MM = MM < 10 ? ('0' + MM) : MM;
+          let d = date.getDate();
+          d = d < 10 ? ('0' + d) : d;
+          let h = date.getHours();
+          h = h < 10 ? ('0' + h) : h;
+          let m = date.getMinutes();
+          m = m < 10 ? ('0' + m) : m;
+          let s = date.getSeconds();
+          s = s < 10 ? ('0' + s) : s;
+          return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+        },
+        cleanTable(){
+          this.tableData = [];
+        },
+        /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+        handleExport() {
+          this.$refs["historyTable"].validate(valid => {
+            if (valid) {
+              var me = this;
+              let start = undefined;
+              let end = undefined;
+              if (this.timeArr) {
+                start = this.timeArr[0];
+                end = this.timeArr[1];
+              }
+              // const queryParams = this.queryParams;
+              this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夐噰闆嗗弬鏁版ā鏉挎暟鎹」?', "璀﹀憡", {
+                confirmButtonText: "纭畾",
+                cancelButtonText: "鍙栨秷",
+                type: "warning"
+              }).then(function () {
+                return exportHistoryTable(me.code, me.formatDate(start), me.formatDate(end), me.pastQueryParams.total.toString(), me.indexName, me.indexUnit);
+              }).then(response => {
+                this.download(response.msg);
+              }).catch(function () {
+              });
+            }
+          })
+        }
+      },
+    }
+</script>
+
+<style scoped>
+  .pastTable .pagination-container{
+    height: 40px!important;
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmView.vue b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmView.vue
new file mode 100644
index 0000000..490338c
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/historyAlarmView.vue
@@ -0,0 +1,162 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="pastQueryParams" ref="historyView" :inline="true" label-width="68px" class="query-form"
+             style="margin-bottom: 20px">
+      <el-form-item>
+        <el-date-picker
+            v-model="timeArr"
+            type="datetimerange"
+            :clearable="false"
+            value-format="timestamp"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="" prop="total" :rules="rules.numRule">
+        鏄剧ず
+        <el-input v-model="pastQueryParams.total" :min="1" :max="1000" style="width: 120px" type="number"></el-input>
+        涓��
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="historyDataSelect">鏌ヨ</el-button>
+      </el-form-item>
+    </el-form>
+    <past-line-chart v-if="'second'==activeName" ref="pastLineChart" :chart-data="historyLineChartData"/>
+  </div>
+</template>
+
+<script>
+import pastLineChart from "./LineChart";
+import {getHistoryData} from "@/api/energyAlarm/realTimeAlarm/liveHistoryAssembly"
+
+export default {
+  components: {pastLineChart},
+  props: ["code", "activeName", "limitVal"],
+  name: "historyAlarmView",
+  data() {
+    const checkNum = (rule, value, callback) => {
+      let reg = /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/;
+      if ("" == value && !reg.test(value)) {
+        callback(new Error('涓暟闇�鏁板瓧骞朵笖涓嶈兘涓虹┖'));
+      } else if (0 > value || 1000 < value) {
+        callback(new Error('鏁板瓧鑼冨洿1~1000鐨勬鏁存暟'));
+      } else {
+        callback();
+      }
+    };
+    return {
+      // activeName:"second",
+      historyLineChartData: {
+        expectedData: [],
+        actualData: [],
+        timeList: []
+      },
+      //鍘嗗彶
+      pastQueryParams: {
+        time: undefined,
+        total: 60,
+        code: undefined,
+        indexId: undefined
+      },
+      startTime: undefined,
+      endTime: undefined,
+      timeArr: undefined,
+      //鏃堕棿闂撮殧(灏忔椂)
+      interval: undefined,
+      rules: {
+        numRule: [
+          {type: "number", validator: checkNum, trigger: "change"},
+        ],
+      }
+    }
+  },
+  created() {
+    this.getConfigKey("energyAlarm.historyTimeAlarm.pastHour").then(response => {
+      this.interval = response.msg;
+      this.getConfigKey("energyAlarm.historyTimeAlarm.pointCount").then(response => {
+        this.pastQueryParams.total = response.msg;
+        this.getTime();
+        this.historyDataSelect();
+      });
+    });
+    // this.getTime();
+  },
+  beforeUpdate() {
+
+  },
+  beforeDestroy() {
+    this.cleanData();
+  },
+  watch: {
+    activeName: function (newData, oldData) {
+      if ("second" == newData) {
+        this.getTime();
+        this.historyDataSelect();
+      } else {
+        this.cleanData();
+      }
+    }
+  },
+  methods: {
+    historyDataSelect() {
+      this.$refs["historyView"].validate(valid => {
+        this.cleanData();
+        if (valid) {
+          let start = undefined;
+          let end = undefined;
+          if (this.timeArr) {
+            start = this.timeArr[0];
+            end = this.timeArr[1];
+          }
+          getHistoryData(this.code, this.formatDate(start), this.formatDate(end), this.pastQueryParams.total.toString()).then(response => {
+            this.resposeList = response.data;
+            let aa = [];
+            for (let i = 0; i < this.resposeList.length; i++) {
+              this.historyLineChartData.actualData.push(this.resposeList[i].value);
+              if (this.limitVal) {
+                this.historyLineChartData.expectedData.push(this.limitVal);
+              }
+              aa.push(this.resposeList[i].showDataTime)
+            }
+            this.historyLineChartData.timeList = aa;
+            if ("second" == this.activeName) {
+              this.$refs.pastLineChart.initChart(this.historyLineChartData)
+            }
+          });
+        }
+      })
+    },
+    getTime() {
+      this.startTime = new Date().getTime() - 1000 * 60 * 60 * this.interval;
+      this.endTime = new Date();
+      //鏄剧ず鏃堕棿
+      this.timeArr = [this.startTime, this.endTime];
+    },
+    formatDate: function (value) {
+      let date = new Date(value);
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? ('0' + MM) : MM;
+      let d = date.getDate();
+      d = d < 10 ? ('0' + d) : d;
+      let h = date.getHours();
+      h = h < 10 ? ('0' + h) : h;
+      let m = date.getMinutes();
+      m = m < 10 ? ('0' + m) : m;
+      let s = date.getSeconds();
+      s = s < 10 ? ('0' + s) : s;
+      return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+    },
+    cleanData() {
+      this.historyLineChartData.actualData = [];
+      this.historyLineChartData.expectedData = [];
+      this.historyLineChartData.timeList = [];
+    }
+  },
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/energyAlarm/realTimeAlarm/index.vue b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/index.vue
new file mode 100644
index 0000000..cd355b2
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/index.vue
@@ -0,0 +1,76 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="瀹炴椂鎶ヨ" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"/>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :title="currentNode ? currentNode.label+'--鑺傜偣閰嶇疆' : '鑺傜偣閰嶇疆'" :bodyStyle="bodyStyleRight">
+        <realTimeSetting ref="realTimeSetting"/>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import realTimeSetting from "./modelRealTimeAlarmSetting";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+import ShrinkCol from '@/components/shrink/index.vue'
+
+export default {
+  components: {realTimeSetting, ModelNode,ShrinkCol},
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode: undefined,
+      isCollapse: false,
+      bodyStyleRight: {},
+      currentNode: ''
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight -155 + 'px'
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      if (node) {
+        this.currentNode = node
+      }
+      this.$refs.realTimeSetting.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      // this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/energyAlarm/realTimeAlarm/liveAlarmView.vue b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/liveAlarmView.vue
new file mode 100644
index 0000000..9016d97
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/liveAlarmView.vue
@@ -0,0 +1,112 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="liveQueryParams" ref="liveView" :inline="true" label-width="68px" class="query-form" style="margin-bottom: 20px">
+      <el-form-item label="" prop="minute" :rules="rules.numRule">
+      鏈�鏂� <el-input v-model="liveQueryParams.minute" :min="1" :max="120" style="width: 120px" type="number"></el-input> 鍒嗛挓
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="liveDataSelect">鏌ヨ</el-button>
+      </el-form-item>
+    </el-form>
+    <live-line-chart v-if="'first'===activeName" ref="liveLineChart" :chart-data="liveLineChartData"/>
+  </div>
+</template>
+
+<script>
+  import liveLineChart from "./LineChart";
+  import {getRealTimeData} from "@/api/energyAlarm/realTimeAlarm/liveHistoryAssembly"
+    export default {
+      name: "liveAlarmView",
+      components: {liveLineChart},
+      props:["code","activeName","limitVal"],
+      data(){
+        const checkNum = (rule, value, callback) => {
+          let reg =  /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/;
+          if (""===value&&!reg.test(value)) {
+            callback(new Error('鍒嗛挓闇�鏁板瓧骞朵笖涓嶈兘涓虹┖'));
+          } else if(0>value||120<value){
+            callback(new Error('鏁板瓧鑼冨洿1~120鐨勬鏁存暟'));
+          }else{
+            callback();
+          }
+        };
+        return{
+          liveLineChartData:{
+            expectedData: [],
+            actualData: [],
+            timeList:[],
+          },
+          //瀹炴椂
+          liveQueryParams:{
+            time:undefined,
+            minute:undefined,
+            code:undefined,
+            indexId:undefined
+          },
+          pointCount:undefined,
+          resposeList:undefined,
+          rules:{
+            numRule: [
+              {type:"number",validator: checkNum,trigger: "change"},
+            ],
+          }
+        }
+      },
+      created(){
+        this.getConfigKey("energyAlarm.realTimeAlarm.pointCount").then(response => {
+          this.pointCount = response.msg;
+          this.getConfigKey("energyAlarm.realTimeAlarm.pastMinute").then(response => {
+            this.liveQueryParams.minute = response.msg;
+            this.liveDataSelect();
+          });
+        });
+      },
+      beforeUpdate(){
+
+      },
+      beforeDestroy() {
+        this.cleanData();
+      },
+      watch:{
+        activeName:function (newData,oldData) {
+          if("first"===newData){
+             this.liveDataSelect();
+          }else {
+            this.cleanData();
+          }
+        }
+      },
+      methods:{
+        liveDataSelect(){
+          this.$refs["liveView"].validate(valid => {
+            this.cleanData();
+            if (valid) {
+              getRealTimeData(this.code, this.liveQueryParams.minute.toString(), this.pointCount.toString()).then(response => {
+                this.resposeList = response.data;
+                let aa = [];
+                for (let i = 0; i < this.resposeList.length; i++) {
+                  this.liveLineChartData.actualData.push(this.resposeList[i].value);
+                  this.liveLineChartData.timeList.push(this.resposeList[i].showDataTime);
+                  if(this.limitVal){
+                    this.liveLineChartData.expectedData.push(this.limitVal);
+                  }
+                }
+                if ("first" === this.activeName) {
+                  this.$refs.liveLineChart.initChart(this.liveLineChartData);
+                }
+              });
+            }
+          })
+        },
+        cleanData(){
+          this.liveLineChartData.actualData = [];
+          this.liveLineChartData.expectedData = [];
+          this.liveLineChartData.timeList = [];
+        }
+      }
+    }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/energyAlarm/realTimeAlarm/modelRealTimeAlarmSetting.vue b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/modelRealTimeAlarmSetting.vue
new file mode 100644
index 0000000..12e48ef
--- /dev/null
+++ b/energy_management_ui/src/views/energyAlarm/realTimeAlarm/modelRealTimeAlarmSetting.vue
@@ -0,0 +1,281 @@
+<template>
+  <div class="modelRealTimeAlarmSetting-right">
+    <el-tabs>
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i>瀹炴椂鎶ヨ</span>
+        <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+          <el-form-item>
+            <el-radio-group v-model="queryParams.eierarchyFlag">
+              <el-radio label="B" style="margin-right: 10px!important;" onselect="true">鏈骇</el-radio>
+              <el-radio label="ALL">鍖呭惈涓嬬骇</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="闄愬�煎悕绉�" prop="limitValName">
+            <el-select v-model="queryParams.limitType" placeholder="闄愬�煎悕绉�" clearable
+                       style="width:100px"
+                       size="mini">
+              <el-option
+                  v-for="dict in limitTypeOptions"
+                  :key="dict.limitCode"
+                  :label="dict.limitName"
+                  :value="dict.limitCode"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鎶ヨ绾у埆" prop="alarmLevel">
+            <el-select v-model="queryParams.alarmLevel" placeholder="鎶ヨ绾у埆" clearable
+                       style="width:100px"
+                       size="mini">
+              <el-option
+                  v-for="dict in alarmLevelOptions"
+                  :key="dict.dictValue"
+                  :label="dict.dictLabel"
+                  :value="dict.dictValue"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="鎸囨爣鍚嶇О">
+            <el-input style="width: 120px"
+                      v-model="queryParams.indexName"
+                      placeholder="鎸囨爣鍚嶇О"
+                      clearable
+                      size="mini"
+                      @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="selectList">鏌ヨ</el-button>
+            <!--<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>-->
+          </el-form-item>
+        </el-form>
+        <!--琛ㄦ牸-->
+        <el-form :model="model" ref="form" class="mainTable">
+          <el-table v-loading="loading" :data="model.tableOptions" border @selection-change="handleSelectionChange"
+                    :default-sort="{prop: 'date', order: 'descending'}" @cell-click="openDialog"
+                    :height="height"
+          >
+            <el-table-column type="selection" width="55" align="center" show-overflow-tooltip/>
+            <el-table-column label="搴忓彿" type="index" align="center" show-overflow-tooltip/>
+            <el-table-column label="鍗曚綅鍚嶇О" align="center" width="100" prop="modelName" show-overflow-tooltip/>
+            <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code" show-overflow-tooltip/>
+            <el-table-column label="鎸囨爣鍚嶇О" align="center" width="100" prop="indexName" show-overflow-tooltip>
+              <template slot-scope="scope">
+                <div style="color:blue;text-decoration:underline;cursor:pointer">{{ scope.row.indexName }}</div>
+              </template>
+            </el-table-column>
+            <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId" :formatter="unitFormat" show-overflow-tooltip/>
+            <el-table-column label="鎶ヨ绾у埆" align="center" prop="alarmLevel" width="100" :formatter="alarmLevelFormat" show-overflow-tooltip/>
+            <el-table-column label="闄愬�肩被鍨�" align="center" prop="limitType" width="100" :formatter="limitTypeFormat" show-overflow-tooltip/>
+            <el-table-column label="闄愬��" align="center" prop="limitingValue" show-overflow-tooltip/>
+            <el-table-column label="鎶ヨ寮�濮嬫椂闂�" align="center" prop="alarmBeginTime" width="180" show-overflow-tooltip/>
+            <el-table-column label="鎶ヨ鍊�" align="center" prop="alarmValue" show-overflow-tooltip/>
+
+          </el-table>
+          <pagination
+              :total="total"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getList"
+          />
+        </el-form>
+      </el-tab-pane>
+
+    </el-tabs>
+    <el-dialog :title="title" :visible.sync="open" width="1000px" :close-on-click-modal="false" @close="closeDialog">
+      <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+        <el-tabs v-model="activeName" @tab-click="handleClick">
+          <el-tab-pane label="瀹炴椂鏁版嵁鏇茬嚎鍥�" name="first">
+            <live-alarm-view ref="liveAlarmView" :code="code" :activeName="activeName"
+                             :limitVal="limitVal"></live-alarm-view>
+          </el-tab-pane>
+          <el-tab-pane label="鍘嗗彶鏁版嵁鏇茬嚎鍥�" name="second">
+            <history-alarm-view ref="historyAlarmView" :code="code" :activeName="activeName"
+                                :limitVal="limitVal"></history-alarm-view>
+          </el-tab-pane>
+          <el-tab-pane label="鍘嗗彶鏁版嵁鏌ヨ" name="third">
+            <history-alarm-table ref="historyAlarmTable" :code="code" :indexName="indexName" :activeName="activeName"
+                                 :indexUnit="indexUnit"></history-alarm-table>
+          </el-tab-pane>
+        </el-tabs>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancelDialog">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {getRealTimeAlarmList} from "@/api/energyAlarm/realTimeAlarm/realTimeAlarm"
+import {listLimitType} from "@/api/basicsetting/limitType"
+import liveAlarmView from "./liveAlarmView"
+import historyAlarmView from "./historyAlarmView"
+import historyAlarmTable from "./historyAlarmTable"
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {liveAlarmView, historyAlarmView, historyAlarmTable},
+  name: "modelMonitorSetting",
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: false,
+      radio: "",
+      title: "瀹炴椂鏁版嵁鏌ヨ",
+      open: false,
+      total: 10,
+      activeName: "first",
+      code: undefined,
+      indexId: undefined,
+      indexName: undefined,
+      indexUnit: undefined,
+      //璁℃椂鍣ㄥ璞�
+      timer: '',
+      //璁℃椂鍣ㄩ棿闅�
+      intervalTime: 30000,
+      currentNode: '',
+      deviceDialog: false,
+      energyDialog: false,
+      productDialog: false,
+      collectIndexDialog: false,
+      indexLoading: false,
+      limitTypeOptions: [],
+      disabledSetting: true,
+      limitValName: [],
+      limitVal: undefined,
+      queryParams: {
+        eierarchyFlag: "ALL",
+        alarmLevel: undefined,
+        indexName: undefined,
+        nodeId: undefined,//
+        limitType: undefined,
+        indexType: "COLLECT",
+        pageNum: 1,
+        pageSize: 10,
+      },
+      height: null,
+      //鎶ヨ绾у埆
+      alarmLevelOptions: [],
+      //鍗曚綅
+      unitOptions: [],
+      //琛ㄦ牸妯″瀷
+      model: {
+        tableOptions: [],
+      },
+    }
+  },
+  created() {
+    this.getDicts("alarm_level").then(response => {
+      this.alarmLevelOptions = response.data;
+    });
+    listLimitType(this.queryParams).then(response => {
+      this.limitTypeOptions = response.rows;
+    });
+    this.getDicts("sys_unit").then(response => {
+      this.unitOptions = response.data;
+    });
+  },
+  mounted() {
+    this.getConfigKey("energyAlarm.realTimeAlarm.intervalTime").then(response => {
+      this.intervalTime = response.msg;
+      this.timer = setInterval(this.getList, this.intervalTime);
+    });
+  },
+  beforeDestroy() {
+    //椤甸潰閿�姣佹椂 瑕佸仠姝㈣鏃跺櫒锛屽惁鍒欓�夐」鍗″垏鎹㈣鏃跺櫒涓嶅仠姝紝浼氳秺鏉ヨ秺蹇紝澶氫釜绾跨▼
+    if (this.timer) {
+      clearInterval(this.timer);
+    }
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 380 + 'px'
+    },
+    modelNodeChange(modelNode) {
+      this.queryParams.nodeId = modelNode.id;
+      this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+      if (modelNode) {
+        this.currentNode = modelNode;
+        this.getList();
+      }
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.indexId);
+      this.names = selection.map(item => item.name);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length
+    },
+
+    getList() {
+      /** 鏌ヨ鎶ヨ闄愬�肩被鍨嬬淮鎶ゅ垪琛� */
+      this.loading = true;
+      getRealTimeAlarmList(this.queryParams).then(response => {
+        this.model.tableOptions = response.data;
+        this.total = response.data.length;
+        this.loading = false;
+      });
+    },
+    openDialog(row, column, event, cell) {
+      if ("indexName" == column.property) {
+        this.open = true;
+        this.code = row.code;
+        this.indexName = row.indexName;
+        this.indexId = row.indexId;
+        this.activeName = "first";
+        this.indexUnit = this.selectDictLabel(this.unitOptions, row.unitId);
+        this.limitVal = row.limitingValue;
+      }
+    },
+    cancelDialog() {
+      this.open = false;
+      this.$refs.historyAlarmTable.cleanTable();
+    },
+    handleClick(tab, event) {
+      this.activeName = tab.name;
+    },
+    selectList() {
+      this.getList();
+    },
+    closeDialog() {
+      this.activeName = "";
+      this.$refs.historyAlarmTable.cleanTable();
+    },
+    // 鎶ヨ绾у埆瀛楀吀缈昏瘧
+    alarmLevelFormat(row, column) {
+      return this.selectDictLabel(this.alarmLevelOptions, row.alarmLevel);
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitFormat(row, column) {
+      return this.selectDictLabel(this.unitOptions, row.unitId);
+    },
+    // 闄愬�肩被鍨嬪瓧鍏哥炕璇�
+    limitTypeFormat(row, column) {
+      var actions = [];
+      Object.keys(this.limitTypeOptions).map((key) => {
+        if (this.limitTypeOptions[key].limitCode == ('' + row.limitType)) {
+          actions.push(this.limitTypeOptions[key].limitName);
+        }
+      });
+      return actions.join('');
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.selectList();
+    },
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.modelRealTimeAlarmSetting-right {
+  height: 100%;
+  overflow: hidden;
+}
+
+.mainTable .pagination-container {
+  height: 40px !important;
+}
+</style>
diff --git a/energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/energyDayConsumeInput.vue b/energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/energyDayConsumeInput.vue
new file mode 100644
index 0000000..0bf4f95
--- /dev/null
+++ b/energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/energyDayConsumeInput.vue
@@ -0,0 +1,204 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="queryParams" ref="queryForm"  label-width="72px" class="special-form">
+      <el-row :gutter="24">
+        <el-col :span="6">
+          <el-date-picker size="small" style="width: 100%"
+                          v-model="queryParams.date"
+                          :type="dateTypes"
+                          :value-format="valueFormat"
+                          :format="showFormat"
+                          @change="handleQuery"
+                          :clearable="false"
+                          placeholder="閫夋嫨鏃ユ湡">
+          </el-date-picker>
+        </el-col>
+        <el-col :span="18">
+          <el-form-item class="operation">
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSave">淇濆瓨</el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div>
+      <el-table :data="energyConsumeInputList" ref="dataList" v-loading="loading" border
+                style="width: 100%; margin-top: 20px"
+                :height="height">
+        <el-table-column label="搴忓彿" align="center" type="index" width="50"></el-table-column>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name" min-width="150px"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+        <el-table-column label="鎸囨爣绫诲瀷" align="center" prop="categoryName"/>
+        <el-table-column label="鑳芥簮鍝佺" align="center" prop="energyName"/>
+        <el-table-column label="鍊�" align="center" prop="value" min-width="100px">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.value" @change="checkNum(scope.row.value)" placeholder="璇疯緭鍏ュ��"
+                      clearable></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍗曚綅" align="center" prop="unit"/>
+        <el-table-column label="鎵�灞炴棩鏈�" align="center" prop="dataTimeStr"/>
+        <el-table-column label="褰曞叆鏃堕棿" align="center" prop="createTimeStr"/>
+        <el-table-column label="褰曞叆浜�" align="center" prop="createBy"/>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import {selectConsumeInputList, saveConsumeInput} from "@/api/energyAssistInput/energyDayConsumeInput"
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: 'energyIndex',
+  mixins: [mixins],
+  data() {
+    return {
+      timeArr: [],
+      currentNode: '',
+      deviceCategory: undefined,
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      dateRange: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 10,
+      // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+      List: [],
+      //鑳芥簮娑堣�楁墜鍔ㄥ綍鍏ユ暟鎹泦鍚�
+      energyConsumeInputList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      queryParams: {
+        date: undefined,
+        nodeId: "",
+        timeType: "DAY"
+      },
+      dateTypes: 'date',
+      valueFormat: "yyyy-MM-dd",
+      showFormat: "yyyy-MM-dd",
+      tableData: [],
+      datas: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {},
+      height:null,
+      moNode: undefined,
+    };
+  },
+  created() {
+    this.setNowDate();
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 365 + 'px';
+    },
+    modelNodeChange(modelNode, deviceCategory) {
+      this.moNode = modelNode;
+      this.queryParams.nodeId = modelNode.id;
+      this.deviceCategory = deviceCategory;
+      this.getList();
+    },
+    setNowDate() {
+      let nowDate = new Date();
+      let date = {
+        year: nowDate.getFullYear(),
+        month: nowDate.getMonth() + 1,
+        day: nowDate.getDate(),
+      }
+      this.queryParams.date = date.year + '-' + this.gshRq(date.month) + '-' + this.gshRq(date.day);
+    },
+    gshRq(rq) {
+      return ((rq * 1) < 10) ? '0' + rq : rq;
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      selectConsumeInputList(this.queryParams).then(response => {
+        this.energyConsumeInputList = response.rows;
+        this.loading = false;
+      });
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        indexId: undefined,
+        name: undefined,
+        code: undefined,
+        indexCategory: undefined,
+        remark: undefined,
+        unitId: undefined
+      };
+      this.resetForm("form");
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 淇濆瓨鎸夐挳鎿嶄綔 */
+    async handleSave() {
+      console.log("this.energyConsumeInputList");
+      console.log(this.energyConsumeInputList);
+      for (let i = 0; i < this.energyConsumeInputList.length; i++) {
+        let item = this.energyConsumeInputList[i];
+        let reg = /(^(-?([1-9]{1}\d*)|(0{1}))(\.\d{1,2,3})?$)/;
+        let value = item.value
+        console.log("i---" + i)
+        if (undefined == value || "" == value) {
+          this.$notify.error({
+            title: '閿欒',
+            message: '绗�' + (i + 1) + '琛屽�间笉鑳戒负绌�'
+          });
+          return false
+        } else if (!reg.test(value)) {
+          this.$notify.error({
+            title: '閿欒',
+            message: '绗�' + (i + 1) + '琛屽�煎繀椤讳负鏁板瓧涓旀渶澶氫繚鐣�3浣嶅皬鏁�'
+          });
+          return false
+        }
+      }
+      this.loading = true;
+      let res = await saveConsumeInput({models: this.energyConsumeInputList});
+      this.loading = false;
+      this.getList();
+    },
+    getTime() {
+      this.startTime = new Date().setHours(0, 0, 0, 0);
+      this.endTime = new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1;
+      //鏄剧ず鏃堕棿
+      this.timeArr = [this.startTime, this.endTime];
+    },
+    checkNum(value) {
+      let reg = /(^(-?([1-9]{1}\d*)|(0{1}))(\.\d{1,2,3})?$)/;
+      if (undefined == value || "" == value) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊间笉鑳戒负绌�'
+        });
+      } else if (!reg.test(value)) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊煎繀椤讳负鏁板瓧涓旀渶澶氫繚鐣�3浣嶅皬鏁�'
+        });
+      }
+    }
+  }
+}
+;
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/index.vue b/energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/index.vue
new file mode 100644
index 0000000..a42fe5e
--- /dev/null
+++ b/energy_management_ui/src/views/energyAssistInput/energyDayConsumeInput/index.vue
@@ -0,0 +1,65 @@
+<template>
+  <el-row type="flex">
+    <el-col class="page-left">
+      <basic-container title="姣忔棩鑳芥簮娑堣�楁墜鍔ㄥ綍鍏�" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :auth="false"
+                   :modelCode="modelCode"></ModelNode>
+      </basic-container>
+    </el-col>
+    <el-col class="page-right">
+      <basic-container title="姣忔棩鑳芥簮娑堣�楁墜鍔ㄥ綍鍏�" :bodyStyle="bodyStyleRight">
+        <energyDayConsumeInput ref="energyDayConsumeInput"></energyDayConsumeInput>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import energyDayConsumeInput from "./energyDayConsumeInput";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {energyDayConsumeInput, ModelNode},
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+    this.deviceCategory = this.$route.query.device_category;
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode: undefined,
+      deviceCategory: undefined,
+      isCollapse: false,
+      bodyStyleRight: {}
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight -155 + 'px'
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      this.$refs.energyDayConsumeInput.modelNodeChange(node, this.deviceCategory);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+@import "~@/assets/styles/left-right-layout.scss";
+</style>
diff --git a/energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/energyMonthConsumeInput.vue b/energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/energyMonthConsumeInput.vue
new file mode 100644
index 0000000..1c30527
--- /dev/null
+++ b/energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/energyMonthConsumeInput.vue
@@ -0,0 +1,204 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="queryParams" ref="queryForm" label-width="68px" class="special-form">
+      <el-row :gutter="24">
+        <el-col :span="6">
+          <el-date-picker size="small" style="width: 100%"
+                          v-model="queryParams.date"
+                          :type="dateTypes"
+                          :value-format="valueFormat"
+                          :format="showFormat"
+                          @change="handleQuery"
+                          :clearable="false"
+                          placeholder="閫夋嫨鏃ユ湡">
+          </el-date-picker>
+        </el-col>
+        <el-col :span="18">
+          <el-form-item class="operation">
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSave">淇濆瓨</el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div>
+      <el-table :data="energyConsumeInputList" ref="dataList" v-loading="loading" border
+                style="width: 100%; margin-top: 20px"
+                :height="height">
+        <el-table-column label="搴忓彿" align="center" type="index" width="50"></el-table-column>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name" min-width="150px"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+        <el-table-column label="鎸囨爣绫诲瀷" align="center" prop="categoryName"/>
+        <el-table-column label="鑳芥簮鍝佺" align="center" prop="energyName"/>
+        <el-table-column label="鍊�" align="center" prop="value" min-width="100px">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.value" @change="checkNum(scope.row.value)" placeholder="璇疯緭鍏ュ��"
+                      clearable></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍗曚綅" align="center" prop="unit"/>
+        <el-table-column label="鎵�灞炴棩鏈�" align="center" prop="dataTimeStr"/>
+        <el-table-column label="褰曞叆鏃堕棿" align="center" prop="createTimeStr"/>
+        <el-table-column label="褰曞叆浜�" align="center" prop="createBy"/>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import {selectConsumeInputList, saveConsumeInput} from "@/api/energyAssistInput/energyMonthConsumeInput"
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: 'energyIndex',
+  mixins: [mixins],
+  data() {
+    return {
+      timeArr: [],
+      currentNode: '',
+      deviceCategory: undefined,
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      dateRange: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 10,
+      // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+      List: [],
+      //鑳芥簮娑堣�楁墜鍔ㄥ綍鍏ユ暟鎹泦鍚�
+      energyConsumeInputList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      queryParams: {
+        date: undefined,
+        nodeId: "",
+        timeType: "MONTH"
+      },
+      dateTypes: 'month',
+      valueFormat: "yyyy-MM-dd",
+      showFormat: "yyyy-MM-dd",
+      tableData: [],
+      datas: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {},
+      moNode: undefined,
+      height: null,
+    };
+  },
+  created() {
+    this.setNowDate();
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 365 + 'px';
+    },
+    modelNodeChange(modelNode, deviceCategory) {
+      this.moNode = modelNode;
+      this.queryParams.nodeId = modelNode.id;
+      this.deviceCategory = deviceCategory;
+      this.getList();
+    },
+    setNowDate() {
+      let nowDate = new Date();
+      let date = {
+        year: nowDate.getFullYear(),
+        month: nowDate.getMonth() + 1,
+        day: nowDate.getDate(),
+      }
+      this.queryParams.date = date.year + '-' + this.gshRq(date.month) + '-' + this.gshRq(date.day);
+    },
+    gshRq(rq) {
+      return ((rq * 1) < 10) ? '0' + rq : rq;
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      selectConsumeInputList(this.queryParams).then(response => {
+        this.energyConsumeInputList = response.rows;
+        this.loading = false;
+      });
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        indexId: undefined,
+        name: undefined,
+        code: undefined,
+        indexCategory: undefined,
+        remark: undefined,
+        unitId: undefined
+      };
+      this.resetForm("form");
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 淇濆瓨鎸夐挳鎿嶄綔 */
+    async handleSave() {
+      console.log("this.energyConsumeInputList");
+      console.log(this.energyConsumeInputList);
+      for (let i = 0; i < this.energyConsumeInputList.length; i++) {
+        let item = this.energyConsumeInputList[i];
+        let reg = /(^(-?([1-9]{1}\d*)|(0{1}))(\.\d{1,2,3})?$)/;
+        let value = item.value
+        console.log("i---" + i)
+        if (undefined == value || "" == value) {
+          this.$notify.error({
+            title: '閿欒',
+            message: '绗�' + (i + 1) + '琛屽�间笉鑳戒负绌�'
+          });
+          return false
+        } else if (!reg.test(value)) {
+          this.$notify.error({
+            title: '閿欒',
+            message: '绗�' + (i + 1) + '琛屽�煎繀椤讳负鏁板瓧涓旀渶澶氫繚鐣�3浣嶅皬鏁�'
+          });
+          return false
+        }
+      }
+      this.loading = true;
+      let res = await saveConsumeInput({models: this.energyConsumeInputList});
+      this.loading = false;
+      this.getList();
+    },
+    getTime() {
+      this.startTime = new Date().setHours(0, 0, 0, 0);
+      this.endTime = new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1;
+      //鏄剧ず鏃堕棿
+      this.timeArr = [this.startTime, this.endTime];
+    },
+    checkNum(value) {
+      let reg = /(^(-?([1-9]{1}\d*)|(0{1}))(\.\d{1,2,3})?$)/;
+      if (undefined == value || "" == value) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊间笉鑳戒负绌�'
+        });
+      } else if (!reg.test(value)) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊煎繀椤讳负鏁板瓧涓旀渶澶氫繚鐣�3浣嶅皬鏁�'
+        });
+      }
+    }
+  }
+}
+;
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/index.vue b/energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/index.vue
new file mode 100644
index 0000000..af73cc1
--- /dev/null
+++ b/energy_management_ui/src/views/energyAssistInput/energyMonthConsumeInput/index.vue
@@ -0,0 +1,65 @@
+<template>
+  <el-row type="flex">
+    <el-col class="page-left">
+      <basic-container title="鏈堝害鑳芥簮娑堣�楁墜鍔ㄥ綍鍏�" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :auth="false"
+                   :modelCode="modelCode"></ModelNode>
+      </basic-container>
+    </el-col>
+    <el-col class="page-right">
+      <basic-container title="鏈堝害鑳芥簮娑堣�楁墜鍔ㄥ綍鍏�" :bodyStyle="bodyStyleRight">
+        <energyMonthConsumeInput ref="energyMonthConsumeInput"></energyMonthConsumeInput>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import energyMonthConsumeInput from "./energyMonthConsumeInput";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  components: {energyMonthConsumeInput, ModelNode},
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+    this.deviceCategory = this.$route.query.device_category;
+  },
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode: undefined,
+      deviceCategory: undefined,
+      isCollapse: false,
+      bodyStyleRight: {}
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight -155 + 'px'
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      this.$refs.energyMonthConsumeInput.modelNodeChange(node, this.deviceCategory);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+@import "~@/assets/styles/left-right-layout.scss";
+</style>
diff --git a/energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/energyYearConsumeInput.vue b/energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/energyYearConsumeInput.vue
new file mode 100644
index 0000000..e2b8432
--- /dev/null
+++ b/energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/energyYearConsumeInput.vue
@@ -0,0 +1,208 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="special-form">
+      <el-row :gutter="24">
+        <el-col :span="6">
+          <el-date-picker size="small" style="width: 200px"
+                          v-model="queryParams.date"
+                          :type="dateTypes"
+                          :value-format="valueFormat"
+                          :format="showFormat"
+                          @change="handleQuery"
+                          :clearable="false"
+                          placeholder="閫夋嫨鏃ユ湡">
+          </el-date-picker>
+        </el-col>
+        <el-col :span="18">
+          <el-form-item class="operation">
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">
+              鏌ヨ
+            </el-button>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleSave">淇濆瓨</el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div>
+      <el-table :data="energyConsumeInputList" ref="dataList" v-loading="loading" border
+                style="width: 100%; margin-top: 20px"
+                :height="height">
+        <el-table-column label="搴忓彿" align="center" type="index" width="50"></el-table-column>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name" min-width="150px"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+        <el-table-column label="鎸囨爣绫诲瀷" align="center" prop="categoryName"/>
+        <el-table-column label="鑳芥簮鍝佺" align="center" prop="energyName"/>
+        <el-table-column label="鍊�" align="center" prop="value" min-width="100px">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.value" @change="checkNum(scope.row.value)" placeholder="璇疯緭鍏ュ��"
+                      clearable></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍗曚綅" align="center" prop="unit"/>
+        <el-table-column label="鎵�灞炴棩鏈�" align="center" prop="dataTimeStr"/>
+        <el-table-column label="褰曞叆鏃堕棿" align="center" prop="createTimeStr"/>
+        <el-table-column label="褰曞叆浜�" align="center" prop="createBy"/>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import {selectConsumeInputList, saveConsumeInput} from "@/api/energyAssistInput/energyYearConsumeInput"
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: 'energyIndex',
+  mixins: [mixins],
+  data() {
+    return {
+      timeArr: [],
+      currentNode: '',
+      deviceCategory: undefined,
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      dateRange: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 10,
+      // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+      List: [],
+      //鑳芥簮娑堣�楁墜鍔ㄥ綍鍏ユ暟鎹泦鍚�
+      energyConsumeInputList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      queryParams: {
+        date: undefined,
+        nodeId: "",
+        timeType: "YEAR"
+      },
+      dateTypes: "year",
+      valueFormat: "yyyy",
+      showFormat: "yyyy",
+      tableData: [],
+      datas: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {},
+      moNode: undefined,
+      height: null,
+    };
+  },
+  created() {
+    this.setNowDate();
+  },
+  methods: {
+    setCharts() {
+      this.height = window.innerHeight - 365 + 'px';
+    },
+    modelNodeChange(modelNode, deviceCategory) {
+      this.moNode = modelNode;
+      this.queryParams.nodeId = modelNode.id;
+      this.deviceCategory = deviceCategory;
+      this.getList();
+    },
+    setNowDate() {
+      let nowDate = new Date();
+      let date = {
+        year: nowDate.getFullYear(),
+        month: nowDate.getMonth() + 1,
+        day: nowDate.getDate(),
+      }
+      console.log(date)
+      this.queryParams.date = date.year + '';
+    },
+    gshRq(rq) {
+      return ((rq * 1) < 10) ? '0' + rq : rq;
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      selectConsumeInputList(this.queryParams).then(response => {
+        this.energyConsumeInputList = response.rows;
+        this.loading = false;
+      });
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        indexId: undefined,
+        name: undefined,
+        code: undefined,
+        indexCategory: undefined,
+        remark: undefined,
+        unitId: undefined
+      };
+      this.resetForm("form");
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 淇濆瓨鎸夐挳鎿嶄綔 */
+    async handleSave() {
+      console.log("this.energyConsumeInputList");
+      console.log(this.energyConsumeInputList);
+      for (let i = 0; i < this.energyConsumeInputList.length; i++) {
+        let item = this.energyConsumeInputList[i];
+        let reg = /(^(-?([1-9]{1}\d*)|(0{1}))(\.\d{1,2,3})?$)/;
+        let value = item.value
+        console.log("i---" + i)
+        if (undefined == value || "" == value) {
+          this.$notify.error({
+            title: '閿欒',
+            message: '绗�' + (i + 1) + '琛屽�间笉鑳戒负绌�'
+          });
+          return false
+        } else if (!reg.test(value)) {
+          this.$notify.error({
+            title: '閿欒',
+            message: '绗�' + (i + 1) + '琛屽�煎繀椤讳负鏁板瓧涓旀渶澶氫繚鐣�3浣嶅皬鏁�'
+          });
+          return false
+        }
+      }
+      this.loading = true;
+      let res = await saveConsumeInput({models: this.energyConsumeInputList});
+      this.loading = false;
+      this.getList();
+    },
+    getTime() {
+      this.startTime = new Date().setHours(0, 0, 0, 0);
+      this.endTime = new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1;
+      //鏄剧ず鏃堕棿
+      this.timeArr = [this.startTime, this.endTime];
+    },
+    checkNum(value) {
+      let reg = /(^(-?([1-9]{1}\d*)|(0{1}))(\.\d{1,2,3})?$)/;
+      if (undefined == value || "" == value) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊间笉鑳戒负绌�'
+        });
+      } else if (!reg.test(value)) {
+        this.$notify.error({
+          title: '閿欒',
+          message: '鍊煎繀椤讳负鏁板瓧涓旀渶澶氫繚鐣�3浣嶅皬鏁�'
+        });
+      }
+    }
+  }
+}
+;
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
+
diff --git a/energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/index.vue b/energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/index.vue
new file mode 100644
index 0000000..5772cdb
--- /dev/null
+++ b/energy_management_ui/src/views/energyAssistInput/energyYearConsumeInput/index.vue
@@ -0,0 +1,65 @@
+<template>
+  <el-row type="flex">
+    <el-col class="page-left">
+      <basic-container title="骞村害鑳芥簮娑堣�楁墜鍔ㄥ綍鍏�" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :auth="false"
+                   :modelCode="modelCode"></ModelNode>
+      </basic-container>
+    </el-col>
+    <el-col class="page-right">
+      <basic-container title="骞村害鑳芥簮娑堣�楁墜鍔ㄥ綍鍏�" :bodyStyle="bodyStyleRight">
+        <energyYearConsumeInput ref="energyYearConsumeInput"></energyYearConsumeInput>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import energyYearConsumeInput from "./energyYearConsumeInput";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {energyYearConsumeInput, ModelNode},
+  mixins: [mixins],
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+    this.deviceCategory = this.$route.query.device_category;
+  },
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode: undefined,
+      deviceCategory: undefined,
+      isCollapse: false,
+      bodyStyleRight: {}
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight -155 + 'px'
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      };
+    },
+    changeNode: function (node) {
+      this.$refs.energyYearConsumeInput.modelNodeChange(node, this.deviceCategory);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+@import "~@/assets/styles/left-right-layout.scss";
+</style>
diff --git a/energy_management_ui/src/views/energyBalance/energyBalance/LineChart.vue b/energy_management_ui/src/views/energyBalance/energyBalance/LineChart.vue
new file mode 100644
index 0000000..9613210
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyBalance/LineChart.vue
@@ -0,0 +1,110 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '600px'
+      },
+      chartData: {
+        type:Object,
+        //required: true
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({actualData,expectedData,title} = {}) {
+        this.chart.setOption({
+          title: {
+            text: '鑳芥簮骞宠 鍒嗘瀽',
+            x:'left',
+            y: 'top',
+            textStyle: {
+              color: "#333",
+              fontSize:16
+            },
+          },
+          xAxis: {
+            data: actualData,
+            type: 'category',
+          },
+          grid: {
+            left: 10,
+            right: 10,
+            bottom: 20,
+            top: '15%',
+            containLabel: true
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              type: 'cross'
+            },
+            padding: [5, 10]
+          },
+          yAxis: {
+            axisTick: {
+              show: false
+            }
+          },
+          legend: {
+            data: []
+          },
+          series: [{
+            name: title,
+            smooth: true,
+            type: 'bar',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/energyBalance/energyBalance/PieChart.vue b/energy_management_ui/src/views/energyBalance/energyBalance/PieChart.vue
new file mode 100644
index 0000000..30da0b7
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyBalance/PieChart.vue
@@ -0,0 +1,139 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    chartData: {
+      type:Object,
+      //required: true
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({actualData,expectedData,title} = {}) {
+      this.chart.setOption({
+        title: {
+          text: '鑳芥簮骞宠 鍒嗘瀽',
+          x:'left',
+          y: 'top',
+          textStyle: {
+            color: "#333"
+          },
+        },
+        tooltip: {
+          trigger: 'item',
+          formatter: actualData
+        },
+        grid: {
+          top: 40,
+          left: '2%',
+          right: '2%',
+          bottom: '3%',
+          containLabel: true
+        },
+        legend: {
+          // orient 璁剧疆甯冨眬鏂瑰紡锛岄粯璁ゆ按骞冲竷灞�锛屽彲閫夊�硷細'horizontal'锛堟按骞筹級 娄 'vertical'锛堝瀭鐩达級
+          orient: 'vertical',
+          // x 璁剧疆姘村钩瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥惧眳涓紝鍙�夊�硷細'center' 娄 'left' 娄 'right' 娄 {number}锛坸鍧愭爣锛屽崟浣峱x锛�
+          x: 'left',
+          // y 璁剧疆鍨傜洿瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥鹃《绔紝鍙�夊�硷細'top' 娄 'bottom' 娄 'center' 娄 {number}锛坹鍧愭爣锛屽崟浣峱x锛�
+          y: '10%',
+          //left: 10,
+          itemWidth: 24,   // 璁剧疆鍥句緥鍥惧舰鐨勫
+          itemHeight: 18,  // 璁剧疆鍥句緥鍥惧舰鐨勯珮
+          textStyle: {
+            color: '#666'  // 鍥句緥鏂囧瓧棰滆壊
+          },
+          // itemGap璁剧疆鍚勪釜item涔嬮棿鐨勯棿闅旓紝鍗曚綅px锛岄粯璁や负10锛屾í鍚戝竷灞�鏃朵负姘村钩闂撮殧锛岀旱鍚戝竷灞�鏃朵负绾靛悜闂撮殧
+          // itemGap: 30,
+          backgroundColor: '#eee',  // 璁剧疆鏁翠釜鍥句緥鍖哄煙鑳屾櫙棰滆壊
+          data: actualData,
+        },
+        series: [{
+          //name: '鑳芥簮',
+          type: 'pie',
+          radius: ['50%', '80%'],  // 璁剧疆鐜舰楗肩姸鍥撅紝 绗竴涓櫨鍒嗘暟璁剧疆鍐呭湀澶у皬锛岀浜屼釜鐧惧垎鏁拌缃鍦堝ぇ灏�
+          center: ['50%', '50%'],  // 璁剧疆楗肩姸鍥句綅缃紝绗竴涓櫨鍒嗘暟璋冩按骞充綅缃紝绗簩涓櫨鍒嗘暟璋冨瀭鐩翠綅缃�
+          data: expectedData,
+          // itemStyle 璁剧疆楗肩姸鍥炬墖褰㈠尯鍩熸牱寮�
+          itemStyle: {
+            // emphasis锛氳嫳鏂囨剰鎬濇槸 寮鸿皟;鐫�閲�;锛堣疆寤撱�佸浘褰㈢瓑鐨勶級椴滄槑;绐佸嚭锛岄噸璇�
+            // emphasis锛氳缃紶鏍囨斁鍒板摢涓�鍧楁墖褰笂闈㈢殑鏃跺�欙紝鎵囧舰鏍峰紡銆侀槾褰�
+            emphasis: {
+              shadowBlur: 10,
+              shadowOffsetX: 0,
+              shadowColor: 'rgba(30, 144, 255锛�0.5)'
+            }
+          },
+          // 璁剧疆鍊煎煙鐨勯偅鎸囧悜绾�
+          labelLine: {
+            normal: {
+              show: false   // show璁剧疆绾挎槸鍚︽樉绀猴紝榛樿涓簍rue锛屽彲閫夊�硷細true 娄 false
+            }
+          },
+          avoidLabelOverlap: false,
+
+          // 璁剧疆鍊煎煙鐨勬爣绛�
+          label: {
+            normal: {
+              position: 'inner',  // 璁剧疆鏍囩浣嶇疆锛岄粯璁ゅ湪楗肩姸鍥惧 鍙�夊�硷細'outer' 娄 'inner锛堥ゼ鐘跺浘涓婏級'
+              // formatter: '{a} {b} : {c}涓� ({d}%)'   璁剧疆鏍囩鏄剧ず鍐呭 锛岄粯璁ゆ樉绀簕b}
+              // {a}鎸噑eries.name  {b}鎸噑eries.data鐨刵ame
+              // {c}鎸噑eries.data鐨剉alue  {d}%鎸囪繖涓�閮ㄥ垎鍗犳�绘暟鐨勭櫨鍒嗘瘮
+              formatter: '{b} : ({d}%)'
+            }
+          }
+        }
+        ],
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyBalance/energyBalance/energyBalance.vue b/energy_management_ui/src/views/energyBalance/energyBalance/energyBalance.vue
new file mode 100644
index 0000000..2955bcf
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyBalance/energyBalance.vue
@@ -0,0 +1,205 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-date-picker clearable size="small" style="width: 200px"
+                      v-model="queryParams.dataTime"
+                      :type="dateTypes"
+                      :value-format="valueFormat"
+                      placeholder="閫夋嫨鏃ユ湡">
+      </el-date-picker>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="20">
+      <el-col :xs="24" :sm="24" :lg="24">
+        <div class="chart-wrapper">
+          <line-chart ref="LineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+    <el-table :data="list" border>
+      <el-table-column label="鍚嶇О" align="center" prop="label">{{label}}</el-table-column>
+      <el-table-column label="浜у嚭" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_CC)}}</template></el-table-column>
+      <el-table-column label="娑堣��" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_XH)}}</template></el-table-column>
+      <el-table-column label="澶栦緵" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_WG)}}</template></el-table-column>
+      <el-table-column label="鎹熻��" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_SH)}}</template></el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {energyBalanceList,energyBalanceTable} from '@/api/energyBalance/energyBalance'
+  import LineChart from './LineChart'
+export default {
+  components: {LineChart},
+  data() {
+    return {
+      dateTypeOptions:[],
+      list:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        timeType:"DAY",
+        dataTime: undefined,
+      },
+      dateTypes: 'date',
+      valueFormat:"yyyy-MM-dd",
+      skinName:"",
+      label:"",
+      lineChartData:{expectedData: [],
+        actualData: [],label:""},
+    };
+  },
+  created() {
+    this.getTime();
+    this.getDicts("energyBalance").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("energyBalance").then(response => {
+      this.skinName=response.msg;
+    });
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.queryParams.indexCode=modelNode.id;
+      this.label=modelNode.label;
+      this.getList(this.queryParams)
+    },
+    getList() {
+      energyBalanceList(this.queryParams).then(response => {
+        //this.plannedOutputList = response.rows;
+        let expectedData=[];
+        let actualData=[];
+        let total="";
+        response.data.forEach(item => {
+          actualData.push(item.indexName)
+          expectedData.push({"name":item.indexName,"value":this.numFilter(item.value)});
+        })
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.title=this.label;
+        this.$refs.LineChart.initChart(this.lineChartData);
+      });
+      energyBalanceTable(this.queryParams).then(response => {
+        this.list=response.data;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    handleTime(date){
+      if(date=='YEAR'){
+        this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+      }else if(date=='MONTH'){
+        this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+      }else{
+        this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+      }
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month + '-' + (date-1)
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '' ;
+      if (!isNaN(value) && value !== '' && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '--'
+      }
+      return realVal
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+  @keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+
+  @-webkit-keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyBalance/energyBalance/index.vue b/energy_management_ui/src/views/energyBalance/energyBalance/index.vue
new file mode 100644
index 0000000..5267f9f
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyBalance/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥簮骞宠 鍒嗘瀽
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <energyBalance ref="energyBalance" style="padding:10px"></energyBalance>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import energyBalance from "./energyBalance";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,energyBalance},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.energyBalance.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyBalance/energyBalance/pie_chart.vue b/energy_management_ui/src/views/energyBalance/energyBalance/pie_chart.vue
new file mode 100644
index 0000000..2983152
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyBalance/pie_chart.vue
@@ -0,0 +1,103 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+
+      this.chart.setOption({
+        title: {
+          text: '杈撳嚭鑳介噺鍒嗘瀽',
+          left: '25%',
+          textAlign: 'center',
+          textStyle: {
+            fontStyle: 'normal',
+            "color": "#333",
+          },
+        },
+        tooltip: {
+          trigger: 'item',
+          formatter: '{a} <br/>{b}: {c} ({d}%)'
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        legend: {
+          orient: 'vertical',
+          left: 10,
+          top:'10%',
+          data: ['姘磋緭鍏ラ噺', '鐢佃緭鍏ラ噺']
+        },
+        series: [
+          {
+            name: '鑳介噺杈撳嚭',
+            type: 'pie',
+            radius: ['30%', '60%'],
+            avoidLabelOverlap: false,
+            label: {
+              show: false,
+              position: 'center'
+            },
+            emphasis: {
+              label: {
+                show: true,
+                fontSize: '16',
+                fontWeight: 'bold'
+              }
+            },
+            labelLine: {
+              show: false
+            },
+            data: [
+              {value: 340, name: '姘磋緭鍏ラ噺'},
+              {value: 150, name: '鐢佃緭鍏ラ噺'}
+            ]
+          }
+        ]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyBalance/energyLoss/PieChart.vue b/energy_management_ui/src/views/energyBalance/energyLoss/PieChart.vue
new file mode 100644
index 0000000..ca0a891
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyLoss/PieChart.vue
@@ -0,0 +1,150 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '600px'
+    },
+    chartData: {
+      type:Object,
+      //required: true
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({actualData,expectedData,title,total} = {}) {
+      this.chart.setOption({
+        title: {
+          text: title+"浜у嚭锛�"+total,
+          x:'left',
+          y: 'top',
+          textStyle: {
+            color: "#333"
+          },
+        },
+        tooltip: {
+          trigger: 'item',
+          formatter: actualData
+        },
+        grid: {
+          top: 40,
+          left: '2%',
+          right: '2%',
+          bottom: '3%',
+          containLabel: true
+        },
+        legend: {
+          // orient 璁剧疆甯冨眬鏂瑰紡锛岄粯璁ゆ按骞冲竷灞�锛屽彲閫夊�硷細'horizontal'锛堟按骞筹級 娄 'vertical'锛堝瀭鐩达級
+          orient: 'vertical',
+          // x 璁剧疆姘村钩瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥惧眳涓紝鍙�夊�硷細'center' 娄 'left' 娄 'right' 娄 {number}锛坸鍧愭爣锛屽崟浣峱x锛�
+          x: 'left',
+          // y 璁剧疆鍨傜洿瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥鹃《绔紝鍙�夊�硷細'top' 娄 'bottom' 娄 'center' 娄 {number}锛坹鍧愭爣锛屽崟浣峱x锛�
+          y: '10%',
+          //left: 10,
+          itemWidth: 24,   // 璁剧疆鍥句緥鍥惧舰鐨勫
+          itemHeight: 18,  // 璁剧疆鍥句緥鍥惧舰鐨勯珮
+          textStyle: {
+            color: '#666'  // 鍥句緥鏂囧瓧棰滆壊
+          },
+          // itemGap璁剧疆鍚勪釜item涔嬮棿鐨勯棿闅旓紝鍗曚綅px锛岄粯璁や负10锛屾í鍚戝竷灞�鏃朵负姘村钩闂撮殧锛岀旱鍚戝竷灞�鏃朵负绾靛悜闂撮殧
+          // itemGap: 30,
+          backgroundColor: '#eee',  // 璁剧疆鏁翠釜鍥句緥鍖哄煙鑳屾櫙棰滆壊
+          data: actualData,
+        },
+        series: [{
+          //name: '鑳芥簮',
+          type: 'pie',
+          radius: ['50%', '80%'],  // 璁剧疆鐜舰楗肩姸鍥撅紝 绗竴涓櫨鍒嗘暟璁剧疆鍐呭湀澶у皬锛岀浜屼釜鐧惧垎鏁拌缃鍦堝ぇ灏�
+          center: ['50%', '50%'],  // 璁剧疆楗肩姸鍥句綅缃紝绗竴涓櫨鍒嗘暟璋冩按骞充綅缃紝绗簩涓櫨鍒嗘暟璋冨瀭鐩翠綅缃�
+          data: expectedData,
+          // itemStyle 璁剧疆楗肩姸鍥炬墖褰㈠尯鍩熸牱寮�
+          itemStyle: {
+            // emphasis锛氳嫳鏂囨剰鎬濇槸 寮鸿皟;鐫�閲�;锛堣疆寤撱�佸浘褰㈢瓑鐨勶級椴滄槑;绐佸嚭锛岄噸璇�
+            // emphasis锛氳缃紶鏍囨斁鍒板摢涓�鍧楁墖褰笂闈㈢殑鏃跺�欙紝鎵囧舰鏍峰紡銆侀槾褰�
+            emphasis: {
+              shadowBlur: 10,
+              shadowOffsetX: 0,
+              shadowColor: 'rgba(30, 144, 255锛�0.5)'
+            },
+            normal: {
+              label:{
+                fontSize:25,
+              }
+            }
+          },
+          // 璁剧疆鍊煎煙鐨勯偅鎸囧悜绾�
+          labelLine: {
+            normal: {
+              show: false ,  // show璁剧疆绾挎槸鍚︽樉绀猴紝榛樿涓簍rue锛屽彲閫夊�硷細true 娄 false
+            }
+          },
+          avoidLabelOverlap: false,
+          emphasis: {
+            label: {
+              show: true,
+              fontSize: '40',
+              fontWeight: 'bold'
+            }
+          },
+          // 璁剧疆鍊煎煙鐨勬爣绛�
+          label: {
+            normal: {
+              position: 'inner',  // 璁剧疆鏍囩浣嶇疆锛岄粯璁ゅ湪楗肩姸鍥惧 鍙�夊�硷細'outer' 娄 'inner锛堥ゼ鐘跺浘涓婏級'
+              // formatter: '{a} {b} : {c}涓� ({d}%)'   璁剧疆鏍囩鏄剧ず鍐呭 锛岄粯璁ゆ樉绀簕b}
+              // {a}鎸噑eries.name  {b}鎸噑eries.data鐨刵ame
+              // {c}鎸噑eries.data鐨剉alue  {d}%鎸囪繖涓�閮ㄥ垎鍗犳�绘暟鐨勭櫨鍒嗘瘮
+              formatter: '{b} : ({d}%)'
+            },
+          }
+        }
+        ],
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyBalance/energyLoss/energyLoss.vue b/energy_management_ui/src/views/energyBalance/energyLoss/energyLoss.vue
new file mode 100644
index 0000000..79654d4
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyLoss/energyLoss.vue
@@ -0,0 +1,211 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-date-picker clearable size="small" style="width: 200px"
+                      v-model="queryParams.dataTime"
+                      :type="dateTypes"
+                      :value-format="valueFormat"
+                      placeholder="閫夋嫨鏃ユ湡">
+      </el-date-picker>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="20">
+      <el-col :xs="24" :sm="24" :lg="24">
+        <div class="chart-wrapper">
+          <pie-chart ref="PieChart" :chart-data="lineChartData"/>
+        </div>
+      </el-col>
+    </el-row>
+    <el-table :data="list" border>
+      <el-table-column label="鍚嶇О" align="center" prop="label">{{label}}</el-table-column>
+      <!--<el-table-column label="浜у嚭" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_CC)}}</template></el-table-column>-->
+      <el-table-column label="娑堣��" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_XH)}}</template></el-table-column>
+      <el-table-column label="澶栦緵" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_WG)}}</template></el-table-column>
+      <el-table-column label="鎹熻��" align="center"> <template slot-scope="scope">{{numFilter(scope.row.value_SH)}}</template></el-table-column>
+      <el-table-column label="鎬婚噺" align="center"><template slot-scope="scope">{{numFilter(scope.row.value_total)}}</template></el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {lossAnalysisList,energyLossTable} from '@/api/energyBalance/energyBalance'
+  import PieChart from './PieChart'
+export default {
+  components: {PieChart},
+  data() {
+    return {
+      dateTypeOptions:[],
+      list:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        timeType:"DAY",
+        dataTime: undefined,
+      },
+      dateTypes: 'date',
+      valueFormat:"yyyy-MM-dd",
+      skinName:"",
+      label:"",
+      lineChartData:{expectedData: [],
+        actualData: [],label:""},
+    };
+  },
+  created() {
+    this.getTime();
+    this.getDicts("energyBalance").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("energyBalance").then(response => {
+      this.skinName=response.msg;
+    });
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.queryParams.indexCode=modelNode.id;
+      this.label=modelNode.label;
+      this.getList(this.queryParams)
+    },
+    getList() {
+      lossAnalysisList(this.queryParams).then(response => {
+        //this.plannedOutputList = response.rows;
+        let expectedData=[];
+        let actualData=[];
+        let total="";
+        response.data.forEach(item => {
+          if(item.indexCode.indexOf("_total")==-1){
+            actualData.push(item.indexName)
+            expectedData.push({"name":item.indexName,"value":this.numFilter(item.value)});
+          }else{
+            total=this.numFilter(item.value)
+          }
+        })
+        this.lineChartData.total=total;
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.title=this.label;
+        this.$refs.PieChart.initChart(this.lineChartData);
+      });
+      energyLossTable(this.queryParams).then(response => {
+        this.list=response.data;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    handleTime(date){
+      if(date=='YEAR'){
+        this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+      }else if(date=='MONTH'){
+        this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+      }else{
+        this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+      }
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month + '-' + (date-1)
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '' ;
+      if (!isNaN(value) && value !== '' && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '--'
+      }
+      return realVal
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+  @keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+
+  @-webkit-keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyBalance/energyLoss/index.vue b/energy_management_ui/src/views/energyBalance/energyLoss/index.vue
new file mode 100644
index 0000000..e30637c
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyLoss/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥簮鎹熷け鍒嗘瀽
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <energyLoss ref="energyLoss" style="padding:10px"></energyLoss>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import energyLoss from "./energyLoss";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,energyLoss},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.energyLoss.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyBalance/energyPic/energyPic.vue b/energy_management_ui/src/views/energyBalance/energyPic/energyPic.vue
new file mode 100644
index 0000000..d961a64
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyPic/energyPic.vue
@@ -0,0 +1,190 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{moNode?moNode.label:''}}--鑳芥祦鍒嗘瀽</span>
+      </div>
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <el-date-picker clearable size="small" style="width: 200px"
+                      v-model="queryParams.dataTime"
+                      :type="dateTypes"
+                      :value-format="valueFormat"
+                      placeholder="閫夋嫨鏃ユ湡">
+      </el-date-picker>
+      <el-form-item label="灏忔椂" prop="selectHour">
+        <el-select v-model="queryParams.selectHour" placeholder="璇烽�夋嫨灏忔椂" clearable size="small">
+          <el-option
+            v-for="dict in selectHourOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+      </el-form-item>
+    </el-form>
+      <div>
+      <el-table :data="energyPicList" v-loading="loading" border style="width: 100%; margin-top: 20px">
+        <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="modename" min-width="200px"/>
+        <el-table-column label="浜у嚭" align="center" prop="a1"/>
+        <el-table-column label="娑堣��" align="center" prop="a2"/>
+        <el-table-column label="澶栦緵" align="center" prop="a3"/>
+        <el-table-column label="鎹熻��" align="center" prop="a4"/>
+      </el-table>
+  </div>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import {selectEnergyPicList} from "@/api/energyBalance/energyPic"
+
+  export default {
+    name: 'energyIndex',
+
+    data() {
+      return {
+        timeArr:[],
+        currentNode: '',
+        deviceCategory:undefined,
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        dateRange: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 10,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        List: [],
+        //鑳芥祦鍒嗘瀽鏁版嵁闆嗗悎
+        energyPicList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        selectHour:"01",
+        selectHourOptions:[{"dictLabel":"01","dictValue":"01","dictType":"selecthour"},
+          {"dictLabel":"02","dictValue":"02","dictType":"selecthour"},
+          {"dictLabel":"03","dictValue":"03","dictType":"selecthour"},
+          {"dictLabel":"04","dictValue":"04","dictType":"selecthour"},
+          {"dictLabel":"05","dictValue":"05","dictType":"selecthour"},
+          {"dictLabel":"06","dictValue":"06","dictType":"selecthour"},
+          {"dictLabel":"07","dictValue":"07","dictType":"selecthour"},
+          {"dictLabel":"08","dictValue":"08","dictType":"selecthour"},
+          {"dictLabel":"09","dictValue":"09","dictType":"selecthour"},
+          {"dictLabel":"10","dictValue":"10","dictType":"selecthour"},
+          {"dictLabel":"11","dictValue":"11","dictType":"selecthour"},
+          {"dictLabel":"12","dictValue":"12","dictType":"selecthour"},
+          {"dictLabel":"13","dictValue":"13","dictType":"selecthour"},
+          {"dictLabel":"14","dictValue":"14","dictType":"selecthour"},
+          {"dictLabel":"15","dictValue":"15","dictType":"selecthour"},
+          {"dictLabel":"16","dictValue":"16","dictType":"selecthour"},
+          {"dictLabel":"17","dictValue":"17","dictType":"selecthour"},
+          {"dictLabel":"18","dictValue":"18","dictType":"selecthour"},
+          {"dictLabel":"19","dictValue":"19","dictType":"selecthour"},
+          {"dictLabel":"20","dictValue":"20","dictType":"selecthour"},
+          {"dictLabel":"21","dictValue":"21","dictType":"selecthour"},
+          {"dictLabel":"22","dictValue":"22","dictType":"selecthour"},
+          {"dictLabel":"23","dictValue":"23","dictType":"selecthour"}
+        ],
+        queryParams: {
+          eierarchyFlag:"B",
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          value:undefined,
+          code: undefined,
+          dataTime: undefined,
+          selectHour:"01",
+          nodeid:""
+        },
+        dateTypes: 'date',
+        valueFormat:"yyyy-MM-dd",
+        tableData: [],
+        datas: [],
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+        },
+        moNode: undefined,
+      };
+    },
+    created() {
+      this.setNowDate();
+    },
+    methods: {
+      modelNodeChange(modelNode,deviceCategory) {
+        this.moNode = modelNode;
+        this.queryParams.nodeid = modelNode.id;
+        this.deviceCategory = deviceCategory;
+        this.getList();
+      },
+      setNowDate() {
+        let nowDate = new Date();
+        let date = {
+          year: nowDate.getFullYear(),
+          month: nowDate.getMonth() + 1,
+          day: nowDate.getDate(),
+        }
+        this.queryParams.dataTime = date.year + '-' + this.gshRq(date.month) + '-' +this.gshRq(date.day);
+      },
+      gshRq(rq)
+      {
+          return ((rq*1)<10)?'0'+rq:rq;
+      },
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList() {
+        this.loading = true;
+        //var search = this.queryParams;
+        selectEnergyPicList(this.queryParams).then(response => {
+          this.energyPicList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        if("5"===this.deviceCategory){
+          this.getList();
+        }else {
+          this.tableData = [];
+        }
+      },
+      getTime(){
+        this.startTime = new Date().setHours(0, 0, 0, 0);
+        this.endTime = new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1;
+        //鏄剧ず鏃堕棿
+        this.timeArr = [this.startTime,this.endTime];
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyBalance/energyPic/index.vue b/energy_management_ui/src/views/energyBalance/energyPic/index.vue
new file mode 100644
index 0000000..eebe485
--- /dev/null
+++ b/energy_management_ui/src/views/energyBalance/energyPic/index.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥祦鍒嗘瀽
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :auth="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <energyPic ref="energyPic"></energyPic>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import energyPic from "./energyPic";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+  export default {
+    components: {energyPic, ModelNode},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+      this.deviceCategory = this.$route.query.device_category;
+    },
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: [],
+        modelCode:undefined,
+        deviceCategory:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.energyPic.modelNodeChange(node,this.deviceCategory);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/index.vue b/energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/index.vue
new file mode 100644
index 0000000..f1569e7
--- /dev/null
+++ b/energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/index.vue
@@ -0,0 +1,55 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳借�楃洃娴嬫姤璀�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+          <MonitorAlarmSetting ref="MonitorAlarmSetting"></MonitorAlarmSetting>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import MonitorAlarmSetting from "./monitorAlarmSetting";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import {listModel} from "@/api/basicsetting/model";
+
+export default {
+  components: {MonitorAlarmSetting, ModelNode},
+  created() {
+    listModel({isShow: 1}).then(response => {
+      this.modelInfoOptions = response.data;
+      if (this.modelInfoOptions.length > 0) {
+        this.modelData = this.modelInfoOptions[0].modelCode;
+        this.$refs.modelNode.getList(this.modelData);
+      }
+    });
+  },
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: []
+    }
+  },
+  methods: {
+    changeNode: function (node) {
+      this.$refs.MonitorAlarmSetting.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/monitorAlarmSetting.vue b/energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/monitorAlarmSetting.vue
new file mode 100644
index 0000000..93e5165
--- /dev/null
+++ b/energy_management_ui/src/views/energyConsumptionAlarm/monitorAlarm/monitorAlarmSetting.vue
@@ -0,0 +1,296 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label+'--鑺傜偣閰嶇疆':'鑺傜偣閰嶇疆'}}</span>
+      </div>
+
+      <el-tabs>
+        <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+          <el-form-item label="鏃堕棿" prop="name">
+            <el-radio-group v-model="radio" size="mini" @change="timeChoose" ref="picker">
+              <el-radio label="year" size="mini" style="margin-right: 10px!important;" value="year">骞�</el-radio>
+              <el-radio label="month" size="mini" style="margin-right: 10px!important;" value="month">鏈�</el-radio>
+              <el-radio label="date" size="mini" value="day">鏃�</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item>
+            <div class="block">
+              <span class="demonstration"></span>
+              <el-date-picker
+                v-model="time"
+                :type="pickerType"
+                ref="mypicker">
+              </el-date-picker>
+            </div>
+          </el-form-item>
+          <el-form-item label="娴嬬偣鍚嶇О" prop="indexCategory">
+            <el-select v-model="queryParams.indexCategory" placeholder="璇烽�夋嫨鎸囨爣鍒嗙被" clearable
+                       style="width:150px"
+                       size="small">
+              <el-option
+                v-for="dict in indexCategoryOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" size="mini">瀵煎嚭</el-button>
+          </el-form-item>
+        </el-form>
+        <el-tab-pane :disabled="disabledSetting">
+          <span slot="label"><i class="el-icon-setting"></i>瀹炴椂鑳借��</span>
+          <!--琛ㄦ牸-->
+          <el-form :model="model"  ref="form">
+            <el-table v-loading="loading" :data="model.tableOptions" border @selection-change="handleSelectionChange"
+                      :default-sort = "{prop: 'date', order: 'descending'}">
+              <el-table-column type="selection" width="55" align="center"/>
+              <el-table-column label="鏃堕棿" align="center" prop="index"/>
+              <el-table-column label="娴嬬偣鍚嶇О" align="center" prop="name"/>
+              <el-table-column label="浣嶅彿" align="center" prop="data" class-name="small-padding fixed-width"/>
+              <el-table-column label="瀹為檯鍊�" align="center" prop="unit"/>
+              <el-table-column label="涓婇檺鍊�" align="center" prop="unit"/>
+              <el-table-column label="涓嬮檺鍊�" align="center" prop="unit"/>
+              <el-table-column label="瓒呴檺鐧惧垎姣�" align="center" prop="unit"/>
+              <el-table-column label="鎿嶄綔" width="150" align="center" class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit"
+                    @click="details(scope.row)"
+                    v-hasPermi="['system:set:query1']"
+                  >璇︽儏
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-form>
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+    <!-- 寮傚父澶勭悊璇︽儏 -->
+    <el-dialog :title="viewModel.title" :visible.sync="viewModel.open" width="500px">
+      <el-form ref="form" :model="form" label-width="120px" label-position="left">
+        <el-form-item label="鎶ヨ鐐�" prop="pointName">
+          <el-input v-model="form.pointName" placeholder="璇疯緭鍏ユ姤璀︾偣" />
+        </el-form-item>
+        <el-form-item label="鎶ヨ鍊�" prop="alarmVal">
+          <el-input v-model="form.alarmVal" placeholder="璇疯緭鍏ユ姤璀﹀��" />
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="state">
+          <el-input v-model="form.state" placeholder="璇疯緭鍏ョ姸鎬�" />
+        </el-form-item>
+        <el-form-item label="缁撴灉" prop="result">
+          <el-input v-model="form.result" placeholder="璇疯緭鍏ョ粨鏋�" />
+        </el-form-item>
+        <el-form-item label="澶勭悊浜哄憳" prop="processingPerson">
+          <el-input v-model="form.processingPerson" placeholder="璇疯緭鍏ュ鐞嗕汉鍛�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import {
+    delDevice,
+    delEnergy,
+    delIndex,
+    delProduct,
+    getSettingDevice,
+    getSettingEnergy,
+    getSettingIndex,
+    getSettingProduct,
+    setCollectIndex,
+    setDevice,
+    setEnergy,
+    setProduct
+  } from '@/api/basicsetting/modelNode'
+
+  export default {
+    name: "modelMonitorSetting",
+    data() {
+      return {
+        currentNode: '',
+        deviceDialog: false,
+        energyDialog: false,
+        productDialog: false,
+        collectIndexDialog: false,
+        indexLoading: false,
+        deviceLoading: false,
+        energyLoading: false,
+        productLoading: false,
+        settingEnergyList: [],
+        settingDeviceList: [],
+        settingProductList: [],
+        settingIndexList: [],
+        disabledSetting: true,
+        // 閬僵灞�
+        loading: false,
+        //琛ㄦ牸妯″瀷
+        model:{
+          tableOptions:[
+            // {
+            //   index:undefined,
+            //   name:undefined,
+            //   data:undefined,
+            //   unit:undefined
+            // }
+            {
+              index:"id001",
+              name:"鐜嬪皬铏�",
+              data:"30000",
+              unit:"WH"
+            }
+          ],
+        },
+        viewModel:{
+          title:"",
+          open:false
+        },
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined
+        },
+        radio:"",
+        time:"",
+        pickerType:"year",
+        // 娴嬬偣鍚嶇О
+        indexCategoryOptions: [
+          {
+            dictLabel:"娴嬬偣1",
+            dictValue:"娴嬬偣1"
+          },
+          {
+            dictLabel:"娴嬬偣2",
+            dictValue:"娴嬬偣2"
+          },
+          {
+            dictLabel:"娴嬬偣3",
+            dictValue:"娴嬬偣3"
+          },
+        ],
+        form:{
+          pointName:"FT001",
+          alarmVal:"20",
+          state:"宸插鐞�",
+          result:"璁惧瓒呰礋鑽疯繍琛岋紝宸插崗璋冪敓浜�",
+          processingPerson:"灏忛儜"
+        }
+      }
+    },
+    created() {
+      // setInterval(alert("鍝堝搱鍝堬紒锛�"),5000);
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.settingDeviceList = [];
+        this.settingIndexList = [];
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+          this.deviceLoading = true;
+          getSettingDevice(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingDeviceList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.deviceLoading = false;
+          });
+          this.energyLoading = true;
+          getSettingEnergy(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingEnergyList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.energyLoading = false;
+          });
+          this.productLoading = true;
+          getSettingProduct(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingProductList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.productLoading = false;
+          });
+          this.indexLoading = true;
+          getSettingIndex(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingIndexList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.indexLoading = false;
+          });
+        }
+      },
+      collectIndexSetting() {
+        this.collectIndexDialog = true;
+      },
+      showCollectIndexDialog() {
+        this.$nextTick(() => {
+          this.$refs.collectIndexSetting.init(this.currentNode, this.settingIndexList);
+        })
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.indexId);
+        this.names = selection.map(item => item.name);
+        this.single = selection.length !== 1;
+        this.multiple = !selection.length
+      },
+      getList() {
+        // console.log(this.myModelNode)
+        // if (this.myModelNode) {
+        //   this.loading = true;
+          // this.queryParams.nodeId = this.myModelNode.id;
+          //鎺ュ彛
+          // getSettingIndex(this.queryParams).then(response => {
+          //   this.model.energyindexList = response.data;
+          //   this.initstartstop();
+          //   this.loading = false;
+          // });
+
+        // } else {
+          this.model.tableOptions = [];
+// }
+      },
+      timeChoose(e){
+        this.pickerType = e;
+        this.$refs.mypicker.userInput = null;
+      },
+      details(){
+        this.viewModel.title="鎶ヨ淇℃伅澶勭悊璁板綍";
+        this.viewModel.open=true;
+      },
+      submitForm(){
+        this.viewModel.open=false;
+      },
+      cancel(){
+        this.viewModel.open=false;
+      }
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/benchmarkingMonitoring.vue b/energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/benchmarkingMonitoring.vue
new file mode 100644
index 0000000..66c562c
--- /dev/null
+++ b/energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/benchmarkingMonitoring.vue
@@ -0,0 +1,136 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item>
+        <el-radio v-model="radios" label="1">褰撳墠</el-radio>
+        <el-radio v-model="radios" label="2">鍏ㄩ儴</el-radio>
+      </el-form-item>
+      <el-form-item>
+        <el-radio v-model="radio" label="1">鏃ユ姤</el-radio>
+        <el-radio v-model="radio" label="2">鏈堟姤</el-radio>
+      </el-form-item>
+      <el-form-item>
+        <el-date-picker clearable size="small" style="width: 200px"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="璇烽�夋嫨鏃堕棿">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+        <el-button icon="el-icon-download" size="mini">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="cpzl"/>
+      <el-table-column label="璁¢噺鍗曚綅" align="center" prop="jldw"/>
+      <el-table-column label="鏍囨潌鑼冨洿" align="center" prop="bgfw"/>
+      <el-table-column label="鏍囨潌绫诲瀷" align="center">
+        <el-table-column label="骞冲潎鍊�" align="center" prop="pjz"/>
+        <el-table-column label="鍏堣繘鍊�" align="center" prop="xjz"/>
+        <el-table-column label="鐩爣鍊�" align="center" prop="mbz"/>
+      </el-table-column>
+      <el-table-column label="鎸囨爣鍊�" align="center" prop="zbz"/>
+      <el-table-column label="鑳芥晥鍋忓樊锛�%锛�" align="center">
+        <el-table-column label="骞冲潎鍊�" align="center" prop="pcpjz"/>
+        <el-table-column label="鍏堣繘鍊�" align="center" prop="pcxjz"/>
+        <el-table-column label="鐩爣鍊�" align="center" prop="pcmbz"/>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      radio: '1',
+      radios:'1',
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[{
+        "name": "鍏ㄥ巶",
+        "cpzl":"鐢佃�楅噺",
+        "jldw":"kwh",
+        "bgfw":"鍥藉唴",
+        "pjz":"665",
+        "xjz":"666",
+        "mbz":"667",
+        "zbz":"3120",
+        "pcpjz":"378.89",
+        "pcxjz":"378.18",
+        "pcmbz":"377.46",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      }],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+    };
+  },
+  created() {
+  },
+  methods: {
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.modelNodeChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/index.vue b/energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/index.vue
new file mode 100644
index 0000000..46fa16a
--- /dev/null
+++ b/energy_management_ui/src/views/energyEenchmarking/benchmarkingMonitoring/index.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥晥瀵规爣鐩戣
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"
+                     :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+         <benchmarkingMonitoring ref="benchmarkingMonitoring" style="padding:10px"></benchmarkingMonitoring>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import benchmarkingMonitoring from "./benchmarkingMonitoring";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,benchmarkingMonitoring},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        //this.$refs.EnergyActual.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/enchmarking.vue b/energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/enchmarking.vue
new file mode 100644
index 0000000..7d10342
--- /dev/null
+++ b/energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/enchmarking.vue
@@ -0,0 +1,441 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鍗曚綅鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ュ崟浣嶅悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鎸囨爣鍚嶇О" prop="codeId">
+        <el-input
+          v-model="queryParams.codeId"
+          placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鎸囨爣鍗曚綅" prop="unit">
+        <el-input
+          v-model="queryParams.unit"
+          placeholder="璇疯緭鍏ユ寚鏍囧崟浣�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏍囨潌鑼冨洿" prop="range">
+        <el-input
+          v-model="queryParams.range"
+          placeholder="璇疯緭鍏ユ爣鏉嗚寖鍥�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+        <el-form-item label="鏍囨潌绫诲瀷" prop="type">
+        <el-select v-model="queryParams.type" placeholder="璇烽�夋嫨鏍囨潌绫诲瀷" clearable size="small">
+          <el-option
+            v-for="dict in typeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鏍囨潌鍊�" prop="value">
+        <el-input
+          v-model="queryParams.value"
+          placeholder="璇疯緭鍏ユ爣鏉嗗��"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏈夋晥鏈�" prop="termValidity">
+        <el-date-picker clearable size="small" style="width: 200px"
+          v-model="queryParams.termValidity"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="閫夋嫨鏈夋晥鏈�">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['energyEenchmarking:energyEenchmarking:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['energyEenchmarking:energyEenchmarking:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['energyEenchmarking:energyEenchmarking:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['energyEenchmarking:energyEenchmarking:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="name" :formatter="nameFormat" />
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="codeId" :formatter="codeIdFormat" />
+      <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unit" :formatter="unitFormat" />
+      <el-table-column label="鏍囨潌鑼冨洿" align="center" prop="range" :formatter="rangeFormat" />
+      <el-table-column label="鏍囨潌绫诲瀷" align="center" prop="type" :formatter="typeFormat" />
+      <el-table-column label="鏍囨潌鍊�" align="center" prop="value" :formatter="valueFormat" />
+      <el-table-column label="鏈夋晥鏈�" align="center" prop="termValidity" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.termValidity) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['energyEenchmarking:energyEenchmarking:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['energyEenchmarking:energyEenchmarking:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="modelNodeChange"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀筫nergy_benchmarking瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" label-width="80px">
+        <el-form-item label="鏈夋晥鏈�" prop="id">
+          <el-input v-model="form.id" placeholder="璇疯緭鍏ユ湁鏁堟湡" />
+        </el-form-item>
+        <el-form-item label="鍗曚綅鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ崟浣嶅悕绉�" />
+        </el-form-item>
+        <el-form-item label="鎸囨爣鍚嶇О" prop="codeId">
+          <el-input v-model="form.codeId" placeholder="璇疯緭鍏ユ寚鏍囧悕绉�" />
+        </el-form-item>
+        <el-form-item label="鎸囨爣鍗曚綅" prop="unit">
+          <el-input v-model="form.unit" placeholder="璇疯緭鍏ユ寚鏍囧崟浣�" />
+        </el-form-item>
+        <el-form-item label="鏍囨潌鑼冨洿" prop="range">
+          <el-input v-model="form.range" placeholder="璇疯緭鍏ユ爣鏉嗚寖鍥�" />
+        </el-form-item>
+        <el-form-item label="鏍囨潌绫诲瀷">
+          <el-select v-model="form.type" placeholder="璇烽�夋嫨鏍囨潌绫诲瀷">
+            <el-option
+              v-for="dict in typeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏍囨潌鍊�" prop="value">
+          <el-input v-model="form.value" placeholder="璇疯緭鍏ユ爣鏉嗗��" />
+        </el-form-item>
+        <el-form-item label="鏈夋晥鏈�" prop="termValidity">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.termValidity"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨鏈夋晥鏈�">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listEnergyEenchmarking, getEnergyEenchmarking, delEnergyEenchmarking, addEnergyEenchmarking, updateEnergyEenchmarking, exportEnergyEenchmarking } from "@/api/energyEenchmarking/energyEenchmarking";
+import {getSettingIndex} from "@/api/energyStatistics/statistics";
+export default {
+  name: 'enchmarking',
+  name: 'Index',
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏈夋晥鏈熷瓧鍏�
+      /*idOptions: [],
+      // 鍗曚綅鍚嶇О瀛楀吀
+      nameOptions: [],
+      // 鎸囨爣鍚嶇О瀛楀吀
+      codeIdOptions: [],
+      // 鎸囨爣鍗曚綅瀛楀吀
+      unitOptions: [],
+      // 鏍囨潌鑼冨洿瀛楀吀
+      rangeOptions: [],
+      // 鏍囨潌绫诲瀷瀛楀吀
+      typeOptions: [],
+      // 鏍囨潌鍊煎瓧鍏�
+      valueOptions: [],
+      // 鏈夋晥鏈熷瓧鍏�
+      termValidityOptions: [],*/
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+    };
+  },
+  created() {
+    //this.getList();
+    /*this.getDicts("${column.dictType}").then(response => {
+      this.idOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.nameOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.codeIdOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.unitOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.rangeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.typeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.valueOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.termValidityOptions = response.data;
+    });*/
+  },
+  methods: {
+    /** 鏌ヨenergy_benchmarking鍒楄〃 */
+    modelNodeChange(modelNode) {
+      //鑾峰彇妯″瀷鑾峰彇鎸囨爣
+      getSettingIndex(modelNode.id).then(response => {
+        this.loading = true;
+        this.queryParams.modelNode=modelNode.id;
+        listEnergyEenchmarking(this.queryParams).then(response => {
+          this.energyEenchmarkingList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      })
+    },
+    // 鏈夋晥鏈熷瓧鍏哥炕璇�
+    /*idFormat(row, column) {
+      return this.selectDictLabel(this.idOptions, row.id);
+    },
+    // 鍗曚綅鍚嶇О瀛楀吀缈昏瘧
+    nameFormat(row, column) {
+      return this.selectDictLabel(this.nameOptions, row.name);
+    },
+    // 鎸囨爣鍚嶇О瀛楀吀缈昏瘧
+    codeIdFormat(row, column) {
+      return this.selectDictLabel(this.codeIdOptions, row.codeId);
+    },
+    // 鎸囨爣鍗曚綅瀛楀吀缈昏瘧
+    unitFormat(row, column) {
+      return this.selectDictLabel(this.unitOptions, row.unit);
+    },
+    // 鏍囨潌鑼冨洿瀛楀吀缈昏瘧
+    rangeFormat(row, column) {
+      return this.selectDictLabel(this.rangeOptions, row.range);
+    },
+    // 鏍囨潌绫诲瀷瀛楀吀缈昏瘧
+    typeFormat(row, column) {
+      return this.selectDictLabel(this.typeOptions, row.type);
+    },
+    // 鏍囨潌鍊煎瓧鍏哥炕璇�
+    valueFormat(row, column) {
+      return this.selectDictLabel(this.valueOptions, row.value);
+    },
+    // 鏈夋晥鏈熷瓧鍏哥炕璇�
+    termValidityFormat(row, column) {
+      return this.selectDictLabel(this.termValidityOptions, row.termValidity);
+    },*/
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.modelNodeChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑳芥晥瀵规爣";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEnergyEenchmarking(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑳芥晥瀵规爣";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateEnergyEenchmarking(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.modelNodeChange();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnergyEenchmarking(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.modelNodeChange();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑳芥晥瀵规爣缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delEnergyEenchmarking(ids);
+        }).then(() => {
+          this.modelNodeChange();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportEnergyEenchmarking(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/index.vue b/energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/index.vue
new file mode 100644
index 0000000..987b915
--- /dev/null
+++ b/energy_management_ui/src/views/energyEenchmarking/energyEenchmarking/index.vue
@@ -0,0 +1,60 @@
+
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥晥瀵规爣
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"
+                     :auth="false"></ModelNode>
+          <!--<ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>-->
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <EnergyIndex ref="EnergyIndex" style="padding:10px"></EnergyIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import EnergyIndex from "./enchmarking";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,EnergyIndex},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.EnergyIndex.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyExamine/assessmentIndex/addIndexTable.vue b/energy_management_ui/src/views/energyExamine/assessmentIndex/addIndexTable.vue
new file mode 100644
index 0000000..586c3e1
--- /dev/null
+++ b/energy_management_ui/src/views/energyExamine/assessmentIndex/addIndexTable.vue
@@ -0,0 +1,121 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" :append-to-body="true" width="800px" top="5vh">
+    <!--
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item>
+        <el-button icon="el-icon-refresh" size="mini" @click="createIndex">鐢熸垚鎸囨爣</el-button>
+      </el-form-item>
+    </el-form>-->
+
+
+    <el-row>
+      <el-table v-loading="loading" :data="impIndexList" @selection-change="handleSelectionChange" stripe max-height="350">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"  />
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"  />
+      </el-table>
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handsave">淇� 瀛�</el-button>
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listIndex,addIndex } from "@/api/energyExamine/addIndex";
+
+export default {
+  data() {
+    return {
+      //妯″瀷鑺傜偣
+      modeNode:'',
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      qjcode:"",
+      //  鎸囨爣  琛ㄦ牸鏁版嵁
+      impIndexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      },
+    };
+  },
+  created() {
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(modeNode) {
+      this.modeNode=modeNode;
+      this.reset();
+      this.getList();
+      this.title="娣诲姞"+this.modeNode.label+"鑰冩牳鎸囨爣";
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ  鎸囨爣
+    getList() {
+      listIndex("STATISTIC",this.modeNode.id).then(response => {
+        this.impIndexList = response.data;
+        this.loading = false;
+      });
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.indexId)
+    },
+    /** 淇濆瓨鎸夐挳鎿嶄綔 */
+    handsave()
+    {
+      if(this.ids==null || this.ids.length<=0){
+        this.msgSuccess("璇烽�夋嫨鎸囨爣!");
+        return;
+      }
+      addIndex(this.ids,this.modeNode.id).then(response => {
+        if(response!=null && response.code=="200")
+        {
+          this.msgSuccess(response.msg);
+          this.open=false;
+        }else{
+          this.msgSuccess(response.msg);
+        }
+      });
+    },
+    /** 鍏抽棴鎸夐挳鎿嶄綔 */
+    handclose()
+    {
+      this.open=false;
+    },
+
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/energyExamine/assessmentIndex/assessmentIndex.vue b/energy_management_ui/src/views/energyExamine/assessmentIndex/assessmentIndex.vue
new file mode 100644
index 0000000..8bc0d1c
--- /dev/null
+++ b/energy_management_ui/src/views/energyExamine/assessmentIndex/assessmentIndex.vue
@@ -0,0 +1,171 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑰冩牳鎸囨爣绠$悊">
+        <el-radio v-model="radio" label="1">褰撳墠鍗曞厓</el-radio>
+        <el-radio v-model="radio" label="2">鍖呭惈涓嬬骇</el-radio>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini">鏂板</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="zbname"/>
+      <el-table-column label="璁¢噺鍗曚綅" align="center" prop="jldw"/>
+      <el-table-column label="鑰冩牳渚濇嵁" align="center">
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="nhjh"/>
+        <el-table-column label="鑳芥晥瀵规爣" align="center" prop="nhdb"/>
+        <el-table-column label="鑳芥簮鍙屾帶" align="center" prop="nysk"/>
+        <el-table-column label="鎸囧畾鏍囧噯" align="center" prop="zdbz"/>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button  size="mini" type="text" icon="el-icon-edit" >淇敼</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      radio: '1',
+
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[{
+        "name": "鍏ㄥ巶",
+        "zbname":"鐢佃�楅噺",
+        "jldw":"鍗冪摝鏃�",
+        "nhjh":"脳",
+        "nhdb":"鈭�",
+        "nysk":"脳",
+        "zdbz":"脳",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "鍏ㄥ巶",
+        "zbname":"澶╃劧姘旇�楅噺",
+        "jldw":"绔嬫柟绫�",
+        "nhjh":"脳",
+        "nhdb":"脳",
+        "nysk":"脳",
+        "zdbz":"脳",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "鍏ㄥ巶",
+        "zbname":"鐒︾偔鑰楅噺",
+        "jldw":"鐒﹁��",
+        "nhjh":"鈭�",
+        "nhdb":"鈭�",
+        "nysk":"鈭�",
+        "zdbz":"鈭�",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "鍏ㄥ巶",
+        "zbname":"姘磋�楅噺",
+        "jldw":"绔嬫柟绫�",
+        "nhjh":"脳",
+        "nhdb":"脳",
+        "nysk":"脳",
+        "zdbz":"脳",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      }],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+    };
+  },
+  created() {
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      //this.queryParams.nodeId = modelNode.id;
+      //this.getList();
+      //this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+      //if (modelNode) {
+      //  this.currentNode = modelNode;
+      //}
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.modelNodeChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyExamine/assessmentIndex/create_index.vue b/energy_management_ui/src/views/energyExamine/assessmentIndex/create_index.vue
new file mode 100644
index 0000000..19b0e2d
--- /dev/null
+++ b/energy_management_ui/src/views/energyExamine/assessmentIndex/create_index.vue
@@ -0,0 +1,393 @@
+<template>
+  <div class="app-container">
+    <span>{{modeNode?modeNode.label:''}}</span>
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <el-form-item>
+        <el-radio-group v-model="queryParams.eierarchyFlag">
+          <el-radio label="B" style="margin-right: 10px!important;" onselect="true">褰撳墠鍗曞厓</el-radio>
+          <el-radio label="ALL">鍖呭惈涓嬬骇</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="selectList">鏌ヨ</el-button>
+          <el-button
+            type="primary"
+            icon="el-icon-plus"
+            size="mini"
+            @click="openImportIndexTable()"
+            v-hasPermi="['energyExamine:assessmentIndex:add']"
+          >娣诲姞</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+    </el-row>
+
+    <el-table v-loading="loading" :data="assessmentIndexList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="modename"/>
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexname"/>
+      <el-table-column label="璁¢噺鍗曚綅" align="center" prop="jldw"/>
+      <el-table-column label="鑰冩牳渚濇嵁" align="center">
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="plan" :formatter="planFormat"/>
+        <el-table-column label="鑳芥晥瀵规爣" align="center" prop="benchmarking" :formatter="benchmarkingFormat"/>
+        <el-table-column label="鑳芥簮鍙屾帶" align="center" prop="dualControl" :formatter="dualControlFormat"/>
+        <el-table-column label="鎸囧畾鏍囧噯" align="center" prop="customStandard" :formatter="customStandardFormat"/>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['energyExamine:assessmentIndex:edit']"
+          >鑰冩牳渚濇嵁</el-button>
+
+
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['energyExamine:assessmentIndex:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀圭敤鑳借�冩牳鏍囧噯瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="open" width="600px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="鍗曚綅鍚嶇О" prop="modename">
+              <el-input v-model="form.modename" readonly="readonly" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎸囨爣鍚嶇О" prop="indexname">
+              <el-input v-model="form.indexname"  readonly="readonly"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璁¢噺鍗曚綅" prop="jldw">
+              <el-input v-model="form.jldw"  readonly="readonly"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="" label-width="30px">
+              <el-checkbox v-model="form.plan" name="plan">鑳借�楄鍒掑�间綔涓哄弬鑰冧緷鎹�</el-checkbox>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label=""  label-width="30px">
+              <el-checkbox v-model="form.benchmarking" name="benchmarking" >鑳借�楀鏍囧�间綔涓哄弬鑰冧緷鎹�</el-checkbox>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+              <el-form-item label="鏍囨潌鑼冨洿" >
+                <el-select v-model="form.benchRange" placeholder="璇烽�夋嫨鏍囨潌鑼冨洿">
+                  <el-option
+                    v-for="dict in benchRangeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏍囨潌绫诲瀷"  >
+            <el-select v-model="form.benchType" placeholder="璇烽�夋嫨鏍囨潌绫诲瀷">
+              <el-option
+                v-for="dict in benchTypeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+              ></el-option>
+            </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label=""  label-width="30px">
+            <el-checkbox v-model="form.dualControl" name="dualControl">鑳芥簮鍙屾帶鍊间綔涓哄弬鑰冧緷鎹�</el-checkbox>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label=""  label-width="30px">
+            <el-checkbox v-model="form.customStandard" >鎸囧畾鏍囧噯浣滀负鍙傝�冧緷鎹�</el-checkbox>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label=""  label-width="10px">
+              <el-input v-model="form.customVal" size="mini"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <addIndexTable ref="addIndex"   />
+
+  </div>
+</template>
+
+<script>
+  import { listAssessmentIndex,listAssessmentIndexModel , getAssessmentIndex, delAssessmentIndex, addAssessmentIndex, updateAssessmentIndex, exportAssessmentIndex } from "@/api/energyExamine/assessmentIndex";
+  import addIndexTable from "./addIndexTable";
+  export default {
+    name: "implement",
+    components: { addIndexTable },
+    data() {
+      return {
+        //妯″瀷鑺傜偣
+        modeNode:'',
+        // 閬僵灞�
+        loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鐢ㄨ兘鑰冩牳鏍囧噯琛ㄦ牸鏁版嵁
+        assessmentIndexList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭id瀛楀吀
+        idOptions: [],
+        // 妯″瀷鑺傜偣id瀛楀吀
+        modeNodeIdOptions: [],
+        // 鎸囨爣id瀛楀吀
+        indexIdOptions: [],
+        // 鏄惁鑳借�楄鍒� Y  N瀛楀吀
+        planOptions: [],
+        // 鏄惁瀵规爣 Y  N瀛楀吀
+        benchmarkingOptions: [],
+        // 鏍囨潌鑼冨洿瀛楀吀椤瑰瓧鍏�
+        benchRangeOptions: [],
+        // 鏍囨潌绫诲瀷瀛楀吀椤瑰瓧鍏�
+        benchTypeOptions: [],
+        // 鏄惁鑳芥簮鍙屾帶 Y N瀛楀吀
+        dualControlOptions: [],
+        // 鏄惁鑷畾涔夋爣鍑� Y  N瀛楀吀
+        customStandardOptions: [],
+        // 鎸囧畾鑷畾涔夋爣鍑嗘暟鍊煎瓧鍏�
+        customValOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          eierarchyFlag:"B",
+          pageNum: 1,
+          pageSize: 10,
+        },
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        setIndexWindow:{
+          title:"娣诲姞鎸囨爣",
+          open:false,
+          indexList:[]
+        },
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          customVal: [
+            { required: true, pattern:/^\+?[1-9]\d*$/,message: "鎸囧畾鏍囧噯鍊煎彧鑳芥槸鏁板瓧", trigger: "blur" }
+          ],
+        }
+      };
+    },
+    created() {
+      this.getList();
+
+      this.getDicts("benchmarkingRange").then(response => {
+        this.benchRangeOptions = response.data;
+      });
+      this.getDicts("benchmarkingType").then(response => {
+        this.benchTypeOptions = response.data;
+      });
+
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        if(modelNode)
+        {
+          this.modeNode=modelNode;
+          this.getList();
+        }
+        console.log("lable="+modelNode.label);
+        console.log("id="+modelNode.id);
+      },
+      /** 鏌ヨ鐢ㄨ兘鑰冩牳鏍囧噯鍒楄〃 */
+      getList() {
+        this.loading = true;
+        listAssessmentIndexModel(this.modeNode.id,this.queryParams).then(response => {
+          this.assessmentIndexList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+
+      // 閫氱敤绗﹀彿鏍煎紡鍖�
+      planFormat(row, column) {
+        return row.plan?"鈭�":"X";
+      },
+      benchmarkingFormat(row, column) {
+        return row.benchmarking?"鈭�":"X";
+      },
+      dualControlFormat(row, column) {
+        return row.dualControl?"鈭�":"X";
+      },
+      customStandardFormat(row, column) {
+        return row.customStandard?"鈭�  "+row.customVal:"X";
+      },
+      /**     // 鏄惁瀵规爣 Y  N瀛楀吀缈昏瘧
+      benchmarkingFormat(row, column) {
+        return this.selectDictLabel(this.benchmarkingOptions, row.benchmarking);
+      },
+
+      // 鏄惁鑳芥簮鍙屾帶 Y N瀛楀吀缈昏瘧
+      dualControlFormat(row, column) {
+        return this.selectDictLabel(this.dualControlOptions, row.dualControl);
+      },
+      // 鏄惁鑷畾涔夋爣鍑� Y  N瀛楀吀缈昏瘧
+      customStandardFormat(row, column) {
+        return this.selectDictLabel(this.customStandardOptions, row.customStandard);
+      },
+   */
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          modeNodeId: undefined,
+          indexId: undefined,
+          plan: undefined,
+          benchmarking: undefined,
+          benchRange: undefined,
+          benchType: undefined,
+          dualControl: undefined,
+          customStandard: undefined,
+          customVal: undefined
+        };
+        this.resetForm("form");
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.id)
+        this.single = selection.length!=1
+        this.multiple = !selection.length
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        this.open = true;
+        this.title = "娣诲姞鐢ㄨ兘鑰冩牳鏍囧噯";
+      },
+      /** 淇敼鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        const id = row.id || this.ids
+        getAssessmentIndex(id).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "鎸囨爣鑰冩牳渚濇嵁璁剧疆";
+        });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitForm: function() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            if (this.form.id != undefined) {
+              updateAssessmentIndex(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇敼鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              addAssessmentIndex(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("鏂板鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+      handleDelete(row) {
+        const indexname = row.indexname;
+        this.$confirm('鏄惁纭鍒犻櫎鎸囨爣涓�"' + indexname + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delAssessmentIndex(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夌敤鑳借�冩牳鏍囧噯鏁版嵁椤�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportAssessmentIndex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+      },
+      /** 鎵撳紑鎸囨爣琛ㄥ脊绐� */
+      openImportIndexTable() {
+        this.$refs.addIndex.show(this.modeNode);
+      },
+      //鏌ヨ鍔熻兘
+      selectList()
+      {
+        this.getList();
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyExamine/assessmentIndex/index.vue b/energy_management_ui/src/views/energyExamine/assessmentIndex/index.vue
new file mode 100644
index 0000000..0722f06
--- /dev/null
+++ b/energy_management_ui/src/views/energyExamine/assessmentIndex/index.vue
@@ -0,0 +1,61 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑰冩牳鏍囧噯绠$悊
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"
+                     :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <assessmentIndex ref="assessmentIndex" style="padding:10px"></assessmentIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  // import assessmentIndex from "./assessmentIndex";
+  import assessmentIndex from "./create_index";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,assessmentIndex},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: [],
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.assessmentIndex.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyExamine/assessmentResults/assessmentResults.vue b/energy_management_ui/src/views/energyExamine/assessmentResults/assessmentResults.vue
new file mode 100644
index 0000000..7cbfa77
--- /dev/null
+++ b/energy_management_ui/src/views/energyExamine/assessmentResults/assessmentResults.vue
@@ -0,0 +1,226 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item>
+        <el-radio v-model="radio" label="1">褰撳墠鍗曞厓</el-radio>
+        <el-radio v-model="radio" label="2">鍖呭惈涓嬩竴绾�</el-radio>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿">
+        <el-date-picker
+          type="daterange"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="鑰冩牳渚濇嵁">
+        <el-checkbox-group v-model="checkList">
+          <el-checkbox label="鑳借�楄鍒�"></el-checkbox>
+          <el-checkbox label="鑳芥晥瀵规爣"></el-checkbox>
+          <el-checkbox label="鑳芥簮鍙屾帶"></el-checkbox>
+          <el-checkbox label="鎸囧畾鏍囧噯"></el-checkbox>
+        </el-checkbox-group>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+        <el-button icon="el-icon-download" size="mini">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <div style="margin: 20px;text-align: center;font-weight: 600;">
+      <span style="float: left;">缁熻鑼冨洿锛氬叏鍘�</span>
+      <span>鑳芥晥鑰冩牳缁撴灉</span>
+      <span style="float: right;">缁熻鍖洪棿锛歿{times}}</span>
+    </div>
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column label="鏃ユ湡" align="center" prop="time"/>
+      <el-table-column label="鐢佃�楅噺" align="center">
+        <el-table-column label="瀹為檯閲�" align="center" prop="dsjl"/>
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="dnhjh"/>
+      </el-table-column>
+      <el-table-column label="澶╃劧姘旇�楅噺" align="center">
+        <el-table-column label="瀹為檯閲�" align="center" prop="tsjl"/>
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="tnhjh"/>
+      </el-table-column>
+      <el-table-column label="姘磋�楅噺" align="center">
+        <el-table-column label="瀹為檯閲�" align="center" prop="ssjl"/>
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="snhjh"/>
+      </el-table-column>
+      <el-table-column label="鐒︾偔鑰楅噺" align="center">
+        <el-table-column label="瀹為檯閲�" align="center" prop="jsjl"/>
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="jnhjh"/>
+      </el-table-column>
+      <el-table-column label="娌硅�楅噺" align="center">
+        <el-table-column label="瀹為檯閲�" align="center" prop="ysjl"/>
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="ynhjh"/>
+      </el-table-column>
+      <el-table-column label="缁煎悎鑰楅噺" align="center">
+        <el-table-column label="瀹為檯閲�" align="center" prop="zsjl"/>
+        <el-table-column label="鑳借�楄鍒�" align="center" prop="znhjh"/>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      radio: '1',
+      checkList: ['鑳借�楄鍒�'],
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[{
+        "time": "2019-02-01",
+        "dsjl":"-",
+        "dnhjh":"-",
+        "tsjl":"244.42",
+        "tnhjh":"-",
+        "ssjl":"343.42",
+        "snhjh":"-",
+        "jsjl":"196.12",
+        "jnhjh":"-",
+        "ysjl":"358.44",
+        "ynhjh":"-",
+        "zsjl":"1716.39",
+        "znhjh":"-",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "time": "2019-02-02",
+        "dsjl":"-",
+        "dnhjh":"-",
+        "tsjl":"392.13",
+        "tnhjh":"-",
+        "ssjl":"382.95",
+        "snhjh":"-",
+        "jsjl":"164.3",
+        "jnhjh":"-",
+        "ysjl":"278.17",
+        "ynhjh":"-",
+        "zsjl":"1813.69",
+        "znhjh":"-",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "time": "2019-02-03",
+        "dsjl":"-",
+        "dnhjh":"-",
+        "tsjl":"213.91",
+        "tnhjh":"-",
+        "ssjl":"263.23",
+        "snhjh":"-",
+        "jsjl":"308.81",
+        "jnhjh":"-",
+        "ysjl":"327.49",
+        "ynhjh":"-",
+        "zsjl":"1698.82",
+        "znhjh":"-",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "time": "2019-02-04",
+        "dsjl":"-",
+        "dnhjh":"-",
+        "tsjl":"355.44",
+        "tnhjh":"-",
+        "ssjl":"260.75",
+        "snhjh":"-",
+        "jsjl":"232.01",
+        "jnhjh":"-",
+        "ysjl":"253.9",
+        "ynhjh":"-",
+        "zsjl":"1486.82",
+        "znhjh":"-",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      }],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+      times:"",
+    };
+  },
+  created() {
+  },
+  methods: {
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.modelNodeChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.times = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyExamine/assessmentResults/index.vue b/energy_management_ui/src/views/energyExamine/assessmentResults/index.vue
new file mode 100644
index 0000000..3fe985a
--- /dev/null
+++ b/energy_management_ui/src/views/energyExamine/assessmentResults/index.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥晥鑰冩牳缁撴灉
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"
+                     :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <assessmentResults ref="assessmentResults" style="padding:10px"></assessmentResults>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import assessmentResults from "./assessmentResults";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,assessmentResults},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        //this.$refs.EnergyActual.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyMonitoring/e-gasMonitoring/index.vue b/energy_management_ui/src/views/energyMonitoring/e-gasMonitoring/index.vue
new file mode 100644
index 0000000..1759736
--- /dev/null
+++ b/energy_management_ui/src/views/energyMonitoring/e-gasMonitoring/index.vue
@@ -0,0 +1,205 @@
+<!--<template>-->
+<!--  -->
+<!--</template>-->
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            瀹炴椂鏁版嵁缁勬�佸浘
+          </div>
+          <el-input
+            placeholder="杈撳叆鍏抽敭瀛楄繘琛岃繃婊�"
+            v-model="filterText">
+          </el-input>
+
+          <el-tree
+            class="filter-tree"
+            :data="svgData"
+            :props="defaultProps"
+            default-expand-all
+            :filter-node-method="filterNode"
+            ref="tree">
+          </el-tree>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+<!--          <el-tabs v-model="activeName" @tab-click="handleClick">-->
+<!--            <el-tab-pane label="妫�娴嬪浘" name="first">鐢ㄦ埛绠$悊</el-tab-pane>-->
+<!--            <el-tab-pane label="鎶ヨ〃" name="second">閰嶇疆绠$悊</el-tab-pane>-->
+<!--            <el-tab-pane label="瓒嬪娍鍥�" name="third">瑙掕壊绠$悊</el-tab-pane>-->
+<!--            <el-tab-pane label="鎶ヨ璁板綍" name="fourth">瀹氭椂浠诲姟琛ュ伩</el-tab-pane>-->
+<!--          </el-tabs>-->
+          <svg-icon v-bind:iconClass="imgShow.realName" className='icon'></svg-icon>
+        </el-main>
+<!--        <el-main style="padding:0">-->
+<!--          <realTimeSetting ref="realTimeSetting"></realTimeSetting>-->
+<!--        </el-main>-->
+<!--        <svg-icon v-bind:iconClass="imgShow.realName" className='icon'></svg-icon>-->
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<style scoped>
+  .icon {
+    width: 970px;
+    height: 550px;
+  }
+</style>
+<script>
+    import {
+        listEquipmentfile,
+    } from "@/api/basicSetup/equipmentfile";
+    export default {
+        watch: {
+            filterText(val) {
+                this.$refs.tree.filter(val);
+            }
+        },
+        data() {
+            var choiceIndex;
+            var Indexid;
+            var realName = "2020-03-12-275a44966506b783f033058f9e0e3472";
+            return {
+                //鍙宠竟鑿滃崟鏍�
+                activeName: '瀹炴椂鐩戞祴',
+                // 閬僵灞�
+                loading: true,
+                // 閫変腑鏁扮粍
+                ids: [],
+                // 闈炲崟涓鐢�
+                single: true,
+                // 闈炲涓鐢�
+                multiple: true,
+                // 鎬绘潯鏁�
+                total: 0,
+                //
+                imgShow:[
+                    realName=""
+                ],
+                // 缁勬�佸浘琛ㄦ牸鏁版嵁
+                equipmentfileList: [],
+                //娴嬬偣琛ㄦ牸鏁版嵁
+                equipmentfilecdList: [
+                    choiceIndex = ""
+                ],
+                // 寮瑰嚭灞傛爣棰�
+                title: "",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                footopen: false,
+                addImgOpen: false,
+                uploadOpen: false,
+                indexLoading: false,
+                //缁勬�佸浘閫夋嫨鎸囨爣
+                statisticIndexDialog: false,
+                //缁勬�佸浘娴嬬偣寮瑰嚭灞�
+                imgcdopen: false,
+                // ID瀛楀吀
+                fileidOptions: [],
+                // 鏂囦欢鍚嶇О瀛楀吀
+                filenameOptions: [],
+                // 鏂囦欢缂栧彿瀛楀吀
+                filenoOptions: [],
+                // 鎿嶄綔浜哄瓧鍏�
+                opomanOptions: [],
+                // 鎿嶄綔鏃堕棿瀛楀吀
+                opotimeOptions: [],
+                // 鏂囦欢璺緞瀛楀吀
+                filepathOptions: [],
+                // 澶囨敞瀛楀吀
+                noteOptions: [],
+                settingStatisticIndexList: [],
+                // 琛ㄥ崟鍙傛暟
+                form: {},
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    filename: [
+                        {required: true, message: "鏂囦欢鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+                    ], fileno: [
+                        {required: true, message: "鏂囦欢缂栧彿涓嶈兘涓虹┖", trigger: "blur"}
+                    ],
+                },
+                filterText: '',
+                svgData:[{
+                    id:1,
+                    label:"鐢熶骇浼佷笟",
+                    children:[{
+                        id:2,
+                        label:"姘寸郴缁�",
+                    },{
+                        id:3,
+                        label: "鐢电郴缁�",
+                    }],
+                }],
+                defaultProps: {
+                    children: 'children',
+                    label: 'label'
+                },
+            };
+        },
+        created() {
+            this.getList();
+            this.imgShow.realName = "dian";
+        },
+        methods: {
+            //閫氳繃
+            handleClick(tab, event) {
+                console.log(tab, event);
+            },
+            //鍒囨崲缁勬�佸浘鏌ョ湅
+            updateImg(row){
+                var pos = row.filepath.lastIndexOf('/');
+                var str = row.filepath.substr(pos+1);
+                this.imgShow.realName = str.substring(0,str.length-4);
+                console.log(this.imgShow.realName)
+            },
+            //閫氳繃鍏抽敭瀛楄繘琛岃繃婊ょ粍鎬佸浘
+            filterNode(value, data) {
+                if (!value) return true;
+                return data.label.indexOf(value) !== -1;
+            },
+            /** 鏌ヨ缁勬�佸浘鍒楄〃 */
+            getList() {
+                this.loading = true;
+                listEquipmentfile(this.queryParams).then(response => {
+                    this.equipmentfileList = response.rows;
+                    this.total = response.total;
+                    this.loading = false;
+                });
+            },
+            // 鍙栨秷鎸夐挳
+            cancel() {
+                this.open = false;
+                this.reset();
+            },
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    fileid: undefined,
+                    filename: undefined,
+                    fileno: undefined,
+                    opoman: undefined,
+                    opotime: undefined,
+                    filepath: undefined,
+                    note: undefined,
+                    img: undefined
+                };
+                this.resetForm("form");
+            },
+            /** 鎼滅储鎸夐挳鎿嶄綔 */
+            handleQuery() {
+                this.queryParams.pageNum = 1;
+                this.getList();
+            },
+            /** 閲嶇疆鎸夐挳鎿嶄綔 */
+            resetQuery() {
+                this.resetForm("queryForm");
+                this.handleQuery();
+            },
+        }
+    };
+</script>
diff --git a/energy_management_ui/src/views/energyMonitoring/eMonitoring/svgView/index.vue b/energy_management_ui/src/views/energyMonitoring/eMonitoring/svgView/index.vue
new file mode 100644
index 0000000..bc9d0e1
--- /dev/null
+++ b/energy_management_ui/src/views/energyMonitoring/eMonitoring/svgView/index.vue
@@ -0,0 +1,185 @@
+<!--<template>-->
+<!--  -->
+<!--</template>-->
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-container>
+        <el-main style="padding:0">
+<!--          <el-tabs v-model="activeName" @tab-click="handleClick">-->
+<!--            <el-tab-pane label="妫�娴嬪浘" name="first">鐢ㄦ埛绠$悊</el-tab-pane>-->
+<!--            <el-tab-pane label="鎶ヨ〃" name="second">閰嶇疆绠$悊</el-tab-pane>-->
+<!--            <el-tab-pane label="瓒嬪娍鍥�" name="third">瑙掕壊绠$悊</el-tab-pane>-->
+<!--            <el-tab-pane label="鎶ヨ璁板綍" name="fourth">瀹氭椂浠诲姟琛ュ伩</el-tab-pane>-->
+<!--          </el-tabs>-->
+          <svg-icon v-bind:iconClass="imgShow.realName" className='icon'></svg-icon>
+        </el-main>
+<!--        <el-main style="padding:0">-->
+<!--          <realTimeSetting ref="realTimeSetting"></realTimeSetting>-->
+<!--        </el-main>-->
+<!--        <svg-icon v-bind:iconClass="imgShow.realName" className='icon'></svg-icon>-->
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<style scoped>
+  .icon {
+    width: 970px;
+    height: 550px;
+  }
+</style>
+<script>
+    import {
+        listEquipmentfile,
+    } from "@/api/basicSetup/equipmentfile";
+    export default {
+        watch: {
+            filterText(val) {
+                this.$refs.tree.filter(val);
+            }
+        },
+        data() {
+            var choiceIndex;
+            var Indexid;
+            var realName = "2020-03-12-275a44966506b783f033058f9e0e3472";
+            return {
+                //鍙宠竟鑿滃崟鏍�
+                activeName: '瀹炴椂鐩戞祴',
+                // 閬僵灞�
+                loading: true,
+                // 閫変腑鏁扮粍
+                ids: [],
+                // 闈炲崟涓鐢�
+                single: true,
+                // 闈炲涓鐢�
+                multiple: true,
+                // 鎬绘潯鏁�
+                total: 0,
+                //
+                imgShow:[
+                    realName=""
+                ],
+                // 缁勬�佸浘琛ㄦ牸鏁版嵁
+                equipmentfileList: [],
+                //娴嬬偣琛ㄦ牸鏁版嵁
+                equipmentfilecdList: [
+                    choiceIndex = ""
+                ],
+                // 寮瑰嚭灞傛爣棰�
+                title: "",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                footopen: false,
+                addImgOpen: false,
+                uploadOpen: false,
+                indexLoading: false,
+                //缁勬�佸浘閫夋嫨鎸囨爣
+                statisticIndexDialog: false,
+                //缁勬�佸浘娴嬬偣寮瑰嚭灞�
+                imgcdopen: false,
+                // ID瀛楀吀
+                fileidOptions: [],
+                // 鏂囦欢鍚嶇О瀛楀吀
+                filenameOptions: [],
+                // 鏂囦欢缂栧彿瀛楀吀
+                filenoOptions: [],
+                // 鎿嶄綔浜哄瓧鍏�
+                opomanOptions: [],
+                // 鎿嶄綔鏃堕棿瀛楀吀
+                opotimeOptions: [],
+                // 鏂囦欢璺緞瀛楀吀
+                filepathOptions: [],
+                // 澶囨敞瀛楀吀
+                noteOptions: [],
+                settingStatisticIndexList: [],
+                // 琛ㄥ崟鍙傛暟
+                form: {},
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    filename: [
+                        {required: true, message: "鏂囦欢鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+                    ], fileno: [
+                        {required: true, message: "鏂囦欢缂栧彿涓嶈兘涓虹┖", trigger: "blur"}
+                    ],
+                },
+                filterText: '',
+                svgData:[{
+                    id:1,
+                    label:"鐢熶骇浼佷笟",
+                    children:[{
+                        id:2,
+                        label:"姘寸郴缁�",
+                    },{
+                        id:3,
+                        label: "鐢电郴缁�",
+                    }],
+                }],
+                defaultProps: {
+                    children: 'children',
+                    label: 'label'
+                },
+            };
+        },
+        created() {
+            this.getList();
+            this.imgShow.realName = "dian";
+        },
+        methods: {
+            //閫氳繃
+            handleClick(tab, event) {
+                console.log(tab, event);
+            },
+            //鍒囨崲缁勬�佸浘鏌ョ湅
+            updateImg(row){
+                var pos = row.filepath.lastIndexOf('/');
+                var str = row.filepath.substr(pos+1);
+                this.imgShow.realName = str.substring(0,str.length-4);
+                console.log(this.imgShow.realName)
+            },
+            //閫氳繃鍏抽敭瀛楄繘琛岃繃婊ょ粍鎬佸浘
+            filterNode(value, data) {
+                if (!value) return true;
+                return data.label.indexOf(value) !== -1;
+            },
+            /** 鏌ヨ缁勬�佸浘鍒楄〃 */
+            getList() {
+                this.loading = true;
+                listEquipmentfile(this.queryParams).then(response => {
+                    this.equipmentfileList = response.rows;
+                    this.total = response.total;
+                    this.loading = false;
+                });
+            },
+            // 鍙栨秷鎸夐挳
+            cancel() {
+                this.open = false;
+                this.reset();
+            },
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    fileid: undefined,
+                    filename: undefined,
+                    fileno: undefined,
+                    opoman: undefined,
+                    opotime: undefined,
+                    filepath: undefined,
+                    note: undefined,
+                    img: undefined
+                };
+                this.resetForm("form");
+            },
+            /** 鎼滅储鎸夐挳鎿嶄綔 */
+            handleQuery() {
+                this.queryParams.pageNum = 1;
+                this.getList();
+            },
+            /** 閲嶇疆鎸夐挳鎿嶄綔 */
+            resetQuery() {
+                this.resetForm("queryForm");
+                this.handleQuery();
+            },
+        }
+    };
+</script>
diff --git a/energy_management_ui/src/views/energyMonitoring/waterMonitoring/svgView/index.vue b/energy_management_ui/src/views/energyMonitoring/waterMonitoring/svgView/index.vue
new file mode 100644
index 0000000..4bb3834
--- /dev/null
+++ b/energy_management_ui/src/views/energyMonitoring/waterMonitoring/svgView/index.vue
@@ -0,0 +1,192 @@
+<!--<template>-->
+<!--  -->
+<!--</template>-->
+<template>
+  <div class="app-container">
+          <el-tabs v-model="activeName" @tab-click="handleClick">
+            <el-tab-pane label="妫�娴嬪浘" name="first">
+                <el-row>
+                  <el-col>
+                    <div class="grid-content bg-purple-dark" style="text-align: right">
+                    <el-button type="warning" style="text-align: center">鍒锋柊鏃堕棿璁剧疆</el-button>
+                    </div>
+                  </el-col>
+                </el-row>
+                  <svg-icon v-bind:iconClass="imgShow.realName" className='icon'></svg-icon>
+            </el-tab-pane>
+            <el-tab-pane label="鎶ヨ〃" name="second">
+              <real-time-index ref="realTimeIndex" :svgId="1962"></real-time-index>
+            </el-tab-pane>
+            <el-tab-pane label="瓒嬪娍鍥�" name="third">瓒嬪娍鍥�</el-tab-pane>
+            <el-tab-pane label="鎶ヨ璁板綍" name="fourth">
+              <history-alarm-note ref="historyAlarmNote" :svgId="1962"></history-alarm-note>
+            </el-tab-pane>
+          </el-tabs>
+  </div>
+</template>
+
+<style scoped>
+  .icon {
+    width: 970px;
+    height: 550px;
+  }
+</style>
+<script>
+    import {
+        listEquipmentfile,
+    } from "@/api/basicSetup/equipmentfile";
+    import HistoryAlarmNote from "../../../energyAlarm/historicalAlarm/historyAlarmNote";
+    import realTimeIndex from "../../../energyStatistics/energyStatisticsTrend/realTimeIndex";
+    export default {
+      components: {HistoryAlarmNote,realTimeIndex},
+      comments:{HistoryAlarmNote},
+        watch: {
+            filterText(val) {
+                this.$refs.tree.filter(val);
+            }
+        },
+        data() {
+            var choiceIndex;
+            var Indexid;
+            return {
+                //鍙宠竟鑿滃崟鏍�
+                activeName: '瀹炴椂鐩戞祴',
+                // 閬僵灞�
+                loading: true,
+                // 閫変腑鏁扮粍
+                ids: [],
+                // 闈炲崟涓鐢�
+                single: true,
+                // 闈炲涓鐢�
+                multiple: true,
+                // 鎬绘潯鏁�
+                total: 0,
+                activeName:"first",
+                //
+                imgShow: {
+                  realName:undefined
+                },
+                // 缁勬�佸浘琛ㄦ牸鏁版嵁
+                equipmentfileList: [],
+                //娴嬬偣琛ㄦ牸鏁版嵁
+                equipmentfilecdList: [
+                    choiceIndex = ""
+                ],
+                // 寮瑰嚭灞傛爣棰�
+                title: "",
+                // 鏄惁鏄剧ず寮瑰嚭灞�
+                open: false,
+                footopen: false,
+                addImgOpen: false,
+                uploadOpen: false,
+                indexLoading: false,
+                //缁勬�佸浘閫夋嫨鎸囨爣
+                statisticIndexDialog: false,
+                //缁勬�佸浘娴嬬偣寮瑰嚭灞�
+                imgcdopen: false,
+                // ID瀛楀吀
+                fileidOptions: [],
+                // 鏂囦欢鍚嶇О瀛楀吀
+                filenameOptions: [],
+                // 鏂囦欢缂栧彿瀛楀吀
+                filenoOptions: [],
+                // 鎿嶄綔浜哄瓧鍏�
+                opomanOptions: [],
+                // 鎿嶄綔鏃堕棿瀛楀吀
+                opotimeOptions: [],
+                // 鏂囦欢璺緞瀛楀吀
+                filepathOptions: [],
+                // 澶囨敞瀛楀吀
+                noteOptions: [],
+                settingStatisticIndexList: [],
+                // 琛ㄥ崟鍙傛暟
+                form: {},
+                // 琛ㄥ崟鏍¢獙
+                rules: {
+                    filename: [
+                        {required: true, message: "鏂囦欢鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+                    ], fileno: [
+                        {required: true, message: "鏂囦欢缂栧彿涓嶈兘涓虹┖", trigger: "blur"}
+                    ],
+                },
+                filterText: '',
+                svgData:[{
+                    id:1,
+                    label:"鐢熶骇浼佷笟",
+                    children:[{
+                        id:2,
+                        label:"姘寸郴缁�",
+                    },{
+                        id:3,
+                        label: "鐢电郴缁�",
+                    }],
+                }],
+                defaultProps: {
+                    children: 'children',
+                    label: 'label'
+                },
+            };
+        },
+        created() {
+            this.getList();
+            this.imgShow.realName = this.modelCode=this.$route.query.realName;
+          console.log("this.imgShow.realName="+this.imgShow.realName);
+        },
+        methods: {
+            //閫氳繃
+            handleClick(tab, event) {
+                console.log("tab=="+tab, event.toString());
+            },
+            //鍒囨崲缁勬�佸浘鏌ョ湅
+            updateImg(row){
+                var pos = row.filepath.lastIndexOf('/');
+                var str = row.filepath.substr(pos+1);
+                // this.imgShow.realName = str.substring(0,str.length-4);
+                // console.log(this.imgShow.realName);
+            },
+            //閫氳繃鍏抽敭瀛楄繘琛岃繃婊ょ粍鎬佸浘
+            filterNode(value, data) {
+                if (!value) return true;
+                return data.label.indexOf(value) !== -1;
+            },
+            /** 鏌ヨ缁勬�佸浘鍒楄〃 */
+            getList() {
+                this.loading = true;
+                listEquipmentfile(this.queryParams).then(response => {
+                    this.equipmentfileList = response.rows;
+                    this.total = response.total;
+                    this.loading = false;
+                });
+            },
+            // 鍙栨秷鎸夐挳
+            cancel() {
+                this.open = false;
+                this.reset();
+            },
+            // 琛ㄥ崟閲嶇疆
+            reset() {
+                this.form = {
+                    fileid: undefined,
+                    filename: undefined,
+                    fileno: undefined,
+                    opoman: undefined,
+                    opotime: undefined,
+                    filepath: undefined,
+                    note: undefined,
+                    img: undefined
+                };
+                this.resetForm("form");
+            },
+            /** 鎼滅储鎸夐挳鎿嶄綔 */
+            handleQuery() {
+                this.queryParams.pageNum = 1;
+                this.getList();
+            },
+            /** 閲嶇疆鎸夐挳鎿嶄綔 */
+            resetQuery() {
+                this.resetForm("queryForm");
+                this.handleQuery();
+            },
+        }
+    };
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/actualOutput/EnergyActual.vue b/energy_management_ui/src/views/energyPlan/actualOutput/EnergyActual.vue
new file mode 100644
index 0000000..aa2825b
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/actualOutput/EnergyActual.vue
@@ -0,0 +1,152 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio v-model="radio" label="1">鏃ユ姤</el-radio>
+        <el-radio v-model="radio" label="2">鏈堟姤</el-radio>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini">淇濆瓨淇敼</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="浜у搧鍚嶇О" align="center" prop="cpname"/>
+      <el-table-column label="璁¢噺鍗曚綅" align="center" prop="jldw"/>
+      <el-table-column label="璁″垝浜ч噺" align="center" prop="jhcl"/>
+      <el-table-column label="瀹為檯浜ч噺" align="center" prop="sjcl">
+        <template scope="scope">
+          <el-input size="mini"  v-model="scope.row.sjcl"></el-input>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {getSettingProduct} from '@/api/basicsetting/modelNode'
+  import { listPlannedOutput, getPlannedOutput, delPlannedOutput, addPlannedOutput, updatePlannedOutput, exportPlannedOutput } from "@/api/plannedOutput/plannedOutput";
+
+  export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      radio: '1',
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[{
+        "name": "鍏ㄥ巶",
+        "cpname": "鐓ゆ皵",
+        "jldw":"绔嬫柟绫�",
+        "jhcl":"100",
+        "sjcl":"99",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+        {
+          "name": "鍏ㄥ巶",
+          "cpname": "绮楄嫰",
+          "jldw":"鍚�",
+          "jhcl":"20",
+          "sjcl":"19",
+          "createBy": null,
+          "createTime": "",
+          "updateBy": null,
+          "updateTime": null,
+          "remark": "",
+        },
+      {
+        "name": "鍏ㄥ巶",
+        "cpname": "鐒︽补",
+        "jldw":"绔嬫柟绫�",
+        "jhcl":"60",
+        "sjcl":"58",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      }],
+      plannedOutputList:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+    };
+  },
+  created() {
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.queryParams.indexCode=modelNode.id;
+      console.log(modelNode);
+      this.getList(this.queryParams)
+    },
+    getList() {
+      this.loading = true;
+      listPlannedOutput(this.queryParams).then(response => {
+        //this.plannedOutputList = response.rows;
+        console.log(response);
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/actualOutput/index.vue b/energy_management_ui/src/views/energyPlan/actualOutput/index.vue
new file mode 100644
index 0000000..ffe4d46
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/actualOutput/index.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁″垝浜ч噺
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <EnergyActual ref="EnergyActual" style="padding:10px"></EnergyActual>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import EnergyActual from "./EnergyActual";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,EnergyActual},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        console.log(node);
+        //this.$refs.EnergyActual.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/energyEstablishment/energyEstablishment.vue b/energy_management_ui/src/views/energyPlan/energyEstablishment/energyEstablishment.vue
new file mode 100644
index 0000000..8b6f406
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyEstablishment/energyEstablishment.vue
@@ -0,0 +1,213 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿" prop="dataTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd">淇濆瓨淇敼</el-button>
+        <el-button icon="el-icon-download" size="mini">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <el-form refs="form" :model="form" >
+      <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange" ref="multipleTable">
+        <el-table-column align="center"  label="鐢ㄨ兘鍗曞厓" prop="label">{{label}}</el-table-column>
+        <el-table-column label="浜у搧浜ч噺" align="center">
+          <el-table-column label="浜у搧绉嶇被" align="center" prop="productname"/>
+          <el-table-column label="璁¢噺鍗曚綅" align="center" prop="muid" :formatter="unitIdFormat"/>
+          <el-table-column label="璁″垝鍊�" align="center" prop="planValue" />
+          <el-table-column label="瀹為檯鍊�" align="center" prop="actualValue" >
+          <template scope="scope">
+            <el-input size="mini"  v-model="scope.row.actualValue"></el-input>
+          </template>
+        </el-table-column>
+        </el-table-column>
+        <el-table-column label="鐢碉紙鍗冪摝鏃讹級" align="center">
+          <el-table-column label="鑳借�楅噺" align="center" prop="value">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.value"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚綅浜у搧鑳借��" align="center" prop="energyValue">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.energyValue"></el-input>
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="姘达紙绔嬫柟绫筹級" align="center">
+          <el-table-column label="鑳借�楅噺" align="center" prop="waterValue">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.waterValue"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚綅浜у搧鑳借��" align="center" prop="waterEnergyValue">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.waterEnergyValue"></el-input>
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="鐓ゆ皵锛堢珛鏂圭背锛�" align="center">
+          <el-table-column label="鑳借�楅噺" align="center" prop="coalValue">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.coalValue"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚綅浜у搧鑳借��" align="center" prop="coalEnergyValue">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.coalEnergyValue"></el-input>
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="钂告苯锛堢珛鏂圭背锛�" align="center">
+          <el-table-column label="鑳借�楅噺" align="center" prop="steamValue">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.steamValue"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚綅浜у搧鑳借��" align="center" prop="steamEnereyValue">
+            <template scope="scope">
+              <el-input size="mini"  v-model="scope.row.steamEnereyValue"></el-input>
+            </template>
+          </el-table-column>
+        </el-table-column>
+      </el-table>
+    </el-form>
+  </div>
+</template>
+
+<script>
+  import { listEnergy,addEnergy} from "@/api/plannedOutput/planEnergy";
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      form:{},
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[],
+      dateTypeOptions:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        timeType:"DAY",
+        dataTime:undefined,
+        type:""
+      },
+      label:"",
+    };
+  },
+  created() {
+    this.getTime();
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+    this.getDicts("energyPlan").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+     this.queryParams.indexCode=modelNode.id;
+     this.label=modelNode.label;
+     this.getList(this.queryParams)
+   },
+    getList(){
+      console.log(123);
+      this.queryParams.type=this.queryParams.timeType
+      listEnergy(this.queryParams).then(response => {
+        this.energyEenchmarkingList=response.data;
+      })
+    },
+    handleAdd(){
+      this.$nextTick(() => {
+        this.$refs['multipleTable'].data.forEach(rowData => {
+          if(rowData.timeType =="" || rowData.timeTyp ==null || rowData.timeTyp ==undefined){
+            rowData.timeType=this.queryParams.timeType
+          }
+          rowData.dataTime=this.queryParams.dataTime;
+        });
+        this.form.configInfo=JSON.stringify( this.$refs['multipleTable'].data);
+        console.log(this.form.configInfo)
+        addEnergy(this.form.configInfo,this.queryParams).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("淇濆瓨璁″垝浜ч噺鎴愬姛");
+            this.getList();
+          } else {
+            this.msgError(response.msg);
+          }
+        })
+      });
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.muid);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/energyEstablishment/index.vue b/energy_management_ui/src/views/energyPlan/energyEstablishment/index.vue
new file mode 100644
index 0000000..dae0787
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyEstablishment/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥簮娑堣�楄鍒�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <energyEstablishment ref="energyEstablishment" style="padding:10px"></energyEstablishment>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import energyEstablishment from "./energyEstablishment";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,energyEstablishment},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.energyEstablishment.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/energyForecast/LineChart.vue b/energy_management_ui/src/views/energyPlan/energyForecast/LineChart.vue
new file mode 100644
index 0000000..cab80f2
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyForecast/LineChart.vue
@@ -0,0 +1,140 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+  const animationDuration = 6000
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null,
+        seriesData: [],
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+
+        this.chart.setOption({
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          title: {
+            x:'center',
+            y: 'top',
+            textStyle: {
+              color: "#333"
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 40,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          legend: {
+            data:['鐒﹀彴','绮夌鏈�'],
+            left: '60%',
+          },
+          xAxis: [{
+            type: 'category',
+            data: ['12鏃�','13鏃�','14鏃�','15鏃�','16鏃�','17鏃�','18鏃�','19鏃�','20鏃�'],
+            axisPointer: {
+              type: 'shadow'
+            }
+          }],
+          yAxis: [{
+            name: '',
+            type: 'value',
+            nameTextStyle:{
+              color:"#333",
+            },
+            axisLabel: {
+              formatter: '{value}'
+            },
+            axisTick: {
+              show: false
+            },
+          },{
+            name: '',
+            type: 'value',
+            nameTextStyle:{
+              color:"#333",
+            },
+            axisLabel: {
+              formatter: '{value}'
+            },
+            axisTick: {
+              show: false
+            },
+          }
+          ],
+          series:[{
+            type: 'bar',
+            data: [289,430,350,375,374,204,300,194,184],
+            smooth: true,//绾挎潯骞虫粦
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          },{
+            type: 'line',
+            yAxisIndex: 1,
+            data: [289,430,350,375,374,204,300,194,184],
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          }]
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/energyForecast/energyForecast.vue b/energy_management_ui/src/views/energyPlan/energyForecast/energyForecast.vue
new file mode 100644
index 0000000..cf4753f
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyForecast/energyForecast.vue
@@ -0,0 +1,268 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item>
+        <el-radio v-model="radio" label="1">鎸夋棩</el-radio>
+        <el-radio v-model="radio" label="2">鎸夋湀</el-radio>
+      </el-form-item>
+      <el-form-item>
+        <el-select v-model="value" placeholder="璇烽�夋嫨">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+        <el-select v-model="values" placeholder="璇烽�夋嫨">
+          <el-option
+            v-for="item in optionList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini">棰勬祴</el-button>
+        <el-button icon="el-icon-refresh" size="mini">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+      <line-chart/>
+    </el-row>
+    <div>
+      <span>缁熻鑼冨洿锛氬叏鍘�</span>
+      <span style="float: right;">缁熻鍖洪棿锛歿{times}}</span>
+    </div>
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column prop="date" align="center"  label="鏃ユ湡"  width="150"/>
+      <el-table-column label="璁″垝浜ч噺" align="center">
+        <el-table-column label="浜у搧绉嶇被" align="center" prop="cpname"/>
+        <el-table-column label="璁¢噺鍗曚綅" align="center" prop="jldw" />
+        <el-table-column label="璁″垝浜ч噺" align="center" prop="jhcl" />
+      </el-table-column>
+      <el-table-column label="棰勬祴鑳借��" align="center">
+        <el-table-column label="鐢�" align="center" prop="dian" />
+        <el-table-column label="姘�" align="center" prop="shui" />
+        <el-table-column label="钂告苯" align="center" prop="zq" />
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import LineChart from './LineChart'
+export default {
+  components: {
+    LineChart
+  },
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      radio: '1',
+      value: '',
+      values: '',
+      options: [{
+        value: '閫夐」1',
+        label: '鏈潵涓夊ぉ'
+      }, {
+        value: '閫夐」2',
+        label: '鏈潵浜斿ぉ'
+      }, {
+        value: '閫夐」3',
+        label: '鏈潵涓冨ぉ'
+      }],
+      optionList: [{
+        value: '閫夐」1',
+        label: '鐢佃��'
+      }, {
+        value: '閫夐」2',
+        label: '姘磋��'
+      }],
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList: [{
+        "date":"2020-11-20",
+        "cpname": "鐓ゆ皵",
+        "jldw":"绔嬫柟绫�",
+        "jhcl":"12212121",
+        "dian":"99",
+        "shui":"20",
+        "zq":"60",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+        {
+          "date":"2020-11-20",
+          "cpname": "绮楄嫰",
+          "jldw":"鍚�",
+          "jhcl":"22212",
+          "dian":"79",
+          "shui":"26",
+          "zq":"50",
+          "createBy": null,
+          "createTime": "",
+          "updateBy": null,
+          "updateTime": null,
+          "remark": "",
+        },
+        {
+          "date":"2020-11-20",
+          "cpname": "鐒︽补",
+          "jldw":"鍚�",
+          "jhcl":"1211212",
+          "dian":"109",
+          "shui":"30",
+          "zq":"85",
+          "createBy": null,
+          "createTime": "",
+          "updateBy": null,
+          "updateTime": null,
+          "remark": "",
+        }],
+      // 寮瑰嚭灞傛爣棰�
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+      times:"",
+    };
+  },
+  created() {this.getTime()},
+  methods: {
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.times = year + '-' + month + '-' + date
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      //this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+  @keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+
+  @-webkit-keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyPlan/energyForecast/index.vue b/energy_management_ui/src/views/energyPlan/energyForecast/index.vue
new file mode 100644
index 0000000..3b9346c
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyForecast/index.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳芥簮棰勬祴
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"
+                     :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <energyForecast ref="energyForecast" style="padding:10px"></energyForecast>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import energyForecast from "./energyForecast";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,energyForecast},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        //this.$refs.EnergyActual.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/energyMonitoring/LineChart.vue b/energy_management_ui/src/views/energyPlan/energyMonitoring/LineChart.vue
new file mode 100644
index 0000000..588cddb
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyMonitoring/LineChart.vue
@@ -0,0 +1,130 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons')
+  import resize from '../../dashboard/mixins/resize'
+  const animationDuration = 6000
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null,
+        seriesData: [],
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData,actualData,expecteData} = {}) {
+        this.chart.setOption({
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          title: {
+            x: 'center',
+            y: 'top',
+            textStyle: {
+              color: "#333"
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 40,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          /*legend: {
+            data:['',''],
+            left: '60%',
+          },*/
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisPointer: {
+              type: 'shadow'
+            }
+          }],
+          yAxis: [{
+            //name: '缁煎悎鑳借��',
+            type: 'value',
+            nameTextStyle: {
+              color: "#333",
+            },
+            axisLabel: {
+              formatter: '{value}'
+            },
+            axisTick: {
+              show: false
+            },
+          }],
+          series: [{
+            //name:"缁煎悎鑳借��",
+            type: 'bar',
+            data: expectedData,
+            //stack: 'vistors',
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          },{
+            //name:"鑳芥簮鍗犳瘮",
+            type: 'bar',
+            data: expecteData,
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          }]
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/energyMonitoring/energyMonitoring.vue b/energy_management_ui/src/views/energyPlan/energyMonitoring/energyMonitoring.vue
new file mode 100644
index 0000000..82a2766
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyMonitoring/energyMonitoring.vue
@@ -0,0 +1,183 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        :type="dateTypes"
+                        :value-format="valueFormat"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+      <line-chart  ref="LineChart" :chart-data="lineChartData"/>
+    </el-row>
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column prop="label" align="center"  label="鐢ㄨ兘鍗曞厓">{{label}}</el-table-column>
+      <el-table-column label="浜у搧浜ч噺" align="center">
+        <el-table-column label="浜у搧绉嶇被" align="center" prop="productname"/>
+        <el-table-column label="璁¢噺鍗曚綅" align="center" prop="muid" :formatter="unitIdFormat"/>
+        <el-table-column label="璁″垝鍊�" align="center" prop="planValue" />
+        <el-table-column label="瀹為檯鍊�" align="center" prop="actualValue" />
+      </el-table-column>
+      <el-table-column label="鐢碉紙鍗冪摝鏃讹級" align="center">
+        <el-table-column label="璁″垝鍊�" align="center" prop="poValue"/>
+        <el-table-column label="瀹為檯鍊�" align="center" prop="peValue"/>
+      </el-table-column>
+      <el-table-column label="姘达紙绔嬫柟绫筹級" align="center">
+        <el-table-column label="璁″垝鍊�" align="center" prop="poWaterValue"/>
+        <el-table-column label="瀹為檯鍊�" align="center" prop="peWaterValue"/>
+      </el-table-column>
+      <el-table-column label="鐓ゆ皵锛堢珛鏂圭背锛�" align="center">
+        <el-table-column label="璁″垝鍊�" align="center" prop="poCoalValue"/>
+        <el-table-column label="瀹為檯鍊�" align="center" prop="peCoalValue"/>
+      </el-table-column>
+      <el-table-column label="钂告苯锛堢珛鏂圭背锛�" align="center">
+        <el-table-column label="璁″垝鍊�" align="center" prop="poSteamValue"/>
+        <el-table-column label="瀹為檯鍊�" align="center" prop="peSteamValue"/>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import { listEnergyMonitoring } from "@/api/plannedOutput/energyMonitoring";
+  import LineChart from './LineChart'
+  export default {
+  components: {LineChart},
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      radio: '1',
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[],
+      dateTypeOptions:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dataTime: undefined,
+        timeType:"DAY",
+      },
+      dateTypes: 'date',
+      valueFormat:"yyyy-MM-dd",
+      label:"",
+      lineChartData:{expectedData: [],actualData: [],expecteData:[]},
+    };
+  },
+  created() {
+    this.getTime();
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+    this.getDicts("energyPlan").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.queryParams.indexCode=modelNode.id;
+      this.label=modelNode.label
+      this.getList(this.queryParams)
+    },
+    getList() {
+      this.loading = true;
+      listEnergyMonitoring(this.queryParams).then(response => {
+        this.energyEenchmarkingList=response.data;
+        let actualData=[];
+        let expectedData=[];
+        let expecteData=[];
+        this.energyEenchmarkingList.forEach(item => {
+          actualData.push(item.productname);
+          expectedData.push(item.planValue);
+          expecteData.push(item.actualValue);
+        })
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.expecteData=expecteData;
+        this.$refs.LineChart.initChart(this.lineChartData);
+      });
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.muid);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    handleTime(date){
+      if(date=='YEAR'){
+        this.dateTypes= 'year',
+        this.valueFormat='yyyy'
+      }else if(date=='MONTH'){
+        this.dateTypes= 'month',
+        this.valueFormat='yyyy-MM'
+      }else{
+        this.dateTypes= 'date',
+        this.valueFormat='yyyy-MM-dd'
+      }
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/energyMonitoring/index.vue b/energy_management_ui/src/views/energyPlan/energyMonitoring/index.vue
new file mode 100644
index 0000000..4246118
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/energyMonitoring/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁″垝浜庡疄缁╁姣斿垎鏋�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+         <energyMonitoring ref="energyMonitoring" style="padding:10px"></energyMonitoring>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import energyMonitoring from "./energyMonitoring";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,energyMonitoring},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.energyMonitoring.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/plannedOutput/EnergyPlan.vue b/energy_management_ui/src/views/energyPlan/plannedOutput/EnergyPlan.vue
new file mode 100644
index 0000000..164b291
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/plannedOutput/EnergyPlan.vue
@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="缁熻鍖洪棿" prop="dataTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd">淇濆瓨淇敼</el-button>
+      </el-form-item>
+    </el-form>
+    <el-form refs="form" :model="form" >
+      <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange" ref="multipleTable">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="label">{{label}}</el-table-column>
+        <el-table-column label="浜у搧鍚嶇О" align="center" prop="productname"/>
+        <el-table-column label="璁¢噺鍗曚綅" align="center" prop="muid" :formatter="unitIdFormat"/>
+        <el-table-column label="璁″垝浜ч噺" align="center" prop="planValue">
+          <template scope="scope">
+            <el-input size="mini"  v-model="scope.row.planValue"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="璁″垝鐢电敤閲�" align="center" prop="value">
+          <template scope="scope">
+            <el-input size="mini"  v-model="scope.row.value"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="璁″垝姘寸敤閲�" align="center" prop="waterValue">
+          <template scope="scope">
+            <el-input size="mini"  v-model="scope.row.waterValue"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="璁″垝鐓ゆ皵鐢ㄩ噺" align="center" prop="coalValue">
+          <template scope="scope">
+            <el-input size="mini"  v-model="scope.row.coalValue"></el-input>
+          </template>
+        </el-table-column>
+        <el-table-column label="璁″垝钂告苯鐢ㄩ噺" align="center" prop="steamValue">
+          <template scope="scope">
+            <el-input size="mini"  v-model="scope.row.steamValue"></el-input>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+  </div>
+</template>
+
+<script>
+  import {getSettingProduct} from '@/api/basicsetting/modelNode'
+  import { listPlannedOutput, getPlannedOutput, delPlannedOutput, addPlannedOutput, updatePlannedOutput, exportPlannedOutput } from "@/api/plannedOutput/plannedOutput";
+
+  export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[],
+      dateTypeOptions:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        timeType:"DAY",
+        dataTime:undefined,
+        planValue:"",
+      },
+      label:"",
+      unitIdOptions:[],
+      form:{},
+    };
+  },
+  created() {
+    this.getTime();
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdOptions = response.data;
+    });
+    this.getDicts("energyPlan").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.queryParams.indexCode=modelNode.id;
+      this.label=modelNode.label
+      this.getList(this.queryParams)
+    },
+    getList() {
+      this.loading = true;
+      this.queryParams.planValue=this.queryParams.timeType
+      listPlannedOutput(this.queryParams).then(response => {
+        this.energyEenchmarkingList=response.data
+      });
+    },
+
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.muid);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList(this.queryParams);
+    },
+    handleAdd(){
+      this.$nextTick(() => {
+        this.$refs['multipleTable'].data.forEach(rowData => {
+          if(rowData.timeType =="" || rowData.timeTyp ==null || rowData.timeTyp ==undefined){
+            rowData.timeType=this.queryParams.timeType
+            rowData.palnType=this.queryParams.timeType
+          }
+          rowData.dataTime=this.queryParams.dataTime
+        });
+        this.form.configInfo=JSON.stringify( this.$refs['multipleTable'].data);
+        console.log(this.form.configInfo)
+        addPlannedOutput(this.form.configInfo).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("淇濆瓨璁″垝浜ч噺鎴愬姛");
+            this.getList();
+          } else {
+            this.msgError(response.msg);
+          }
+        })
+      });
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyPlan/plannedOutput/index.vue b/energy_management_ui/src/views/energyPlan/plannedOutput/index.vue
new file mode 100644
index 0000000..3545d4f
--- /dev/null
+++ b/energy_management_ui/src/views/energyPlan/plannedOutput/index.vue
@@ -0,0 +1,57 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁″垝浜ч噺
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <EnergyPlan ref="EnergyPlan" style="padding:10px"></EnergyPlan>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import EnergyPlan from "./EnergyPlan";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,EnergyPlan},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.EnergyPlan.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energySaving/emissionReduction/emissionReduction.vue b/energy_management_ui/src/views/energySaving/emissionReduction/emissionReduction.vue
new file mode 100644
index 0000000..76c451f
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/emissionReduction/emissionReduction.vue
@@ -0,0 +1,131 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="缁熻鍖洪棿">
+        <el-date-picker
+          type="daterange"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="energyEenchmarkingList">
+      <el-table-column label="鑺傝兘閲忥紙鍚ㄦ爣鐓わ級" align="center" prop="jnl"/>
+      <el-table-column label="鑺傛按閲忥紙鍚級" align="center" prop="jsl"/>
+      <el-table-column label="鍑忔帓閲忥紙鍚級" align="center" prop="jpl"/>
+    </el-table>
+    <div style="margin: 20px;text-align: center;font-weight: 600;">
+      <span>鑺傝兘閲�</span>
+    </div>
+    <el-table :data="energyList">
+      <el-table-column label="鍩烘湰鍗曚綅浜у�肩患鍚堣兘鑰楋紙涓婂勾锛�" align="center" prop="jnczzh"/>
+      <el-table-column label="鎶ュ憡鏈熷崟浣嶄骇鍊肩患鍚堣兘鑰楋紙褰撳勾锛屽惃鏍囩叅姣忎竾鍏冿級" align="center" prop="jnbg1czzh"/>
+      <el-table-column label="鎶ュ憡鏈熷伐涓氭�讳骇鍊硷紙褰撳勾锛屼竾鍏冿級" align="center" prop="jngyzz"/>
+      <el-table-column label="鎶ュ憡鏈熺患鍚堣兘鑰楁�婚噺锛堝綋骞达紝鍚ㄦ爣鐓わ級" align="center" prop="jnzhnh"/>
+      <el-table-column label="鎶ュ憡鏈熻妭鑳介噺锛堝綋骞达紝鍚ㄦ爣鐓わ級" align="center" prop="jnjnl"/>
+      <el-table-column label="鎶ュ憡鏈熻妭鑳界⒊鍑忔帓閲忥紙褰撳勾锛屽惃纰筹級" align="center" prop="jntjp"/>
+    </el-table>
+    <div style="margin: 20px;text-align: center;font-weight: 600;">
+      <span>鑺傛按閲�</span>
+    </div>
+    <el-table :data="waterList">
+      <el-table-column label="鍩烘湰鍗曚綅浜у�艰�楁按閲忥紙涓婂勾锛�" align="center" prop="jszhsl"/>
+      <el-table-column label="鎶ュ憡鏈熷崟浣嶄骇鍊艰�楁按閲忥紙褰撳勾锛屽惃鏍囩叅姣忎竾鍏冿級" align="center" prop="jsdwzhsl"/>
+      <el-table-column label="鎶ュ憡鏈熷伐涓氭�讳骇鍊硷紙褰撳勾锛屼竾鍏冿級" align="center" prop="jsgyzz"/>
+      <el-table-column label="鎶ュ憡鏈熺患鍚堣�楁按鎬婚噺锛堝綋骞达紝鍚ㄦ爣鐓わ級" align="center" prop="jszhhsl"/>
+      <el-table-column label="鎶ュ憡鏈熻妭姘撮噺锛堝綋骞达紝鍚ㄦ爣鐓わ級" align="center" prop="jsjsl"/>
+      <el-table-column label="鎶ュ憡鏈熻妭姘寸⒊鍑忔帓閲忥紙褰撳勾锛屽惃纰筹級" align="center" prop="jstjp"/>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      radio: '1',
+
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[{
+        "jnl": "54.58",
+        "jsl": "6.87",
+        "jnl":"75.58",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      }],
+      energyList:[{"jnczzh":"0.00","jnbg1czzh":"0.00","jngyzz":"0.00","jnzhnh":"10.43","jnjnl":"54.58","jntjp":"67.13"}],
+      waterList:[{"jszhsl":"0.00","jsdwzhsl":"0.00","jsgyzz":"0.00","jszhhsl":"0.00","jsjsl":"0.00","jstjp":"0.00"}],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+    };
+  },
+  created() {
+  },
+  methods: {
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.modelNodeChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energySaving/emissionReduction/index.vue b/energy_management_ui/src/views/energySaving/emissionReduction/index.vue
new file mode 100644
index 0000000..f5c07cc
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/emissionReduction/index.vue
@@ -0,0 +1,58 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑺傝兘鍑忔帓鍒嗘瀽
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode"
+                     :modelCode="modelCode"
+                     :showOpt="false"
+                     :auth="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <emissionReduction ref="emissionReduction" style="padding:10px"></emissionReduction>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import emissionReduction from "./emissionReduction";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,emissionReduction},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        //this.$refs.EnergyActual.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energySaving/energyAnnex/energyAnnex.vue b/energy_management_ui/src/views/energySaving/energyAnnex/energyAnnex.vue
new file mode 100644
index 0000000..2d12113
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/energyAnnex/energyAnnex.vue
@@ -0,0 +1,443 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鍏宠仈policy_regulations" prop="projectId">
+        <el-input
+          v-model="queryParams.projectId"
+          placeholder="璇疯緭鍏ュ叧鑱攑olicy_regulations"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏂囦欢鍚庣紑" prop="fileSuffix">
+        <el-input
+          v-model="queryParams.fileSuffix"
+          placeholder="璇疯緭鍏ユ枃浠跺悗缂�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鏂囦欢璺緞" prop="filePath">
+        <el-input
+          v-model="queryParams.filePath"
+          placeholder="璇疯緭鍏ユ枃浠惰矾寰�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄�" prop="delFlage">
+        <el-input
+          v-model="queryParams.delFlage"
+          placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇梇鍒犻櫎 N涓哄垹闄�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="寤虹珛浜�" prop="createOperator">
+        <el-input
+          v-model="queryParams.createOperator"
+          placeholder="璇疯緭鍏ュ缓绔嬩汉"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="淇敼浜�" prop="updateOperator">
+        <el-input
+          v-model="queryParams.updateOperator"
+          placeholder="璇疯緭鍏ヤ慨鏀逛汉"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['energy:energyAnnex:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['energy:energyAnnex:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['energy:energyAnnex:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['energy:energyAnnex:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="energyAnnexList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鍏宠仈policy_regulations" align="center" prop="projectId" :formatter="projectIdFormat" />
+      <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName" :formatter="fileNameFormat" />
+      <el-table-column label="鏂囦欢鍚庣紑" align="center" prop="fileSuffix" :formatter="fileSuffixFormat" />
+      <el-table-column label="鏂囦欢璺緞" align="center" prop="filePath" :formatter="filePathFormat" />
+      <el-table-column label="鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄�" align="center" prop="delFlage" :formatter="delFlageFormat" />
+      <el-table-column label="寤虹珛浜�" align="center" prop="createOperator" :formatter="createOperatorFormat" />
+      <el-table-column label="淇敼浜�" align="center" prop="updateOperator" :formatter="updateOperatorFormat" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['energy:energyAnnex:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['energy:energyAnnex:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀硅妭鑳介」鐩鐞嗛檮浠跺璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="form.id" placeholder="璇疯緭鍏ヤ富閿�" />
+        </el-form-item>
+        <el-form-item label="鍏宠仈policy_regulations" prop="projectId">
+          <el-input v-model="form.projectId" placeholder="璇疯緭鍏ュ叧鑱攑olicy_regulations" />
+        </el-form-item>
+        <el-form-item label="鏂囦欢鍚�" prop="fileName">
+          <el-input v-model="form.fileName" placeholder="璇疯緭鍏ユ枃浠跺悕" />
+        </el-form-item>
+        <el-form-item label="鏂囦欢鍚庣紑" prop="fileSuffix">
+          <el-input v-model="form.fileSuffix" placeholder="璇疯緭鍏ユ枃浠跺悗缂�" />
+        </el-form-item>
+        <el-form-item label="鏂囦欢璺緞" prop="filePath">
+          <el-input v-model="form.filePath" placeholder="璇疯緭鍏ユ枃浠惰矾寰�" />
+        </el-form-item>
+        <el-form-item label="鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄�" prop="delFlage">
+          <el-input v-model="form.delFlage" placeholder="璇疯緭鍏ュ垹闄ゆ爣蹇梇鍒犻櫎 N涓哄垹闄�" />
+        </el-form-item>
+        <el-form-item label="寤虹珛浜�" prop="createOperator">
+          <el-input v-model="form.createOperator" placeholder="璇疯緭鍏ュ缓绔嬩汉" />
+        </el-form-item>
+        <el-form-item label="淇敼浜�" prop="updateOperator">
+          <el-input v-model="form.updateOperator" placeholder="璇疯緭鍏ヤ慨鏀逛汉" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listEnergyAnnex, getEnergyAnnex, delEnergyAnnex, addEnergyAnnex, updateEnergyAnnex, exportEnergyAnnex } from "@/api/energy/energyAnnex";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鑺傝兘椤圭洰绠$悊闄勪欢琛ㄦ牸鏁版嵁
+      energyAnnexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈policy_regulations瀛楀吀
+      projectIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏂囦欢鍚庣紑瀛楀吀
+      fileSuffixOptions: [],
+      // 鏂囦欢璺緞瀛楀吀
+      filePathOptions: [],
+      // 鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄ゅ瓧鍏�
+      delFlageOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 寤虹珛浜哄瓧鍏�
+      createOperatorOptions: [],
+      // 淇敼鏃ユ湡瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateOperatorOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        projectId: undefined,
+        fileName: undefined,
+        fileSuffix: undefined,
+        filePath: undefined,
+        delFlage: undefined,
+        createOperator: undefined,
+        updateOperator: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "涓婚敭涓嶈兘涓虹┖", trigger: "blur" }
+        ],      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("${column.dictType}").then(response => {
+      this.idOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.projectIdOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.fileNameOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.fileSuffixOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.filePathOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.delFlageOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.createTimeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.createOperatorOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.updateTimeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.updateOperatorOptions = response.data;
+    });
+  },
+  methods: {
+    /** 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listEnergyAnnex(this.queryParams).then(response => {
+        this.energyAnnexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 涓婚敭瀛楀吀缈昏瘧
+    idFormat(row, column) {
+      return this.selectDictLabel(this.idOptions, row.id);
+    },
+    // 鍏宠仈policy_regulations瀛楀吀缈昏瘧
+    projectIdFormat(row, column) {
+      return this.selectDictLabel(this.projectIdOptions, row.projectId);
+    },
+    // 鏂囦欢鍚嶅瓧鍏哥炕璇�
+    fileNameFormat(row, column) {
+      return this.selectDictLabel(this.fileNameOptions, row.fileName);
+    },
+    // 鏂囦欢鍚庣紑瀛楀吀缈昏瘧
+    fileSuffixFormat(row, column) {
+      return this.selectDictLabel(this.fileSuffixOptions, row.fileSuffix);
+    },
+    // 鏂囦欢璺緞瀛楀吀缈昏瘧
+    filePathFormat(row, column) {
+      return this.selectDictLabel(this.filePathOptions, row.filePath);
+    },
+    // 鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄ゅ瓧鍏哥炕璇�
+    delFlageFormat(row, column) {
+      return this.selectDictLabel(this.delFlageOptions, row.delFlage);
+    },
+    // 寤虹珛鏃堕棿瀛楀吀缈昏瘧
+    createTimeFormat(row, column) {
+      return this.selectDictLabel(this.createTimeOptions, row.createTime);
+    },
+    // 寤虹珛浜哄瓧鍏哥炕璇�
+    createOperatorFormat(row, column) {
+      return this.selectDictLabel(this.createOperatorOptions, row.createOperator);
+    },
+    // 淇敼鏃ユ湡瀛楀吀缈昏瘧
+    updateTimeFormat(row, column) {
+      return this.selectDictLabel(this.updateTimeOptions, row.updateTime);
+    },
+    // 淇敼浜哄瓧鍏哥炕璇�
+    updateOperatorFormat(row, column) {
+      return this.selectDictLabel(this.updateOperatorOptions, row.updateOperator);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        projectId: undefined,
+        fileName: undefined,
+        fileSuffix: undefined,
+        filePath: undefined,
+        delFlage: undefined,
+        createTime: undefined,
+        createOperator: undefined,
+        updateTime: undefined,
+        updateOperator: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑺傝兘椤圭洰绠$悊闄勪欢";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEnergyAnnex(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑺傝兘椤圭洰绠$悊闄勪欢";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateEnergyAnnex(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnergyAnnex(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delEnergyAnnex(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎妭鑳介」鐩鐞嗛檮浠舵暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportEnergyAnnex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energySaving/energyProject/energyAnnex.vue b/energy_management_ui/src/views/energySaving/energyProject/energyAnnex.vue
new file mode 100644
index 0000000..95fbb48
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/energyProject/energyAnnex.vue
@@ -0,0 +1,293 @@
+<template>
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?projectId=' + queryParams.projectId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+      <el-button slot="trigger" size="small" type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitFileForm">涓婁紶鍒版湇鍔″櫒</el-button>
+      <div class="el-upload__tip" style="color:red" slot="tip">娉ㄦ剰鎺у埗鏂囦欢澶у皬锛屼笉瑕佽秴杩�50M</div>
+    </el-upload>
+    <el-row>
+      <el-table v-loading="loading" :data="energyAnnexList">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"/>
+        <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName" />
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="seeImpFile(scope.row)"
+              v-hasPermi="['energy:energyAnnex:assignDownload']"
+            >涓嬭浇</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['energy:energyAnnex:remove']"
+            >鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+
+
+  </el-dialog>
+</template>
+
+<script>
+import { listEnergyAnnex, getEnergyAnnex, delEnergyAnnex, addEnergyAnnex, updateEnergyAnnex, exportEnergyAnnex } from "@/api/energy/energyAnnex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鑺傝兘椤圭洰绠$悊闄勪欢琛ㄦ牸鏁版嵁
+      energyAnnexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙鑺傝兘绠$悊瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/energy/energyAnnex/fileImport"
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        projectId: undefined,
+        fileName: undefined,
+        fileSuffix: undefined,
+        filePath: undefined,
+        delFlage: undefined,
+        createOperator: undefined,
+        updateOperator: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "涓婚敭涓嶈兘涓虹┖", trigger: "blur" }
+        ],      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(impid) {
+      this.reset();
+      this.queryParams.projectId = impid;
+      this.getList();
+      this.title=' 闄勪欢';
+      this.open = true;
+    },
+    /** 鏌ヨ鑺傝兘椤圭洰绠$悊闄勪欢鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listEnergyAnnex(this.queryParams).then(response => {
+        this.energyAnnexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        projectId: undefined,
+        fileName: undefined,
+        fileSuffix: undefined,
+        filePath: undefined,
+        delFlage: undefined,
+        createTime: undefined,
+        createOperator: undefined,
+        updateTime: undefined,
+        updateOperator: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("form");
+    },
+    /**鍙栨秷*/
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑺傝兘椤圭洰绠$悊闄勪欢";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEnergyAnnex(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑺傝兘椤圭洰绠$悊闄勪欢";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateEnergyAnnex(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnergyAnnex(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑺傝兘椤圭洰绠$悊闄勪欢缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delEnergyAnnex(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎妭鑳介」鐩鐞嗛檮浠舵暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportEnergyAnnex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energySaving/energyProject/index.vue b/energy_management_ui/src/views/energySaving/energyProject/index.vue
new file mode 100644
index 0000000..4df139d
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/energyProject/index.vue
@@ -0,0 +1,435 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form class="special-form" :model="queryParams" ref="queryForm" label-width="76px">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="椤圭洰鍚嶇О" prop="name">
+              <el-input
+                  v-model="queryParams.name"
+                  placeholder="璇疯緭鍏ラ」鐩悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
+              <el-date-picker clearable size="small" style="width: 100%"
+                              v-model="queryParams.startTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="閫夋嫨寮�濮嬫椂闂�">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="缁撴潫鏃堕棿" prop="enddTime">
+              <el-date-picker clearable size="small" style="width: 100%"
+                              v-model="queryParams.enddTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="閫夋嫨缁撴潫鏃堕棿">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <!--          <el-col :span="6">-->
+          <!--            <el-form-item label="璐熻矗浜�" prop="people">-->
+          <!--              <el-input-->
+          <!--                  v-model="queryParams.people"-->
+          <!--                  placeholder="璇疯緭鍏ヨ礋璐d汉"-->
+          <!--                  clearable-->
+          <!--                  size="small"-->
+          <!--                  @keyup.enter.native="handleQuery"-->
+          <!--              />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['energy:energyProject:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['energy:energyProject:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['energy:energyProject:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['energy:energyProject:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+
+      <el-table v-loading="loading" :data="energyProjectList" :height="height"
+                @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" show-overflow-tooltip/>
+        <el-table-column label="椤圭洰鍚嶇О" align="center" prop="name" show-overflow-tooltip/>
+        <el-table-column label="鑺傝兘璁″垝" align="center" prop="plan" show-overflow-tooltip/>
+        <el-table-column label="鑺傝兘鐩爣" align="center" prop="target" show-overflow-tooltip/>
+        <el-table-column label="寮�濮嬫椂闂�" align="center" prop="startTime" width="180" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.startTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="缁撴潫鏃堕棿" align="center" prop="enddTime" width="180" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.enddTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="璐熻矗浜�" align="center" prop="people" show-overflow-tooltip/>
+        <el-table-column label="鍒跺畾鏃舵" align="center" prop="setTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.setTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍒涘缓浜�" align="center" prop="createOperator" show-overflow-tooltip/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openEnergyAnnex(scope.row)"
+                v-hasPermi="['tool:gen:import']"
+            >闄勪欢
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['energy:energyProject:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['energy:energyProject:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+
+
+    <!-- 娣诲姞鎴栦慨鏀硅妭鑳介」鐩鐞嗗璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="椤圭洰鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ラ」鐩悕绉�"/>
+        </el-form-item>
+        <el-form-item label="鑺傝兘璁″垝" prop="plan">
+          <el-input v-model="form.plan" placeholder="璇疯緭鍏ヨ妭鑳借鍒�"/>
+        </el-form-item>
+        <el-form-item label="鑺傝兘鐩爣" prop="target">
+          <el-input v-model="form.target" placeholder="璇疯緭鍏ヨ妭鑳界洰鏍�"/>
+        </el-form-item>
+        <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
+          <el-date-picker clearable size="small" style="width: 200px"
+                          v-model="form.startTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="閫夋嫨寮�濮嬫椂闂�">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="缁撴潫鏃堕棿" prop="enddTime">
+          <el-date-picker clearable size="small" style="width: 200px"
+                          v-model="form.enddTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="閫夋嫨缁撴潫鏃堕棿">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="璐熻矗浜�" prop="people">
+          <el-input v-model="form.people" placeholder="璇疯緭鍏ヨ礋璐d汉"/>
+        </el-form-item>
+        <el-form-item label="鍒跺畾鏃舵" prop="setTime">
+          <el-date-picker clearable size="small" style="width: 200px"
+                          v-model="form.setTime"
+                          type="date"
+                          value-format="yyyy-MM-dd"
+                          placeholder="閫夋嫨鍒跺畾鏃舵">
+          </el-date-picker>
+        </el-form-item>
+        <!-- <el-form-item label="鍒涘缓浜�" prop="createOperator">
+           <el-input v-model="form.createOperator" placeholder="璇疯緭鍏ュ垱寤轰汉" />
+         </el-form-item>-->
+        <!-- <el-form-item label="淇敼浜�" prop="updateOperator">
+           <el-input v-model="form.updateOperator" placeholder="璇疯緭鍏ヤ慨鏀逛汉" />
+         </el-form-item>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <energyAnnex ref="annex" @ok="handleFjQuery"/>
+  </div>
+</template>
+
+<script>
+import {
+  listEnergyProject,
+  getEnergyProject,
+  delEnergyProject,
+  addEnergyProject,
+  updateEnergyProject,
+  exportEnergyProject
+} from "@/api/energy/energyProject";
+import energyAnnex from "./energyAnnex";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {energyAnnex},
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鑺傝兘椤圭洰绠$悊琛ㄦ牸鏁版嵁
+      energyProjectList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // id瀛楀吀
+      idOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        plan: undefined,
+        target: undefined,
+        startTime: undefined,
+        enddTime: undefined,
+        people: undefined,
+        setTime: undefined,
+        createOperator: undefined,
+        updateOperator: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          {required: true, message: "id涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ鑺傝兘椤圭洰绠$悊鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listEnergyProject(this.queryParams).then(response => {
+        this.energyProjectList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // id瀛楀吀缈昏瘧
+    idFormat(row, column) {
+      return this.selectDictLabel(this.idOptions, row.id);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        plan: undefined,
+        target: undefined,
+        startTime: undefined,
+        enddTime: undefined,
+        people: undefined,
+        setTime: undefined,
+        createOperator: undefined,
+        createTime: undefined,
+        updateOperator: undefined,
+        updateTime: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑺傝兘椤圭洰绠$悊";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getEnergyProject(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑺傝兘椤圭洰绠$悊";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateEnergyProject(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnergyProject(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑺傝兘椤圭洰绠$悊缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delEnergyProject(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎妭鑳介」鐩鐞嗘暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportEnergyProject(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openEnergyAnnex(row) {
+      let impid = row.id;
+      this.$refs.annex.show(impid);
+    },
+    /** 闄勪欢鎼滅储鎸夐挳鎿嶄綔 */
+    handleFjQuery() {
+      // this.queryParams.pageNum = 1;
+      // this.getList();
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/energySaving/policiesRegulations/index.vue b/energy_management_ui/src/views/energySaving/policiesRegulations/index.vue
new file mode 100644
index 0000000..8c391c8
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/policiesRegulations/index.vue
@@ -0,0 +1,179 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢绫诲埆">
+        <el-select v-model="value" placeholder="璇烽�夋嫨">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鏂囦欢鏍囬">
+        <el-input placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-plus" size="mini">鏂板</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="80" align="center" />
+      <el-table-column label="鏂囦欢鏍囬" align="center" prop="name"/>
+      <el-table-column label="鏂囦欢绫诲埆" align="center" prop="wjlb" />
+      <el-table-column label="鍗板彂鏃堕棿" align="center" prop="yfsj" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button  size="mini" type="text" icon="el-icon-edit" >淇敼</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      options: [{
+        value: '閫夐」1',
+        label: '鏀跨瓥娉曡'
+      }],
+      value: '',
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[{
+        "name": "鑺傜害鐢ㄧ數",
+        "wjlb":"鏀跨瓥娉曡",
+        "yfsj":"2019/10/19",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "鐢靛姏璁炬柦淇濇姢鏉′緥",
+        "wjlb":"鏀跨瓥娉曡",
+        "yfsj":"2019/10/19",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "鐢靛姏鐩戠鏉′緥",
+        "wjlb":"鏀跨瓥娉曡",
+        "yfsj":"2019/10/19",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "涓崕浜烘皯鍏卞拰鍥界幆澧冧繚鎶ゆ硶",
+        "wjlb":"鏀跨瓥娉曡",
+        "yfsj":"2019/10/19",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "涓崕浜烘皯鍏卞拰鍥藉畨鍏ㄧ敓浜ф硶",
+        "wjlb":"鏀跨瓥娉曡",
+        "yfsj":"2019/10/19",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      }],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+      times:"",
+    };
+  },
+  created() {this.getList();this.getTime()},
+  methods: {
+    getList() {
+
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.times = year + '-' + month + '-' + date
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      //this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energySaving/projectManagement/index.vue b/energy_management_ui/src/views/energySaving/projectManagement/index.vue
new file mode 100644
index 0000000..bd0ff8b
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/projectManagement/index.vue
@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="椤圭洰鍚嶇О">
+        <el-select v-model="value" placeholder="璇烽�夋嫨">
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鏂囦欢鏍囬">
+        <el-date-picker
+          type="daterange"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-plus" size="mini">鏂板</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="energyEenchmarkingList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="80" align="center" />
+      <el-table-column label="椤圭洰鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="鑺傝兘璁″垝" align="center" prop="jnjh" />
+      <el-table-column label="鑺傝兘鐩爣" align="center" prop="jnmb" />
+      <el-table-column label="璁″垝寮�濮嬫椂闂�" align="center" prop="kstime" />
+      <el-table-column label="璁″垝缁撴潫鏃堕棿" align="center" prop="jstime" />
+      <el-table-column label="璐熻矗浜�" align="center" prop="fzr" />
+      <el-table-column label="鍒跺畾鏃舵" align="center" prop="zdtime" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button  size="mini" type="text" icon="el-icon-edit" >淇敼</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete">鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      options: [{
+        value: '閫夐」1',
+        label: '绌鸿皟鑺傝兘'
+      },{
+        value: '閫夐」2',
+          label: '鑺傜害鐢ㄦ按'
+      },
+      {value: '閫夐」3',
+        label: '钂告苯鑺傝兘'
+      }],
+      value: '',
+      // energy_benchmarking琛ㄦ牸鏁版嵁
+      energyEenchmarkingList:[{
+        "name": "绌鸿皟鑺傝兘",
+        "jnjh":"閫氳繃姘撮�氳皟瑙f硶绠�",
+        "jnmb":"鏈堝害骞冲潎鐢ㄧ數闄嶄綆",
+        "kstime":"2019/5/22",
+        "jstime":"2020/5/13",
+        "fzr":"寮犱紶鏅�",
+        "zdtime":"2019/5/22",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "鑺傜害鐢ㄦ按",
+        "jnjh":"閫氳繃姘撮�氳皟瑙f硶绠�",
+        "jnmb":"鏈堝害骞冲潎鐢ㄦ按闄嶄綆",
+        "kstime":"2019/5/22",
+        "jstime":"2020/5/13",
+        "fzr":"寮犱紶鏅�",
+        "zdtime":"2019/5/22",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      },
+      {
+        "name": "鍖楀巶鍐峰嵈姘村鏀归��",
+        "jnjh":"杩涜鏀归��",
+        "jnmb":"鑺傜數鐜�5%",
+        "kstime":"2019/5/22",
+        "jstime":"2020/5/13",
+        "fzr":"寮犱紶鏅�",
+        "zdtime":"2019/5/22",
+        "createBy": null,
+        "createTime": "",
+        "updateBy": null,
+        "updateTime": null,
+        "remark": "",
+      }],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined,
+        modelNode:"",
+      },
+      times:"",
+    };
+  },
+  created() {this.getList();this.getTime()},
+  methods: {
+    getList() {
+
+    },
+    getTime(){
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.times = year + '-' + month + '-' + date
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        codeId: undefined,
+        unit: undefined,
+        range: undefined,
+        type: undefined,
+        value: undefined,
+        termValidity: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      //this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energySaving/report/importReportFile.vue b/energy_management_ui/src/views/energySaving/report/importReportFile.vue
new file mode 100644
index 0000000..e5e2383
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/report/importReportFile.vue
@@ -0,0 +1,205 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?reportId=' + queryParams.implementId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+      <el-button slot="trigger" size="small" type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitFileForm">涓婁紶鍒版湇鍔″櫒</el-button>
+      <div class="el-upload__tip" style="color:red" slot="tip">娉ㄦ剰鎺у埗鏂囦欢澶у皬锛屼笉瑕佽秴杩�50M</div>
+    </el-upload>
+
+    <el-row>
+      <el-table v-loading="loading" :data="annexList" >
+        <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName"  />
+        <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"  />
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="seeImpFile(scope.row)"
+              v-hasPermi="['meter:annex:assignDownload']"
+            >涓嬭浇</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['meter:annex:remove']"
+            >鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listReportAnnex,delReportAnnex } from "@/api/energy/reportAnnex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/energy/reportAnnex/fileImport"
+      },
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(impid,code) {
+      this.reset();
+      this.queryParams.implementId = impid;
+      this.getList();
+      this.title=code+' 闄勪欢';
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listReportAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+       this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delReportAnnex(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/energySaving/report/index.vue b/energy_management_ui/src/views/energySaving/report/index.vue
new file mode 100644
index 0000000..2c154bb
--- /dev/null
+++ b/energy_management_ui/src/views/energySaving/report/index.vue
@@ -0,0 +1,330 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鎶ュ憡鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ユ姤鍛婂悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['energy:report:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['energy:report:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['energy:report:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <!--
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['energy:report:export']"
+        >瀵煎嚭</el-button>
+      </el-col>-->
+    </el-row>
+
+    <el-table v-loading="loading" :data="reportList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鎶ュ憡鍚嶇О" align="center" prop="name"  />
+      <el-table-column label="寮�濮嬫椂闂�" align="center" prop="startTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.startTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="缁撴潫鏃堕棿" align="center" prop="enddTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.enddTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="澶囨敞" align="center" prop="bak"  />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="openImportFileTable(scope.row)"
+            v-hasPermi="['tool:gen:import']"
+          >闄勪欢</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['energy:report:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['energy:report:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀硅妭鑳藉垎鏋愭姤鍛婄鐞嗗璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鎶ュ憡鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ユ姤鍛婂悕绉�" />
+        </el-form-item>
+        <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.startTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨寮�濮嬫椂闂�">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="缁撴潫鏃堕棿" prop="enddTime">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.enddTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨缁撴潫鏃堕棿">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="bak">
+          <el-input v-model="form.bak" placeholder="璇疯緭鍏ュ娉�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <importReportFile ref="importReportFile"   />
+  </div>
+</template>
+
+<script>
+import { listReport, getReport, delReport, addReport, updateReport, exportReport } from "@/api/energy/report";
+import importReportFile from "./importReportFile";
+export default {
+  name: "importReport",
+  components: { importReportFile },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鑺傝兘鍒嗘瀽鎶ュ憡绠$悊琛ㄦ牸鏁版嵁
+      reportList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // id瀛楀吀
+      idOptions: [],
+      // 鎶ュ憡鍚嶇О瀛楀吀
+      nameOptions: [],
+      // 寮�濮嬫椂闂村瓧鍏�
+      startTimeOptions: [],
+      // 缁撴潫鏃堕棿瀛楀吀
+      enddTimeOptions: [],
+      // 鍒涘缓浜哄瓧鍏�
+      createByOptions: [],
+      // 鍒涘缓鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 澶囨敞瀛楀吀
+      bakOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "id涓嶈兘涓虹┖", trigger: "blur" }
+        ],      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ鑺傝兘鍒嗘瀽鎶ュ憡绠$悊鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listReport(this.queryParams).then(response => {
+        this.reportList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        startTime: undefined,
+        enddTime: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined,
+        bak: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑺傝兘鍒嗘瀽鎶ュ憡";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getReport(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑺傝兘鍒嗘瀽鎶ュ憡";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateReport(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addReport(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑺傝兘鍒嗘瀽鎶ュ憡缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delReport(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎妭鑳藉垎鏋愭姤鍛婃暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportReport(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportFileTable(row) {
+      let impid = row.id;
+      let impcode = row.name;
+      this.$refs.importReportFile.show(impid,impcode);
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyAnalysis/energyAnalysis.vue b/energy_management_ui/src/views/energyStatistics/energyAnalysis/energyAnalysis.vue
new file mode 100644
index 0000000..23fe143
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyAnalysis/energyAnalysis.vue
@@ -0,0 +1,161 @@
+<template>
+  <div class="dashboard-editor-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏃ユ湡">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio style="margin-right: 10px" v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+        <el-date-picker
+          v-model="dateRange"
+          :type="dateType"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="list">
+      <el-table-column prop="indexName" label="鍚嶇О"  align="center"></el-table-column>
+      <el-table-column label="鏃堕棿"  align="center">
+        <template slot-scope="scope">
+          <span>{{formatDate(scope.row.dataTime)}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="value" label="鍊�"  align="center"></el-table-column>
+    </el-table>
+      <!--<el-table :data="tabledata">
+        <el-table-column prop="dataTime" label="鏃堕棿"  align="center"></el-table-column>
+        <template v-for="item in  tablehead ">
+          <el-table-column :label=item.IndexName align="center" prop="value" ></el-table-column>
+        </template>
+      </el-table>-->
+    </div>
+</template>
+
+<script>
+  import {getEnergyAnalysis,exportEnergyAnalysis} from "@/api/energyStatistics/statistics";
+  export default {
+    props: ["modelCode"],
+    data() {
+      return {
+        total: 0,
+        dateTypeOptions:[],
+        dateType:"datetimerange",
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          indexCode:undefined,
+          timeType:"HOUR",
+          beginTime:undefined,
+          endTime:undefined,
+        },
+        dateRange: [],
+        list:[],
+        rowIndex: '-1',
+        OrderIndexArr: [],
+        hoverOrderArr: [],
+      }
+    },
+    created() {
+      this.getDicts("energyAnalysis").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+      this.getTime();
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.queryParams.indexCode=modelNode.id;
+        this.getList(this.queryParams)
+      },
+      getList(){
+        this.dateRange = [this.formatDate(this.dateRange[0]),this.formatDate(this.dateRange[1])];
+        getEnergyAnalysis(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+          this.list=response.data
+        });
+      },
+      getTime(){
+        this.queryParams.beginTime = new Date().setHours(0, 0, 0, 0);
+        this.queryParams.endTime = new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1;
+        this.dateRange = [this.queryParams.beginTime,this.queryParams.endTime];
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.queryParams);
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      handleTime(date){
+        if(date=='DATE'){
+          this.dateType='daterange'
+        }else if(date=='HOUR'){
+          this.dateType="datetimerange"
+        }
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘鑰楃粺璁″垎鏋愭暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportEnergyAnalysis(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      formatDate: function (value) {
+        let date = new Date(value);
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? ('0' + MM) : MM;
+        let d = date.getDate();
+        d = d < 10 ? ('0' + d) : d;
+        let h = date.getHours();
+        h = h < 10 ? ('0' + h) : h;
+        let m = date.getMinutes();
+        m = m < 10 ? ('0' + m) : m;
+        let s = date.getSeconds();
+        s = s < 10 ? ('0' + s) : s;
+        return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+      },
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+  .chart-title{
+    display: block;
+    background: #f2f6fc;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px;
+  }
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyStatistics/energyAnalysis/index.vue b/energy_management_ui/src/views/energyStatistics/energyAnalysis/index.vue
new file mode 100644
index 0000000..6fc8f87
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyAnalysis/index.vue
@@ -0,0 +1,55 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳借�楃粺璁″垎鏋�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <energyAnalysis ref="energyAnalysis" style="padding:10px"></energyAnalysis>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import energyAnalysis from "./energyAnalysis";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,energyAnalysis},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.energyAnalysis.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyConsumption/BarChart.vue b/energy_management_ui/src/views/energyStatistics/energyConsumption/BarChart.vue
new file mode 100644
index 0000000..8632876
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyConsumption/BarChart.vue
@@ -0,0 +1,145 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../mixins/resize'
+const animationDuration = 6000
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    chartData: {
+      type:Object,
+      //required: true
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  data() {
+    return {
+      chart: null,
+      seriesData: [],
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+       this.setOptions(this.chartData)
+     },
+     setOptions({newVisitis,xAxis,actualData} = {}) {
+       var series=[];
+       if(newVisitis !=null ||newVisitis != undefined){
+         newVisitis.forEach(rowData => {
+           series.push({
+               name: actualData,
+               type: 'bar',
+               data: newVisitis,
+               smooth: true,//绾挎潯骞虫粦
+               stack: 'vistors',
+               animationDuration: 2800,
+               animationEasing: 'quadraticOut'
+             },
+           );
+         });
+         /*for(var i=0;i<newVisitis.length;i++){
+           series.push({
+               name: actualData[i],
+               type: 'bar',
+               data: newVisitis[i],
+               smooth: true,//绾挎潯骞虫粦
+               stack: 'vistors',
+               animationDuration: 2800,
+               animationEasing: 'quadraticOut'
+             },
+           );
+         }*/
+       }
+      this.chart.setOption({
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+            type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+          }
+        },
+        grid: {
+          top: 40,
+          left: '1%',
+          right: '2%',
+          bottom: '3%',
+          containLabel: true
+        },
+        legend: {
+          data:actualData,
+          left: '60%',
+        },
+        xAxis: [{
+          type: 'category',
+          data: xAxis,
+          axisTick: {
+            alignWithLabel: true
+          },
+        }],
+        yAxis: [{
+          name: '鍚ㄦ爣鐓�',
+          type: 'value',
+          axisTick: {
+            show: false
+          },
+        }],
+        series:series,/*[{
+          name: '鏈湡',
+           type: 'bar',
+          data: [
+            {value: 335, name: ''},
+            {value: 310, name: '閭欢钀ラ攢'},
+          ],
+           smooth: true,//绾挎潯骞虫粦
+           //stack: 'vistors',
+           animationDuration: 2800,
+           animationEasing: 'quadraticOut'
+       },{
+           name: '鍚屾湡',
+             type: 'bar',
+             data: [100,120],
+             smooth: true,//绾挎潯骞虫粦
+             //stack: 'vistors',
+             animationDuration: 2800,
+             animationEasing: 'quadraticOut'
+         }]*/
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyConsumption/BarCharts.vue b/energy_management_ui/src/views/energyStatistics/energyConsumption/BarCharts.vue
new file mode 100644
index 0000000..6592587
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyConsumption/BarCharts.vue
@@ -0,0 +1,117 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../mixins/resize'
+const animationDuration = 6000
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    chartData: {
+      type:Object,
+      //required: true
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  data() {
+    return {
+      chart: null,
+      seriesData: [],
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+       this.setOptions(this.chartData)
+     },
+     setOptions({newVisitis,xAxis,actualData} = {}) {
+       var series=[];
+       if(newVisitis !=null ||newVisitis != undefined){
+         for(var i=0;i<newVisitis.length;i++){
+           let aa=newVisitis[i];
+           for(var j=0;j<aa.length;j++) {
+             series.push({
+                 name: actualData[i],
+                 type: 'bar',
+                 data: aa[j],
+                 smooth: true,//绾挎潯骞虫粦
+                 //stack: 'vistors',
+                 animationDuration: 2800,
+                 animationEasing: 'quadraticOut'
+               }
+             );
+           }
+         }
+       }
+      this.chart.setOption({
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+            type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+          }
+        },
+        grid: {
+          top: 40,
+          left: '1%',
+          right: '2%',
+          bottom: '3%',
+          containLabel: true
+        },
+        legend: {
+          data:actualData,
+          left: '40%',
+        },
+        xAxis: [{
+          type: 'category',
+          data: xAxis,
+          axisTick: {
+            alignWithLabel: true
+          },
+        }],
+        yAxis: [{
+          name: '涓囧厓',
+          type: 'value',
+          axisTick: {
+            show: false
+          },
+        }],
+        series: series
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyConsumption/PieChart.vue b/energy_management_ui/src/views/energyStatistics/energyConsumption/PieChart.vue
new file mode 100644
index 0000000..44559d9
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyConsumption/PieChart.vue
@@ -0,0 +1,150 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    chartData: {
+      type:Object,
+      //required: true
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({newVisitis,title,datas } = {}) {
+      this.chart.setOption({
+        title: {
+          text: '鑳芥簮娑堣垂缁撴瀯鏋勬垚',
+          x:'left',
+          y: 'top',
+          textStyle: {
+            color: "#333"
+          },
+        },
+        tooltip: {
+          trigger: 'item',
+          formatter: title
+        },
+        grid: {
+          top: 40,
+          left: '2%',
+          right: '2%',
+          bottom: '3%',
+          containLabel: true
+        },
+        legend: {
+          // orient 璁剧疆甯冨眬鏂瑰紡锛岄粯璁ゆ按骞冲竷灞�锛屽彲閫夊�硷細'horizontal'锛堟按骞筹級 娄 'vertical'锛堝瀭鐩达級
+          orient: 'vertical',
+          // x 璁剧疆姘村钩瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥惧眳涓紝鍙�夊�硷細'center' 娄 'left' 娄 'right' 娄 {number}锛坸鍧愭爣锛屽崟浣峱x锛�
+          x: 'left',
+          // y 璁剧疆鍨傜洿瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥鹃《绔紝鍙�夊�硷細'top' 娄 'bottom' 娄 'center' 娄 {number}锛坹鍧愭爣锛屽崟浣峱x锛�
+          y: '10%',
+          //left: 10,
+          itemWidth: 24,   // 璁剧疆鍥句緥鍥惧舰鐨勫
+          itemHeight: 18,  // 璁剧疆鍥句緥鍥惧舰鐨勯珮
+          textStyle: {
+            color: '#666'  // 鍥句緥鏂囧瓧棰滆壊
+          },
+          // itemGap璁剧疆鍚勪釜item涔嬮棿鐨勯棿闅旓紝鍗曚綅px锛岄粯璁や负10锛屾í鍚戝竷灞�鏃朵负姘村钩闂撮殧锛岀旱鍚戝竷灞�鏃朵负绾靛悜闂撮殧
+         // itemGap: 30,
+          backgroundColor: '#eee',  // 璁剧疆鏁翠釜鍥句緥鍖哄煙鑳屾櫙棰滆壊
+          data: title,
+          formatter:function(item){
+            let target;
+            let unitId;
+            for(let i=0;i<newVisitis.length;i++){
+              if(datas[i].name===item){
+                target=datas[i].value;
+                unitId=datas[i].unitId
+              }
+            }
+            let arr=[item+ +target+ unitId]/*["{a|"+target+"}","{b|"+item+"}"]*/
+            return arr/*.join("\n")*/
+          },
+        },
+        series: [{
+            //name: '鑳芥簮',
+            type: 'pie',
+             radius: '60%',  // 璁剧疆楗肩姸鍥惧ぇ灏忥紝100%鏃讹紝鏈�澶х洿寰�=鏁翠釜鍥惧舰鐨刴in(瀹斤紝楂�)
+            //radius: ['30%', '60%'],  // 璁剧疆鐜舰楗肩姸鍥撅紝 绗竴涓櫨鍒嗘暟璁剧疆鍐呭湀澶у皬锛岀浜屼釜鐧惧垎鏁拌缃鍦堝ぇ灏�
+            center: ['65%', '50%'],  // 璁剧疆楗肩姸鍥句綅缃紝绗竴涓櫨鍒嗘暟璋冩按骞充綅缃紝绗簩涓櫨鍒嗘暟璋冨瀭鐩翠綅缃�
+            data: newVisitis,//[{value:335, name:'娲楃簿鐓�' },{value:310, name:'宸ヤ笟鐢ㄧ數'}],/*selected: true*/
+            // itemStyle 璁剧疆楗肩姸鍥炬墖褰㈠尯鍩熸牱寮�
+            itemStyle: {
+              // emphasis锛氳嫳鏂囨剰鎬濇槸 寮鸿皟;鐫�閲�;锛堣疆寤撱�佸浘褰㈢瓑鐨勶級椴滄槑;绐佸嚭锛岄噸璇�
+              // emphasis锛氳缃紶鏍囨斁鍒板摢涓�鍧楁墖褰笂闈㈢殑鏃跺�欙紝鎵囧舰鏍峰紡銆侀槾褰�
+              emphasis: {
+                shadowBlur: 10,
+                shadowOffsetX: 0,
+                shadowColor: 'rgba(30, 144, 255锛�0.5)'
+              }
+            },
+            // 璁剧疆鍊煎煙鐨勯偅鎸囧悜绾�
+            labelLine: {
+              normal: {
+                show: false   // show璁剧疆绾挎槸鍚︽樉绀猴紝榛樿涓簍rue锛屽彲閫夊�硷細true 娄 false
+              }
+            },
+            // 璁剧疆鍊煎煙鐨勬爣绛�
+            label: {
+              normal: {
+                position: 'inner',  // 璁剧疆鏍囩浣嶇疆锛岄粯璁ゅ湪楗肩姸鍥惧 鍙�夊�硷細'outer' 娄 'inner锛堥ゼ鐘跺浘涓婏級'
+                // formatter: '{a} {b} : {c}涓� ({d}%)'   璁剧疆鏍囩鏄剧ず鍐呭 锛岄粯璁ゆ樉绀簕b}
+                // {a}鎸噑eries.name  {b}鎸噑eries.data鐨刵ame
+                // {c}鎸噑eries.data鐨剉alue  {d}%鎸囪繖涓�閮ㄥ垎鍗犳�绘暟鐨勭櫨鍒嗘瘮
+                formatter: '{c}'
+              }
+            }
+          }
+        ],
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyConsumption/consumption.vue b/energy_management_ui/src/views/energyStatistics/energyConsumption/consumption.vue
new file mode 100644
index 0000000..dbb0e10
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyConsumption/consumption.vue
@@ -0,0 +1,419 @@
+<template>
+  <div class="dashboard-editor-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏃ユ湡">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio style="margin-right: 10px" v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+        <el-date-picker
+          v-model="queryParams.beginTime"
+          :type="dateTypes"
+          :value-format="valueFormat"
+          placeholder="寮�濮嬫棩鏈�">
+        </el-date-picker>
+        鍒�
+        <el-date-picker
+          v-model="queryParams.endTime"
+          :type="dateTypes"
+          :value-format="valueFormat"
+          placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+      <el-form-item>
+        <router-link :to="'/energyConsumption/listEnergyConsumption/'+queryParams.timeType+'/'+queryParams.beginTime+'/'+queryParams.endTime+'/'+queryParams.indexCode+'/'+queryParams.id+'/'+titleName"  class="link-type">
+          <el-button size="mini">鑳芥簮娑堣垂鎴愭湰鍒嗘椂鍒嗘瀽鎶ヨ〃</el-button>
+        </router-link>
+      </el-form-item>
+    </el-form>
+    <h4 style="float: left; text-align:center;padding: 0;margin: 0px 0px 10px;width: 90%;">鐢熶骇浼佷笟鑳芥簮娑堣�楁垚鏈垎鏋�</h4>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="12" style="padding-right: 0">
+        <div class="chart-wrapper" >
+          <pie-chart ref="PieChart" :chart-data="lineChartData"/>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="12" style="padding-right: 0">
+        <div class="chart-wrapper" >
+          <pieChartCost ref="pieChartCost" :chart-data="lineChartData1"/>
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="12" style="padding-right: 0">
+        <div class="chart-wrapper" >
+          <span style="display: block;color: #333;">鑳芥簮娑堣垂缁撴瀯鎯呭喌瀵规瘮</span>
+          <el-checkbox-group v-model="checkList1" style="padding: 10px;border: 1px solid #ddd;margin:10px 0;"  @change="handleCheckedCitiesChange1"><!--clickMe -->
+            <el-checkbox :indeterminate="isIndeterminate1" v-model="checkAll1" @change="handleCheckAllChange1">鍏ㄩ��</el-checkbox>
+            <el-checkbox v-for="dict in list" :key="dict.code" :label="dict.code">{{dict.name}}</el-checkbox>
+          </el-checkbox-group>
+          <bar-chart ref="BarChart" :chart-data="lineChartData2"/>
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="12" style="padding-right: 0">
+        <div class="chart-wrapper">
+          <span style="display: block;color: #333;">鑳芥簮娑堣垂鎴愭湰鎯呭喌瀵规瘮</span>
+          <el-checkbox-group v-model="checkList2" style="padding: 10px;border: 1px solid #ddd;margin:10px 0;"  @change="handleCheckedCitiesChange2"><!--clickMe -->
+            <el-checkbox :indeterminate="isIndeterminate2" v-model="checkAll2" @change="handleCheckAllChange2">鍏ㄩ��</el-checkbox>
+            <el-checkbox v-for="dict in list" :key="dict.code" :label="dict.code">{{dict.name}}</el-checkbox>
+          </el-checkbox-group>
+         <!-- <el-checkbox-group v-model="checkList2" style="padding: 10px;border: 1px solid #ddd;margin:10px 0;"  @change="clickMe(2)">
+            <el-checkbox v-for="dict in list" :key="dict.code" :label="dict.code">{{dict.name}}</el-checkbox>
+          </el-checkbox-group>-->
+          <BarCharts ref="BarCharts" :chart-data="lineChartData3"/>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import BarChart from './BarChart'
+  import BarCharts from './BarCharts'
+  import PieChart from './PieChart'
+  import pieChartCost from './pieChartCost'
+  import {getEnergyConstitute,getEnergyConsumption,getSettingIndex} from "@/api/energyStatistics/statistics";
+  export default {
+    name: 'consumption',
+    name: 'Index',
+    components: {BarChart,BarCharts,PieChart,pieChartCost},
+    props: ["modelCode"],
+    data() {
+      return {
+        // 閬僵灞�
+        loading: true,
+        total: 0,
+        dateTypeOptions:[],
+        checkList1:[],
+        checkList2:[],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          beginTime: undefined,
+          endTime: undefined,
+          dataTime: undefined,
+          timeType:'MONTH',
+          indexId: undefined,
+          procedure: undefined,
+          indexCode: "",
+          id: undefined,
+        },
+        list:[],
+        arraylist1:[],
+        arraylist2:[],
+        arraylist3:[],
+        arraylist4:[],
+        arraylist5:[],
+        xAxisListXFCB:[],
+        xAxisListZBL:[],
+        lineChartData:{
+          newVisitis:null,
+        },
+        lineChartData1:{
+          newVisitis:null,
+        },
+        lineChartData2:{
+          newVisitis:null,
+        },
+        lineChartData3:{
+          newVisitis:null,
+        },
+        lineChartData4:{
+          newVisitis:null,
+        },
+        //dateTypes: 'monthrange',//鏃堕棿鑼冨洿
+        dateTypes: 'month',
+        valueFormat:'yyyy-MM',
+        title:"",
+        titleName: "",
+        checkAll1: false,
+        checkAll2: false,
+        isIndeterminate1: true,
+        isIndeterminate2: true,
+      }
+    },
+    watch: {
+      modelCode: {
+        deep: true,
+        handler(val) {
+          this.getList(val)
+        }
+      },
+    },
+    created() {
+      //this.getList();
+      this.getDicts("timeType").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+      this.getConfigKey("energyStatistics.energyStatisticConsum").then(response => {
+        this.skinName=response.msg;
+      });
+      let endTtime=(new Date().getFullYear()) +'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+      let starTtime= (new Date().getFullYear()-1)+'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+      this.queryParams.beginTime=starTtime;
+      this.queryParams.endTime=endTtime;
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        let legendTitle=[];
+        this.queryParams.id=modelNode.id;
+        this.titleName=modelNode.label;
+        this.queryParams.indexCode=modelNode.id;
+        getEnergyConstitute(this.queryParams).then(response => {
+        this.arraylist1=response.data.listXFL;//娑堣垂閲�
+        this.arraylist2=response.data.listZBL;//鎶樻爣閲�
+        this.arraylist4=response.data.listXFCB;//娑堣垂鎴愭湰
+        //鑳借�楁秷璐圭粨鏋� 娑堣垂閲�
+        let unitId=[];
+        let source=[];
+        let title=[];
+        for (let i=0; i<this.arraylist1.length;i++){
+          title.push(this.arraylist1[i].indexName);
+          unitId.push({"name":this.arraylist1[i].indexName,"value":this.numFilter(this.arraylist1[i].value),"unitId":this.arraylist1[i].unitId});
+        };
+        for (let i=0; i<this.arraylist2.length;i++){
+         source.push({"name":this.arraylist2[i].indexName,"value":this.numFilter(this.arraylist2[i].value)});
+        }
+        this.lineChartData.datas=unitId;
+        this.lineChartData.title=title;
+        this.lineChartData.newVisitis=source;
+        this.$refs.PieChart.initChart(this.lineChartData);
+        //鑳借�楁秷璐规垚鏈�
+        let unitIdXFCB=[];
+        let sourceXFCB=[];
+        let titleXFCB=[];
+        for (let i=0; i<this.arraylist4.length;i++){
+          sourceXFCB.push({"name":this.arraylist4[i].indexName,"value":this.numFilter(this.arraylist4[i].value)});
+          unitIdXFCB.push({"name":this.arraylist4[i].indexName,"value":this.numFilter(this.arraylist4[i].value),"unitId":"涓囧厓"});
+          titleXFCB +=this.numFilter(this.arraylist4[i].value);
+        }
+        this.lineChartData1.title=titleXFCB;
+        this.lineChartData1.newVisitis=sourceXFCB;
+        this.lineChartData1.datas=unitIdXFCB;
+        this.$refs.pieChartCost.initChart(this.lineChartData1);
+      });
+      //鑾峰彇妯″瀷鑾峰彇鎸囨爣
+       getSettingIndex(this.queryParams.id).then(response => {
+          this.list=response.data;
+         this.queryParams.indexName="";
+          this.list.forEach(item => {
+            this.queryParams.indexName+=item.code+",";
+          });
+          getEnergyConsumption(this.queryParams).then(response => {
+            this.arraylist3=response.data.resultListZBL;//鎶樻爣閲�
+            this.arraylist5=response.data.resultListXFCB;//鎶樻爣閲�
+            //this.arraylist5=response.data.tabledataMap;
+            //鑳借�楁秷璐圭粨鏋� 瀵规瘮
+            let resultZBL =[];
+            let currentValue=[];
+            let lastYearValue=[];
+            let xAxis=[];
+            for(let i=0; i<this.arraylist3.length; i++){
+              currentValue.push(this.numFilter(this.arraylist3[i].currentValue));
+              lastYearValue.push(this.numFilter(this.arraylist3[i].lastYearValue));
+            }
+            resultZBL.push(currentValue);
+            resultZBL.push(lastYearValue);
+            this.xAxisListZBL=response.data.resultZBL;
+            for (let i=0;i<this.xAxisListZBL.length;i++){
+              xAxis.push(this.xAxisListZBL[i].indexName);
+            }
+            this.lineChartData2.xAxis=xAxis;
+            this.lineChartData2.newVisitis=resultZBL;
+            this.lineChartData2.actualData=['鏈湡','鍚屾湡'];
+            this.$refs.BarChart.initChart(this.lineChartData2);
+            //鑳借�楁秷璐规垚鏈� 瀵规瘮
+            let resultXFCB=[];
+            let currentValueXFCB=[];
+            let lastYearValueXFCB=[];
+            let minValue=[];
+            let xAxisXFCB=[];
+            for(let i=0; i<this.arraylist5.length; i++){
+              currentValueXFCB.push(this.arraylist5[i].currentValue);
+              lastYearValueXFCB.push(this.arraylist5[i].lastYearValue);
+              minValue.push(this.numFilter(this.arraylist5[i].minValue));
+            }
+            resultXFCB.push(currentValueXFCB);
+            resultXFCB.push(lastYearValueXFCB);
+            //source.push(minValue);
+            //x杞村潗鏍囧悕绉�
+            this.xAxisListXFCB=response.data.resultXFCB;
+            for (let i=0;i<this.xAxisListXFCB.length;i++){
+              xAxisXFCB.push(this.xAxisListXFCB[i].indexName);
+            }
+            this.lineChartData3.xAxis=xAxisXFCB;
+            this.lineChartData3.newVisitis=resultXFCB;
+            this.lineChartData3.actualData=['鏈湡','鍚屾湡','棰勭畻'];
+            this.$refs.BarCharts.initChart(this.lineChartData3);
+          })
+        });
+      },
+
+      handleCheckAllChange1(val) {
+        let checke=[];
+        this.list.forEach(item => {
+          checke.push(item.code);
+        });
+        this.checkList1 =val ? checke : [];
+        this.isIndeterminate1 = false;
+        this.resultListZBL(checke);
+      },
+      handleCheckedCitiesChange1(value) {
+        let checkedCount = value.length;
+        this.checkAll1 = checkedCount === this.list.length;
+        this.isIndeterminate1 = checkedCount > 0 && checkedCount < this.list.length;
+        this.resultListZBL(value);
+      },
+      handleCheckAllChange2(val) {
+        let checke=[];
+        this.list.forEach(item => {
+          checke.push(item.code);
+        });
+        this.checkList2 =val ? checke : [];
+        this.isIndeterminate2 = false;
+        this.resultListXFCB(checke);
+      },
+      handleCheckedCitiesChange2(value) {
+        this.resultListXFCB(value);
+        let checkedCount = value.length;
+        this.checkAll2 = checkedCount === this.list.length;
+        this.isIndeterminate2 = checkedCount > 0 && checkedCount < this.list.length;
+      },
+      resultListZBL(value){
+        this.queryParams.indexName=value.join(',');
+        getEnergyConsumption(this.queryParams).then(response => {
+          this.arraylist3=response.data.resultListZBL;//鎶樻爣閲�
+          //鑳借�楁秷璐圭粨鏋� 瀵规瘮
+          let resultZBL =[];
+          let currentValue=[];
+          let lastYearValue=[];
+          let xAxis=[];
+          for(let i=0; i<this.arraylist3.length; i++){
+            currentValue.push(this.numFilter(this.arraylist3[i].currentValue));
+            lastYearValue.push(this.numFilter(this.arraylist3[i].lastYearValue));
+          }
+          resultZBL.push(currentValue);
+          resultZBL.push(lastYearValue);
+          let xAxisListZBL=[];
+          xAxisListZBL=response.data.resultZBL;
+          for (let i=0;i<xAxisListZBL.length;i++){
+            xAxis.push(xAxisListZBL[i].indexName);
+          }
+          this.lineChartData2.xAxis=xAxis;
+          this.lineChartData2.newVisitis=resultZBL;
+          this.lineChartData2.actualData=['鏈湡','鍚屾湡'];
+          this.$refs.BarChart.initChart(this.lineChartData2);
+        });
+      },
+      resultListXFCB(value){
+        this.queryParams.indexName=value.join(',');
+        //鑳芥簮娑堣垂鎴愭湰鎯呭喌
+        getEnergyConsumption(this.queryParams).then(response => {
+          this.arraylist5=response.data.resultListXFCB;//鎶樻爣閲�
+          //鑳借�楁秷璐规垚鏈� 瀵规瘮
+          let resultXFCB=[];
+          let currentValueXFCB=[];
+          let lastYearValueXFCB=[];
+          let minValue=[];
+          let xAxisXFCB=[];
+          for(let i=0; i<this.arraylist5.length; i++){
+            currentValueXFCB.push(this.arraylist5[i].currentValue);
+            lastYearValueXFCB.push(this.arraylist5[i].lastYearValue);
+            minValue.push(this.numFilter(this.arraylist5[i].minValue));
+          }
+          resultXFCB.push(currentValueXFCB);
+          resultXFCB.push(lastYearValueXFCB);
+          //source.push(minValue);
+          //x杞村潗鏍囧悕绉�
+          this.xAxisListXFCB=response.data.resultXFCB;
+          for (let i=0;i<this.xAxisListXFCB.length;i++){
+            xAxisXFCB.push(this.xAxisListXFCB[i].indexName);
+          }
+          this.lineChartData3.xAxis=xAxisXFCB;
+          this.lineChartData3.newVisitis=resultXFCB;
+          this.lineChartData3.actualData=['鏈湡','鍚屾湡','棰勭畻'];
+          this.$refs.BarCharts.initChart(this.lineChartData3);
+        });
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.modelNodeChange(this.queryParams);
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      handleTime(data){
+        let nowDate = new Date();
+        let date = {
+          year: nowDate.getFullYear(),
+          month: nowDate.getMonth() + 1,
+          frontMonth: nowDate.getMonth(),
+        }
+        if(data=='YEAR'){
+          this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+        }else if(data=='MONTH'){
+          //this.dateTypes='monthrange'
+          this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+        }
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘鑰楁寚鏍囪秼鍔垮垎鏋愭暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          //return exportEnergyindex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '') {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '--'
+        }
+        return realVal
+      },
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+  .chart-title{
+    display: block;
+    background: #f2f6fc;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px;
+  }
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyStatistics/energyConsumption/consumptionCost.vue b/energy_management_ui/src/views/energyStatistics/energyConsumption/consumptionCost.vue
new file mode 100644
index 0000000..b5c2acb
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyConsumption/consumptionCost.vue
@@ -0,0 +1,156 @@
+<template>
+  <div class="dashboard-editor-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="缁熻鍛ㄦ湡">
+        <el-date-picker
+          v-model="queryParams.beginTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="寮�濮嬫棩鏈�">
+        </el-date-picker>
+        鍒�
+        <el-date-picker
+          v-model="queryParams.endTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" size="mini" @click="handleExport">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <h4 style="float: left; text-align:center;padding: 0;margin: 0px 0px 10px;width: 90%;">{{title}}鑳芥簮娑堣�楁垚鏈粺璁℃姤琛�</h4>
+      <el-table border show-summary style="width: 100%" :data=tabledata>
+        <el-table-column prop="dateTims" label="鏃ユ湡" align="center"></el-table-column>
+        <template v-for="item in  tablehead ">
+          <el-table-column :label=item.lable align="center" :prop=item.prop >
+            <template v-for="childnode in item.childNodes">
+              <el-table-column :prop=childnode.prop :label=childnode.lable align="center"></el-table-column>
+            </template>
+          </el-table-column>
+        </template>
+      </el-table>
+    </div>
+</template>
+
+<script>
+  import {listEnergyConsumption,getSettingEnergy,energyConsumptionExport} from "@/api/energyStatistics/statistics";
+  export default {
+    name: 'consumption',
+    props: ["modelCode"],
+    data() {
+      return {
+          // 閬僵灞�
+        loading: true,
+        total: 0,
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          beginTime: undefined,
+          endTime: undefined,
+          timeType: undefined,
+          indexCode: undefined,
+        },
+        tablehead:[
+          /*this.tablehead=[
+            {"lable":"鏃ユ湡","prop":"data"},
+            {"lable":"鎸囨爣1",
+              "childnodes":[
+                {"lable":"鍒�1","prop":"a1"},
+                {"lable":"鍒�2","prop":"a2"}
+              ]
+            },
+            {"lable":"鎸囨爣2",
+              "childnodes":[
+                {"lable":"鍒梐","prop":"b1"},
+                {"lable":"鍒梑","prop":"b2"}
+              ]
+            },];*/
+        ],
+        tabledata:[
+          /*{"a1":"111","a2":"112","b1":"221","b2":"222","data":'2020-03-01'}*/
+        ],
+        list:[],
+        arraylist:[],
+        //dateTypes: 'monthrange',//鏃堕棿鑼冨洿
+        dateTypes: '',
+        valueFormat:'',
+        title:"",
+        skinName:"",
+      }
+    },
+    created() {
+      this.queryParams.timeType=this.$route.params && this.$route.params.timeType;
+      this.title=this.$route.params && this.$route.params.titleName;
+      if(this.queryParams.timeType=='YEAR'){
+        this.dateTypes= 'year';
+        this.valueFormat='yyyy';
+      }else if(this.queryParams.timeType=='MONTH'){
+        this.dateTypes='month';
+        this.valueFormat='yyyy-MM';
+      }
+      this.queryParams.beginTime = this.$route.params && this.$route.params.beginTime;
+      this.queryParams.endTime = this.$route.params && this.$route.params.endTime;
+      this.queryParams.indexCode =this.$route.params && this.$route.params.indexCode;
+      this.queryParams.id =this.$route.params && this.$route.params.id;
+      this.getList();
+    },
+    mounted() {
+
+    },
+    methods: {
+      getList() {
+        let aa=[];
+        let bb=[];
+        listEnergyConsumption(this.queryParams).then(response => {
+          this.tablehead = response.data.tablehead;
+          this.tabledata= response.data.tabledataMap;
+          console.log("this.tablehead="+JSON.stringify(response));
+        })
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘鑰楁寚鏍囪秼鍔垮垎鏋愭暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return energyConsumptionExport(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+  .chart-title{
+    display: block;
+    background: #f2f6fc;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px;
+  }
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyStatistics/energyConsumption/index.vue b/energy_management_ui/src/views/energyStatistics/energyConsumption/index.vue
new file mode 100644
index 0000000..66026c8
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyConsumption/index.vue
@@ -0,0 +1,55 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳借�楁秷璐规垚鏈垎鏋�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <consumption ref="consumption" style="padding:10px"></consumption>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import consumption from "./consumption";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,consumption},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.consumption.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyConsumption/pieChartCost.vue b/energy_management_ui/src/views/energyStatistics/energyConsumption/pieChartCost.vue
new file mode 100644
index 0000000..bc7882a
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyConsumption/pieChartCost.vue
@@ -0,0 +1,161 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    chartData: {
+      type:Object,
+      //required: true
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({newVisitis,datas,title } = {}) {
+      let scale = 1;
+      this.chart.setOption({
+        title: {
+          text: '鑳芥簮娑堣垂鎴愭湰鍒嗘瀽',
+          x:'left',
+          y: 'top',
+          textStyle: {
+            color: "#333",
+          },
+        },
+        tooltip: {
+          trigger: 'item',
+          formatter: datas
+        },
+        grid: {
+          top: 40,
+          left: '2%',
+          right: '2%',
+          bottom: '3%',
+          containLabel: true
+        },
+        legend: {
+          // orient 璁剧疆甯冨眬鏂瑰紡锛岄粯璁ゆ按骞冲竷灞�锛屽彲閫夊�硷細'horizontal'锛堟按骞筹級 娄 'vertical'锛堝瀭鐩达級
+          orient: 'vertical',
+          // x 璁剧疆姘村钩瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥惧眳涓紝鍙�夊�硷細'center' 娄 'left' 娄 'right' 娄 {number}锛坸鍧愭爣锛屽崟浣峱x锛�
+          x: 'left',
+          // y 璁剧疆鍨傜洿瀹夋斁浣嶇疆锛岄粯璁ゅ叏鍥鹃《绔紝鍙�夊�硷細'top' 娄 'bottom' 娄 'center' 娄 {number}锛坹鍧愭爣锛屽崟浣峱x锛�
+          y: '10%',
+          //left: 10,
+          itemWidth: 24,   // 璁剧疆鍥句緥鍥惧舰鐨勫
+          itemHeight: 18,  // 璁剧疆鍥句緥鍥惧舰鐨勯珮
+          textStyle: {
+            color: '#666'  // 鍥句緥鏂囧瓧棰滆壊
+          },
+          // itemGap璁剧疆鍚勪釜item涔嬮棿鐨勯棿闅旓紝鍗曚綅px锛岄粯璁や负10锛屾í鍚戝竷灞�鏃朵负姘村钩闂撮殧锛岀旱鍚戝竷灞�鏃朵负绾靛悜闂撮殧
+         // itemGap: 30,
+          backgroundColor: '#eee',  // 璁剧疆鏁翠釜鍥句緥鍖哄煙鑳屾櫙棰滆壊
+          data: datas,
+          formatter:function(item){
+            let target;
+            let unitId;
+            for(let i=0;i<newVisitis.length;i++){
+              if(datas[i].name===item){
+                target=datas[i].value;
+                unitId=datas[i].unitId
+              }
+            }
+            let arr=[item+ +target+ unitId]/*["{a|"+target+"}","{b|"+item+"}"]*/
+            return arr/*.join("\n")*/
+          },
+        },
+        series: [{
+            //name: '鐢ㄦ按',
+            type: 'pie',
+            avoidLabelOverlap: false,
+            radius: ['40%', '60%'], // 璁剧疆鐜舰楗肩姸鍥撅紝 绗竴涓櫨鍒嗘暟璁剧疆鍐呭湀澶у皬锛岀浜屼釜鐧惧垎鏁拌缃鍦堝ぇ灏�
+            center: ['65%', '50%'],  // 璁剧疆楗肩姸鍥句綅缃紝绗竴涓櫨鍒嗘暟璋冩按骞充綅缃紝绗簩涓櫨鍒嗘暟璋冨瀭鐩翠綅缃�
+            data: newVisitis,//[{value:335, name:'鐢ㄦ按' },{value:310, name:'鐢ㄧ數'},{value:234, name:'鐢ㄧ叅'}],/*selected: true*/
+            // itemStyle 璁剧疆楗肩姸鍥炬墖褰㈠尯鍩熸牱寮�
+            itemStyle: {
+              // emphasis锛氳嫳鏂囨剰鎬濇槸 寮鸿皟;鐫�閲�;锛堣疆寤撱�佸浘褰㈢瓑鐨勶級椴滄槑;绐佸嚭锛岄噸璇�
+              // emphasis锛氳缃紶鏍囨斁鍒板摢涓�鍧楁墖褰笂闈㈢殑鏃跺�欙紝鎵囧舰鏍峰紡銆侀槾褰�
+              emphasis: {
+                shadowBlur: 10,
+                shadowOffsetX: 0,
+                shadowColor: 'rgba(30, 144, 255锛�0.5)'
+              }
+            },
+            // 璁剧疆鍊煎煙鐨勯偅鎸囧悜绾�
+            labelLine: {
+              normal: {
+                show: false   // show璁剧疆绾挎槸鍚︽樉绀猴紝榛樿涓簍rue锛屽彲閫夊�硷細true 娄 false
+              }
+            },
+            // 璁剧疆鍊煎煙鐨勬爣绛�
+          label: {
+            normal: {
+              show: true,
+              position: 'center',
+              formatter: ['绱鎴愭湰',title].join('\n'),
+            },
+            emphasis: {
+              show: true,
+            },
+          },
+            /*label: {
+              normal: {
+                position: 'inner',  // 璁剧疆鏍囩浣嶇疆锛岄粯璁ゅ湪楗肩姸鍥惧 鍙�夊�硷細'outer' 娄 'inner锛堥ゼ鐘跺浘涓婏級'
+                // formatter: '{a} {b} : {c}涓� ({d}%)'   璁剧疆鏍囩鏄剧ず鍐呭 锛岄粯璁ゆ樉绀簕b}
+                // {a}鎸噑eries.name  {b}鎸噑eries.data鐨刵ame
+                // {c}鎸噑eries.data鐨剉alue  {d}%鎸囪繖涓�閮ㄥ垎鍗犳�绘暟鐨勭櫨鍒嗘瘮
+                formatter: '{c}'
+              }
+            }*/
+          }
+        ],
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/EnergyIndex.vue b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/EnergyIndex.vue
new file mode 100644
index 0000000..9bec9d0
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/EnergyIndex.vue
@@ -0,0 +1,307 @@
+<template>
+  <div class="dashboard-editor-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏌ョ湅鎸囨爣">
+        <el-select v-model="queryParams.procedure" placeholder="璇烽�夋嫨鎸囨爣" @change="currentSel">
+          <el-option style="width: 150px"
+            v-for="dict in list"
+            :key="dict.indexId"
+            :label="dict.name"
+            :value="dict.indexId"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鏃ユ湡" label-width="40px">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio style="margin-right: 10px" v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+          <el-date-picker
+            v-model="queryParams.beginTime"
+            :type="dateTypes"
+            style="width: 150px"
+            :value-format="valueFormat"
+            placeholder="寮�濮嬫棩鏈�">
+          </el-date-picker>
+          鍒�
+        <el-date-picker
+          v-model="queryParams.endTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+        <!--<el-date-picker
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          :value-format="valueFormat"
+          :type="dateTypes"
+          :default-value="dateRange"
+          range-separator="-"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        ></el-date-picker>-->
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24" >
+        <div class="chart-wrapper">
+          <line-chart ref="lineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24" >
+        <div class="chart-wrapper" >
+          <h4 style="float: left; text-align:center;padding: 0;margin: 0;width: 90%;">{{title}}1</h4>
+          <el-button type="warning" icon="el-icon-download" size="mini" style="float: right" @click="handleExport" >瀵煎嚭</el-button><!--v-hasPermi="['system:post:export']"-->
+          <el-table v-loading="loading" :data="arraylist">
+            <el-table-column prop="dataTime" label="鏃ユ湡" align="center" width="150" show-overflow-tooltip>
+              <template slot-scope="scope">
+                <span>{{ changeTime(parseTime(scope.row.dataTime)) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="currentValue" label="鏈湡鍊�"  align="center">
+              <template slot-scope="scope">
+                <span>{{numFilter(scope.row.currentValue)}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="lastYearValue" label="鍚屾湡鍊�"  align="center">
+              <template slot-scope="scope">
+                <span>{{numFilter(scope.row.lastYearValue)}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="yoy" label="鍚屾瘮"  align="center">
+              <template slot-scope="scope">
+                <span>{{numFilter(scope.row.yoy)}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column v-if="queryParams.timeType ==='MONTH'" prop="qoq" label="鐜瘮"  align="center">
+              <template slot-scope="scope">
+                <span>{{numFilter(scope.row.qoq)}}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="minValue" label="鍘嗗彶鏈�浼�"  align="center">
+              <template slot-scope="scope">
+                <span>{{numFilter(scope.row.minValue)}}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import LineChart from './lineChart'
+  import {getSettingIndex,getSettingEnergy,exportEnergyindex,getEnergyStatisticsTrend} from "@/api/energyStatistics/statistics";
+
+  export default {
+    name: 'EnergyIndex',
+    name: 'Index',
+    components: {LineChart},
+    props: ["modelCode"],
+    data() {
+      return {
+        // 閬僵灞�
+        loading: true,
+        total: 0,
+        dateTypeOptions:[],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          beginTime: undefined,
+          endTime: undefined,
+          dataTime: undefined,
+          timeType:undefined,
+          indexId: undefined,
+          procedure: undefined,
+        },
+        list:[],
+        arraylist:[],
+        lineChartData:{
+          newVisitis:null,
+        },
+        //dateTypes: 'monthrange',//鏃堕棿鑼冨洿
+        dateTypes: 'month',
+        valueFormat:'yyyy-MM',
+        title:"",
+        skinName:"",
+      }
+    },
+    watch: {
+      modelCode: {
+        deep: true,
+        handler(val) {
+          this.getList(val)
+        }
+      },
+    },
+    created() {
+      //this.getList();
+      this.getDicts("timeType").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+      this.getConfigKey("energyStatistics.energyStatisticsTrend").then(response => {
+        this.skinName=response.msg;
+      });
+      let endTtime=(new Date().getFullYear()) +'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+      let starTtime= (new Date().getFullYear()-1)+'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+      this.queryParams.beginTime=starTtime;
+      this.queryParams.endTime=endTtime;
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.queryParams.id=modelNode.id;
+        this.loading = true;
+        getSettingIndex(this.queryParams.id).then(response => {
+          let result=response.data;
+          this.list = result.filter(f => f.indexType === 'STATISTIC');
+          this.loading = false;
+          if (this.list.length > 0) {
+            this.queryParams.procedure = this.list[0].indexId;
+          }else{
+            this.queryParams.procedure = "";
+            this.title="";
+          }
+          if(this.queryParams.timeType=='YEAR'){
+            this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 4)+'-01-01';
+            this.queryParams.endTime=this.queryParams.endTime.substring(0, 4)+'-01-01';
+          }else if(this.queryParams.timeType=='MONTH'){
+            this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 7)+'-01';
+            this.queryParams.endTime=this.queryParams.endTime.substring(0, 7)+'-01';
+          }
+          this.getList();
+        });
+      },
+      getList(){
+        let source=[];
+        let xAxis=[];
+        this.queryParams.indexId=this.queryParams.procedure;
+        getEnergyStatisticsTrend(this.queryParams).then(response => {
+          this.arraylist=response.rows;
+          this.total = response.total;
+          let currentValue=[];
+          let lastYearValue=[];
+          let minValue=[];
+          for(let i=0; i<this.arraylist.length; i++){
+            currentValue.push(this.arraylist[i].currentValue);
+            lastYearValue.push(this.arraylist[i].lastYearValue);
+            minValue.push(this.arraylist[i].minValue);
+            if(this.queryParams.timeType=='MONTH') {
+              xAxis.push(this.arraylist[i].dataTime.substring(0, 7))
+            }else if(this.queryParams.timeType=='YEAR'){
+              xAxis.push(this.arraylist[i].dataTime.substring(0, 4))
+            }
+          }
+          source.push(currentValue);
+          source.push(lastYearValue);
+          let yAxis="";
+          if(this.arraylist.length>0){
+            this.title=this.arraylist[0].indexName+"("+this.arraylist[0].unitId+")";
+            yAxis=this.arraylist[0].unitId
+          }
+          this.lineChartData.newVisitis=source;
+          this.lineChartData.actualData=['鏈湡鍊�','鍚屾湡鍊�'];
+          this.lineChartData.actual=minValue;
+          this.lineChartData.xAxis=xAxis;
+          this.lineChartData.title=this.title;
+          this.lineChartData.yAxis=yAxis;
+          this.$refs.lineChart.initChart(this.lineChartData);
+        });
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '') {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '--'
+        }
+        return realVal
+      },
+      currentSel(selVal) {//鑾峰彇涓嬫媺妗嗙殑text
+        let obj = {};
+        obj = this.list.find((item) => {
+          return item.indexId === selVal
+        });
+        this.title=obj.name;
+        this.queryParams.procedure=obj.indexId;
+      },
+      handleTime(date){
+        if(date=='YEAR'){
+          this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+        }else if(date=='MONTH'){
+          //this.dateTypes='monthrange'
+          this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+        }
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.queryParams.title=this.title;
+        this.getList();
+        //this.modelNodeChange(this.queryParams);
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘鑰楁寚鏍囪秼鍔垮垎鏋愭暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportEnergyindex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      changeTime(time) {
+        if (time !== null && time !== undefined && time !== "") {
+          return time.substring(0, 10);
+        } else {
+          return "";
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+  .chart-title{
+    display: block;
+    background: #f2f6fc;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px;
+  }
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/index.vue b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/index.vue
new file mode 100644
index 0000000..c9e6130
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/index.vue
@@ -0,0 +1,55 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鑳借�楁寚鏍囪秼鍔垮垎鏋�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <EnergyIndex ref="EnergyIndex" style="padding:10px"></EnergyIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import EnergyIndex from "./EnergyIndex";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,EnergyIndex},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.EnergyIndex.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/lineChart.vue b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/lineChart.vue
new file mode 100644
index 0000000..d78140a
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/lineChart.vue
@@ -0,0 +1,136 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from './mixins/resize'
+  const animationDuration = 6000
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null,
+        seriesData: [],
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({newVisitis,xAxis,actualData,actual,title,yAxis} = {}) {
+        var series=[];
+        if(newVisitis !=null ||newVisitis != undefined){
+          for(var i=0;i<newVisitis.length;i++){
+            series.push({
+                name: actualData[i],
+                type: 'bar',
+                data: newVisitis[i],
+                smooth: true,//绾挎潯骞虫粦
+                //stack: 'vistors',
+                animationDuration: 2800,
+                animationEasing: 'quadraticOut'
+              }
+            );
+          }
+          series.push({
+            name:'鍘嗗彶鏈�浼�' ,
+            type: 'line',
+            data: actual,
+            smooth: true,//绾挎潯骞虫粦
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          })
+        }
+        this.chart.setOption({
+          title: {
+            text: title,
+            x:'center',
+            y: 'top',
+            textStyle: {
+              color: "#333"
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 40,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          legend: {
+            data:['鏈湡鍊�', '鍚屾湡鍊�','鍘嗗彶鏈�浼�'],
+            left: '60%',
+          },
+          xAxis: [{
+            type: 'category',
+            data: xAxis,
+            axisTick: {
+              alignWithLabel: true
+            },
+          }],
+          yAxis: [{
+              name: yAxis,
+              type: 'value',
+              nameTextStyle:{
+                color:"#333",
+              },
+              axisLabel: {
+                formatter: '{value}'
+              },
+              axisTick: {
+                show: false
+              },
+            }
+          ],
+          series:series
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/mixins/resize.js b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/mixins/resize.js
new file mode 100644
index 0000000..ae02e64
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/mixins/resize.js
@@ -0,0 +1,52 @@
+import { debounce } from '@/utils'
+
+export default {
+  data() {
+    return {
+      $_sidebarElm: null
+    }
+  },
+  mounted() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  beforeDestroy() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  activated() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  deactivated() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  methods: {
+    $_resizeHandler() {
+      return debounce(() => {
+        if (this.chart) {
+          this.chart.resize()
+        }
+      }, 100)()
+    },
+    $_initResizeEvent() {
+      window.addEventListener('resize', this.$_resizeHandler)
+    },
+    $_destroyResizeEvent() {
+      window.removeEventListener('resize', this.$_resizeHandler)
+    },
+    $_sidebarResizeHandler(e) {
+      if (e.propertyName === 'width') {
+        this.$_resizeHandler()
+      }
+    },
+    $_initSidebarResizeEvent() {
+      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+      this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+    },
+    $_destroySidebarResizeEvent() {
+      this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+    }
+  }
+}
diff --git a/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/realTimeIndex.vue b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/realTimeIndex.vue
new file mode 100644
index 0000000..af698c6
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/realTimeIndex.vue
@@ -0,0 +1,135 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true">
+      <el-form-item label="鏃ユ湡" label-width="40px">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio style="margin-right: 10px" v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+        <el-date-picker
+          v-model="queryParams.dataTime"
+          type="date"
+          style="width: 150px"
+          value-format="yyyy-MM-dd"
+          placeholder="璇烽�夋嫨鏃堕棿">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+        >瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table  :data="tabledata" border>
+      <el-table-column label=鏃ユ湡 align="center" prop="formatdate"/>
+      <template v-for="item in  tablehead ">
+        <el-table-column :label=item.indexName align="center" prop="value" />
+      </template>
+    </el-table>
+    <pagination style="padding-bottom: 50px !important;"
+                v-show="total>0"
+                :total="total"
+                :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  import {reportFormsvg,reportFormsvgExport,getConfigure } from "@/api/energyStatistics/statistics";
+  export default {
+    name: 'realTimeIndex',
+    props:['svgId','tagId'],
+    data() {
+      return {
+        // 閬僵灞�
+        loading: true,
+        total: 0,
+        tagCodes: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          indexType:'STATISTIC',
+          dataTime:undefined,
+          timeType:'MONTH',
+          nodeId:undefined,
+        },
+        dateTypeOptions:[],
+        tablehead:[],
+        tabledata:[],
+      }
+    },
+    created() {
+      if (this.$props.tagId) {
+        this.queryParams.nodeId = this.$props.tagId;
+      }
+      this.getDicts("dateType").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+      this.queryParams.dataTime=this.formatDate(new Date());
+    },
+
+    methods: {
+      show(nodeId){
+        this.queryParams.nodeId = nodeId;
+        this.getList();
+        //this.queryParams.nodeId='5b28f6ab-29f2-471a-bec9-ec481909f26a'
+      },
+      getList() {
+        this.loading = true;
+        reportFormsvg(this.queryParams).then(response => {
+          this.tablehead = response.data.tabledataMap;
+          this.tabledata= response.data.tabledata;
+          this.loading = false;
+        })
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.queryParams.title=this.title;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鏁版嵁椤�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+           return reportFormsvgExport(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      formatDate: function (value) {
+        let date = new Date(value);
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? ('0' + MM) : MM;
+        let d = date.getDate();
+        d = d < 10 ? ('0' + d) : d;
+        let h = date.getHours();
+        h = h < 10 ? ('0' + h) : h;
+        let m = date.getMinutes();
+        m = m < 10 ? ('0' + m) : m;
+        let s = date.getSeconds();
+        s = s < 10 ? ('0' + s) : s;
+        return y + '-' + MM + '-' + d;
+      },
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/reportForm.vue b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/reportForm.vue
new file mode 100644
index 0000000..843803f
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStatisticsTrend/reportForm.vue
@@ -0,0 +1,212 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true">
+      <el-form-item label="鏃ユ湡" label-width="40px">
+          <el-date-picker
+            v-model="queryParams.starTtime"
+            type="date"
+            style="width: 150px"
+            value-format="yyyy-MM-dd"
+            placeholder="璇烽�夋嫨鏃堕棿">
+          </el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏃堕棿闂撮殧(鍒嗛挓)" label-width="110px">
+        <el-input
+          v-model="queryParams.interval"
+          placeholder="鏃堕棿闂撮殧"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+        >瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table  :data="list">
+      <el-table-column prop="dataTime" label="鏃ユ湡" align="center" width="150" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column prop="currentValue" label="鎸囨爣1"  align="center"></el-table-column>
+      <el-table-column prop="lastYearValue" label="鎸囨爣1"  align="center"></el-table-column>
+      <el-table-column prop="yoy" label="鎸囨爣1"  align="center"></el-table-column>
+      <el-table-column prop="qoq" label="鎸囨爣1"  align="center"> </el-table-column>
+      <el-table-column prop="minValue" label="鎸囨爣1"  align="center"></el-table-column>
+    </el-table>
+    <!--<div class="el-table el-table&#45;&#45;fit el-table&#45;&#45;enable-row-hover el-table&#45;&#45;medium">
+      <div class="hidden-columns">
+        <div></div>
+        <div></div>
+        <div></div>
+        <div></div>
+        <div></div>
+        <div></div>
+      </div>
+      <div class="el-table__header-wrapper">
+        <table cellspacing="0" cellpadding="0" border="0" class="el-table__header" style="width: 790px;">
+          <colgroup>
+            <col name="el-table_2_column_7" width="150">
+            <col name="el-table_2_column_8" width="128">
+            <col name="el-table_2_column_9" width="128">
+            <col name="el-table_2_column_10" width="128">
+            <col name="el-table_2_column_11" width="128">
+            <col name="el-table_2_column_12" width="128">
+            <col name="gutter" width="0">
+          </colgroup>
+          <thead class="has-gutter">
+          <tr class="">
+            <th colspan="1" rowspan="1" class="el-table_2_column_7  is-center   is-leaf">
+              <div class="cell">鏃ユ湡</div>
+            </th>
+            <th colspan="1" rowspan="1" class="el-table_2_column_8  is-center   is-leaf">
+              <div class="cell">鎸囨爣1</div>
+            </th>
+            <th colspan="1" rowspan="1" class="el-table_2_column_9  is-center   is-leaf">
+              <div class="cell">鎸囨爣1</div>
+            </th>
+            <th colspan="1" rowspan="1" class="el-table_2_column_10  is-center   is-leaf">
+              <div class="cell">鎸囨爣1</div>
+            </th>
+            <th colspan="1" rowspan="1" class="el-table_2_column_11  is-center   is-leaf">
+              <div class="cell">鎸囨爣1</div>
+            </th>
+            <th colspan="1" rowspan="1" class="el-table_2_column_12  is-center   is-leaf">
+              <div class="cell">鎸囨爣1</div>
+            </th>
+            <th class="gutter" style="width: 0px; display: none;"></th>
+          </tr>
+          </thead>
+        </table>
+      </div>
+      <div class="el-table__body-wrapper is-scrolling-none">
+        <table cellspacing="0" cellpadding="0" border="0" class="el-table__body" style="width: 790px;">
+          <colgroup>
+            <col name="el-table_2_column_7" width="150">
+            <col name="el-table_2_column_8" width="128">
+            <col name="el-table_2_column_9" width="128">
+            <col name="el-table_2_column_10" width="128">
+            <col name="el-table_2_column_11" width="128">
+            <col name="el-table_2_column_12" width="128">
+          </colgroup>
+          <tbody>&lt;!&ndash;&ndash;&gt;</tbody>
+        </table>
+        <div class="el-table__empty-block" style="width: 790px;">
+          <span class="el-table__empty-text">鏆傛棤鏁版嵁</span>
+        </div>&lt;!&ndash;&ndash;&gt;
+      </div>
+      <div class="el-table__column-resize-proxy" style="display: none;"></div>
+    </div>-->
+    <!--<table cellspacing="0" cellpadding="0" border="0" class="el-table__body" style="width: 90%;border: 1px solid #ddd;margin-bottom: 20px">
+      <thead class="has-gutter" style="background: #e7eaec">
+      <tr class="">
+        <th colspan="1" rowspan="1" class="el-table_4_column_24  is-center is-leaf">
+          <div class="cell">鏃ユ湡</div>
+        </th>
+        <th colspan="1" rowspan="1" class="el-table_4_column_25  is-center is-leaf">
+          <div class="cell">鎸囨爣</div>
+        </th>
+        <th colspan="1" rowspan="1" class="el-table_4_column_25  is-center is-leaf">
+          <div class="cell">鎸囨爣</div>
+        </th>
+      </tr>
+      </thead>
+      <tbody>
+      <tr class="el-table__row expanded"  style="border: 1px solid #ddd">
+        <td rowspan="1" colspan="1" class="el-table_1_column_3 is-center " >
+          <div class="cell">娴嬭瘯</div>
+        </td>
+        <td rowspan="1" colspan="1" class="el-table_1_column_3 is-center " >
+          <div class="cell">娴嬭瘯1</div>
+        </td>
+        <td rowspan="1" colspan="1" class="el-table_1_column_3 is-center " >
+          <div class="cell">娴嬭瘯2</div>
+        </td>
+      </tr>
+      </tbody>
+    </table>-->
+    <pagination style="padding-bottom: 50px !important;"
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+  import LineChart from './lineChart'
+  import {getSettingIndex,getSettingEnergy,exportEnergyindex,getEnergyStatisticsTrend} from "@/api/energyStatistics/statistics";
+/*  window.setInterval(() => {
+    setTimeout(fun, 0)
+  },3000),*/
+  export default {
+    name: 'EnergyIndex',
+    name: 'Index',
+    data() {
+      return {
+        // 閬僵灞�
+        //loading: true,
+        total: 0,
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          starTtime:undefined,
+          interval:'60'
+        },
+        list:[],
+        arraylist:[],
+      }
+    },
+    created() {
+      //this.getList();
+      let nowDate = new Date();
+      let date = {
+        year: nowDate.getFullYear(),
+        month: nowDate.getMonth() + 1,
+        frontMonth: nowDate.getMonth(),
+        date:nowDate.getDate(),
+      }
+      this.queryParams.starTtime= date.year + '-' + date.month+ '-'+ date.date;
+    },
+
+    methods: {
+        getList(data) {
+          console.log(data.id);
+          console.log(this.queryParams);
+        },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.queryParams.title=this.title;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鏁版嵁椤�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+         /* return exportEnergyindex(queryParams);*/
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStructure/EnergyIndex.vue b/energy_management_ui/src/views/energyStatistics/energyStructure/EnergyIndex.vue
new file mode 100644
index 0000000..a008ff3
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStructure/EnergyIndex.vue
@@ -0,0 +1,347 @@
+<template>
+  <div class="dashboard-editor-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="鏃ユ湡" label-width="40px">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio
+            style="margin-right: 10px"
+            v-for="dict in dateTypeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictValue"
+            @change="handleTime(dict.dictValue)"
+            >{{ dict.dictLabel }}</el-radio
+          >
+        </el-radio-group>
+        <el-date-picker
+          v-model="queryParams.dataTime"
+          :type="dateTypes"
+          placeholder="閫夋嫨鏃ユ湡"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鑳芥簮鍝佺">
+        <el-select
+          v-model="queryParams.indexCode"
+          placeholder="璇烽�夋嫨鎸囨爣"
+          @change="currentSel"
+        >
+          <el-option
+            style="width: 150px"
+            v-for="dict in arraylist"
+            :key="dict.code"
+            :label="dict.name"
+            :value="dict.code"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="handleQuery"
+          >鏌ヨ</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+          >閲嶇疆</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24">
+        <div class="chart-wrapper">
+          <line-chart ref="lineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24">
+        <div class="chart-wrapper">
+          <el-table :data="resultList" show-summary>
+            <el-table-column
+              prop="formatdate"
+              label="鏃ユ湡"
+              align="center"
+              width="150"
+              show-overflow-tooltip
+            ></el-table-column>
+            <el-table-column
+              prop="indexName"
+              label="绫诲埆"
+              align="center"
+            ></el-table-column>
+            <el-table-column
+              prop="unitId"
+              label="鍗曚綅"
+              align="center"
+            ></el-table-column>
+            <el-table-column
+              prop="yoy"
+              v-if="queryParams.timeType != 'DAY'"
+              label="鍚屾瘮"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <span>{{ numFilter(scope.row.yoy) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+              v-if="queryParams.timeType != 'DAY'"
+              prop="qoq"
+              label="鐜瘮"
+              align="center"
+            >
+              <template slot-scope="scope">
+                <span>{{ numFilter(scope.row.qoq) }}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import LineChart from "./lineChart";
+import {
+  getSettingEnergy,
+  getEnergyUnit,
+  getSettingIndex
+} from "@/api/energyStatistics/statistics";
+
+export default {
+  name: "EnergyIndex",
+  name: "Index",
+  components: { LineChart },
+  props: ["modelCode"],
+  data() {
+    return {
+      total: 0,
+      dateTypeOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dataTime: undefined,
+        timeType: undefined,
+        indexId: undefined,
+        procedure: undefined,
+        indexCode: undefined
+      },
+      list: [],
+      arraylist: [],
+      resultList: [],
+      lineChartData: {
+        newVisitis: null
+      },
+      //dateTypes: 'monthrange',//鏃堕棿鑼冨洿
+      dateTypes: "month",
+      title: "",
+      skinName: ""
+    };
+  },
+  watch: {
+    modelCode: {
+      deep: true,
+      handler(val) {
+        this.getList(val);
+      }
+    }
+  },
+  created() {
+    //this.getList();
+    this.getDicts("dateType").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(
+        f => f.isDefault === "Y"
+      ).dictValue;
+    });
+    this.getConfigKey("energyStatistics.energyStructure").then(response => {
+      this.skinName = response.msg;
+    });
+
+    this.queryParams.dataTime =
+      new Date().getFullYear() +
+      "-" +
+      (new Date().getMonth() + 1 > 9
+        ? new Date().getMonth() + 1
+        : "0" + (new Date().getMonth() + 1));
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.queryParams.id = modelNode.id;
+      let source = [];
+      let xAxis = [];
+      if (this.queryParams.timeType == "DAY") {
+        this.queryParams.dataTime = this.formatDate(
+          new Date(this.queryParams.dataTime).getTime() - 72 * 60 * 60 * 1000
+        );
+      }
+      //鑾峰彇妯″瀷鑾峰彇鎸囨爣
+      getSettingIndex(modelNode.id).then(response => {
+        let result = response.data;
+        this.arraylist = result.filter(f => f.indexType === "STATISTIC");
+        if (this.arraylist.length > 0) {
+          this.queryParams.indexCode = this.arraylist[0].code;
+        }
+        /*for (let i=0;i<this.arraylist.length;i++){
+            let code=this.arraylist[i].code;
+            if (this.arraylist[i].code.indexOf(this.queryParams.procedure) >= 0) {
+              this.queryParams.indexCode=this.arraylist[i].code;
+            }
+          }*/
+        console.log(result);
+        console.log(this.queryParams.indexCode);
+        //鑾峰彇鎸囨爣璁$畻鏁版嵁
+        getEnergyUnit(this.queryParams).then(response => {
+          this.resultList = response.data;
+          let currentValue = [];
+          let lastYearValue = [];
+          this.resultList.forEach(item => {
+            currentValue.push(this.numFilter(item.maxValue));
+            lastYearValue.push(this.numFilter(item.minValue));
+            xAxis.push(item.formatdate);
+          });
+          source.push(currentValue);
+          let titleName = "";
+          if (this.resultList > 0) {
+            titleName =
+              this.resultList[0].indexName +
+              "(" +
+              this.resultList[0].unitId +
+              ")";
+          }
+          this.title = titleName;
+          this.lineChartData.currentValue = currentValue;
+          this.lineChartData.lastYearValue = lastYearValue;
+          this.lineChartData.xAxis = xAxis;
+          this.lineChartData.title = this.title;
+          this.$refs.lineChart.initChart();
+          if (this.queryParams.timeType == "DAY") {
+            this.queryParams.dataTime = this.formatDate(
+              new Date(this.queryParams.dataTime).getTime() +
+                72 * 60 * 60 * 1000
+            );
+          }
+        });
+      });
+    },
+    numFilter(value) {
+      // 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = "";
+      if (!isNaN(value) && value !== "") {
+        realVal = parseFloat(value).toFixed(this.skinName);
+      } else {
+        realVal = "--";
+      }
+      return realVal;
+    },
+    currentSel(selVal) {
+      //鑾峰彇涓嬫媺妗嗙殑text
+      let obj = {};
+      obj = this.arraylist.find(item => {
+        //console.log(item.enersno)
+        return item.code === selVal;
+      });
+      this.title = obj.name;
+      this.queryParams.indexCode = obj.code;
+    },
+    handleTime(data) {
+      let date = {
+        year: new Date().getFullYear(),
+        month: new Date().getMonth() + 1,
+        dateDate: new Date().getDate()
+      };
+      if (data == "YEAR") {
+        this.dateTypes = "year";
+      } else if (data == "MONTH") {
+        //this.dateTypes='monthrange'
+        (this.dateTypes = "month"),
+          (this.queryParams.dataTime =
+            date.year + "-" + (date.month > 9 ? date.month : "0" + date.month));
+      } else if (data == "DAY") {
+        //this.dateTypes='monthrange'
+        (this.dateTypes = "date"),
+          (this.queryParams.dataTime =
+            date.year +
+            "-" +
+            (date.month > 9 ? date.month : "0" + date.month) +
+            "-" +
+            (date.dateDate > 9 ? date.dateDate : "0" + date.dateDate));
+      }
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      //this.getList(this.queryParams);
+      this.modelNodeChange(this.queryParams);
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭鎵�鏈夎兘鑰楁寚鏍囪秼鍔垮垎鏋愭暟鎹」?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      })
+        .then(function() {
+          return exportEnergyindex(queryParams);
+        })
+        .then(response => {
+          this.download(response.msg);
+        })
+        .catch(function() {});
+    },
+    formatDate: function(value) {
+      let date = new Date(value);
+      let y = date.getFullYear();
+      let MM = date.getMonth() + 1;
+      MM = MM < 10 ? "0" + MM : MM;
+      let d = date.getDate();
+      d = d < 10 ? "0" + d : d;
+      let h = date.getHours();
+      h = h < 10 ? "0" + h : h;
+      let m = date.getMinutes();
+      m = m < 10 ? "0" + m : m;
+      let s = date.getSeconds();
+      s = s < 10 ? "0" + s : s;
+      return y + "-" + MM + "-" + d + " " + h + ":" + m + ":" + s;
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+.chart-title {
+  display: block;
+  background: #f2f6fc;
+  height: 30px;
+  line-height: 30px;
+  padding: 0 10px;
+}
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStructure/index.vue b/energy_management_ui/src/views/energyStatistics/energyStructure/index.vue
new file mode 100644
index 0000000..5bb4410
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStructure/index.vue
@@ -0,0 +1,56 @@
+
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鐢ㄨ兘鍗曞厓鑳借�楀垎鏋�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <EnergyIndex ref="EnergyIndex" style="padding:10px"></EnergyIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import EnergyIndex from "./EnergyIndex";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,EnergyIndex},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.EnergyIndex.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/energyStructure/lineChart.vue b/energy_management_ui/src/views/energyStatistics/energyStructure/lineChart.vue
new file mode 100644
index 0000000..e370f7d
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/energyStructure/lineChart.vue
@@ -0,0 +1,146 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../mixins/resize'
+  const animationDuration = 6000
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null,
+        seriesData: [],
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({currentValue,xAxis,lastYearValue,title} = {}) {
+        var series=[];
+/*        if(newVisitis !=null ||newVisitis != undefined){
+          series.push()
+        }
+        console.log("newVisitis:"+newVisitis+"actual"+actual);*/
+        this.chart.setOption({
+          title: {
+            text: title,
+            x:'center',
+            y: 'top',
+            textStyle: {
+              color: "#333"
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 40,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          legend: {
+            data:['娑堣垂閲�', '浜ч噺'],
+            left: '60%',
+          },
+          xAxis: [{
+            type: 'category',
+            data: xAxis,
+            axisPointer: {
+              type: 'shadow'
+            }
+          }],
+          yAxis: [{
+              name: '娑堣垂閲�',
+              type: 'value',
+              nameTextStyle:{
+                color:"#333",
+              },
+              axisLabel: {
+                formatter: '{value}'
+              },
+              axisTick: {
+                show: false
+              },
+            },{
+            name: '浜ч噺',
+            type: 'value',
+            nameTextStyle:{
+              color:"#333",
+            },
+            axisLabel: {
+              formatter: '{value}'
+            },
+            axisTick: {
+              show: false
+            },
+          }
+          ],
+          series:[{
+            name: "娑堣垂閲�",
+            type: 'bar',
+            data: currentValue,
+            smooth: true,//绾挎潯骞虫粦
+            //stack: 'vistors',
+            barMaxWidth:30,//鏈�澶у搴�
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+          },{
+          name: '浜ч噺',
+            type: 'line',
+            yAxisIndex: 1,
+            data: lastYearValue,
+            animationDuration: 2800,
+            animationEasing: 'quadraticOut'
+        }]
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/energyStatistics/mixins/resize.js b/energy_management_ui/src/views/energyStatistics/mixins/resize.js
new file mode 100644
index 0000000..ae02e64
--- /dev/null
+++ b/energy_management_ui/src/views/energyStatistics/mixins/resize.js
@@ -0,0 +1,52 @@
+import { debounce } from '@/utils'
+
+export default {
+  data() {
+    return {
+      $_sidebarElm: null
+    }
+  },
+  mounted() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  beforeDestroy() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  activated() {
+    this.$_initResizeEvent()
+    this.$_initSidebarResizeEvent()
+  },
+  deactivated() {
+    this.$_destroyResizeEvent()
+    this.$_destroySidebarResizeEvent()
+  },
+  methods: {
+    $_resizeHandler() {
+      return debounce(() => {
+        if (this.chart) {
+          this.chart.resize()
+        }
+      }, 100)()
+    },
+    $_initResizeEvent() {
+      window.addEventListener('resize', this.$_resizeHandler)
+    },
+    $_destroyResizeEvent() {
+      window.removeEventListener('resize', this.$_resizeHandler)
+    },
+    $_sidebarResizeHandler(e) {
+      if (e.propertyName === 'width') {
+        this.$_resizeHandler()
+      }
+    },
+    $_initSidebarResizeEvent() {
+      this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+      this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+    },
+    $_destroySidebarResizeEvent() {
+      this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+    }
+  }
+}
diff --git a/energy_management_ui/src/views/equipmentMonitor/energyConsumption/curve.vue b/energy_management_ui/src/views/equipmentMonitor/energyConsumption/curve.vue
new file mode 100644
index 0000000..06d8558
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/energyConsumption/curve.vue
@@ -0,0 +1,291 @@
+<template>
+
+  <div class="dashboard-editor-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏃ユ湡" label-width="40px">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio style="margin-right: 10px" v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+        <el-date-picker
+          v-model="queryParams.beginTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="寮�濮嬫棩鏈�">
+        </el-date-picker>
+        鍒�
+        <el-date-picker
+          v-model="queryParams.endTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport" v-hasPermi="['workforce:rosteringManagement:export']">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24" >
+        <div class="chart-wrapper">
+          <line-chart ref="lineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="24" >
+        <div class="chart-wrapper" >
+          <el-button type="warning" icon="el-icon-download" size="mini" style="float: right" @click="handleExport" >瀵煎嚭</el-button>
+          <el-table v-loading="loading" :data="arraylist">
+            <el-table-column prop="dataTime" label="鏃ユ湡" align="center" width="150" show-overflow-tooltip>
+              <template slot-scope="scope">
+                <span>{{ changeTime(parseTime(scope.row.dataTime)) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="currentValue" label="璁惧1" align="center"></el-table-column>
+            <el-table-column prop="lastYearValue" label="璁惧2"  align="center"></el-table-column>
+            <el-table-column prop="unitId" label="鍗曚綅"  align="center"></el-table-column>
+          </el-table>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+
+
+</template>
+<script>
+  import {getSettingDevice,getSettingIndex,exportEnergyCurveindex,getEnergyCurveTrend} from "@/api/energyStatistics/statistics";
+  import LineChart from "./lineChart";
+    export default {
+      name: 'curve',
+     components:{LineChart},
+      props: ["modelCode"],
+      data() {
+        return {
+          // 閬僵灞�
+          loading: true,
+          total: 0,
+          dateTypeOptions:[],
+          // 鏌ヨ鍙傛暟
+          queryParams: {
+            pageNum: 1,
+            pageSize: 10,
+            beginTime: undefined,
+            endTime: undefined,
+            dataTime: undefined,
+            timeType:undefined,
+            indexId: undefined,
+            procedure: undefined,
+          },
+          list:[],
+          arraylist:[],
+          lineChartData:{
+            newVisitis:null,
+          },
+          //dateTypes: 'monthrange',//鏃堕棿鑼冨洿
+          dateTypes: 'month',
+          valueFormat:'yyyy-MM',
+          title:"",
+          skinName:"",
+          curvename:[]
+        }
+      },
+      watch: {
+        modelCode: {
+          deep: true,
+          handler(val) {
+            this.getList(val)
+          }
+        },
+      },
+      created() {
+        //this.getList();
+        this.getDicts("timeType_device").then(response => {
+          this.dateTypeOptions = response.data;
+          this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+        });
+        this.getConfigKey("energyStatistics.energyStatisticsTrend").then(response => {
+          this.skinName=response.msg;
+        });
+        let endTtime=(new Date().getFullYear()) +'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+        let starTtime= (new Date().getFullYear()-1)+'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+        this.queryParams.beginTime=starTtime;
+        this.queryParams.endTime=endTtime;
+      },
+      methods: {
+        modelNodeChange(modelNode) {
+          this.queryParams.id=modelNode.id;
+          let source=[];
+          let xAxis=[];
+          this.loading = true;
+          this.queryParams.indexId=this.queryParams.procedure;
+          if(this.queryParams.timeType=='YEAR'){
+            this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 4)+'-01-01';
+            this.queryParams.endTime=this.queryParams.endTime.substring(0, 4)+'-01-01';
+          }else if(this.queryParams.timeType=='MONTH'){
+            this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 7);
+            this.queryParams.endTime=this.queryParams.endTime.substring(0, 7);
+          }else if(this.queryParams.timeType=='DATE'){
+            this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 10);
+            this.queryParams.endTime=this.queryParams.endTime.substring(0, 10);
+          /*  this.queryParams.beginTime=this.formatDate(new Date(this.queryParams.beginTime).getTime()-  72 * 60 * 60 * 1000);
+            this.queryParams.endTime=this.formatDate(new Date(this.queryParams.endTime).getTime()-  72 * 60 * 60 * 1000);*/
+          }
+          //鑾峰彇妯″瀷涓嬬殑鎸囨爣
+          getSettingIndex(this.queryParams.id).then(response => {
+            let result = response.data;
+            this.list = result.filter(f => f.indexType === 'STATISTIC');
+            /*  this.curvename=result.*/
+            this.loading = false;
+            if (this.list.length > 0) {
+              if (modelNode.title == undefined) {
+                this.queryParams.procedure = this.list[0].indexId;
+              }
+            } else {
+              this.queryParams.procedure = '';
+              this.title = ''
+            }
+            this.queryParams.indexId = this.queryParams.procedure;
+            if (this.queryParams.timeType == 'YEAR') {
+              this.queryParams.beginTime = this.queryParams.beginTime.substring(0, 4) + '-01-01';
+              this.queryParams.endTime = this.queryParams.endTime.substring(0, 4) + '-01-01';
+            } else if (this.queryParams.timeType == 'MONTH') {
+              this.queryParams.beginTime = this.queryParams.beginTime.substring(0, 7);
+              this.queryParams.endTime = this.queryParams.endTime.substring(0, 7);
+            } else if (this.queryParams.timeType == 'DATE') {
+              this.queryParams.beginTime = this.queryParams.beginTime.substring(0, 10);
+              this.queryParams.endTime = this.queryParams.endTime.substring(0, 10);
+            }
+            //鑾峰彇妯″瀷涓嬬殑璁惧
+            getSettingDevice(this.queryParams.id).then(response => {
+              let results = response.data;
+             /* console.log(results);*/
+              this.curvename=results.meterName;
+              //鑳借�楁寚鏍囪秼鍔垮垎鏋�
+              getEnergyCurveTrend(this.queryParams).then(response => {
+                this.arraylist = response.rows;
+                this.total = response.total;
+                let currentValue = [];
+                let lastYearValue = [];
+                for (let i = 0; i < this.arraylist.length; i++) {
+                  currentValue.push(this.arraylist[i].currentValue);
+                  lastYearValue.push(this.arraylist[i].lastYearValue);
+                  if (this.queryParams.timeType == 'DATE') {
+                    xAxis.push(this.arraylist[i].dataTime.substring(0, 10))
+                  } else if (this.queryParams.timeType == 'MONTH') {
+                    xAxis.push(this.arraylist[i].dataTime.substring(0, 7))
+                  } else if (this.queryParams.timeType == 'YEAR') {
+                    xAxis.push(this.arraylist[i].dataTime.substring(0, 4))
+                  }
+                  /* if(this.queryParams.timeType=='MONTH') {
+                    xAxis.push(this.arraylist[i].dataTime.substring(0, 7))
+                  }else if(this.queryParams.timeType=='YEAR'){
+                    xAxis.push(this.arraylist[i].dataTime.substring(0, 4))
+                  }*/
+                }
+                source.push(currentValue);//鏈湡鍊硷紙闇�瑕侊級
+                source.push(lastYearValue);//鍚屾湡鍊硷紙涓嶉渶瑕侊級
+                let titleName = "";
+                let yAxis = "";
+                let actualData = [];
+                if (this.arraylist > 0) {
+                  titleName = this.arraylist[0].indexName + "(" + this.arraylist[0].unitId + ")";
+                  yAxis = this.arraylist[0].unitId
+                }
+                this.title = titleName
+                this.lineChartData.newVisitis = source;
+                this.lineChartData.actualData = ['璁惧1','璁惧2'];
+                this.lineChartData.xAxis = xAxis;
+                this.lineChartData.title = this.title;
+                this.lineChartData.yAxis = yAxis;
+                this.$refs.lineChart.initChart(this.lineChartData);
+              });
+            });
+          });
+
+        },
+        numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+          let realVal = '' ;
+          if (!isNaN(value) && value !== '') {
+            realVal = parseFloat(value).toFixed(this.skinName)
+          } else {
+            realVal = '--'
+          }
+          return realVal
+        },
+        handleTime(date){
+          if(date=='YEAR'){
+            this.dateTypes= 'year',
+              this.valueFormat='yyyy'
+          }else if(date=='MONTH'){
+            //this.dateTypes='monthrange'
+            this.dateTypes= 'month',
+              this.valueFormat='yyyy-MM'
+          }else if(date=='DATE'){
+            //this.dateTypes='monthrange'
+            this.dateTypes= 'date',
+              this.valueFormat='yyyy-MM-dd'
+          }
+        },
+        /** 鎼滅储鎸夐挳鎿嶄綔 */
+        handleQuery() {
+          this.queryParams.pageNum = 1;
+          this.queryParams.title=this.title;
+          this.modelNodeChange(this.queryParams);
+        },
+        /** 閲嶇疆鎸夐挳鎿嶄綔 */
+        resetQuery() {
+          this.resetForm("queryForm");
+          this.handleQuery();
+        },
+        /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+        handleExport() {
+          const queryParams = this.queryParams;
+          this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘鑰楁寚鏍囪秼鍔垮垎鏋愭暟鎹」?', "璀﹀憡", {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning"
+          }).then(function () {
+            return exportEnergyCurveindex(queryParams);
+          }).then(response => {
+            this.download(response.msg);
+          }).catch(function () {
+          });
+        },
+        changeTime(time) {
+          if (time !== null && time !== undefined && time !== "") {
+            return time.substring(0, 10);
+          } else {
+            return "";
+          }
+        }
+      }
+    }
+</script>
+
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+  .chart-title{
+    display: block;
+    background: #f2f6fc;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px;
+  }
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/equipmentMonitor/energyConsumption/index.vue b/energy_management_ui/src/views/equipmentMonitor/energyConsumption/index.vue
new file mode 100644
index 0000000..da00bba
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/energyConsumption/index.vue
@@ -0,0 +1,61 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁惧鑳借�楀垎鏋�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <Curve ref="curve"></Curve>
+        </el-main>
+
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import Curve from "./curve";
+
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+
+  export default {
+    components: { ModelNode,Curve},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: [],
+        modelCode:undefined,
+        deviceCategory:"",
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.curve.modelNodeChange(node,this.deviceCategory);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/energyConsumption/lineChart.vue b/energy_management_ui/src/views/equipmentMonitor/energyConsumption/lineChart.vue
new file mode 100644
index 0000000..959968e
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/energyConsumption/lineChart.vue
@@ -0,0 +1,128 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  import resize from "../../energyStatistics/mixins/resize";
+  require('echarts/theme/macarons') // echarts theme
+  const animationDuration = 6000
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '350px'
+      },
+      chartData: {
+        type:Object,
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    data() {
+      return {
+        chart: null,
+        seriesData: [],
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({newVisitis,xAxis,actualData,title,yAxis} = {}) {
+        var series=[];
+        if(newVisitis !=null ||newVisitis != undefined){
+          for(var i=0;i<newVisitis.length;i++){
+            series.push({
+                name: actualData[i],
+                type: 'bar',
+                data: newVisitis[i],
+                smooth: true,//绾挎潯骞虫粦
+                //stack: 'vistors',
+                animationDuration: 2800,
+                animationEasing: 'quadraticOut'
+              }
+            );
+          }
+        }
+        this.chart.setOption({
+          title: {
+            text: title,
+            x:'center',
+            y: 'top',
+            textStyle: {
+              color: "#333"
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'     line涓虹洿绾�  shadow涓烘煴鐘堕槾褰�
+            }
+          },
+          grid: {
+            top: 40,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          legend: {
+            data:['璁惧1','璁惧2'],
+            left: '60%',
+          },
+          xAxis: [{
+            type: 'category',
+            data: xAxis,
+            axisTick: {
+              alignWithLabel: true
+            },
+          }],
+          yAxis: [{
+            name: yAxis,
+            type: 'value',
+            nameTextStyle:{
+              color:"#333",
+            },
+            axisLabel: {
+              formatter: '{value}'
+            },
+            axisTick: {
+              show: false
+            },
+          }
+          ],
+          series:series
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/history/historyIndex.vue b/energy_management_ui/src/views/equipmentMonitor/history/historyIndex.vue
new file mode 100644
index 0000000..0ed6178
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/history/historyIndex.vue
@@ -0,0 +1,245 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label:''}}--鑺傜偣璁剧疆</span>
+      </div>
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <el-form-item >
+        <el-radio-group v-model="queryParams.eierarchyFlag">
+          <el-radio label="B" style="margin-right: 10px!important;" onselect="true">鏈骇</el-radio>
+          <el-radio label="ALL">鍖呭惈涓嬬骇</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="璧锋鏃堕棿">
+        <el-date-picker
+          v-model="timeArr"
+          type="datetimerange"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['historyMonitoring:historyMonitoring:export']"
+        >瀵煎嚭
+        </el-button>
+      </el-col>
+    </el-row>
+      <div>
+      <el-table :data="tableData" border style="width: 100%; margin-top: 20px">
+        <el-table-column prop="indexName" align="center" label="璁惧鍚嶇О" width="180"></el-table-column>
+        <el-table-column prop="statusName" align="center" label="璁惧鐘舵��"></el-table-column>
+        <el-table-column prop="devBeginTime" align="center" label="寮�濮嬫椂闂�"></el-table-column>
+        <el-table-column prop="devEndTime" align="center" label="缁撴潫鏃堕棿"></el-table-column>
+        <el-table-column prop="duration" align="center" label="鏃堕暱(灏忔椂)"></el-table-column>
+      </el-table>
+  </div>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import {listHistoryMonitoringNew,exportHistoryMonitoringTableList} from "@/api/equipmentMonitor/historyMonitoring/historyMonitoring"
+
+  export default {
+    name: 'energyIndex',
+
+    data() {
+      return {
+        pickerOptions: {
+        /*  value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],*/
+        },
+        timeArr:[],
+        currentNode: '',
+        deviceCategory:undefined,
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        dateRange: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 10,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        List: [],
+        energyindexList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "鍘嗗彶鏁版嵁鏌ヨ",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+        indexCategoryOptions: [],
+        // 澶囨敞瀛楀吀
+        remarkOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        queryParams: {
+          eierarchyFlag:"B",
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          value:undefined,
+          code: undefined,
+          indexCategory: undefined,
+          deviceId: undefined,
+          indexType:"COLLECT"
+        },
+        tableData: [],
+        datas: [],
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          name: [
+            {required: true, message: "鎸囨爣鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+          ], code: [
+            {required: true, message: "鎸囨爣缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'},
+            {pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+          ], indexCategory: [
+            {required: true, message: "璇烽�夋嫨鎸囨爣鍒嗙被", trigger: "blur"}
+          ]
+        },
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+    created() {
+      this.getTime();
+    },
+    methods: {
+      modelNodeChange(modelNode,deviceCategory) {
+        this.queryParams.deviceId = modelNode.id;
+        this.deviceCategory = deviceCategory;
+        this.getList();
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+        }
+        if("5"===this.deviceCategory){
+          this.getList();
+        }else {
+          this.tableData = [];
+        }
+      },
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList() {
+        this.loading = true;
+        // this.queryParams.deviceId = modelNode.id;
+        var search = this.queryParams;
+        search.beginTime = "";
+        search.endTime = "";
+        if (null != this.timeArr && '' != this.timeArr) {
+          search.beginTime = this.formatDate(this.timeArr[0]).toString();
+          search.endTime = this.formatDate(this.timeArr[1]).toString();
+        }
+
+        listHistoryMonitoringNew(search).then(response => {
+          this.tableData = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        if("5"===this.deviceCategory){
+          this.getList();
+        }else {
+          this.tableData = [];
+        }
+      },
+      getTime(){
+        this.startTime = new Date().setHours(0, 0, 0, 0);
+        this.endTime = new Date().setHours(0, 0, 0, 0) + 24 * 60 * 60 * 1000 - 1;
+        //鏄剧ず鏃堕棿
+        this.timeArr = [this.startTime,this.endTime];
+      },
+      formatDate: function (value) {
+        let date = new Date(value);
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? ('0' + MM) : MM;
+        let d = date.getDate();
+        d = d < 10 ? ('0' + d) : d;
+        let h = date.getHours();
+        h = h < 10 ? ('0' + h) : h;
+        let m = date.getMinutes();
+        m = m < 10 ? ('0' + m) : m;
+        let s = date.getSeconds();
+        s = s < 10 ? ('0' + s) : s;
+        return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        // this.$refs["historyTable"].validate(valid => {
+        //   if (valid) {
+        if (this.currentNode) {
+          var search = this.queryParams;
+          search.beginTime = "";
+          search.endTime = "";
+          if (null != this.timeArr && '' != this.timeArr) {
+            search.beginTime = this.formatDate(this.timeArr[0]).toString();
+            search.endTime = this.formatDate(this.timeArr[1]).toString();
+          }
+          this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋暟鎹」?', "璀﹀憡", {
+            confirmButtonText: "纭畾",
+            cancelButtonText: "鍙栨秷",
+            type: "warning"
+          }).then(function () {
+            return exportHistoryMonitoringTableList(search);
+          }).then(response => {
+            this.download(response.msg);
+          }).catch(function () {
+          });
+          //   }
+          // })
+        }
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/history/index.vue b/energy_management_ui/src/views/equipmentMonitor/history/index.vue
new file mode 100644
index 0000000..c3ba830
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/history/index.vue
@@ -0,0 +1,59 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁惧鍚仠鍘嗗彶鏌ヨ
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <HistoryIndex ref="HistoryIndex"></HistoryIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import HistoryIndex from "./historyIndex";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+  import {listModel} from "@/api/basicsetting/model";
+  export default {
+    components: {HistoryIndex, ModelNode},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+      this.deviceCategory = this.$route.query.device_category;
+    },
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: [],
+        modelCode:undefined,
+        deviceCategory:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.HistoryIndex.modelNodeChange(node,this.deviceCategory);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/keyEquipment/LineChart.vue b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/LineChart.vue
new file mode 100644
index 0000000..ae8345e
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/LineChart.vue
@@ -0,0 +1,154 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons'); // echarts theme
+// import resize from './mixins/resize'
+
+export default {
+  // mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      // required: true
+    },
+
+  },
+  data() {
+    return {
+      chart: null,
+      alarmLimitName:undefined
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose();
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons');
+      this.setOptions(this.chartData);
+    },
+    setOptions({ datas,legendArr,timeList,legendNameArr } = {}) {
+      // this.chart.clear();
+      if(datas.length>0){
+        var yAxisDataArr = [];
+        var seriesArr = [];
+        var yAxisNumArr = [];
+        var yAxisIndexArr = [];
+        for(let i = 0;i<datas.length;i++){
+          //y杞�
+          let yAxisItem = {
+            type: 'value',
+            // name:legendNameArr[i],
+            minInterval : 1,
+            boundaryGap : [ 0, 0.2 ],
+          };
+          if(i>1){
+            let positionKey = "position";
+            let positionValue = "right";
+            let offsetKey = "offset";
+            let offsetValue = 50*(i-1);
+            yAxisItem[positionKey] = positionValue;
+            yAxisItem[offsetKey] = offsetValue;
+          }
+          yAxisDataArr.push(yAxisItem);
+        }
+        for(let i = 0;i<legendArr.length;i++){
+          if(""!=legendArr[i]){
+            let item = parseInt(legendArr[i].substr(1, legendArr[i].length));
+            yAxisNumArr.push(item);
+            if(!yAxisIndexArr.indexOf(yAxisNumArr[i])>-1){
+              yAxisIndexArr.push(yAxisNumArr[i]);
+            }
+            let seriesItem = {
+              name:legendNameArr[i],
+              type: 'line',
+              data: datas[i],
+              yAxisIndex:yAxisIndexArr.indexOf(yAxisNumArr[i]),
+            };
+            seriesArr.push(seriesItem);
+          }else {
+            let seriesItem = {
+              name:legendNameArr[i],
+              type: 'line',
+              data: datas[i],
+            };
+            if(i>0){
+              let key = "yAxisIndex";
+              let value = i;
+              seriesItem[key] = value;
+            }
+            seriesArr.push(seriesItem);
+          }
+        }
+        this.chart.setOption({
+          xAxis: {
+            data: timeList,
+            boundaryGap: false,
+            axisTick: {
+              show: false
+            }
+          },
+          grid: {
+            left: '2%',
+            right: '18%',
+            bottom: 20,
+            top: 30,
+            containLabel: true
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              type: 'cross'
+            },
+            padding: [5, 10]
+          },
+          yAxis: yAxisDataArr,
+          legend: {
+            data: legendNameArr,
+          },
+          series: seriesArr
+        })
+      }
+    },
+    closeLineChar(){
+      this.chart.clear();
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/keyEquipment/equipmentView.vue b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/equipmentView.vue
new file mode 100644
index 0000000..e40ea73
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/equipmentView.vue
@@ -0,0 +1,358 @@
+<template>
+  <div class="dashboard-editor-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <!--<el-form-item label="鏌ョ湅鎸囨爣">-->
+        <!--<el-select v-model="queryParams.procedure" placeholder="璇烽�夋嫨鎸囨爣" @change="currentSel">-->
+          <!--<el-option style="width: 150px"-->
+            <!--v-for="dict in list"-->
+            <!--:key="dict.indexId"-->
+            <!--:label="dict.name"-->
+            <!--:value="dict.indexId"-->
+          <!--&gt;</el-option>-->
+        <!--</el-select>-->
+      <!--</el-form-item>-->
+      <el-form-item label="鏃ユ湡" label-width="40px">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio style="margin-right: 10px" v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+          <el-date-picker
+            v-model="queryParams.beginTime"
+            :type="dateTypes"
+            style="width: 150px"
+            :value-format="valueFormat"
+            placeholder="寮�濮嬫棩鏈�">
+          </el-date-picker>
+          鍒�
+        <el-date-picker
+          v-model="queryParams.endTime"
+          :type="dateTypes"
+          style="width: 150px"
+          :value-format="valueFormat"
+          placeholder="缁撴潫鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <!--<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>-->
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="6">
+      <el-col :span="6" class="card-box" style="height: 280px">
+        <!--璁惧淇℃伅-->
+        <el-card class="box-card" style="height:280px">
+          <div slot="header" class="clearfix">
+            <span>1#姘у帇鏈哄熀鏈俊鎭�</span>
+          </div>
+          <div>
+            <table cellspacing="0" style="width: 100%;">
+              <tbody>
+              <tr>
+                <td><div class="cell">鍚嶇О锛�</div></td>
+                <td><div class="cell" v-if=""></div></td>
+              </tr>
+              <tr>
+                <td><div class="cell">缂栧彿锛�</div></td>
+                <td><div class="cell" v-if=""></div></td>
+              </tr>
+              <tr>
+                <td><div class="cell">瀵瑰簲宸ュ簭锛�</div></td>
+                <td><div class="cell" v-if=""></div></td>
+              </tr>
+              <tr>
+                <td><div class="cell">棰濆畾鐢靛帇锛�</div></td>
+                <td><div class="cell" v-if=""></div></td>
+              </tr>
+              <tr>
+                <td><div class="cell">棰濆畾鍔熺巼锛�</div></td>
+                <td><div class="cell" v-if=""></div></td>
+              </tr>
+              <tr>
+                <td><div class="cell">鍚仠鐘舵�侊細</div></td>
+                <td><div class="cell" v-if=""></div></td>
+              </tr>
+              <tr>
+                <td><div class="cell">浣滀笟鍐呭锛�</div></td>
+                <td><div class="cell" v-if=""></div></td>
+              </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+      <!--鍥剧墖-->
+      <el-col :span="8" class="card-box" style="height: 280px">
+        <el-card class="box-card" style="height:280px">
+          <div>
+            <el-image
+              src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
+              fit="contain"></el-image>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="10" class="card-box" style="height: 280px">
+        <div>
+          <div style="display: flex;flex-direction: row;justify-content: space-between">
+            <el-card class="box-card" style="height:60px;width: 180px">
+              <div>
+                鐢ㄧ數閲�
+              </div>
+              <div style="margin-top: 4px">
+                绱锛歿{}}Kwh
+              </div>
+            </el-card>
+            <el-card class="box-card" style="height:60px;width: 180px">
+              <div>
+                澶╃劧姘旈噺
+              </div>
+              <div style="margin-top: 4px">
+                绱锛歿{}}涓囩珛鏂圭背
+              </div>
+            </el-card>
+          </div>
+        </div>
+        <div style="margin-top: 10px">
+          <div style="display: flex;flex-direction: row;justify-content: space-between">
+            <el-card class="box-card" style="height:60px;width: 180px">
+              <div>
+                钂告苯閲�
+              </div>
+              <div style="margin-top: 4px">
+                绱锛歿{}}涓囧惃
+              </div>
+            </el-card>
+            <el-card class="box-card" style="height:60px;width: 180px">
+              <div>
+                鐢ㄦ哀閲�
+              </div>
+              <div style="margin-top: 4px">
+                绱锛歿{}}涓囩珛鏂圭背
+              </div>
+            </el-card>
+          </div>
+        </div>
+        <el-card class="box-card" style="margin-top: 10px;height: 140px">
+          <div>
+            <pie-chart></pie-chart>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+    <el-row :gutter="32">
+      <!--<el-col :span="16" class="card-box" style="height: 280px">-->
+        <line-chart ref="liveLineChart" :chart-data="liveLineChartData" style="margin-top: 20px"></line-chart>
+      <!--</el-col>-->
+    </el-row>
+  </div>
+</template>
+
+<script>
+   import PieChart from './pieChart'
+   import LineChart from './LineChart'
+  import {getSettingIndex,getSettingEnergy,exportEnergyindex,getEnergyStatisticsTrend} from "@/api/energyStatistics/statistics";
+
+  export default {
+    name: 'equipmentView',
+    name: 'Index',
+    components: {PieChart,LineChart},
+    props: ["modelCode"],
+    data() {
+      return {
+        // 閬僵灞�
+        loading: true,
+        total: 0,
+        dateTypeOptions:[],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          beginTime: undefined,
+          endTime: undefined,
+          dataTime: undefined,
+          timeType:undefined,
+          indexId: undefined,
+          procedure: undefined,
+        },
+        list:[],
+        arraylist:[],
+        lineChartData:{
+          newVisitis:null,
+        },
+        //dateTypes: 'monthrange',//鏃堕棿鑼冨洿
+        dateTypes: 'month',
+        valueFormat:'yyyy-MM',
+        title:"",
+        skinName:"",
+        liveLineChartData:{
+          datas:[[10,20,30,10,20,30,10,20,30,10,20,30,10,20,30,10,20,30],[100,200,30,10,20,30,10,20,30,100,20,30,10,200,30,10,20,300],[102,2,30,10,20,30,10,2,30,10,20,30,10,202,30,10,20,30]],
+          legendArr:['h1','h2','h3'],
+          timeList:['0527','0528','0529','0527','0528','0529','0527','0528','0529','0527','0528','0529','0527','0528','0529','0527','0528','0529'],
+          legendNameArr:['haha1','hehe2','heihei3']
+        },
+      }
+    },
+    watch: {
+      modelCode: {
+        deep: true,
+        handler(val) {
+          this.getList(val)
+        }
+      },
+    },
+    created() {
+      //this.getList();
+      this.getDicts("timeType_device").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+      this.getConfigKey("energyStatistics.energyStatisticsTrend").then(response => {
+        this.skinName=response.msg;
+      });
+      let endTtime=(new Date().getFullYear()) +'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+      let starTtime= (new Date().getFullYear()-1)+'-' +((new Date().getMonth() + 1)>9?(new Date().getMonth() + 1):"0"+(new Date().getMonth() + 1));
+      this.queryParams.beginTime=starTtime;
+      this.queryParams.endTime=endTtime;
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.queryParams.id=modelNode.id;
+        let source=[];
+        let xAxis=[];
+        this.loading = true;
+        getSettingIndex(this.queryParams.id).then(response => {
+          let result=response.data;
+          this.list = result.filter(f => f.indexType === 'STATISTIC');
+          this.loading = false;
+          if (this.list.length > 0) {
+            if(modelNode.title==undefined ){
+              this.queryParams.procedure = this.list[0].indexId;
+            }
+          }else{
+            this.queryParams.procedure = '';
+            this.title= ''
+          }
+          this.queryParams.indexId=this.queryParams.procedure;
+          if(this.queryParams.timeType=='YEAR'){
+            this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 4)+'-01-01';
+            this.queryParams.endTime=this.queryParams.endTime.substring(0, 4)+'-01-01';
+          }else if(this.queryParams.timeType=='MONTH'){
+            this.queryParams.beginTime=this.queryParams.beginTime.substring(0, 7)+'-01';
+            this.queryParams.endTime=this.queryParams.endTime.substring(0, 7)+'-01';
+          }
+          getEnergyStatisticsTrend(this.queryParams).then(response => {
+            this.arraylist=response.rows;
+            this.total = response.total;
+            let currentValue=[];
+            let lastYearValue=[];
+            let minValue=[];
+            for(let i=0; i<this.arraylist.length; i++){
+              currentValue.push(this.arraylist[i].currentValue);
+              lastYearValue.push(this.arraylist[i].lastYearValue);
+              minValue.push(this.arraylist[i].minValue);
+              if(this.queryParams.timeType=='MONTH') {
+                xAxis.push(this.arraylist[i].dataTime.substring(0, 7))
+              }else if(this.queryParams.timeType=='YEAR'){
+                xAxis.push(this.arraylist[i].dataTime.substring(0, 4))
+              }
+            }
+            source.push(currentValue);
+            source.push(lastYearValue);
+            let titleName="";
+            let yAxis="";
+            if(this.arraylist>0){
+              titleName= this.arraylist[0].indexName+"("+this.arraylist[0].unitId+")";
+              yAxis=this.arraylist[0].unitId
+            }
+           this.title=titleName
+          });
+        });
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '') {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '--'
+        }
+        return realVal
+      },
+      currentSel(selVal) {//鑾峰彇涓嬫媺妗嗙殑text
+        let obj = {};
+        obj = this.list.find((item) => {
+          return item.indexId === selVal
+        });
+        this.title=obj.name;
+        this.queryParams.procedure=obj.indexId;
+      },
+      handleTime(date){
+        if(date=='YEAR'){
+          this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+        }else if(date=='MONTH'){
+          //this.dateTypes='monthrange'
+          this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+        }else if('DATE'==date){
+          this.dateTypes= 'date',
+            this.valueFormat='yyyy-MM-dd'
+        }
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.queryParams.title=this.title;
+        this.modelNodeChange(this.queryParams);
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘鑰楁寚鏍囪秼鍔垮垎鏋愭暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportEnergyindex(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      changeTime(time) {
+        if (time !== null && time !== undefined && time !== "") {
+          return time.substring(0, 10);
+        } else {
+          return "";
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+  .chart-title{
+    display: block;
+    background: #f2f6fc;
+    height: 30px;
+    line-height: 30px;
+    padding: 0 10px;
+  }
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/equipmentMonitor/keyEquipment/index.vue b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/index.vue
new file mode 100644
index 0000000..f89def1
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/index.vue
@@ -0,0 +1,55 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            閲嶇偣璁惧鍒嗘瀽
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <equipment-view ref="EquipmentView" style="padding:10px"></equipment-view>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import equipmentView from "./equipmentView";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+
+  export default {
+    components: { ModelNode,equipmentView},
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+    },
+    data() {
+      return {
+        modelCode:undefined,
+        isCollapse: false,
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.EquipmentView.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+      // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+      toggleCollapse () {
+        this.isCollapse = !this.isCollapse
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/keyEquipment/pieChart.vue b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/pieChart.vue
new file mode 100644
index 0000000..60f17c9
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/keyEquipment/pieChart.vue
@@ -0,0 +1,86 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons'); // echarts theme
+  // import resize from './mixins/resize'
+
+  export default {
+    // mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '130px'
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose();
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons');
+
+        this.chart.setOption({
+          tooltip: {
+            trigger: 'item',
+            formatter: '{a} <br/>{b} : {c} ({d}%)'
+          },
+          // legend: {
+          //   left: 'center',
+          //   bottom: '10',
+          //   data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts']
+          // },
+          legend: {
+            type: 'scroll',
+            orient: 'vertical',
+            right: 10,
+            top: 20,
+            bottom: 20,
+            data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts'],
+          },
+          series: [
+            {
+              name: 'WEEKLY WRITE ARTICLES',
+              type: 'pie',
+              radius: '55%',
+              center: ['40%', '50%'],
+              data: [
+                { value: 320, name: 'Industries' },
+                { value: 240, name: 'Technology' },
+                { value: 149, name: 'Forex' },
+                { value: 100, name: 'Gold' },
+                { value: 59, name: 'Forecasts' }
+              ],
+              // animationEasing: 'cubicInOut',
+              animationDuration: 2600
+            }
+          ]
+        })
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/parameters/index.vue b/energy_management_ui/src/views/equipmentMonitor/parameters/index.vue
new file mode 100644
index 0000000..6416cac
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/parameters/index.vue
@@ -0,0 +1,55 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁惧鑳借�楀弬鏁扮洃娴�
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+          <MonitorSetting ref="MonitorSetting"></MonitorSetting>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import MonitorSetting from "./modelMonitorSetting";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import {listModel} from "@/api/basicsetting/model";
+
+export default {
+  components: {MonitorSetting, ModelNode},
+  created() {
+    listModel({isShow: 1}).then(response => {
+      this.modelInfoOptions = response.data;
+      if (this.modelInfoOptions.length > 0) {
+        this.modelData = this.modelInfoOptions[0].modelCode;
+        this.$refs.modelNode.getList(this.modelData);
+      }
+    });
+  },
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: []
+    }
+  },
+  methods: {
+    changeNode: function (node) {
+      this.$refs.MonitorSetting.modelNodeChange(node);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/parameters/modelMonitorSetting.vue b/energy_management_ui/src/views/equipmentMonitor/parameters/modelMonitorSetting.vue
new file mode 100644
index 0000000..fc8cd58
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/parameters/modelMonitorSetting.vue
@@ -0,0 +1,169 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label+'--鑺傜偣閰嶇疆':'鑺傜偣閰嶇疆'</span>
+      </div>
+
+      <el-tabs>
+        <el-tab-pane :disabled="disabledSetting">
+          <span slot="label"><i class="el-icon-setting"></i>瀹炴椂鑳借��</span>
+          <!--琛ㄦ牸-->
+          <el-form :model="model"  ref="form">
+            <el-table v-loading="loading" :data="model.tableOptions" border @selection-change="handleSelectionChange"
+                      :default-sort = "{prop: 'date', order: 'descending'}">
+              <el-table-column type="selection" width="55" align="center"/>
+              <el-table-column label="搴忓彿" align="center" prop="index"/>
+              <el-table-column label="鍚嶇О" align="center" prop="name"/>
+              <el-table-column label="鏁版嵁" align="center" prop="data" class-name="small-padding fixed-width"/>
+              <el-table-column label="鍗曚綅" align="center" prop="unit"/>
+            </el-table>
+          </el-form>
+        </el-tab-pane>
+
+      </el-tabs>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import {
+    delDevice,
+    delEnergy,
+    delIndex,
+    delProduct,
+    getSettingDevice,
+    getSettingEnergy,
+    getSettingIndex,
+    getSettingProduct,
+    setCollectIndex,
+    setDevice,
+    setEnergy,
+    setProduct
+  } from '@/api/basicsetting/modelNode'
+
+  export default {
+    name: "modelMonitorSetting",
+    data() {
+      return {
+        currentNode: '',
+        deviceDialog: false,
+        energyDialog: false,
+        productDialog: false,
+        collectIndexDialog: false,
+        indexLoading: false,
+        deviceLoading: false,
+        energyLoading: false,
+        productLoading: false,
+        settingEnergyList: [],
+        settingDeviceList: [],
+        settingProductList: [],
+        settingIndexList: [],
+        disabledSetting: true,
+        // 閬僵灞�
+        loading: false,
+        //琛ㄦ牸妯″瀷
+        model:{
+          tableOptions:[
+            // {
+            //   index:undefined,
+            //   name:undefined,
+            //   data:undefined,
+            //   unit:undefined
+            // }
+            {
+              index:"id001",
+              name:"鐜嬪皬铏�",
+              data:"30000",
+              unit:"WH"
+            }
+          ],
+        }
+      }
+    },
+    created() {
+      // setInterval(alert("鍝堝搱鍝堬紒锛�"),5000);
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        this.settingDeviceList = [];
+        this.settingIndexList = [];
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+          this.deviceLoading = true;
+          getSettingDevice(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingDeviceList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.deviceLoading = false;
+          });
+          this.energyLoading = true;
+          getSettingEnergy(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingEnergyList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.energyLoading = false;
+          });
+          this.productLoading = true;
+          getSettingProduct(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingProductList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.productLoading = false;
+          });
+          this.indexLoading = true;
+          getSettingIndex(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingIndexList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.indexLoading = false;
+          });
+        }
+      },
+      collectIndexSetting() {
+        this.collectIndexDialog = true;
+      },
+      showCollectIndexDialog() {
+        this.$nextTick(() => {
+          this.$refs.collectIndexSetting.init(this.currentNode, this.settingIndexList);
+        })
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.indexId);
+        this.names = selection.map(item => item.name);
+        this.single = selection.length !== 1;
+        this.multiple = !selection.length
+      },
+      getList() {
+        // console.log(this.myModelNode)
+        // if (this.myModelNode) {
+        //   this.loading = true;
+          // this.queryParams.nodeId = this.myModelNode.id;
+          //鎺ュ彛
+          // getSettingIndex(this.queryParams).then(response => {
+          //   this.model.energyindexList = response.data;
+          //   this.initstartstop();
+          //   this.loading = false;
+          // });
+
+        // } else {
+          this.model.tableOptions = [];
+        // }
+      },
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/index.vue b/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/index.vue
new file mode 100644
index 0000000..9e2e867
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/index.vue
@@ -0,0 +1,66 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'20%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            璁惧鍚仠瀹炴椂鐩戞祴
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" :modelCode="modelCode"></ModelNode>
+        </el-card>
+      </el-aside>
+      <div style="cursor:pointer;" @click="toggleCollapse">
+        <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+      </div>
+      <el-container>
+        <el-header style="padding:0" height="200px">
+          <state-table ref="stateTable"></state-table>
+        </el-header>
+        <el-main style="padding:0">
+          <parameters-table ref="parametersTable"></parameters-table>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import stateTable from "./stateTable";
+import parametersTable from "./parametersTable";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import {listModel} from "@/api/basicsetting/model";
+
+
+export default {
+  components: { ModelNode,stateTable,parametersTable},
+  created() {
+    this.modelCode=this.$route.query.modelCode;
+    this.deviceCategory = this.$route.query.device_category;
+  },
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode:undefined,
+      deviceCategory:"",
+      isCollapse: false,
+    }
+  },
+  methods: {
+    changeNode: function (node) {
+      this.$refs.stateTable.modelNodeChange(node,this.deviceCategory);
+      this.$refs.parametersTable.modelNodeChange(node,this.deviceCategory);
+    },
+    manageModel: function () {
+      this.$router.push('/model');
+    },
+    changeModel: function (item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse () {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/parametersTable.vue b/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/parametersTable.vue
new file mode 100644
index 0000000..8255d1d
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/parametersTable.vue
@@ -0,0 +1,160 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <div style="margin-bottom:10px;">
+      <span>{{currentNode?currentNode.label:''}}娴嬬偣鍙傛暟鍒楄〃</span>
+    </div>
+    <el-table
+      :data="parameterTableData"
+      border
+      style="width: 100%"
+      @cell-click="openDialog">
+      <el-table-column
+        prop="code"
+        label="鎸囨爣缂栫爜"
+        width="180"
+        align="center">
+      </el-table-column>
+      <el-table-column
+        prop="indexName"
+        label="鎸囨爣鍚嶇О"
+        align="center">
+        <template slot-scope="scope">
+          <div style="color:blue;text-decoration:underline;cursor:pointer">{{scope.row.indexName}}</div>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="indexUnit"
+        label="鎸囨爣鍗曚綅"
+        align="center"
+        :formatter="unitFormat">
+      </el-table-column>
+      <el-table-column
+        prop="value"
+        label="鎸囨爣鍊�(瀹炴椂鍊�)"
+        align="center">
+      </el-table-column>
+    </el-table>
+
+    <!--鏇茬嚎鍥句笌琛ㄦ牸-->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" :close-on-click-modal="false" @close="closeDialog">
+      <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+        <el-tabs v-model="activeName" @tab-click="handleClick" >
+          <el-tab-pane label="瀹炴椂鏁版嵁鏇茬嚎鍥�" name="first">
+            <live-alarm-view ref="liveAlarmView" :code="code" :activeName="activeName"></live-alarm-view>
+          </el-tab-pane>
+          <el-tab-pane label="鍘嗗彶鏁版嵁鏇茬嚎鍥�" name="second">
+            <history-alarm-view ref="historyAlarmView" :code="code" :activeName="activeName"></history-alarm-view>
+          </el-tab-pane>
+          <el-tab-pane label="鍘嗗彶鏁版嵁鏌ヨ" name="third">
+            <history-alarm-table ref="historyAlarmTable" :code="code" :indexName="indexName" :activeName="activeName" :indexUnit="indexUnit"></history-alarm-table>
+          </el-tab-pane>
+        </el-tabs>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancelDialog">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import {getSettingIndex} from "@/api/equipmentMonitor/realTimeMonitoring/realTimeMonitoring";
+  import liveAlarmView from "../../energyAlarm/realTimeAlarm/liveAlarmView";
+  import historyAlarmView from "../../energyAlarm/realTimeAlarm/historyAlarmView";
+  import historyAlarmTable from "../../energyAlarm/realTimeAlarm/historyAlarmTable";
+    export default {
+        name: "parametersTable",
+      components: {liveAlarmView,historyAlarmView,historyAlarmTable},
+      data(){
+          return{
+            parameterTableData:[],
+            currentNode:undefined,
+            unitOptions:undefined,
+            intervalTime:undefined,
+            timer:undefined,
+            //寮瑰嚭灞�
+            activeName:undefined,
+            title:"瀹炴椂鏁版嵁",
+            open:false,
+            code:undefined,
+            indexName:undefined,
+            indexUnit:undefined,
+            deviceCategory:undefined,
+            queryParams:{
+              nodeId:undefined,
+              //鎸囨爣index
+              indexType:"COLLECT",
+            }
+          }
+      },
+      created() {
+        this.getDicts("sys_unit").then(response => {
+          this.unitOptions = response.data;
+        });
+      },
+      mounted()
+      {
+        this.getConfigKey("equipmentMonitor.realTimeMonitoring.intervalTime").then(response => {
+          this.intervalTime = response.msg;
+          this.timer = setInterval(this.getList, this.intervalTime);
+        });
+      },
+      beforeDestroy() {
+        //椤甸潰閿�姣佹椂 瑕佸仠姝㈣鏃跺櫒锛屽惁鍒欓�夐」鍗″垏鎹㈣鏃跺櫒涓嶅仠姝紝浼氳秺鏉ヨ秺蹇紝澶氫釜绾跨▼
+        if(this.timer) {
+          clearInterval(this.timer);
+        }
+      },
+      methods:{
+        modelNodeChange(modelNode,deviceCategory) {
+          if (modelNode) {
+            this.queryParams.nodeId = modelNode.id;
+            this.deviceCategory = deviceCategory;
+            if("5"===this.deviceCategory){
+              this.getList();
+            }else {
+              this.parameterTableData = [];
+            }
+          }
+        },
+        getList(){
+          getSettingIndex(this.queryParams).then(response => {
+            this.parameterTableData = [];
+            this.parameterTableData = response.data;
+          });
+        },
+        // 鍗曚綅瀛楀吀缈昏瘧
+        unitFormat(row, column) {
+          return this.selectDictLabel(this.unitOptions, row.indexUnit);
+        },
+        //鏇茬嚎寮瑰嚭
+        openDialog(row,column,event,cell){
+          if("indexName"===column.property){
+            this.open = true;
+            this.code = row.code;
+            this.indexName = row.indexName;
+            this.indexId = row.indexId;
+            this.activeName = "first";
+            this.indexUnit = this.selectDictLabel(this.unitOptions, row.indexUnit);
+          }
+        },
+        //鍏抽棴
+        closeDialog(){
+          this.activeName = "";
+          this.$refs.historyAlarmTable.cleanTable();
+        },
+        //鍙栨秷
+        cancelDialog(){
+          this.open = false;
+          this.$refs.historyAlarmTable.cleanTable();
+        },
+        handleClick(tab, event){
+          this.activeName = tab.name;
+        },
+      }
+    }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/stateTable.vue b/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/stateTable.vue
new file mode 100644
index 0000000..e24bb97
--- /dev/null
+++ b/energy_management_ui/src/views/equipmentMonitor/realTimeMonitoring/stateTable.vue
@@ -0,0 +1,88 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <div style="display: flex;width: 100%;height: 53px;align-items: center;justify-content: center">
+      <span>{{currentNode?currentNode.label:''}}鐩戞帶璁惧鐘舵�佷俊鎭�</span>
+    </div>
+    <div style="margin-bottom:10px;">
+      璁惧鐘舵�佸垪琛�
+    </div>
+    <el-table
+      :data="stateTableData"
+      border
+      style="width: 100%">
+      <el-table-column
+        prop="modelNodeName"
+        label="璁惧鍚嶇О"
+        align="center">
+      </el-table-column>
+      <el-table-column
+        prop="statusName"
+        label="褰撳墠鐘舵��"
+        align="center">
+        <template slot-scope="scope">
+          <div :style="{'color':scope.row.stateType.colorNumber}">{{scope.row.statusName}}</div>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import {getRealTimeMonitoring} from "@/api/equipmentMonitor/realTimeMonitoring/realTimeMonitoring";
+    export default {
+        name: "stateTable",
+      data(){
+          return{
+            stateTableData: [],
+            currentNode:undefined,
+            resposeJson:undefined,
+            colorNumber:undefined,
+          }
+      },
+      created(){
+
+      },
+      mounted()
+      {
+        this.getConfigKey("equipmentMonitor.realTimeMonitoring.intervalTime").then(response => {
+          this.intervalTime = response.msg;
+
+          this.timer = setInterval(this.getList, this.intervalTime);
+        });
+      },
+      beforeDestroy() {
+        //椤甸潰閿�姣佹椂 瑕佸仠姝㈣鏃跺櫒锛屽惁鍒欓�夐」鍗″垏鎹㈣鏃跺櫒涓嶅仠姝紝浼氳秺鏉ヨ秺蹇紝澶氫釜绾跨▼
+        if(this.timer) {
+          clearInterval(this.timer);
+        }
+      },
+      methods:{
+        modelNodeChange(modelNode,deviceCategory) {
+          if (modelNode) {
+            this.currentNode = modelNode;
+            this.currentNodeId = modelNode.id;
+            this.deviceCategory = deviceCategory;
+            if("5"===this.deviceCategory){
+              this.getList();
+            }else {
+            this.stateTableData = [];
+            }
+          }
+        },
+        getList(){
+          getRealTimeMonitoring(this.currentNodeId).then(response => {
+            this.stateTableData = [];
+            if(response.rows!=undefined && response.rows[0]!=null)
+            {
+              response.rows[0].modelNodeName=this.currentNode.label;
+              this.stateTableData = response.rows;
+            }
+          });
+        }
+      }
+    }
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/error/401.vue b/energy_management_ui/src/views/error/401.vue
new file mode 100644
index 0000000..448b6ec
--- /dev/null
+++ b/energy_management_ui/src/views/error/401.vue
@@ -0,0 +1,88 @@
+<template>
+  <div class="errPage-container">
+    <el-button icon="arrow-left" class="pan-back-btn" @click="back">
+      杩斿洖
+    </el-button>
+    <el-row>
+      <el-col :span="12">
+        <h1 class="text-jumbo text-ginormous">
+          401閿欒!
+        </h1>
+        <h2>鎮ㄦ病鏈夎闂潈闄愶紒</h2>
+        <h6>瀵逛笉璧凤紝鎮ㄦ病鏈夎闂潈闄愶紝璇蜂笉瑕佽繘琛岄潪娉曟搷浣滐紒鎮ㄥ彲浠ヨ繑鍥炰富椤甸潰</h6>
+        <ul class="list-unstyled">
+          <li class="link-type">
+            <router-link to="/">
+              鍥為椤�
+            </router-link>
+          </li>
+        </ul>
+      </el-col>
+      <el-col :span="12">
+        <img :src="errGif" width="313" height="428" alt="Girl has dropped her ice cream.">
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import errGif from '@/assets/401_images/401.gif'
+
+export default {
+  name: 'Page401',
+  data() {
+    return {
+      errGif: errGif + '?' + +new Date()
+    }
+  },
+  methods: {
+    back() {
+      if (this.$route.query.noGoBack) {
+        this.$router.push({ path: '/' })
+      } else {
+        this.$router.go(-1)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .errPage-container {
+    width: 800px;
+    max-width: 100%;
+    margin: 100px auto;
+    .pan-back-btn {
+      background: #008489;
+      color: #fff;
+      border: none!important;
+    }
+    .pan-gif {
+      margin: 0 auto;
+      display: block;
+    }
+    .pan-img {
+      display: block;
+      margin: 0 auto;
+      width: 100%;
+    }
+    .text-jumbo {
+      font-size: 60px;
+      font-weight: 700;
+      color: #484848;
+    }
+    .list-unstyled {
+      font-size: 14px;
+      li {
+        padding-bottom: 5px;
+      }
+      a {
+        color: #008489;
+        text-decoration: none;
+        &:hover {
+          text-decoration: underline;
+        }
+      }
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/error/404.vue b/energy_management_ui/src/views/error/404.vue
new file mode 100644
index 0000000..96f075c
--- /dev/null
+++ b/energy_management_ui/src/views/error/404.vue
@@ -0,0 +1,233 @@
+<template>
+  <div class="wscn-http404-container">
+    <div class="wscn-http404">
+      <div class="pic-404">
+        <img class="pic-404__parent" src="@/assets/404_images/404.png" alt="404">
+        <img class="pic-404__child left" src="@/assets/404_images/404_cloud.png" alt="404">
+        <img class="pic-404__child mid" src="@/assets/404_images/404_cloud.png" alt="404">
+        <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404">
+      </div>
+      <div class="bullshit">
+        <div class="bullshit__oops">
+          404閿欒!
+        </div>
+        <div class="bullshit__headline">
+          {{ message }}
+        </div>
+        <div class="bullshit__info">
+          瀵逛笉璧凤紝鎮ㄦ鍦ㄥ鎵剧殑椤甸潰涓嶅瓨鍦ㄣ�傚皾璇曟鏌RL鐨勯敊璇紝鐒跺悗鎸夋祻瑙堝櫒涓婄殑鍒锋柊鎸夐挳鎴栧皾璇曞湪鎴戜滑鐨勫簲鐢ㄧ▼搴忎腑鎵惧埌鍏朵粬鍐呭銆�
+        </div>
+        <router-link to="/" class="bullshit__return-home">
+          杩斿洖棣栭〉
+        </router-link>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+
+export default {
+  name: 'Page404',
+  computed: {
+    message() {
+      return '鎵句笉鍒扮綉椤碉紒'
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.wscn-http404-container{
+  transform: translate(-50%,-50%);
+  position: absolute;
+  top: 40%;
+  left: 50%;
+}
+.wscn-http404 {
+  position: relative;
+  width: 1200px;
+  padding: 0 50px;
+  overflow: hidden;
+  .pic-404 {
+    position: relative;
+    float: left;
+    width: 600px;
+    overflow: hidden;
+    &__parent {
+      width: 100%;
+    }
+    &__child {
+      position: absolute;
+      &.left {
+        width: 80px;
+        top: 17px;
+        left: 220px;
+        opacity: 0;
+        animation-name: cloudLeft;
+        animation-duration: 2s;
+        animation-timing-function: linear;
+        animation-fill-mode: forwards;
+        animation-delay: 1s;
+      }
+      &.mid {
+        width: 46px;
+        top: 10px;
+        left: 420px;
+        opacity: 0;
+        animation-name: cloudMid;
+        animation-duration: 2s;
+        animation-timing-function: linear;
+        animation-fill-mode: forwards;
+        animation-delay: 1.2s;
+      }
+      &.right {
+        width: 62px;
+        top: 100px;
+        left: 500px;
+        opacity: 0;
+        animation-name: cloudRight;
+        animation-duration: 2s;
+        animation-timing-function: linear;
+        animation-fill-mode: forwards;
+        animation-delay: 1s;
+      }
+      @keyframes cloudLeft {
+        0% {
+          top: 17px;
+          left: 220px;
+          opacity: 0;
+        }
+        20% {
+          top: 33px;
+          left: 188px;
+          opacity: 1;
+        }
+        80% {
+          top: 81px;
+          left: 92px;
+          opacity: 1;
+        }
+        100% {
+          top: 97px;
+          left: 60px;
+          opacity: 0;
+        }
+      }
+      @keyframes cloudMid {
+        0% {
+          top: 10px;
+          left: 420px;
+          opacity: 0;
+        }
+        20% {
+          top: 40px;
+          left: 360px;
+          opacity: 1;
+        }
+        70% {
+          top: 130px;
+          left: 180px;
+          opacity: 1;
+        }
+        100% {
+          top: 160px;
+          left: 120px;
+          opacity: 0;
+        }
+      }
+      @keyframes cloudRight {
+        0% {
+          top: 100px;
+          left: 500px;
+          opacity: 0;
+        }
+        20% {
+          top: 120px;
+          left: 460px;
+          opacity: 1;
+        }
+        80% {
+          top: 180px;
+          left: 340px;
+          opacity: 1;
+        }
+        100% {
+          top: 200px;
+          left: 300px;
+          opacity: 0;
+        }
+      }
+    }
+  }
+  .bullshit {
+    position: relative;
+    float: left;
+    width: 300px;
+    padding: 30px 0;
+    overflow: hidden;
+    &__oops {
+      font-size: 32px;
+      font-weight: bold;
+      line-height: 40px;
+      color: #1482f0;
+      opacity: 0;
+      margin-bottom: 20px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-fill-mode: forwards;
+    }
+    &__headline {
+      font-size: 20px;
+      line-height: 24px;
+      color: #222;
+      font-weight: bold;
+      opacity: 0;
+      margin-bottom: 10px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.1s;
+      animation-fill-mode: forwards;
+    }
+    &__info {
+      font-size: 13px;
+      line-height: 21px;
+      color: grey;
+      opacity: 0;
+      margin-bottom: 30px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.2s;
+      animation-fill-mode: forwards;
+    }
+    &__return-home {
+      display: block;
+      float: left;
+      width: 110px;
+      height: 36px;
+      background: #1482f0;
+      border-radius: 100px;
+      text-align: center;
+      color: #ffffff;
+      opacity: 0;
+      font-size: 14px;
+      line-height: 36px;
+      cursor: pointer;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.3s;
+      animation-fill-mode: forwards;
+    }
+    @keyframes slideUp {
+      0% {
+        transform: translateY(60px);
+        opacity: 0;
+      }
+      100% {
+        transform: translateY(0);
+        opacity: 1;
+      }
+    }
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/facility/archives/importAnnexTable.vue b/energy_management_ui/src/views/facility/archives/importAnnexTable.vue
new file mode 100644
index 0000000..858686c
--- /dev/null
+++ b/energy_management_ui/src/views/facility/archives/importAnnexTable.vue
@@ -0,0 +1,205 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?facilityId=' + queryParams.facilityId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+      <el-button slot="trigger" size="small" type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitFileForm">涓婁紶鍒版湇鍔″櫒</el-button>
+      <div class="el-upload__tip" style="color:red" slot="tip">娉ㄦ剰鎺у埗鏂囦欢澶у皬锛屼笉瑕佽秴杩�50M</div>
+    </el-upload>
+
+    <el-row>
+      <el-table v-loading="loading" :data="annexList" >
+        <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName"  />
+        <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"  />
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="seeImpFile(scope.row)"
+              v-hasPermi="['facility:annex:assignDownload']"
+            >鏌ョ湅</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['facility:annex:remove']"
+            >鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listAnnex,delAnnex } from "@/api/facility/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/facility/annex/fileImport"
+      },
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(facid,code) {
+      this.reset();
+      this.queryParams.facilityId = facid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 闄勪欢';
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+       this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delAnnex(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/facility/archives/index.vue b/energy_management_ui/src/views/facility/archives/index.vue
new file mode 100644
index 0000000..89fde81
--- /dev/null
+++ b/energy_management_ui/src/views/facility/archives/index.vue
@@ -0,0 +1,805 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form class="special-form" :model="queryParams" ref="queryForm" label-width="72px">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="缂栫爜" prop="code">
+              <el-input
+                  v-model="queryParams.code"
+                  placeholder="璇疯緭鍏ョ紪鐮�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="璁惧鍚嶇О" prop="facilityName">
+              <el-input
+                  v-model="queryParams.facilityName"
+                  placeholder="璇疯緭鍏ヨ澶囧悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="璁惧绫诲瀷" prop="facilityType">
+              <el-select v-model="queryParams.facilityType" placeholder="璇烽�夋嫨璁惧绫诲瀷" clearable size="small"
+                         style="width: 100%">
+                <el-option
+                    v-for="dict in facilityTypeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!--          <el-col :span="6">-->
+          <!--            <el-form-item label="浣跨敤鍒嗗巶" prop="branchFactory">-->
+          <!--              <el-select v-model="queryParams.branchFactory" placeholder="璇烽�夋嫨浣跨敤鍒嗗巶" clearable size="small"-->
+          <!--                         style="width: 100%">-->
+          <!--                <el-option-->
+          <!--                    v-for="dict in branchFactoryOptions"-->
+          <!--                    :key="dict.dictValue"-->
+          <!--                    :label="dict.dictLabel"-->
+          <!--                    :value="dict.dictValue"-->
+          <!--                />-->
+          <!--              </el-select>-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <!--          <el-col :span="6">-->
+          <!--            <el-form-item label="鐗╃悊浣嶇疆" prop="istallationLocationn">-->
+          <!--              <el-input-->
+          <!--                  v-model="queryParams.istallationLocationn"-->
+          <!--                  placeholder="璇疯緭鍏ョ墿鐞嗕綅缃�"-->
+          <!--                  clearable-->
+          <!--                  size="small"-->
+          <!--                  @keyup.enter.native="handleQuery"-->
+          <!--              />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <!--          <el-col :span="6">-->
+          <!--            <el-form-item label="鑳借�楃瓑绾�" prop="facilityGrade">-->
+          <!--              <el-select v-model="queryParams.facilityGrade" placeholder="璇烽�夋嫨鑳借�楃瓑绾�" clearable size="small"-->
+          <!--                         style="width: 100%">-->
+          <!--                <el-option-->
+          <!--                    v-for="dict in facilityGradeOptions"-->
+          <!--                    :key="dict.dictValue"-->
+          <!--                    :label="dict.dictLabel"-->
+          <!--                    :value="dict.dictValue"-->
+          <!--                />-->
+          <!--              </el-select>-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <!--          <el-col :span="6">-->
+          <!--            <el-form-item label="鐢熶骇鍘傚" prop="manufacturer">-->
+          <!--              <el-input-->
+          <!--                  v-model="queryParams.manufacturer"-->
+          <!--                  placeholder="璇疯緭鍏ョ敓浜у巶瀹�"-->
+          <!--                  clearable-->
+          <!--                  size="small"-->
+          <!--                  @keyup.enter.native="handleQuery"-->
+          <!--              />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <!--          <el-col :span="6">-->
+          <!--            <el-form-item label="棰濆畾鍔熺巼" prop="ratedPower">-->
+          <!--              <el-select v-model="queryParams.ratedPower" placeholder="璇烽�夋嫨棰濆畾鍔熺巼" clearable size="small"-->
+          <!--                         style="width: 100%">-->
+          <!--                <el-option-->
+          <!--                    v-for="dict in ratedPowerOptions"-->
+          <!--                    :key="dict.dictValue"-->
+          <!--                    :label="dict.dictLabel"-->
+          <!--                    :value="dict.dictValue"-->
+          <!--                />-->
+          <!--              </el-select>-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['facility:archives:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['facility:archives:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['facility:archives:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['facility:archives:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+        <!--        <el-col :span="1.5">-->
+        <!--          <el-button-->
+        <!--              type="info"-->
+        <!--              icon="el-icon-upload2"-->
+        <!--              size="mini"-->
+        <!--              @click="handleImport"-->
+        <!--              v-hasPermi="['facility:archives:import']"-->
+        <!--          >瀵煎叆-->
+        <!--          </el-button>-->
+        <!--        </el-col>-->
+      </el-row>
+      <el-table v-loading="loading" :data="archivesList" @selection-change="handleSelectionChange" :height="height">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="缂栫爜" align="center" prop="code" show-overflow-tooltip/>
+        <el-table-column label="璁惧鍚嶇О" align="center" prop="facilityName" show-overflow-tooltip/>
+        <el-table-column label="璁惧绫诲瀷" align="center" prop="facilityType" :formatter="facilityTypeFormat"
+                         show-overflow-tooltip/>
+        <el-table-column label="浣跨敤鍒嗗巶" align="center" prop="branchFactory" :formatter="branchFactoryFormat"
+                         show-overflow-tooltip/>
+        <el-table-column label="閲嶇偣璁惧" align="center" prop="pointFlag" :formatter="pointFlagFactoryFormat"
+                         show-overflow-tooltip/>
+        <el-table-column label="鐗╃悊浣嶇疆" align="center" prop="istallationLocationn" show-overflow-tooltip/>
+        <el-table-column label="鑳借�楃瓑绾�" align="center" prop="facilityGrade" :formatter="facilityGradeFormat"
+                         show-overflow-tooltip/>
+        <el-table-column label="棰濆畾鍔熺巼" align="center" width="100" prop="ratedPower" show-overflow-tooltip/>
+        <el-table-column label="鎶曡繍鏃ユ湡" align="center" prop="putrunDate" width="180" show-overflow-tooltip/>
+        <el-table-column label="鐢熶骇鍘傚" align="center" width="220" prop="manufacturer" show-overflow-tooltip/>
+        <el-table-column label="鎿嶄綔" align="center" width="200" class-name="small-padding fixed-width"
+                         show-overflow-tooltip fixed="right">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['facility:archives:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportAnnexTable(scope.row)"
+                v-hasPermi="['tool:gen:import']"
+            >闄勪欢
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['facility:archives:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+      <!-- 娣诲姞鎴栦慨鏀硅澶囨。妗堝璇濇 -->
+      <el-dialog :title="title" :visible.sync="open" width="820px" class="dialog-form-row">
+        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+          <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="缂栫爜" prop="code">
+                <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="璁惧鍚嶇О" prop="facilityName">
+                <el-input v-model="form.facilityName" placeholder="璇疯緭鍏ヨ澶囧悕绉�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="璁惧绫诲瀷">
+                <el-select v-model="form.facilityType" placeholder="璇烽�夋嫨璁惧绫诲瀷" filterable>
+                  <el-option
+                      v-for="dict in facilityTypeOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="浣跨敤鍒嗗巶">
+                <el-select v-model="form.branchFactory" placeholder="璇烽�夋嫨浣跨敤鍒嗗巶" style="width: 100%">
+                  <el-option
+                      v-for="dict in branchFactoryOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鑳借�楃瓑绾�">
+                <el-select v-model="form.facilityGrade" placeholder="璇烽�夋嫨鑳借�楃瓑绾�">
+                  <el-option
+                      v-for="dict in facilityGradeOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="棰濆畾鍔熺巼" prop="ratedPower">
+                <el-input v-model="form.ratedPower" placeholder="璇疯緭鍏ラ瀹氬姛鐜�" style="width: 100%"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="鐢熶骇鏃ユ湡" prop="productionDate">
+                <el-date-picker clearable size="small" style="width: 100%"
+                                v-model="form.productionDate"
+                                type="date"
+                                value-format="yyyy-MM-dd"
+                                placeholder="閫夋嫨鐢熶骇鏃ユ湡">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鎶曡繍鏃ユ湡" prop="putrunDate">
+                <el-date-picker clearable size="small" style="width: 100%"
+                                v-model="form.putrunDate"
+                                type="date"
+                                value-format="yyyy-MM-dd"
+                                placeholder="閫夋嫨鎶曡繍鏃ユ湡">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="閲嶇偣璁惧" prop="pointFlag">
+                <el-select v-model="form.pointFlag" placeholder="璇烽�夋嫨">
+                  <el-option
+                      v-for="dict in pointFlagOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="鐢熶骇鍘傚" prop="manufacturer">
+                <el-input v-model="form.manufacturer" placeholder="璇疯緭鍏ョ敓浜у巶瀹�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="璐熻矗浜�" prop="personCharge">
+                <el-input v-model="form.personCharge" placeholder="璇疯緭鍏ヨ礋璐d汉"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鐗╃悊浣嶇疆" prop="istallationLocationn">
+                <el-input v-model="form.istallationLocationn" placeholder="璇疯緭鍏ョ墿鐞嗕綅缃�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鎶�鏈弬鏁�" prop="technicalData">
+                <el-input v-model="form.technicalData" placeholder="璇疯緭鍏ユ妧鏈弬鏁�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="璧峰鏃堕棿" prop="startTime">
+                <el-date-picker clearable size="small" style="width: 100%"
+                                v-model="form.startTime"
+                                type="date"
+                                value-format="yyyy-MM-dd"
+                                placeholder="閫夋嫨璧峰鏃堕棿">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="妫�瀹氬懆鏈�" prop="checkCycle">
+                <el-input v-model="form.checkCycle" placeholder="璇疯緭鍏ユ瀹氬懆鏈�"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="鎻愰啋鍛ㄦ湡" prop="reminderCycle">
+                <el-input v-model="form.reminderCycle" placeholder="璇疯緭鍏ユ彁閱掑懆鏈�"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="澶囨敞" prop="remark">
+                <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <div slot="footer" class="dialog-footer" style="padding-top: 5px">
+          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+      <!-- 璁惧妗f 瀵煎叆瀵硅瘽妗� -->
+      <el-dialog :title="upload.title" :visible.sync="upload.open" :destroy-on-close="true" width="400px">
+        <el-upload
+            ref="upload"
+            :limit="1"
+            :accept="upload.accept"
+            :headers="upload.headers"
+            :action="upload.url"
+            :disabled="upload.isUploading"
+            :on-progress="handleFileUploadProgress"
+            :on-success="handleFileSuccess"
+            :auto-upload="false"
+            drag
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">
+            灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+            <em>鐐瑰嚮涓婁紶</em>
+          </div>
+          <div class="el-upload__tip" slot="tip">
+            <el-link type="info" style="font-size:12px;color:blue;" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+          </div>
+          <div class="el-upload__tip" style="color:red" slot="tip">
+            瀵煎叆鎻愮ず锛�<br>1銆佹柊澧炲鍏�,浠呭厑璁稿鍏モ�渪ls鈥濇垨鈥渪lsx鈥濇牸寮忔枃浠讹紒
+            <br>2銆佺紪鐮佸繀椤诲敮涓�,閲嶅鏁版嵁鏃犳硶瀵煎叆
+            <br>3銆佽澶囩绫汇�佷娇鐢ㄥ垎鍘傘�佽兘婧愮瓑绾у~鍐欓敊璇殑鏁版嵁鏃犳硶瀵煎叆
+            <br>4銆佹瀹氬懆鏈熴�佹彁閱掑懆鏈熷ぇ浜�0姝f暣鏁�,濉啓閿欒鍒欓粯璁や负1
+            <br>5銆佽捣濮嬫椂闂村~鍐欓敊璇垨涓嶅~鍒欓粯璁や负绌�
+          </div>
+
+        </el-upload>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+          <el-button @click="upload.open = false">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+      <importAnnexTable ref="importAnnex"/>
+    </basic-container>
+  </div>
+</template>
+<style scoped>
+.el-dialog__body {
+  padding: 10px 10px 10px 10px;
+  color: #606266;
+  font-size: 14px;
+  word-break: break-all;
+}
+</style>
+<script>
+import {
+  listArchives,
+  getArchives,
+  delArchives,
+  addArchives,
+  updateArchives,
+  exportArchives,
+  importTemplate
+} from "@/api/facility/archives";
+import {getToken} from "@/utils/auth";
+import importAnnexTable from "./importAnnexTable";
+import mixins from "@/layout/mixin/getHeight";
+
+const facilityType = "0";
+const branchFactory = "0";
+const facilityGrade = "0";
+export default {
+  name: "importAnnex",
+  components: {importAnnexTable},
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 缂栫爜閫変腑鏁扮粍
+      codes: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁惧妗f琛ㄦ牸鏁版嵁
+      archivesList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭id瀛楀吀
+      idOptions: [],
+      // 缂栫爜瀛楀吀
+      codeOptions: [],
+      // 璁惧鍚嶇О瀛楀吀
+      facilityNameOptions: [],
+      // 璁惧绫诲瀷瀛楀吀
+      facilityTypeOptions: [],
+      // 閲嶇偣璁惧瀛楀吀
+      pointFlagOptions: [],
+      // 浣跨敤鍒嗗巶瀛楀吀
+      branchFactoryOptions: [],
+      // 鐗╃悊浣嶇疆瀛楀吀
+      istallationLocationnOptions: [],
+      // 鑳借�楃瓑绾у瓧鍏�
+      facilityGradeOptions: [],
+      // 棰濆畾鍔熺巼瀛楀吀
+      ratedPowerOptions: [],
+      // 鐢熶骇鏃ユ湡瀛楀吀
+      productionDateOptions: [],
+      // 鎶曡繍鏃ユ湡瀛楀吀
+      putrunDateOptions: [],
+      // 鐢熶骇鍘傚瀛楀吀
+      manufacturerOptions: [],
+      // 璐熻矗浜哄瓧鍏�
+      personChargeOptions: [],
+      // 鎶�鏈弬鏁板瓧鍏�
+      technicalDataOptions: [],
+      // 璧峰鏃堕棿瀛楀吀
+      startTimeOptions: [],
+      // 妫�瀹氬懆鏈熷瓧鍏�
+      checkCycleOptions: [],
+      // 鎻愰啋鍛ㄦ湡瀛楀吀
+      reminderCycleOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 鐩戠悊浜哄瓧鍏�
+      createByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      upload: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        //涓婁紶鏂囦欢绫诲瀷鎺у埗
+        accept: undefined,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: undefined,
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勮閲忓櫒鍏锋。妗�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: {Authorization: "Bearer " + getToken()},
+        // 涓婁紶鐨勫湴鍧�
+        url: ""
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        branchFactory: undefined,
+        pointFlag: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        manufacturer: undefined,
+        ratedPower: undefined
+      },
+      height: null,
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        code: [
+          {required: true, message: "缂栫爜涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        facilityName: [
+          {required: true, message: "璁惧鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        installactionLocation: [
+          {required: true, message: "瀹夎浣嶇疆涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        startTime: [
+          {required: true, message: "璧峰鏃堕棿涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        putrunTime: [
+          {required: true, message: "鎶曡繍鏃堕棿涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        checkCycle: [
+          {required: true, pattern: /^\+?[1-9]\d*$/, message: "妫�瀹氬懆鏈熷繀椤绘槸澶т簬0鐨勬鏁存暟", trigger: "blur"}
+        ],
+        reminderCycle: [
+          {required: true, pattern: /^\+?[1-9]\d*$/, message: "鎻愰啋鍛ㄦ湡蹇呴』鏄ぇ浜�0鐨勬鏁存暟", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("facility_type").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.facilityType = response.data[i].dictValue;
+        }
+      }
+      this.facilityTypeOptions = response.data;
+    });
+    this.getDicts("pointFlag").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.pointFlag = response.data[i].dictValue;
+        }
+      }
+      this.pointFlagOptions = response.data;
+    });
+    this.getDicts("branch_factory").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.branchFactory = response.data[i].dictValue;
+        }
+      }
+      this.branchFactoryOptions = response.data;
+    });
+    this.getDicts("facility_grade").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.facilityGrade = response.data[i].dictValue;
+        }
+      }
+      this.facilityGradeOptions = response.data;
+    });
+    this.getDicts("ratedPower").then(response => {
+      this.ratedPowerOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ璁惧妗f鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listArchives(this.queryParams).then(response => {
+        this.archivesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 璁惧绫诲瀷瀛楀吀缈昏瘧
+    facilityTypeFormat(row, column) {
+      return this.selectDictLabel(this.facilityTypeOptions, row.facilityType);
+    },
+    // 浣跨敤鍒嗗巶瀛楀吀缈昏瘧
+    branchFactoryFormat(row, column) {
+      return this.selectDictLabel(this.branchFactoryOptions, row.branchFactory);
+    },
+    // 閲嶇偣璁惧瀛楀吀缈昏瘧
+    pointFlagFactoryFormat(row, column) {
+      return this.selectDictLabel(this.pointFlagOptions, row.pointFlag);
+    },
+    // 鑳借�楃瓑绾у瓧鍏哥炕璇�
+    facilityGradeFormat(row, column) {
+      return this.selectDictLabel(this.facilityGradeOptions, row.facilityGrade);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        branchFactory: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        ratedPower: undefined,
+        productionDate: undefined,
+        putrunDate: undefined,
+        manufacturer: undefined,
+        personCharge: undefined,
+        technicalData: undefined,
+        startTime: undefined,
+        checkCycle: undefined,
+        reminderCycle: undefined,
+        remark: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.codes = selection.map(item => item.code)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞璁惧妗f";
+      this.form.facilityGrade = this.facilityGrade;
+      this.form.facilityType = this.facilityType;
+      this.form.branchFactory = this.branchFactory
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getArchives(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼璁惧妗f";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateArchives(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addArchives(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const codes = row.code || this.codes;
+      this.$confirm('鏄惁纭鍒犻櫎璁惧妗f缂栫紪涓�"' + codes + '"鐨勮澶囨。妗堝悧 ?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delArchives(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎澶囨。妗堟暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportArchives(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      //this.$refs.upload.clearFiles();
+      this.upload.title = "璁惧妗f瀵煎叆";
+      this.upload.accept = ".xlsx, .xls";
+      this.upload.url = process.env.VUE_APP_BASE_API + "/facility/archives/imporel-colata?updateSupport=0";
+      this.upload.open = true;
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      importTemplate().then(response => {
+        this.download(response.msg);
+      });
+    },
+    // 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "瀵煎叆缁撴灉", {dangerouslyUseHTMLString: true});
+      this.getList();
+    },
+    // 鎻愪氦涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportAnnexTable(row) {
+      let facid = row.id;
+      let faccode = row.code;
+      this.$refs.importAnnex.show(facid, faccode);
+    },
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+
+.dialog-form-row {
+  .el-row {
+    margin-bottom: 0;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/facility/querycount/importAnnexTable.vue b/energy_management_ui/src/views/facility/querycount/importAnnexTable.vue
new file mode 100644
index 0000000..86655ed
--- /dev/null
+++ b/energy_management_ui/src/views/facility/querycount/importAnnexTable.vue
@@ -0,0 +1,205 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!--<el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?facilityId=' + queryParams.facilityId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+      <el-button slot="trigger" size="small" type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitFileForm">涓婁紶鍒版湇鍔″櫒</el-button>
+      <div class="el-upload__tip" style="color:red" slot="tip">娉ㄦ剰鎺у埗鏂囦欢澶у皬锛屼笉瑕佽秴杩�50M</div>
+    </el-upload> -->
+
+    <el-row>
+      <el-table v-loading="loading" :data="annexList" >
+        <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName"  />
+        <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"  />
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="seeImpFile(scope.row)"
+              v-hasPermi="['facility:annex:assignDownload']"
+            >鏌ョ湅</el-button>
+          <!--  <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['facility:annex:remove']"
+            >鍒犻櫎</el-button> -->
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listAnnex,delAnnex } from "@/api/facility/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/facility/annex/fileImport"
+      },
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(facid,code) {
+      this.reset();
+      this.queryParams.facilityId = facid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 闄勪欢';
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+       this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delAnnex(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/facility/querycount/index.vue b/energy_management_ui/src/views/facility/querycount/index.vue
new file mode 100644
index 0000000..8d2a61b
--- /dev/null
+++ b/energy_management_ui/src/views/facility/querycount/index.vue
@@ -0,0 +1,668 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form class="special-form" :model="queryParams" ref="queryForm" label-width="72px">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="缂栫爜" prop="code">
+              <el-input
+                  v-model="queryParams.code"
+                  placeholder="璇疯緭鍏ョ紪鐮�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="璁惧鍚嶇О" prop="facilityName">
+              <el-input
+                  v-model="queryParams.facilityName"
+                  placeholder="璇疯緭鍏ヨ澶囧悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="璁惧绫诲瀷" prop="facilityType">
+              <el-select v-model="queryParams.facilityType" placeholder="璇烽�夋嫨璁惧绫诲瀷" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in facilityTypeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="浣跨敤鍒嗗巶" prop="branchFactory">-->
+<!--              <el-select v-model="queryParams.branchFactory" placeholder="璇烽�夋嫨浣跨敤鍒嗗巶" clearable size="small" style="width: 100%">-->
+<!--                <el-option-->
+<!--                    v-for="dict in branchFactoryOptions"-->
+<!--                    :key="dict.dictValue"-->
+<!--                    :label="dict.dictLabel"-->
+<!--                    :value="dict.dictValue"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鐗╃悊浣嶇疆" prop="istallationLocationn">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.istallationLocationn"-->
+<!--                  placeholder="璇疯緭鍏ョ墿鐞嗕綅缃�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鑳借�楃瓑绾�" prop="facilityGrade">-->
+<!--              <el-select v-model="queryParams.facilityGrade" placeholder="璇烽�夋嫨鑳借�楃瓑绾�" clearable size="small" style="width: 100%">-->
+<!--                <el-option-->
+<!--                    v-for="dict in facilityGradeOptions"-->
+<!--                    :key="dict.dictValue"-->
+<!--                    :label="dict.dictLabel"-->
+<!--                    :value="dict.dictValue"-->
+<!--                />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鐢熶骇鍘傚" prop="manufacturer">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.manufacturer"-->
+<!--                  placeholder="璇疯緭鍏ョ敓浜у巶瀹�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-refresh"
+              size="mini"
+              :disabled="multiple"
+              @click="handleReset"
+              v-hasPermi="['facility:archives:reset']"
+          >妫�瀹氭仮澶�
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['facility:archives:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table v-loading="loading" :data="archivesList" :row-class-name="tableRowClassName" :height="height"
+                @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="60" align="center"/>
+        <!-- <el-table-column label="搴忓彿" align="center" prop="id"  />-->
+        <el-table-column label="缂栫爜" align="center" prop="code" show-overflow-tooltip/>
+        <el-table-column label="璁惧鍚嶇О" align="center" prop="facilityName" show-overflow-tooltip/>
+        <el-table-column label="璁惧绫诲瀷" align="center" prop="facilityType" :formatter="facilityTypeFormat" show-overflow-tooltip/>
+        <el-table-column label="浣跨敤鍒嗗巶" align="center" prop="branchFactory" :formatter="branchFactoryFormat" show-overflow-tooltip/>
+        <el-table-column label="閲嶇偣璁惧" align="center" prop="pointFlag" :formatter="pointFlagFactoryFormat" show-overflow-tooltip/>
+        <el-table-column label="鐢熶骇鍘傚" align="center" prop="manufacturer" show-overflow-tooltip/>
+        <el-table-column label="鐗╃悊浣嶇疆" align="center" prop="istallationLocationn" show-overflow-tooltip/>
+        <el-table-column label="鑳借�楃瓑绾�" align="center" prop="facilityGrade" :formatter="facilityGradeFormat" show-overflow-tooltip/>
+        <el-table-column label="璐d换浜�" align="center" prop="personCharge" show-overflow-tooltip/>
+        <el-table-column label="鎶曡繍鏃ユ湡" align="center" prop="putrunDate" width="180" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.putrunDate) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="棰濆畾鍔熺巼" align="center" prop="ratedPower" show-overflow-tooltip/>
+        <el-table-column label="鎿嶄綔" align="center" width="195px" :row-class-name="tableRowClassName"
+                         class-name="small-padding fixed-width"  fixed="right">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-view"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['facility:archives:edit']"
+            >鏌ョ湅
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportAnnexTable(scope.row)"
+                v-hasPermi="['tool:gen:import']"
+            >闄勪欢
+            </el-button>
+            <el-button v-if="scope.row.txflage"
+                       size="mini"
+                       type="text"
+                       icon="el-icon-refresh"
+                       @click="handleReset(scope.row)"
+                       v-hasPermi="['facility:archives:reset']"
+            >妫�瀹氭仮澶�
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀硅澶囨。妗堝璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px">
+      <el-form ref="form" :model="form" :rules="rules" disabled="disabled" label-width="80px"
+               style="padding: 5px 5px 5px 5px">
+        <table>
+          <tr>
+            <td width="200px">
+              <el-form-item label="缂栫爜" prop="code" style="margin-bottom: 10px;">
+                <el-input v-model="form.code"/>
+              </el-form-item>
+            </td>
+            <td width="200px">
+              <el-form-item label="璁惧鍚嶇О" prop="facilityName" style="margin-bottom: 10px">
+                <el-input v-model="form.facilityName"/>
+              </el-form-item>
+            </td>
+            <td width="200px">
+              <el-form-item label="璁惧绫诲瀷" style="margin-bottom: 10px">
+                <el-select v-model="form.facilityType">
+                  <el-option
+                      v-for="dict in facilityTypeOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <el-form-item label="浣跨敤鍒嗗巶" style="margin-bottom: 10px">
+                <el-select v-model="form.branchFactory">
+                  <el-option
+                      v-for="dict in branchFactoryOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </td>
+            <td>
+              <el-form-item label="鑳借�楃瓑绾�" style="margin-bottom: 10px">
+                <el-select v-model="form.facilityGrade">
+                  <el-option
+                      v-for="dict in facilityGradeOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictLabel"
+                      :value="dict.dictValue"
+                  ></el-option>
+                </el-select>
+              </el-form-item>
+            </td>
+            <td>
+              <el-form-item label="棰濆畾鍔熺巼" prop="ratedPower" style="margin-bottom: 10px">
+                <el-input v-model="form.ratedPower"/>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <el-form-item label="鐢熶骇鏃ユ湡" prop="productionDate" style="margin-bottom: 10px">
+                <el-date-picker clearable size="small" style="width: 200px"
+                                v-model="form.productionDate"
+                                type="date"
+                                value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </td>
+            <td>
+              <el-form-item label="鎶曡繍鏃ユ湡" prop="putrunDate" style="margin-bottom: 10px">
+                <el-date-picker clearable size="small" style="width: 200px"
+                                v-model="form.putrunDate"
+                                type="date"
+                                value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </td>
+            <td>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="2">
+              <el-form-item label="鐢熶骇鍘傚" prop="manufacturer" style="margin-bottom: 10px">
+                <el-input v-model="form.manufacturer"/>
+              </el-form-item>
+            </td>
+            <td>
+              <el-form-item label="璐熻矗浜�" prop="personCharge" style="margin-bottom: 10px">
+                <el-input v-model="form.personCharge"/>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="3">
+              <el-form-item label="鐗╃悊浣嶇疆" prop="istallationLocationn" style="margin-bottom: 10px">
+                <el-input v-model="form.istallationLocationn"/>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="3">
+              <el-form-item label="鎶�鏈弬鏁�" prop="technicalData" style="margin-bottom: 10px;">
+                <el-input v-model="form.technicalData"/>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="3">
+              <el-form-item label="澶囨敞" prop="remark" style="margin-bottom: 10px">
+                <el-input v-model="form.remark"/>
+              </el-form-item>
+            </td>
+          </tr>
+          <tr>
+            <td>
+              <el-form-item label="璧峰鏃堕棿" prop="startTime" style="margin-bottom: 10px;">
+                <el-date-picker clearable size="small" style="width: 150px"
+                                v-model="form.startTime"
+                                type="date"
+                                value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </el-form-item>
+            </td>
+            <td>
+              <el-form-item label="妫�瀹氬懆鏈�" prop="checkCycle" style="margin-bottom: 10px;">
+                <el-input v-model="form.checkCycle" style="width: 150px"/>
+              </el-form-item>
+            </td>
+            <td>
+              <el-form-item label="鎻愰啋鍛ㄦ湡" prop="reminderCycle" style="margin-bottom: 10px;">
+                <el-input v-model="form.reminderCycle"/>
+              </el-form-item>
+            </td>
+          </tr>
+        </table>
+      </el-form>
+      <div slot="footer" class="dialog-footer" style="padding-top: 5px">
+        <!-- <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>-->
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <importAnnexTable ref="importAnnex"/>
+  </div>
+</template>
+<style scoped lang="scss">
+.el-table .warning-rown {
+  color: #ff0000;
+}
+
+.el-table .warning-row {
+  background: #ffb8a9;
+}
+</style>
+<script>
+import {
+  listArchives,
+  getArchives,
+  delArchives,
+  addArchives,
+  updateArchives,
+  exportArchives,
+  resetArchives
+} from "@/api/facility/archives";
+import {getToken} from "@/utils/auth";
+import importAnnexTable from "./importAnnexTable";
+import mixins from "@/layout/mixin/getHeight";
+
+const facilityType = "0";
+const branchFactory = "0";
+const facilityGrade = "0";
+export default {
+  name: "importAnnex",
+  components: {importAnnexTable},
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁惧妗f琛ㄦ牸鏁版嵁
+      archivesList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭id瀛楀吀
+      idOptions: [],
+      // 缂栫爜瀛楀吀
+      codeOptions: [],
+      height: null,
+      // 璁惧鍚嶇О瀛楀吀
+      facilityNameOptions: [],
+      // 璁惧绫诲瀷瀛楀吀
+      facilityTypeOptions: [],
+      // 閲嶇偣璁惧瀛楀吀
+      pointFlagOptions: [],
+      // 浣跨敤鍒嗗巶瀛楀吀
+      branchFactoryOptions: [],
+      // 鐗╃悊浣嶇疆瀛楀吀
+      istallationLocationnOptions: [],
+      // 鑳借�楃瓑绾у瓧鍏�
+      facilityGradeOptions: [],
+      // 棰濆畾鍔熺巼瀛楀吀
+      ratedPowerOptions: [],
+      // 鐢熶骇鏃ユ湡瀛楀吀
+      productionDateOptions: [],
+      // 鎶曡繍鏃ユ湡瀛楀吀
+      putrunDateOptions: [],
+      // 鐢熶骇鍘傚瀛楀吀
+      manufacturerOptions: [],
+      // 璐熻矗浜哄瓧鍏�
+      personChargeOptions: [],
+      // 鎶�鏈弬鏁板瓧鍏�
+      technicalDataOptions: [],
+      // 璧峰鏃堕棿瀛楀吀
+      startTimeOptions: [],
+      // 妫�瀹氬懆鏈熷瓧鍏�
+      checkCycleOptions: [],
+      // 鎻愰啋鍛ㄦ湡瀛楀吀
+      reminderCycleOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 鐩戠悊浜哄瓧鍏�
+      createByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      //鏍¢獙鏁扮粍
+      flagArray: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        pointFlag: undefined,
+        branchFactory: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        manufacturer: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        code: [
+          {required: true, message: "缂栫爜涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("facility_type").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.facilityType = response.data[i].dictValue;
+        }
+      }
+      this.facilityTypeOptions = response.data;
+    });
+    this.getDicts("pointFlag").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.pointFlag = response.data[i].dictValue;
+        }
+      }
+      this.pointFlagOptions = response.data;
+    });
+    this.getDicts("branch_factory").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.branchFactory = response.data[i].dictValue;
+        }
+      }
+      this.branchFactoryOptions = response.data;
+    });
+    this.getDicts("facility_grade").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.facilityGrade = response.data[i].dictValue;
+        }
+      }
+      this.facilityGradeOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    tableRowClassName({row, rowIndex}) {
+      if (row.txflage) {
+        console.log(JSON.stringify(row.txflage));
+        return 'warning-row'
+      }
+      return '';
+    },
+    /** 鏌ヨ璁惧妗f鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listArchives(this.queryParams).then(response => {
+        this.archivesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 璁惧绫诲瀷瀛楀吀缈昏瘧
+    facilityTypeFormat(row, column) {
+      return this.selectDictLabel(this.facilityTypeOptions, row.facilityType);
+    },
+    // 浣跨敤鍒嗗巶瀛楀吀缈昏瘧
+    branchFactoryFormat(row, column) {
+      return this.selectDictLabel(this.branchFactoryOptions, row.branchFactory);
+    },
+    // 閲嶇偣璁惧瀛楀吀缈昏瘧
+    pointFlagFactoryFormat(row, column) {
+      return this.selectDictLabel(this.pointFlagOptions, row.pointFlag);
+    },
+    // 鑳借�楃瓑绾у瓧鍏哥炕璇�
+    facilityGradeFormat(row, column) {
+      return this.selectDictLabel(this.facilityGradeOptions, row.facilityGrade);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        branchFactory: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        ratedPower: undefined,
+        productionDate: undefined,
+        putrunDate: undefined,
+        manufacturer: undefined,
+        personCharge: undefined,
+        technicalData: undefined,
+        startTime: undefined,
+        checkCycle: undefined,
+        reminderCycle: undefined,
+        remark: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+      //鏂�
+      this.flagArray = selection.map(item => item.txflage)
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞璁惧妗f";
+      this.form.facilityGrade = this.facilityGrade;
+      this.form.facilityType = this.facilityType;
+      this.form.branchFactory = this.branchFactory
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids;
+      getArchives(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼璁惧妗f";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateArchives(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addArchives(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 妫�瀹氭仮澶嶆寜閽搷浣� */
+    handleReset(row) {
+      const ids = row.id || this.ids;
+      if (this.flagArray.indexOf(false) > -1) {
+        this.$confirm('闈炴彁閱掔殑璁惧涓嶈兘鎭㈠!', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        });
+        return;
+      }
+      this.$confirm('鏄惁杩涜妫�瀹氭棩鏈熸仮澶�?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return resetArchives(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("妫�瀹氭棩鏈熸仮澶嶆垚鍔�");
+      }).catch(function () {
+      });
+
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportAnnexTable(row) {
+      let facid = row.id;
+      let faccode = row.code;
+      this.$refs.importAnnex.show(facid, faccode);
+    },
+    /** 闄勪欢鎼滅储鎸夐挳鎿嶄綔 */
+    handleFjQuery() {
+      // this.queryParams.pageNum = 1;
+      // this.getList();
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎澶囨。妗堟暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportArchives(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form{
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/history/query/historyIndex.vue b/energy_management_ui/src/views/history/query/historyIndex.vue
new file mode 100644
index 0000000..e734aa3
--- /dev/null
+++ b/energy_management_ui/src/views/history/query/historyIndex.vue
@@ -0,0 +1,317 @@
+
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label:''}}--鑺傜偣璁剧疆</span>
+      </div>
+      <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+        <el-form-item label="璧锋鏃堕棿">
+          <el-date-picker
+            v-model="dateRange"
+            type="datetimerange"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+          <!--<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>-->
+        </el-form-item>
+
+      </el-form>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="warning"
+            icon="el-icon-download"
+            size="mini"
+            @click="handleExport"
+            v-hasPermi="['energyAlarm:historicalAlarm:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-form>
+        <el-table :data="JkHistoryAlarmList" v-loading="loading" border @selection-change="" @cell-click="openDialog"  >
+          <el-table-column label="搴忓彿" type="index"  align="center"/>
+          <el-table-column label="鍗曚綅鍚嶇О" align="center" prop="modelName"/>
+          <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"/>
+          <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName">
+            <template slot-scope="scope">
+              <div style="color:blue;text-decoration:underline ;cursor:pointer">{{scope.row.indexName}}</div>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎸囨爣鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat" />
+        <!--  <el-table-column label="鎶ヨ绾у埆" align="center" prop="alarmLevel" :formatter="alarmLevelFormat"/>
+          <el-table-column label="闄愬�肩被鍨�" align="center" prop="limitType"  :formatter="limitTypeFormat"/>
+          <el-table-column label="闄愬��"     align="center" prop="limitingValue"/>
+          <el-table-column label="鏃堕棿璧�" align="center" prop="alarmBeginTime"/>
+          <el-table-column label="鏃堕棿姝�" align="center" prop="alarmEndTime"/>
+          <el-table-column label="棰勮鍊�"   align="center" prop="alarmValue" />-->
+          <!--<el-table-column label="鎸佺画鏃堕暱(鍒嗛挓)" align="center" prop="duration" width="96px" />-->
+        </el-table>
+      </el-form>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+      <!--寮规-->
+      <el-dialog :title="title" :visible.sync="open" width="1500px" :close-on-click-modal="false">
+        <el-row style="background:#fff;margin-bottom:32px;">
+          <el-tabs v-model="activeName" @tab-click="handleClick" >
+            <el-tab-pane label="鍘嗗彶鏁版嵁鏇茬嚎鍥�" name="second">
+              <history-alarm-view ref="historyAlarmView" :code="code" :activeName="activeName" :limitVal="limitVal"></history-alarm-view>
+            </el-tab-pane>
+            <el-tab-pane label="鍘嗗彶鏁版嵁鏌ヨ" name="third">
+              <history-alarm-table ref="historyAlarmTable" :code="code" :indexName="indexName" :activeName="activeName" :indexUnit="indexUnit" :limitVal="limitVal"></history-alarm-table>
+            </el-tab-pane>
+          </el-tabs>
+        </el-row>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+    </el-card>
+  </div>
+</template>
+
+<script>
+
+  import {listHistoryAlarm,exportHistoricalAlarm , getHistoricalAlarm} from  "@/api/basicsetting/historyAlarm";
+  import {listLimitType} from "@/api/basicsetting/limitType"
+  import historyAlarmView from "../../energyAlarm/realTimeAlarm/historyAlarmView"
+  import historyAlarmTable from "../../energyAlarm/realTimeAlarm/historyAlarmTable"
+
+  export default {
+    components: {historyAlarmView,historyAlarmTable},
+    name: 'historyAlarm',
+
+    data() {
+      return {
+        num: 20,
+        num1:5,
+        pickerOptions: {
+          /*  value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],*/
+        },
+        code:undefined,
+        value:'',
+        options:undefined,
+        // handleClick:'simple',
+        radio: 'B',
+        activeName: 'second',
+        indexId:undefined,
+        indexName:undefined,
+        indexUnit:undefined,
+        currentNode: '',
+        limitVal:undefined,
+        hiddenTableHeader:false,
+       /* lineChartData: lineChartData.newVisitis,*/
+        limitTypeOptions:[],
+        alarmLevelOptions:[],
+        resposeList:[],
+        /* formatDate:undefined,*/
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        dateRange: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 10,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        List: [],
+        energyindexList: [],
+        // 寮瑰嚭灞傛爣棰�
+        JkHistoryAlarmList:[],
+        title: "鍘嗗彶鏁版嵁鏌ヨ",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        // 鏌ヨ鍙傛暟
+        lineChartData:{
+          newVisitis:null,
+        },
+        queryParams: {
+           pageNum: 1,
+           pageSize: 10,
+          eierarchyFlag:'B',
+          indexType:'COLLECT',
+          code: undefined,
+          indexName:undefined,
+          /* unitId: undefined,*/
+          limitType: undefined,
+          alarmLevel: undefined,
+          /*alarmValue:undefined,*/
+          /* limitingValue:undefined,*/
+          nodeId:undefined,
+          beginTime: undefined,
+          endTime:undefined,
+
+        },
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+    created() {
+      this.getDicts("alarm_level").then(response => {
+        this.alarmLevelOptions = response.data;
+      });
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+      });
+      listLimitType(this.queryParams).then(response => {
+        this.limitTypeOptions = response.rows;
+      });
+
+    },
+    methods: {
+
+      getList() {
+        this.loading = true;
+        listHistoryAlarm(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+          this.JkHistoryAlarmList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        const indexId = row.indexId || this.ids;
+        this.open = true;
+        /*this.title = "鍘嗗彶鏁版嵁鏌ヨ";*/
+      },
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+/*      // 闄愬�肩被鍨嬪瓧鍏哥炕璇�
+      limitTypeFormat(row, column) {
+        return this.selectDictLabel(this.limitTypeOptions, row.limitType);
+      },*/
+      // 鎶ヨ绾у埆瀛楀吀缈昏瘧
+      alarmLevelFormat(row, column) {
+        return this.selectDictLabel(this.alarmLevelOptions, row.alarmLevel);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+      modelNodeChange(modelNode) {
+        this.queryParams.nodeId = modelNode.id;
+        this.settingDeviceList = [];
+        this.settingIndexList = [];
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+          this.deviceLoading = true;
+          this.energyLoading = true;
+          this.productLoading = true;
+          this.indexLoading = true;
+        }
+        this.getList();
+      },
+      formatDate: function (value) {
+        let date = new Date(value);
+        let y = date.getFullYear();
+        let MM = date.getMonth() + 1;
+        MM = MM < 10 ? ('0' + MM) : MM;
+        let d = date.getDate();
+        d = d < 10 ? ('0' + d) : d;
+        let h = date.getHours();
+        h = h < 10 ? ('0' + h) : h;
+        let m = date.getMinutes();
+        m = m < 10 ? ('0' + m) : m;
+        let s = date.getSeconds();
+        s = s < 10 ? ('0' + s) : s;
+        return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s;
+      },
+
+
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.dateRange = [];
+        this.resetForm("queryForm");
+      },
+
+      handleSelectionChange() {
+      },
+      openDialog(row,column,event,cell){
+        if("indexName"==column.property){
+          this.open = true;
+          this.code = row.code;
+          this.indexName = row.indexName;
+          this.indexId = row.indexId;
+          this.activeName = "second";
+          this.indexUnit = this.selectDictLabel(this.unitIdOptions, row.unitId);
+          this.limitVal = row.limitingValue;
+        }
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋姤璀︽暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportHistoricalAlarm(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+
+      },
+      //闄愬埗绫诲瀷缈昏瘧
+      limitTypeFormat(row,column){
+        var actions = [];
+        Object.keys(this.limitTypeOptions).map((key) => {
+          if (this.limitTypeOptions[key].limitCode == ('' + row.limitType)) {
+            actions.push(this.limitTypeOptions[key].limitName);
+          }
+        });
+        return actions.join('');
+      },
+      handleClick(tab, event){
+        this.activeName = tab.name;
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/history/query/index.vue b/energy_management_ui/src/views/history/query/index.vue
new file mode 100644
index 0000000..567f460
--- /dev/null
+++ b/energy_management_ui/src/views/history/query/index.vue
@@ -0,0 +1,77 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content">
+       <!-- <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            <el-select v-model="modelData" placeholder="璇烽�夋嫨妯″瀷"
+                       style="width:220px"
+                       size="small"
+                       @change="changeModel">
+              <el-option
+                v-for="model in modelInfoOptions"
+                :key="model.modelCode"
+                :label="model.modelName"
+                :value="model.modelCode"
+              />
+            </el-select>
+            &lt;!&ndash; <el-button icon="el-icon-setting" circle title="绠$悊妯″瀷" style="float:right;padding:8px"
+                        @click="manageModel"></el-button>&ndash;&gt;
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false"></ModelNode>
+        </el-card>-->
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鍘嗗彶鏁版嵁
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false" modelCode="alarm"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+          <HistoryIndex ref="HistoryIndex"></HistoryIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import HistoryIndex from "./historyIndex";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+  import {listModel} from "@/api/basicsetting/model";
+
+
+
+  export default {
+    components: {HistoryIndex, ModelNode},
+    created() {
+      /*listModel({isShow: 1}).then(response => {
+        this.modelInfoOptions = response.data;
+        if (this.modelInfoOptions.length > 0) {
+          this.modelData = this.modelInfoOptions[0].modelCode;
+          this.$refs.modelNode.getList(this.modelData);
+        }
+      });*/
+      this.modelCode=this.$route.query.modelCode;
+    },
+
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: []
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.HistoryIndex.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        /*this.$refs.modelNode.getList(item);*/
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/index copy.vue b/energy_management_ui/src/views/index copy.vue
new file mode 100644
index 0000000..9d864a4
--- /dev/null
+++ b/energy_management_ui/src/views/index copy.vue
@@ -0,0 +1,688 @@
+<template>
+  <div class="home-show">
+    <!-- <el-card :bordered="false">
+      <div class="home-head">
+        <div class="home-select-label">鏃ユ湡鍒囨崲</div>
+        <div>
+          <el-button
+            :type="dateType === 'DAY' ? 'primary' : ''"
+            @click="dateClickHandle('DAY')"
+            >鏃�</el-button
+          >
+          <el-button
+            :type="dateType === 'MONTH' ? 'primary' : ''"
+            @click="dateClickHandle('MONTH')"
+            class="select-month"
+            >鏈�
+          </el-button>
+          <el-button
+            :type="dateType === 'YEAR' ? 'primary' : ''"
+            @click="dateClickHandle('YEAR')"
+            >骞�</el-button
+          >
+        </div>
+      </div>
+    </el-card> -->
+    <el-row type="flex" class="data-indicator-overview">
+      <el-col class="home-body-left">
+        <el-card class="body-left-title" :bordered="false">
+          <div slot="header" class="clearfix">
+            <span>鍙屾帶鏁版嵁鎸囨爣鎬昏</span>
+          </div>
+          <el-row class="double-data-show-content">
+            <el-col :span="12" class="total">
+              <img alt="" src="~@/assets/home/zonghe.svg" />
+              <div class="left-title-style">
+                <div>
+                  <div>鍏ㄥ巶缁煎悎鑳借��</div>
+                  <div class="unit">{{ summation }} tce</div>
+                </div>
+              </div>
+            </el-col>
+            <!-- <el-col :span="12" class="co2">
+              <img alt="" src="~@/assets/home/tan.svg" />
+              <div class="left-title-style">
+                <div>
+                  <div>CO鈧傛帓鏀炬�婚噺</div>
+                  <div class="unit">{{ totalCo2Emissions }} t</div>
+                </div>
+              </div>
+            </el-col> -->
+          </el-row>
+          </el-card>
+          <div class="left-line-style">
+            <div>鑳芥簮瀹炴椂鐩戞祴</div>
+            <el-row type="flex" justify="space-between">
+              <!-- <el-col class="radio-list">
+                <div class="radio-list-content">
+                  <el-radio-group
+                    v-model="energyType"
+                    @change="onPowerTypeChange"
+                  >
+                    <el-radio
+                      :style="radioStyle"
+                      :label="item.value"
+                      v-for="item in powerTypeOptions"
+                      :key="item.value"
+                    >
+                      {{ item.label }}
+                    </el-radio>
+                  </el-radio-group>
+                </div>
+              </el-col> -->
+              <el-col class="right-line">
+                <span class="chart-left-unit">{{
+                  `鍗曚綅锛�${monitoringUnit}锛塦
+                }}</span>
+                <BarChart class="line-content" :chartData="chartDataObj" />
+              </el-col>
+            </el-row>
+          </div>
+        </el-card>
+        <el-card
+          :bordered="false"
+          class="left-bottom-type"
+          :body-style="{ height: '140px' }"
+        >
+          <div slot="header" class="clearfix">
+            <span>鍒嗙被鑳芥簮缁熻</span>
+          </div>
+          <div class="card-list">
+            <div
+              class="classify-energy"
+              style=""
+              v-for="(item, index) in energyStatistic"
+              :key="index"
+            >
+              <div class="img-list">
+                <img
+                  v-if="item.item.includes('鐢�')"
+                  src="~@/assets/home/haodian.svg"
+                  alt=""
+                />
+                <img
+                  v-if="item.item.includes('姘�')"
+                  src="~@/assets/home/haoshui.svg"
+                  alt=""
+                />
+                <img
+                  v-if="item.item.includes('姘�')"
+                  src="~@/assets/home/haoqi.svg"
+                  alt=""
+                />
+                <img
+                  v-if="item.item.includes('钂告苯')"
+                  src="~@/assets/home/haozhengqi.svg"
+                  alt=""
+                />
+                <div class="text-describe">
+                  <div>
+                    <div>
+                      鑰梴{
+                        item.item.indexOf("澶╃劧") !== -1
+                          ? item.item.replace("澶╃劧", "")
+                          : item.item
+                      }}閲�
+                      {{ item.unit ? `锛�${item.unit}锛塦 : "" }}
+                    </div>
+                    <div class="number">
+                      {{ item.count || 0 }}
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col class="home-body-right">
+        <el-card :bordered="false" class="right-first-card-title">
+          <div slot="header" class="clearfix">
+            <span>缁煎悎鑳借�楀崰姣斿垎鏋�</span>
+          </div>
+          <PieChart
+            class="first-chat"
+            :chartData="firstPieData"
+            pieTitle="缁煎悎鑳借�楀崰姣斿垎鏋�"
+          />
+        </el-card>
+        <el-card :bordered="false" class="second-card-title">
+          <div slot="header" class="clearfix">
+            <span>鑳借�楄澶囧崰姣�</span>
+          </div>
+          <PieChart
+            class="second-chat"
+            :chartData="secondPieData"
+            pieTitle="鑳借�楄澶囧崰姣�"
+          />
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {
+  getEnergyConsumptionRatio,
+  getEnergyConsumptionSummation,
+  getEnergyStatistic,
+  getHomeEnergyMonitoring,
+  listEnergyType,
+  getHomeEnergyUnitConsumptionRatio
+} from "@/api/home/home";
+import mixins from "@/layout/mixin/getHeight";
+import moment from "moment";
+import PieChart from "./dashboard/PieChart";
+import LineChart from "./dashboard/LineChart";
+import BarChart from "./dashboard/BarChart";
+
+export default {
+  components: {
+    LineChart,
+    BarChart,
+    PieChart
+  },
+  mixins: [mixins],
+
+  data() {
+    return {
+      firstPieData: [],
+      secondPieData: [],
+      chartDataObj: {},
+      energyType: "electric",
+      energyTypeName: "鐢�",
+      dateType: "DAY",
+      powerTypeOptions: [
+        {
+          label: "鐢�",
+          value: "electric",
+          energyUnit: "kWh"
+        },
+        { label: "姘�", value: "Water", energyUnit: "m鲁" },
+        { label: "钂告苯", value: "Steam", energyUnit: "鍚�" },
+        { label: "澶╃劧姘�", value: "Gas", energyUnit: "Nm鲁" }
+      ],
+      isClick: true,
+      radioStyle: {
+        display: "block",
+        height: "30px",
+        lineHeight: "30px"
+      },
+      chart1: null,
+      chart2: null,
+      monitoringUnit: "kWh",
+      data: [],
+      pieDta: [],
+      pieDtatwo: [],
+      energyCostSum: 0,
+      energyStatistic: [],
+      summation: 10776,
+      totalCo2Emissions: 0
+    };
+  },
+  mounted() {
+    this.getEnergyType();
+    this.getSummationData();
+    this.getEnergyConsumptionRatioData();
+    this.getEnergyStatisticData();
+    this.getHomeEnergyUnitConsumptionRatioData();
+
+    const ele = document.createEvent("Event");
+    ele.initEvent("resize", true, true);
+    window.dispatchEvent(ele);
+  },
+  methods: {
+    getEnergyType() {
+      listEnergyType()
+        .then(res => {
+          if (res.code === 200) {
+            this.powerTypeOptions =
+              res.data.map(item => ({
+                ...item,
+                value: item.energy,
+                label: item.energyName
+              })) || [];
+            this.energyType =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].value
+                : "";
+            this.energyTypeName =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].label
+                : "";
+            this.getEnergyMonitoring();
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇鑳芥簮绫诲瀷鍒楄〃", e);
+        });
+    },
+    // 纰虫帓閲忔牳绠楁煡璇�
+    getCarbonEmission() {
+      getHomeCarbonEmission(this.dateType).then(res => {
+        this.totalCo2Emissions = res.result.totalCo2Emissions;
+      });
+    },
+    // 鑾峰彇鍏ㄥ巶缁煎悎鑳借��
+    getSummationData() {
+      getEnergyConsumptionSummation(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.summation = res.data;
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇鍏ㄥ巶缁煎悎鑳借��", e);
+        });
+    },
+    // 鑾峰彇缁煎悎鑳借�楀崰姣旂幆褰㈠浘鍒嗘瀽鏁版嵁
+    getEnergyConsumptionRatioData() {
+      getEnergyConsumptionRatio(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.firstPieData = res.data.map(item => {
+              return {
+                ...item,
+                name: item.item,
+                value: item.count || 0
+                // unit: filterUint
+              };
+            });
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇缁煎悎鑳借�楀崰姣旂幆褰㈠浘鍒嗘瀽鏁版嵁", e);
+        });
+    },
+
+    // 鑳芥簮璁惧鐜舰鍥炬暟鎹暟鎹�
+    getHomeEnergyUnitConsumptionRatioData() {
+      getHomeEnergyUnitConsumptionRatio(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.secondPieData = res.data.map(item => {
+              return {
+                ...item,
+                name: item.name,
+                value: item.value || 0
+                // unit: filterUint
+              };
+            });
+          }
+        })
+        .catch(e => {
+          console.log("鑳芥簮璁惧鍒嗘瀽鐜舰鍥炬暟鎹暟鎹�", e);
+        });
+    },
+
+    // 鍒嗙被鑳芥簮缁熻鏁版嵁
+    getEnergyStatisticData() {
+      getEnergyStatistic(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.energyStatistic = res.data;
+          }
+        })
+        .catch(e => {
+          console.log("鍒嗙被鑳芥簮缁熻鏁版嵁", e);
+        });
+    },
+
+    // 鑳芥簮鐩戞祴鏌辩姸鍥炬暟鎹�
+    getEnergyMonitoring() {
+      getHomeEnergyMonitoring(this.dateType, this.energyType)
+        .then(res => {
+          if (res.code === 200) {
+            this.monitoringUnit = res.data.unit;
+            let chartData = res.data.chartData.sort((a, b) => {
+              return a.date - b.date;
+            });
+            let nameList = Array.from(
+              new Set(
+                chartData.map(item => {
+                  return item.name;
+                })
+              )
+            ).sort((a, b) => {
+              return new Date(b.date).getTime() - new Date(a.date).getTime();
+            });
+            // 琛ュ叏鏁版嵁
+            let oneArr = chartData.filter(item => {
+              return item.name === nameList[0];
+            });
+            let twoArr = chartData.filter(item => {
+              return item.name === nameList[1];
+            });
+
+            let maxDate =
+              this.dateType === "DAY"
+                ? 23
+                : Math.max(
+                    ...chartData.map(item => {
+                      return item.date;
+                    })
+                  );
+            oneArr.forEach(element => {
+              if (this.dateType === "DAY") {
+                let hour = new Date("2022 " + element.date).getHours() + "鏃�";
+                element.date = hour;
+              } else {
+                element.date =
+                  this.dateType === "MONTH"
+                    ? element.date + "鏃�"
+                    : element.date + "鏈�";
+              }
+            });
+            twoArr.forEach(element => {
+              if (this.dateType === "DAY") {
+                let hour = new Date("2022 " + element.date).getHours() + "鏃�";
+                element.date = hour;
+              } else {
+                element.date =
+                  this.dateType === "MONTH"
+                    ? element.date + "鏃�"
+                    : element.date + "鏈�";
+              }
+            });
+            if (oneArr.length < maxDate) {
+              if (this.dateType === "DAY") {
+                for (let d = oneArr.length; d < maxDate + 1; d++) {
+                  oneArr.push({
+                    date: d + "鏃�",
+                    name: nameList[0],
+                    count: 0,
+                    value: null
+                  });
+                }
+              } else {
+                console.log("one111111111");
+                for (let d = oneArr.length + 1; d < maxDate + 1; d++) {
+                  oneArr.push({
+                    date: this.dateType === "MONTH" ? d + "鏃�" : d + "鏈�",
+                    name: nameList[0],
+                    count: 0,
+                    value: null
+                  });
+                }
+              }
+            }
+            if (twoArr.length < maxDate) {
+              if (this.dateType === "DAY") {
+                for (let d = twoArr.length; d < maxDate + 1; d++) {
+                  twoArr.push({
+                    date: d + "鏃�",
+                    name: nameList[1],
+                    count: 0,
+                    value: 0
+                  });
+                }
+              } else {
+                for (let d = twoArr.length + 1; d < maxDate + 1; d++) {
+                  twoArr.push({
+                    date: this.dateType === "MONTH" ? d + "鏃�" : d + "鏈�",
+                    name: nameList[1],
+                    count: 0,
+                    value: 0
+                  });
+                }
+              }
+            }
+
+            let chartData2 = oneArr
+              .concat(twoArr)
+              .map(item => {
+                return {
+                  ...item,
+                  len: item.date,
+                  count: item.value === "--" ? null : +item.value
+                };
+              })
+              .sort((a, b) => {
+                return new Date(a.name).getTime() - new Date(b.name).getTime();
+              });
+            this.data = chartData2;
+            this.chartDataObj = {
+              expectedData: twoArr.map(one => {
+                return one.value;
+              }),
+              actualData: oneArr.map(e => {
+                return e.value;
+              }),
+              xData: oneArr.map(one => {
+                return one.date;
+              })
+            };
+          }
+        })
+        .catch(e => {
+          console.log("鑳芥簮鐩戞祴鏌辩姸鍥炬暟鎹�", e);
+        });
+    },
+
+    dateClickHandle(type) {
+      this.dateType = type;
+      this.isClick = !this.isClick;
+      this.getSummationData();
+      this.getEnergyConsumptionRatioData();
+      this.getEnergyCostRatioData();
+      this.getEnergyStatisticData();
+      this.getEnergyMonitoring();
+      this.getCarbonEmission();
+    },
+
+    onPowerTypeChange(e) {
+      this.energyType = e;
+      for (let i = 0; i < this.powerTypeOptions.length; i++) {
+        if (this.energyType === this.powerTypeOptions[i].value) {
+          this.energyTypeName = this.powerTypeOptions[i].label;
+          this.monitoringUnit = this.powerTypeOptions[i].energyUnit || "";
+        }
+      }
+      this.getEnergyMonitoring();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.home-show {
+  background: #f0f2f5;
+  overflow: hidden;
+  overflow-y: scroll;
+  height: calc(100vh - 90px);
+  .home-head {
+    display: flex;
+    align-items: center;
+
+    .home-select-label {
+      margin-right: 10px;
+      color: #000;
+      font-weight: 600;
+    }
+
+    .select-month {
+      margin: 0 8px;
+    }
+  }
+
+  .data-indicator-overview {
+    ::v-deep .el-card__body {
+      padding: 0 !important;
+    }
+
+    .home-body-left {
+      width: 66.3%;
+      height: 100%;
+
+      .body-left-title {
+        margin: 0 16px 0px 0;
+      }
+
+      .double-data-show-content {
+        display: flex;
+        align-items: center;
+        border-bottom: 1px solid #e9e9e9;
+        padding: 23px 0 23px 47px;
+
+        & > div {
+          display: flex;
+          align-items: center;
+        }
+
+        img {
+          width: 20px;
+          height: 20px;
+        }
+
+        .left-title-style {
+          display: flex;
+          align-items: center;
+          margin-left: 18px;
+
+          .unit {
+            font-size: 30px;
+            color: #000000;
+          }
+        }
+      }
+
+      .left-line-style {
+        padding: 24px;
+        color: #000000;
+
+        .radio-list {
+          width: 122px;
+
+          .radio-list-content {
+            margin: 16px 12px 0 0;
+            background: #f3f7f7;
+            padding: 21px 9px;
+            border-radius: 2px;
+            overflow: auto;
+            height: 360px;
+          }
+        }
+
+        .right-line {
+          width: calc(100% - 122px);
+          position: relative;
+
+          .chart-left-unit {
+            position: absolute;
+            top: 16px;
+            left: 0;
+            color: #333;
+          }
+
+          .line-content {
+            margin: 12px 0 0 0;
+            height: 300px;
+          }
+        }
+      }
+
+      .left-bottom-type {
+        margin: 16px 16px 16px 0;
+
+        .card-list {
+          display: flex;
+          flex-wrap: wrap;
+          height: 100%;
+
+          .classify-energy {
+            border-left: 1px solid #e9e9e9;
+            flex: 1;
+            display: flex;
+            align-items: center;
+            padding: 0 0 0 24px;
+
+            &:first-child {
+              border-left: none;
+            }
+
+            .img-list {
+              display: flex;
+              align-items: center;
+              img {
+                width: 20px;
+                height: 20px;
+              }
+
+              .text-describe {
+                display: flex;
+                align-items: center;
+                margin-left: 18px;
+
+                .number {
+                  font-size: 24px;
+                  color: #000000;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+
+    .home-body-right {
+      width: 33.7%;
+      height: 100%;
+
+      .right-first-card-title {
+        margin: 0 0 16px 0;
+
+        .first-chat {
+          margin: 10px 0 0 0;
+          height: 340px;
+        }
+      }
+
+      .second-card-title {
+        // padding-top: 16px;
+
+        .second-chat {
+          margin: 10px 0 0 0;
+          height: 340px;
+        }
+
+        .bottom-description-list {
+          display: flex;
+          padding: 0 23px 16px 10px;
+          height: 106px;
+          align-items: center;
+
+          .total {
+            border-right: 1px solid #e9e9e9;
+            padding-left: 10px;
+            min-width: 180px;
+            max-width: 180px;
+
+            .energy-cost-sum {
+              font-size: 24px;
+              color: #000000;
+            }
+          }
+
+          .legend {
+            padding: 6px 0 0 20px;
+
+            .legend-list {
+              display: flex;
+              // width: 280px;
+              flex-wrap: wrap;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  .power-cost {
+    width: 8px;
+    height: 8px;
+    border-radius: 50%;
+    display: inline-block;
+    margin-right: 4px;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/index.vue b/energy_management_ui/src/views/index.vue
new file mode 100644
index 0000000..7e5dbd9
--- /dev/null
+++ b/energy_management_ui/src/views/index.vue
@@ -0,0 +1,773 @@
+<template>
+  <div class="home-show">
+    <!-- <el-card :bordered="false">
+      <div class="home-head">
+        <div class="home-select-label">鏃ユ湡鍒囨崲</div>
+        <div>
+          <el-button
+            :type="dateType === 'DAY' ? 'primary' : ''"
+            @click="dateClickHandle('DAY')"
+            >鏃�</el-button
+          >
+          <el-button
+            :type="dateType === 'MONTH' ? 'primary' : ''"
+            @click="dateClickHandle('MONTH')"
+            class="select-month"
+            >鏈�
+          </el-button>
+          <el-button
+            :type="dateType === 'YEAR' ? 'primary' : ''"
+            @click="dateClickHandle('YEAR')"
+            >骞�</el-button
+          >
+        </div>
+      </div>
+    </el-card> -->
+    <el-row type="flex" class="data-indicator-overview">
+      <el-col class="home-body-left">
+        <el-card class="body-left-title" :bordered="false">
+          <div slot="header" class="clearfix">
+            <span>褰撴棩鍙屾帶鏁版嵁鎸囨爣鎬昏</span>
+          </div>
+          <el-row class="double-data-show-content">
+            <el-col :span="4" class="total">
+              <img alt="" src="~@/assets/home/zonghe.svg" />
+              <div class="left-title-style">
+                <div>
+                  <div>鍏ㄥ巶缁煎悎鑳借��</div>
+                  <div class="unit">{{ summation }} tce</div>
+                </div>
+              </div>
+            </el-col>
+            <el-col
+              :span="5"
+              class="co2"
+              v-for="(item, index) in energyStatistic"
+              :key="index"
+              style="border-left: 1px solid #e9e9e9;"
+            >
+              <img
+                v-if="item.item.includes('鐢�')"
+                src="~@/assets/home/haodian.svg"
+                alt=""
+              />
+              <img
+                v-if="item.item.includes('姘�')"
+                src="~@/assets/home/haoshui.svg"
+                alt=""
+              />
+              <img
+                v-if="item.item.includes('姘�')"
+                src="~@/assets/home/haoqi.svg"
+                alt=""
+              />
+              <img
+                v-if="item.item.includes('钂告苯')"
+                src="~@/assets/home/haozhengqi.svg"
+                alt=""
+              />
+              <div class="left-title-style">
+                <div>
+                  <div>
+                    鑰梴{
+                      item.item.indexOf("澶╃劧") !== -1
+                        ? item.item.replace("澶╃劧", "")
+                        : item.item
+                    }}閲�
+                    {{ item.unit ? `锛�${item.unit}锛塦 : "" }}
+                  </div>
+                  <div class="unit">
+                    {{ item.count || 0 }}
+                  </div>
+                </div>
+              </div>
+            </el-col>
+            <el-col
+              :span="5"
+              class="total"
+              style="border-left: 1px solid #e9e9e9;"
+            >
+              <img alt="" src="~@/assets/home/wen.png" />
+              <div class="left-title-style">
+                <div>
+                  <div>瀹ゅ娓╁害</div>
+                  <div class="unit">{{ temperature }}</div>
+                </div>
+              </div>
+            </el-col>
+            <el-col
+              :span="5"
+              class="total"
+              style="border-left: 1px solid #e9e9e9;"
+            >
+              <img alt="" src="~@/assets/home/shi.png" />
+              <div class="left-title-style">
+                <div>
+                  <div>瀹ゅ婀垮害</div>
+                  <div class="unit">{{ humidity }}</div>
+                </div>
+              </div>
+            </el-col>
+          </el-row>
+        </el-card>
+        <el-card :bordered="false" class="body-left-title">
+          <div slot="header" class="clearfix">
+            <span>鑳芥簮瀹炴椂鐩戞祴</span>
+          </div>
+          <div class="chart-wrapper">
+            <span class="chart-left-unit">{{
+              `鐢�/鍗曚綅${monitoringUnit}`
+            }}</span>
+            <BarChart class="line-content" :chartData="chartDataObj" />
+          </div>
+          <div class="chart-wrapper" style="border-top: 1px solid #e9e9e9">
+            <span class="chart-left-unit">{{
+              `姘�/鍗曚綅${monitoringWaterUnit}`
+            }}</span>
+            <BarChart class="line-content" :chartData="chartDataWaterObj" />
+          </div>
+        </el-card>
+        <!-- <div class="left-line-style">
+          <div>鑳芥簮瀹炴椂鐩戞祴</div>
+          <el-row type="flex" justify="space-between">
+            <el-col class="radio-list">
+                <div class="radio-list-content">
+                  <el-radio-group
+                    v-model="energyType"
+                    @change="onPowerTypeChange"
+                  >
+                    <el-radio
+                      :style="radioStyle"
+                      :label="item.value"
+                      v-for="item in powerTypeOptions"
+                      :key="item.value"
+                    >
+                      {{ item.label }}
+                    </el-radio>
+                  </el-radio-group>
+                </div>
+              </el-col>
+          </el-row>
+        </div> -->
+      </el-col>
+      <el-col class="home-body-right">
+        <el-card :bordered="false" class="right-first-card-title">
+          <div slot="header" class="clearfix">
+            <span>缁煎悎鑳借�楀崰姣斿垎鏋�</span>
+          </div>
+          <PieChart
+            class="first-chat"
+            :chartData="firstPieData"
+            pieTitle="缁煎悎鑳借�楀崰姣斿垎鏋�"
+          />
+        </el-card>
+        <el-card :bordered="false" class="second-card-title">
+          <div slot="header" class="clearfix">
+            <span>鑳借�楄澶囧崰姣�</span>
+          </div>
+          <PieChart
+            class="second-chat"
+            :chartData="secondPieData"
+            pieTitle="鑳借�楄澶囧崰姣�"
+          />
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {
+  getEnergyConsumptionRatio,
+  getEnergyConsumptionSummation,
+  getEnergyStatistic,
+  getHomeEnergyMonitoring,
+  listEnergyType,
+  getHomeEnergyUnitConsumptionRatio,
+  getHomeOutdoorTemperature
+} from "@/api/home/home";
+import mixins from "@/layout/mixin/getHeight";
+import moment from "moment";
+import PieChart from "./dashboard/PieChart";
+import LineChart from "./dashboard/LineChart";
+import BarChart from "./dashboard/BarChart";
+
+export default {
+  components: {
+    LineChart,
+    BarChart,
+    PieChart
+  },
+  mixins: [mixins],
+
+  data() {
+    return {
+      firstPieData: [],
+      secondPieData: [],
+      monitoringUnit: "kWh",
+      chartDataObj: {},
+      monitoringWaterUnit: "m鲁",
+      chartDataWaterObj: {},
+      energyType: "electric",
+      energyTypeName: "鐢�",
+      dateType: "DAY",
+      powerTypeOptions: [
+        {
+          label: "鐢�",
+          value: "electric",
+          energyUnit: "kWh"
+        },
+        { label: "姘�", value: "Water", energyUnit: "m鲁" },
+        { label: "钂告苯", value: "Steam", energyUnit: "鍚�" },
+        { label: "澶╃劧姘�", value: "Gas", energyUnit: "Nm鲁" }
+      ],
+      isClick: true,
+      radioStyle: {
+        display: "block",
+        height: "30px",
+        lineHeight: "30px"
+      },
+      chart1: null,
+      chart2: null,
+      data: [],
+      pieDta: [],
+      pieDtatwo: [],
+      energyCostSum: 0,
+      energyStatistic: [],
+      summation: 10776,
+      totalCo2Emissions: 0,
+      humidity: "",
+      temperature: "",
+      timer: null,
+      timer30: null
+    };
+  },
+  mounted() {
+    this.getEnergyType();
+    this.getSummationData();
+    this.getEnergyConsumptionRatioData();
+    this.getEnergyStatisticData();
+    this.getHomeEnergyUnitConsumptionRatioData();
+
+    const ele = document.createEvent("Event");
+    ele.initEvent("resize", true, true);
+    window.dispatchEvent(ele);
+
+    clearInterval(this.timer);
+    clearInterval(this.timer30);
+    this.getHomeOutdoorTemperatureData();
+    this.timer = setInterval(() => {
+      this.getHomeOutdoorTemperatureData();
+    }, 12000);
+    this.timer30 = setInterval(() => {
+      // this.getEnergyType();
+      this.getSummationData();
+      this.getEnergyConsumptionRatioData();
+      this.getEnergyStatisticData();
+      this.getHomeEnergyUnitConsumptionRatioData();
+    }, 180000);
+  },
+  beforeDestroy() {
+    clearInterval(this.timer);
+    clearInterval(this.timer30);
+  },
+  methods: {
+    getHomeOutdoorTemperatureData() {
+      getHomeOutdoorTemperature().then(res => {
+        this.temperature = res.data.temperature;
+        this.humidity = res.data.humidity;
+      });
+    },
+    getEnergyType() {
+      listEnergyType()
+        .then(res => {
+          if (res.code === 200) {
+            this.powerTypeOptions =
+              res.data.map(item => ({
+                ...item,
+                value: item.energy,
+                label: item.energyName
+              })) || [];
+            this.energyType =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].value
+                : "";
+            this.energyTypeName =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].label
+                : "";
+            for (let i = 0; i < this.powerTypeOptions.length; i++) {
+              this.getEnergyMonitoring(this.powerTypeOptions[i].value);
+            }
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇鑳芥簮绫诲瀷鍒楄〃", e);
+        });
+    },
+    // 纰虫帓閲忔牳绠楁煡璇�
+    getCarbonEmission() {
+      getHomeCarbonEmission(this.dateType).then(res => {
+        this.totalCo2Emissions = res.result.totalCo2Emissions;
+      });
+    },
+    // 鑾峰彇鍏ㄥ巶缁煎悎鑳借��
+    getSummationData() {
+      getEnergyConsumptionSummation(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.summation = res.data;
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇鍏ㄥ巶缁煎悎鑳借��", e);
+        });
+    },
+    // 鑾峰彇缁煎悎鑳借�楀崰姣旂幆褰㈠浘鍒嗘瀽鏁版嵁
+    getEnergyConsumptionRatioData() {
+      getEnergyConsumptionRatio(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.firstPieData = res.data.map(item => {
+              return {
+                ...item,
+                name: item.item,
+                value: item.count || 0
+                // unit: filterUint
+              };
+            });
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇缁煎悎鑳借�楀崰姣旂幆褰㈠浘鍒嗘瀽鏁版嵁", e);
+        });
+    },
+
+    // 鑳芥簮璁惧鐜舰鍥炬暟鎹暟鎹�
+    getHomeEnergyUnitConsumptionRatioData() {
+      getHomeEnergyUnitConsumptionRatio(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.secondPieData = res.data.map(item => {
+              return {
+                ...item,
+                name: item.name,
+                value: item.value || 0
+                // unit: filterUint
+              };
+            });
+          }
+        })
+        .catch(e => {
+          console.log("鑳芥簮璁惧鍒嗘瀽鐜舰鍥炬暟鎹暟鎹�", e);
+        });
+    },
+
+    // 鍒嗙被鑳芥簮缁熻鏁版嵁
+    getEnergyStatisticData() {
+      getEnergyStatistic(this.dateType)
+        .then(res => {
+          if (res.code === 200) {
+            this.energyStatistic = res.data;
+          }
+        })
+        .catch(e => {
+          console.log("鍒嗙被鑳芥簮缁熻鏁版嵁", e);
+        });
+    },
+
+    // 鑳芥簮鐩戞祴鏌辩姸鍥炬暟鎹�
+    getEnergyMonitoring(energyType) {
+      getHomeEnergyMonitoring(this.dateType, energyType)
+        .then(res => {
+          if (res.code === 200) {
+            let chartData = res.data.chartData.sort((a, b) => {
+              return a.date - b.date;
+            });
+            let nameList = Array.from(
+              new Set(
+                chartData.map(item => {
+                  return item.name;
+                })
+              )
+            ).sort((a, b) => {
+              return new Date(b.date).getTime() - new Date(a.date).getTime();
+            });
+            // 琛ュ叏鏁版嵁
+            let oneArr = chartData.filter(item => {
+              return item.name === nameList[0];
+            });
+            let twoArr = chartData.filter(item => {
+              return item.name === nameList[1];
+            });
+
+            let maxDate =
+              this.dateType === "DAY"
+                ? 23
+                : Math.max(
+                    ...chartData.map(item => {
+                      return item.date;
+                    })
+                  );
+            oneArr.forEach(element => {
+              if (this.dateType === "DAY") {
+                let hour = new Date("2022 " + element.date).getHours() + "鏃�";
+                element.date = hour;
+              } else {
+                element.date =
+                  this.dateType === "MONTH"
+                    ? element.date + "鏃�"
+                    : element.date + "鏈�";
+              }
+            });
+            twoArr.forEach(element => {
+              if (this.dateType === "DAY") {
+                let hour = new Date("2022 " + element.date).getHours() + "鏃�";
+                element.date = hour;
+              } else {
+                element.date =
+                  this.dateType === "MONTH"
+                    ? element.date + "鏃�"
+                    : element.date + "鏈�";
+              }
+            });
+            if (oneArr.length < maxDate) {
+              if (this.dateType === "DAY") {
+                for (let d = oneArr.length; d < maxDate + 1; d++) {
+                  oneArr.push({
+                    date: d + "鏃�",
+                    name: nameList[0],
+                    count: 0,
+                    value: null
+                  });
+                }
+              } else {
+                console.log("one111111111");
+                for (let d = oneArr.length + 1; d < maxDate + 1; d++) {
+                  oneArr.push({
+                    date: this.dateType === "MONTH" ? d + "鏃�" : d + "鏈�",
+                    name: nameList[0],
+                    count: 0,
+                    value: null
+                  });
+                }
+              }
+            }
+            if (twoArr.length < maxDate) {
+              if (this.dateType === "DAY") {
+                for (let d = twoArr.length; d < maxDate + 1; d++) {
+                  twoArr.push({
+                    date: d + "鏃�",
+                    name: nameList[1],
+                    count: 0,
+                    value: 0
+                  });
+                }
+              } else {
+                for (let d = twoArr.length + 1; d < maxDate + 1; d++) {
+                  twoArr.push({
+                    date: this.dateType === "MONTH" ? d + "鏃�" : d + "鏈�",
+                    name: nameList[1],
+                    count: 0,
+                    value: 0
+                  });
+                }
+              }
+            }
+
+            let chartData2 = oneArr
+              .concat(twoArr)
+              .map(item => {
+                return {
+                  ...item,
+                  len: item.date,
+                  count: item.value === "--" ? null : +item.value
+                };
+              })
+              .sort((a, b) => {
+                return new Date(a.name).getTime() - new Date(b.name).getTime();
+              });
+            this.data = chartData2;
+            if (energyType == "water") {
+              this.monitoringWaterUnit = res.data.unit;
+              this.chartDataWaterObj = {
+                expectedData: twoArr.map(one => {
+                  return one.value;
+                }),
+                actualData: oneArr.map(e => {
+                  return e.value;
+                }),
+                xData: oneArr.map(one => {
+                  return one.date;
+                })
+              };
+            } else if (energyType == "electric") {
+              this.monitoringUnit = res.data.unit;
+              this.chartDataObj = {
+                expectedData: twoArr.map(one => {
+                  return one.value;
+                }),
+                actualData: oneArr.map(e => {
+                  return e.value;
+                }),
+                xData: oneArr.map(one => {
+                  return one.date;
+                })
+              };
+            }
+          }
+        })
+        .catch(e => {
+          console.log("鑳芥簮鐩戞祴鏌辩姸鍥炬暟鎹�", e);
+        });
+    },
+
+    dateClickHandle(type) {
+      this.dateType = type;
+      this.isClick = !this.isClick;
+      this.getSummationData();
+      this.getEnergyConsumptionRatioData();
+      this.getEnergyCostRatioData();
+      this.getEnergyStatisticData();
+      this.getEnergyMonitoring();
+      this.getCarbonEmission();
+    },
+
+    onPowerTypeChange(e) {
+      this.energyType = e;
+      for (let i = 0; i < this.powerTypeOptions.length; i++) {
+        if (this.energyType === this.powerTypeOptions[i].value) {
+          this.energyTypeName = this.powerTypeOptions[i].label;
+          this.monitoringUnit = this.powerTypeOptions[i].energyUnit || "";
+        }
+      }
+      this.getEnergyMonitoring();
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.home-show {
+  background: #f0f2f5;
+  overflow: hidden;
+  overflow-y: scroll;
+  height: calc(100vh - 90px);
+  .home-head {
+    display: flex;
+    align-items: center;
+
+    .home-select-label {
+      margin-right: 10px;
+      color: #000;
+      font-weight: 600;
+    }
+
+    .select-month {
+      margin: 0 8px;
+    }
+  }
+
+  .chart-wrapper {
+    padding: 10px 24px;
+    position: relative;
+    .chart-left-unit {
+      position: absolute;
+      top: 16px;
+      left: 24px;
+      color: #333;
+      font-size: 18px;
+    }
+
+    .line-content {
+      margin: 4px 0 0 0;
+      height: 300px;
+    }
+  }
+
+  .data-indicator-overview {
+    ::v-deep .el-card__body {
+      padding: 0 !important;
+    }
+
+    .home-body-left {
+      width: 66.3%;
+      height: 100%;
+
+      .body-left-title {
+        margin: 0 16px 0px 0;
+      }
+
+      .double-data-show-content {
+        display: flex;
+        align-items: center;
+        // border-bottom: 1px solid #e9e9e9;
+        // padding: 23px 0 24px 40px;
+        .el-col {
+          padding: 23px 0 24px 10px;
+        }
+
+        & > div {
+          display: flex;
+          align-items: center;
+        }
+
+        img {
+          width: 20px;
+          height: 20px;
+        }
+
+        .left-title-style {
+          display: flex;
+          align-items: center;
+          margin-left: 10px;
+          // border-right: 1px solid #e9e9e9;
+
+          .unit {
+            font-size: 22px;
+            color: #000000;
+            margin-top: 4px;
+          }
+        }
+      }
+
+      .left-line-style {
+        padding: 24px;
+        color: #000000;
+
+        .radio-list {
+          width: 122px;
+
+          .radio-list-content {
+            margin: 16px 12px 0 0;
+            background: #f3f7f7;
+            padding: 21px 9px;
+            border-radius: 2px;
+            overflow: auto;
+            height: 360px;
+          }
+        }
+
+        .right-line {
+          width: calc(100% - 122px);
+          position: relative;
+
+          .chart-left-unit {
+            position: absolute;
+            top: 16px;
+            left: 0;
+            color: #333;
+          }
+
+          .line-content {
+            margin: 12px 0 0 0;
+            height: 300px;
+          }
+        }
+      }
+
+      .left-bottom-type {
+        margin: 16px 16px 16px 0;
+
+        .card-list {
+          display: flex;
+          flex-wrap: wrap;
+          height: 100%;
+
+          .classify-energy {
+            border-left: 1px solid #e9e9e9;
+            flex: 1;
+            display: flex;
+            align-items: center;
+            padding: 0 0 0 24px;
+
+            &:first-child {
+              border-left: none;
+            }
+
+            .img-list {
+              display: flex;
+              align-items: center;
+              img {
+                width: 20px;
+                height: 20px;
+              }
+
+              .text-describe {
+                display: flex;
+                align-items: center;
+                margin-left: 18px;
+
+                .number {
+                  font-size: 24px;
+                  color: #000000;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+
+    .home-body-right {
+      width: 33.7%;
+      height: 100%;
+
+      .right-first-card-title {
+        margin: 0 0 16px 0;
+
+        .first-chat {
+          margin: 10px 0 0 0;
+          height: 340px;
+        }
+      }
+
+      .second-card-title {
+        // padding-top: 16px;
+
+        .second-chat {
+          margin: 10px 0 0 0;
+          height: 340px;
+        }
+
+        .bottom-description-list {
+          display: flex;
+          padding: 0 23px 16px 10px;
+          height: 106px;
+          align-items: center;
+
+          .total {
+            border-right: 1px solid #e9e9e9;
+            padding-left: 10px;
+            min-width: 180px;
+            max-width: 180px;
+
+            .energy-cost-sum {
+              font-size: 24px;
+              color: #000000;
+            }
+          }
+
+          .legend {
+            padding: 6px 0 0 20px;
+
+            .legend-list {
+              display: flex;
+              // width: 280px;
+              flex-wrap: wrap;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  .power-cost {
+    width: 8px;
+    height: 8px;
+    border-radius: 50%;
+    display: inline-block;
+    margin-right: 4px;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/indexInfo.vue b/energy_management_ui/src/views/indexInfo.vue
new file mode 100644
index 0000000..4fabfbd
--- /dev/null
+++ b/energy_management_ui/src/views/indexInfo.vue
@@ -0,0 +1,26 @@
+<template>
+  <div class="app-container":style="'height:'+ height">
+    <iframe :src="srcUrl" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
+  </div>
+</template>
+
+<script>
+    export default {
+      data() {
+        return {
+          srcUrl:"",
+          height: document.documentElement.clientHeight - 94.5 + "px;",
+          loading: false
+        }
+      },
+      created() {
+        this.srcUrl=this.$route.query.modelCode;
+      },
+      mounted: function() {
+        const that = this;
+        window.onresize = function temp() {
+          that.height = document.documentElement.clientHeight - 94.5 + "px;";
+        };
+      },
+    }
+</script>
diff --git a/energy_management_ui/src/views/index_bak.vue b/energy_management_ui/src/views/index_bak.vue
new file mode 100644
index 0000000..7c96b41
--- /dev/null
+++ b/energy_management_ui/src/views/index_bak.vue
@@ -0,0 +1,150 @@
+<template>
+  <div class="dashboard-editor-container">
+
+    <panel-group @handleSetLineChartData="handleSetLineChartData" />
+
+    <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+      <line-chart :chart-data="lineChartData" />
+    </el-row>
+
+    <el-row :gutter="32">
+      <el-col :xs="24" :sm="24" :lg="8">
+        <div class="chart-wrapper">
+          <raddar-chart />
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="8">
+        <div class="chart-wrapper">
+          <pie-chart />
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="8">
+        <div class="chart-wrapper">
+          <bar-chart />
+        </div>
+      </el-col>
+    </el-row>
+
+    <!--&lt;!&ndash;瀹炴椂&ndash;&gt;-->
+    <!--<div class="live">-->
+      <!--<div class="live_content">瀹炴椂鎶ヨ</div>-->
+      <!--<div class="live_number">35</div>-->
+    <!--</div>-->
+  </div>
+
+</template>
+
+<script>
+import PanelGroup from './dashboard/PanelGroup'
+import LineChart from './dashboard/LineChart'
+import RaddarChart from './dashboard/RaddarChart'
+import PieChart from './dashboard/PieChart'
+import BarChart from './dashboard/BarChart'
+
+const lineChartData = {
+  newVisitis: {
+    expectedData: [100, 120, 161, 134, 105, 160, 165],
+    actualData: [120, 82, 91, 154, 162, 140, 145]
+  },
+  messages: {
+    expectedData: [200, 192, 120, 144, 160, 130, 140],
+    actualData: [180, 160, 151, 106, 145, 150, 130]
+  },
+  purchases: {
+    expectedData: [80, 100, 121, 104, 105, 90, 100],
+    actualData: [120, 90, 100, 138, 142, 130, 130]
+  },
+  shoppings: {
+    expectedData: [130, 140, 141, 142, 145, 150, 160],
+    actualData: [120, 82, 91, 154, 162, 140, 130]
+  }
+}
+
+export default {
+  name: 'Index',
+  components: {
+    PanelGroup,
+    LineChart,
+    RaddarChart,
+    PieChart,
+    BarChart
+  },
+  data() {
+    return {
+      lineChartData: lineChartData.newVisitis
+    }
+  },
+  methods: {
+    handleSetLineChartData(type) {
+      this.lineChartData = lineChartData[type]
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width:1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+@keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/index_dev.vue b/energy_management_ui/src/views/index_dev.vue
new file mode 100644
index 0000000..949ae94
--- /dev/null
+++ b/energy_management_ui/src/views/index_dev.vue
@@ -0,0 +1,10 @@
+<template>
+  <div class="app-container" style="padding: 0;margin: 10px;">
+    <div
+      class="dashboard-editor-container"
+      style="width: auto;height: auto;max-width: 100%;max-height: 100%;display: block;"
+    >
+      <!-- <img src="@/assets/image/index.jpg" style="width: 100%;height: 100%"> -->
+    </div>
+  </div>
+</template>
diff --git a/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/BarChart.vue b/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/BarChart.vue
new file mode 100644
index 0000000..7198e0f
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            left: 10,
+            right: 10,
+            bottom: 20,
+            top: 40,
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/LineChart.vue b/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/index.vue b/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/index.vue
new file mode 100644
index 0000000..c433837
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/dailykeyEquipment/index.vue
@@ -0,0 +1,342 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="68px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="閲嶇偣璁惧">
+              <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨閲嶇偣璁惧" size="small" style="width: 100%">
+                <el-option
+                  v-for="dict in indexCategoryOptions"
+                  :key="dict.id"
+                  :label="dict.facilityName"
+                  :value="dict.id"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="缁熻鍖洪棿" prop="dataTime">
+              <el-date-picker clearable size="small" style="width: 100%"
+                              v-model="queryParams.dataTime"
+                              :type="dateTypes"
+                              :clearable="false"
+                              :value-format="valueFormat"
+                              placeholder="閫夋嫨鏃ユ湡">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container :bodyStyle="bodyStyle" style="margin-top: 16px">
+      <el-table :data="energyList" border style="width: 100%;" class="tableList">
+        <el-table-column fixed label="鏇茬嚎閫夋嫨">
+          <template slot-scope="scope">
+            <el-button icon="el-icon-search" circle @click="selectChange(scope.row)"
+                       style="font-size: 10px"></el-button>
+          </template>
+        </el-table-column>
+        <el-table-column fixed prop="indexName" align="center" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+        <el-table-column label="0鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value0) }}</template>
+        </el-table-column>
+        <el-table-column label="1鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value1) }}</template>
+        </el-table-column>
+        <el-table-column label="2鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value2) }}</template>
+        </el-table-column>
+        <el-table-column label="3鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value3) }}</template>
+        </el-table-column>
+        <el-table-column label="4鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value4) }}</template>
+        </el-table-column>
+        <el-table-column label="5鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value5) }}</template>
+        </el-table-column>
+        <el-table-column label="6鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value6) }}</template>
+        </el-table-column>
+        <el-table-column label="7鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value7) }}</template>
+        </el-table-column>
+        <el-table-column label="8鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value8) }}</template>
+        </el-table-column>
+        <el-table-column label="9鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value9) }}</template>
+        </el-table-column>
+        <el-table-column label="20鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value20) }}</template>
+        </el-table-column>
+        <el-table-column label="11鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value11) }}</template>
+        </el-table-column>
+        <el-table-column label="12鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value12) }}</template>
+        </el-table-column>
+        <el-table-column label="13鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value13) }}</template>
+        </el-table-column>
+        <el-table-column label="14鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value14) }}</template>
+        </el-table-column>
+        <el-table-column label="15鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value15) }}</template>
+        </el-table-column>
+        <el-table-column label="16鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value16) }}</template>
+        </el-table-column>
+        <el-table-column label="17鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value17) }}</template>
+        </el-table-column>
+        <el-table-column label="18鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value18) }}</template>
+        </el-table-column>
+        <el-table-column label="19鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value19) }}</template>
+        </el-table-column>
+        <el-table-column label="20鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value20) }}</template>
+        </el-table-column>
+        <el-table-column label="21鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value21) }}</template>
+        </el-table-column>
+        <el-table-column label="22鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value22) }}</template>
+        </el-table-column>
+        <el-table-column label="23鏃�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value23) }}</template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+      <el-row :gutter="32" style="margin:30px 0">
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <line-chart ref="LineChart" :chart-data="lineChartData"/>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <bar-chart ref="BarChart" :chart-data="lineChartData"/>
+          </div>
+        </el-col>
+      </el-row>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {getDataList, getlistChart, getPointFacility} from "@/api/keyEquipment/dailykeyEquipment/dailykeyEquipment";
+import LineChart from './LineChart'
+import BarChart from "./BarChart";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {
+    LineChart,
+    BarChart
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      energyList: [],
+      indexCategoryOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexId: undefined,
+        dataTime: undefined,
+        timeType: "HOUR",
+        indexType: undefined,
+        indexStorageId: undefined,
+      },
+      skinName: "",
+      dateTypes: 'date',
+      valueFormat: "yyyy-MM-dd",
+      lineChartData: {expectedData: [], actualData: []},
+    };
+  },
+  created() {
+    this.getList();
+    this.getTime();
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("processEnergy").then(response => {
+      this.skinName = response.msg;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 210+ 'px'
+    },
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      getDataList(this.queryParams).then(response => {
+        this.energyList = response.rows;
+        this.total = response.total;
+      })
+      getPointFacility().then(response => {
+        this.indexCategoryOptions = response.data;
+      });
+    },
+    selectChange(row) {
+      this.queryParams.indexId = row.indexId;
+      getlistChart(this.queryParams).then(response => {
+        let actualData = [];
+        let expectedData = [];
+        let title = "";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(item.timeCode.slice(item.timeCode.length - 2, item.timeCode.length) + "鏃�");
+          title = item.indexName + "(" + item.unitId + ")";
+        })
+        this.lineChartData.actualData = actualData;
+        this.lineChartData.expectedData = expectedData;
+        this.lineChartData.title = title
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      })
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.indexStorageId = '';
+      this.handleQuery();
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '';
+      if (!isNaN(value) && value !== '' && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '0'
+      }
+      return realVal
+    },
+    getTime() {
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month + '-' + date
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 0;
+}
+
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/BarChart.vue b/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/BarChart.vue
new file mode 100644
index 0000000..7198e0f
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            left: 10,
+            right: 10,
+            bottom: 20,
+            top: 40,
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/LineChart.vue b/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/index.vue b/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/index.vue
new file mode 100644
index 0000000..85345db
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/monthlykeyEquipment/index.vue
@@ -0,0 +1,404 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="68px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="閲嶇偣璁惧">
+              <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨閲嶇偣璁惧" size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in indexCategoryOptions"
+                    :key="dict.id"
+                    :label="dict.facilityName"
+                    :value="dict.id"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="缁熻鏃堕棿">
+              <el-date-picker clearable size="small" style="width: 100%"
+                              v-model="queryParams.dataTime"
+                              type="month"
+                              :clearable="false"
+                              value-format="yyyy-MM"
+                              placeholder="閫夋嫨鏃ユ湡">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+              <!--<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>-->
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷" >
+         <el-radio-group v-model="queryParams.timeType">
+           <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+         </el-radio-group>
+       </el-form-item>-->
+    </basic-container>
+    <basic-container :bodyStyle="bodyStyle" style="margin-top: 16px">
+      <div class="el-table el-table--fit el-table--scrollable-x el-table--enable-row-hover el-table--medium">
+        <div class="el-table__body-wrapper is-scrolling-left">
+          <table class="el-table__body tableList" cellspacing="0" cellpadding="0" style="width: 2600px">
+            <tr v-for="item in tableHead">
+              <td style="background: #D5D5D5;width: 80px">鏇茬嚎閫夋嫨</td>
+              <td style="background: #D5D5D5;width: 240px">鑳芥簮鎸囨爣鍚嶇О</td>
+              <td style="background: #D5D5D5;">{{ item.value1 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value2 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value3 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value4 }}</td>
+              <td style="background: #D5D5D5">{{ item.value5 }}</td>
+              <td style="background: #D5D5D5">{{ item.value6 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value7 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value8 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value9 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value10 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value11 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value12 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value13 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value14 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value15 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value16 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value17 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value18 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value19 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value20 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value21 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value22 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value23 }}</td>
+              <td style="background: #D5D5D5">{{ item.value24 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value25 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value26 }}</td>
+              <td style="background: #D5D5D5;">{{ item.value27 }}</td>
+              <td style="background: #D5D5D5;" v-if="item.value29 !=null">{{ item.value28 }}</td>
+              <td style="background: #D5D5D5;" v-if="item.value29 !=null">{{ item.value29 }}</td>
+              <td style="background: #D5D5D5;" v-if="item.value30 !=null">{{ item.value30 }}</td>
+              <td style="background: #D5D5D5;" v-if="item.value31 !=null">{{ item.value31 }}</td>
+            </tr>
+            <tr v-for="data in tableData">
+              <td style="width: 80px">
+                <el-button icon="el-icon-search" circle @click="selectChange(data.indexId)"
+                           style="font-size: 10px"></el-button>
+              </td>
+              <td style="width: 240px">{{ data.indexName }}</td>
+              <td>{{ numFilter(data.value1) }}</td>
+              <td>{{ numFilter(data.value2) }}</td>
+              <td>{{ numFilter(data.value3) }}</td>
+              <td>{{ numFilter(data.value4) }}</td>
+              <td>{{ numFilter(data.value5) }}</td>
+              <td>{{ numFilter(data.value6) }}</td>
+              <td>{{ numFilter(data.value7) }}</td>
+              <td>{{ numFilter(data.value8) }}</td>
+              <td>{{ numFilter(data.value9) }}</td>
+              <td>{{ numFilter(data.value10) }}</td>
+              <td>{{ numFilter(data.value11) }}</td>
+              <td>{{ numFilter(data.value12) }}</td>
+              <td>{{ numFilter(data.value13) }}</td>
+              <td>{{ numFilter(data.value14) }}</td>
+              <td>{{ numFilter(data.value15) }}</td>
+              <td>{{ numFilter(data.value16) }}</td>
+              <td>{{ numFilter(data.value17) }}</td>
+              <td>{{ numFilter(data.value18) }}</td>
+              <td>{{ numFilter(data.value19) }}</td>
+              <td>{{ numFilter(data.value20) }}</td>
+              <td>{{ numFilter(data.value21) }}</td>
+              <td>{{ numFilter(data.value22) }}</td>
+              <td>{{ numFilter(data.value23) }}</td>
+              <td>{{ numFilter(data.value24) }}</td>
+              <td>{{ numFilter(data.value25) }}</td>
+              <td>{{ numFilter(data.value26) }}</td>
+              <td>{{ numFilter(data.value27) }}</td>
+              <td v-if="data.count>=28">{{ numFilter(data.value28) }}</td>
+              <td v-if="data.count>=29">{{ numFilter(data.value29) }}</td>
+              <td v-if="data.count>=30">{{ numFilter(data.value30) }}</td>
+              <td v-if="data.count==31">{{ numFilter(data.value31) }}</td>
+            </tr>
+          </table>
+        </div>
+      </div>
+      <pagination
+          v-show="total>0"
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+      <el-row :gutter="32" style="margin:30px 0">
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <line-chart ref="LineChart" :chart-data="lineChartData"/>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <bar-chart ref="BarChart" :chart-data="lineChartData"/>
+          </div>
+        </el-col>
+      </el-row>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {getDataList, exportList, getlistChart} from "@/api/keyEquipment/monthlykeyEquipment/monthlykeyEquipment";
+import {getPointFacility} from "@/api/keyEquipment/dailykeyEquipment/dailykeyEquipment";
+import LineChart from './LineChart'
+import BarChart from "./BarChart";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {
+    LineChart,
+    BarChart
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange: [],
+      dateTypeOptions: [],
+      energyList: [],
+      tableData: [],
+      tableHead: [],
+      indexCategoryOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        dataTime: undefined,
+        timeType: "DAY",
+        indexType: undefined,
+        indexStorageId: undefined,
+      },
+      skinName: "",
+      lineChartData: {expectedData: [], actualData: []},
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      //this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName = response.msg;
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 210+ 'px'
+    },
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      getDataList(this.queryParams).then(response => {
+        this.tableData = response.data.tabledata;
+        this.tableHead = response.data.tablehead;
+        this.total = response.data.total
+      })
+      getPointFacility().then(response => {
+        this.indexCategoryOptions = response.data;
+      });
+    },
+    selectChange(data) {
+      this.queryParams.indexId = data;
+      getlistChart(this.queryParams).then(response => {
+        let actualData = [];
+        let expectedData = [];
+        let title = "";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(item.timeCode.slice(item.timeCode.length - 2, item.timeCode.length) + "鏃�");
+          title = item.indexName + "(" + item.unitId + ")";
+        })
+        this.lineChartData.actualData = actualData;
+        this.lineChartData.expectedData = expectedData;
+        this.lineChartData.title = title
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      })
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.indexStorageId = '';
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭缁煎悎鑳借��?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportList(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '';
+      if (!isNaN(value) && value !== '' && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '0'
+      }
+      return realVal
+    },
+    getTime() {
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month
+      /*let startTime = year + '-' + month + '-' + date
+      let endTime = year + '-' + month + '-' + (date + 1)
+      this.dateRange = [startTime, endTime]*/
+    },
+
+    handleTime(date) {
+      if (date == 'MONTH') {
+        this.dateTypes = 'year',
+            this.valueFormat = 'yyyy'
+      } else if (date == 'DAY') {
+        this.dateTypes = 'month',
+            this.valueFormat = 'yyyy-MM'
+      } else {
+        this.dateTypes = 'date',
+            this.valueFormat = 'yyyy-MM-dd'
+      }
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 0;
+}
+
+.tableList tr > td:first-child {
+  position: sticky;
+  left: 0;
+  z-index: 1;
+  background: #fff;
+}
+
+.tableList tr > td:nth-child(2) {
+  position: sticky;
+  left: 80px;
+  z-index: 1;
+  background: #fff;
+}
+
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+.el-table--enable-row-hover .el-table__body tr:hover > td {
+  background: #CFDCF5;
+}
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/BarChart.vue b/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/BarChart.vue
new file mode 100644
index 0000000..7198e0f
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            left: 10,
+            right: 10,
+            bottom: 20,
+            top: 40,
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/LineChart.vue b/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/index.vue b/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/index.vue
new file mode 100644
index 0000000..003cf0f
--- /dev/null
+++ b/energy_management_ui/src/views/keyEquipment/yearkeyEquipment/index.vue
@@ -0,0 +1,376 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="68px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="閲嶇偣璁惧">
+              <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨閲嶇偣璁惧" size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in indexCategoryOptions"
+                    :key="dict.id"
+                    :label="dict.facilityName"
+                    :value="dict.id"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="缁熻鏃堕棿">
+              <el-date-picker clearable size="small" style="width: 100%"
+                              v-model="queryParams.dataTime"
+                              type="year"
+                              :clearable="false"
+                              value-format="yyyy"
+                              placeholder="閫夋嫨鏃ユ湡">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+              <!--<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>-->
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container :bodyStyle="bodyStyle" style="margin-top: 16px">
+      <el-table :data="energyList" border style="width: 100%;" class="tableList">
+        <el-table-column fixed label="鏇茬嚎閫夋嫨">
+          <template slot-scope="scope">
+            <el-button icon="el-icon-search" circle @click="selectChange(scope.row)"
+                       style="font-size: 10px"></el-button>
+          </template>
+        </el-table-column>
+        <el-table-column fixed prop="indexName" align="center" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+        <el-table-column label="1鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value1) }}</template>
+        </el-table-column>
+        <el-table-column label="2鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value2) }}</template>
+        </el-table-column>
+        <el-table-column label="3鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value3) }}</template>
+        </el-table-column>
+        <el-table-column label="4鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value4) }}</template>
+        </el-table-column>
+        <el-table-column label="5鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value5) }}</template>
+        </el-table-column>
+        <el-table-column label="6鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value6) }}</template>
+        </el-table-column>
+        <el-table-column label="7鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value7) }}</template>
+        </el-table-column>
+        <el-table-column label="8鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value8) }}</template>
+        </el-table-column>
+        <el-table-column label="9鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value9) }}</template>
+        </el-table-column>
+        <el-table-column label="10鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value10) }}</template>
+        </el-table-column>
+        <el-table-column label="11鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value11) }}</template>
+        </el-table-column>
+        <el-table-column label="12鏈�" align="center" min-width="140px">
+          <template slot-scope="scope">{{ numFilter(scope.row.value12) }}</template>
+        </el-table-column>
+      </el-table>
+      <el-row :gutter="32" style="margin:30px 0">
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <line-chart ref="LineChart" :chart-data="lineChartData"/>
+          </div>
+        </el-col>
+        <el-col :xs="24" :sm="24" :lg="12">
+          <div class="chart-wrapper">
+            <bar-chart ref="BarChart" :chart-data="lineChartData"/>
+          </div>
+        </el-col>
+      </el-row>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {getDataList, exportList, getlistChart} from "@/api/keyEquipment/yearkeyEquipment/yearkeyEquipment";
+import {getPointFacility} from "@/api/keyEquipment/dailykeyEquipment/dailykeyEquipment";
+import LineChart from './LineChart'
+import BarChart from "./BarChart";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {
+    LineChart,
+    BarChart
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange: [],
+      dateTypeOptions: [],
+      energyList: [],
+      tableData: [],
+      tableHead: [],
+      indexCategoryOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        dataTime: undefined,
+        timeType: "MONTH",
+        indexType: undefined,
+        indexStorageId: undefined,
+      },
+      skinName: "",
+      lineChartData: {expectedData: [], actualData: []},
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      //this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName = response.msg;
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 210+ 'px'
+    },
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      if (this.queryParams.dataTime == undefined) {
+        this.queryParams.dataTime = year + '-' + month
+      }
+      let times = this.queryParams.dataTime.slice(0, 4);
+      this.queryParams.beginTime = times + "-01-01 00:00:00"
+      this.queryParams.endTime = times + "-12-31 00:00:00"
+      getDataList(this.queryParams).then(response => {
+        this.energyList = response.rows;
+      })
+      getPointFacility().then(response => {
+        this.indexCategoryOptions = response.data;
+      });
+    },
+    selectChange(row) {
+      this.queryParams.indexId = row.indexId;
+      getlistChart(this.queryParams).then(response => {
+        let actualData = [];
+        let expectedData = [];
+        let title = "";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(item.timeCode.slice(item.timeCode.length - 2, item.timeCode.length) + "鏈�");
+          title = item.indexName + "(" + item.unitId + ")";
+        })
+        this.lineChartData.actualData = actualData;
+        this.lineChartData.expectedData = expectedData;
+        this.lineChartData.title = title
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      })
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.indexStorageId = '';
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭缁煎悎鑳借��?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportList(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    getSummaries(param) {
+      const {columns, data} = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '';
+          return;
+        }
+        if (index === 1) {
+          sums[index] = '鍚堣';
+          return;
+        }
+        const values = data.map(item => Number(item[column.property]));
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          //sums[index];
+          sums[index] = this.numFilter(sums[index])
+        } else {
+          sums[index] = '0';
+        }
+      });
+      return sums;
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '';
+      if (!isNaN(value) && value !== '' && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '0'
+      }
+      return realVal
+    },
+    getTime() {
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime = year + '-' + month
+    },
+
+    handleTime(date) {
+      if (date == 'MONTH') {
+        this.dateTypes = 'year',
+            this.valueFormat = 'yyyy'
+      } else if (date == 'DAY') {
+        this.dateTypes = 'month',
+            this.valueFormat = 'yyyy-MM'
+      } else {
+        this.dateTypes = 'date',
+            this.valueFormat = 'yyyy-MM-dd'
+      }
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-form-item {
+  margin-bottom: 0;
+}
+
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1.0;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1.0;
+  }
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/login.vue b/energy_management_ui/src/views/login.vue
new file mode 100644
index 0000000..ce36cab
--- /dev/null
+++ b/energy_management_ui/src/views/login.vue
@@ -0,0 +1,228 @@
+<template>
+  <div class="logo-page">
+    <div class="logo-png">
+      <img
+        style="width: 208px;margin-right: 30px "
+        :src="'https://www.toray.cn/shared/images/toray_logo_ch.svg'"
+        alt=""
+      />
+      <div>涓滀附鍖荤枟鑳芥簮绠$悊骞冲彴</div>
+    </div>
+    <div class="login">
+      <div class="demo-image">
+        <el-image style="width: 75%;" :src="logo"></el-image>
+      </div>
+      <div class="login-form">
+        <el-form ref="loginForm" :model="loginForm" :rules="loginRules">
+          <div class="title">鐢ㄦ埛鐧诲綍</div>
+          <el-form-item prop="username" style="margin-bottom: 21px">
+            <el-input
+              v-model="loginForm.username"
+              type="text"
+              auto-complete="off"
+              placeholder="鐢ㄦ埛鍚�"
+            >
+            </el-input>
+          </el-form-item>
+          <el-form-item prop="password" style="margin-bottom: 21px">
+            <el-input
+              v-model="loginForm.password"
+              type="password"
+              auto-complete="off"
+              placeholder="瀵嗙爜"
+              @keyup.enter.native="handleLogin"
+            >
+            </el-input>
+          </el-form-item>
+          <el-form-item prop="code" style="margin-bottom: 21px">
+            <el-input
+              v-model="loginForm.code"
+              auto-complete="off"
+              placeholder="楠岃瘉鐮�"
+              style="width: 100%"
+              @keyup.enter.native="handleLogin"
+            >
+              <img
+                :src="codeUrl"
+                @click="getCode"
+                slot="suffix"
+                style="height: 31px;  padding: 6px 0 0 0;"
+              />
+            </el-input>
+          </el-form-item>
+          <el-checkbox v-model="loginForm.rememberMe" style="margin:0 0 25px 0;"
+            >璁颁綇瀵嗙爜
+          </el-checkbox>
+          <el-form-item style="width:100%;">
+            <el-button
+              :loading="loading"
+              size="medium"
+              type="primary"
+              style="width:100%;"
+              @click.native.prevent="handleLogin"
+            >
+              <span v-if="!loading">鐧� 褰�</span>
+              <span v-else>鐧� 褰� 涓�...</span>
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getCodeImg } from "@/api/login";
+import Cookies from "js-cookie";
+import { decrypt, encrypt } from "@/utils/jsencrypt";
+import logoImg from "@/assets/logo/logo-page-left.png";
+
+export default {
+  data() {
+    return {
+      codeUrl: "",
+      cookiePassword: "",
+      loginForm: {
+        username: "",
+        password: "",
+        rememberMe: false,
+        code: "",
+        uuid: ""
+      },
+      loginRules: {
+        username: [
+          { required: true, trigger: "blur", message: "鐢ㄦ埛鍚嶄笉鑳戒负绌�" }
+        ],
+        password: [
+          { required: true, trigger: "blur", message: "瀵嗙爜涓嶈兘涓虹┖" }
+        ],
+        code: [{ required: true, trigger: "change", message: "楠岃瘉鐮佷笉鑳戒负绌�" }]
+      },
+      loading: false,
+      redirect: undefined,
+      logo: logoImg
+    };
+  },
+  watch: {
+    $route: {
+      handler: function(route) {
+        this.redirect = route.query && route.query.redirect;
+      },
+      immediate: true
+    }
+  },
+  created() {
+    this.getCode();
+    this.getCookie();
+  },
+  methods: {
+    getCode() {
+      getCodeImg().then(res => {
+        this.codeUrl = "data:image/gif;base64," + res.img;
+        this.loginForm.uuid = res.uuid;
+      });
+    },
+    getCookie() {
+      const username = Cookies.get("username");
+      const password = Cookies.get("password");
+      const rememberMe = Cookies.get("rememberMe");
+      this.loginForm = {
+        username: username === undefined ? this.loginForm.username : username,
+        password:
+          password === undefined ? this.loginForm.password : decrypt(password),
+        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
+      };
+    },
+    handleLogin() {
+      this.$refs.loginForm.validate(valid => {
+        if (valid) {
+          this.loading = true;
+          if (this.loginForm.rememberMe) {
+            Cookies.set("username", this.loginForm.username, { expires: 30 });
+            Cookies.set("password", encrypt(this.loginForm.password), {
+              expires: 30
+            });
+            Cookies.set("rememberMe", this.loginForm.rememberMe, {
+              expires: 30
+            });
+          } else {
+            Cookies.remove("username");
+            Cookies.remove("password");
+            Cookies.remove("rememberMe");
+          }
+          this.$store
+            .dispatch("Login", this.loginForm)
+            .then(() => {
+              this.loading = false;
+              this.$router.push({ path: this.redirect || "/" });
+            })
+            .catch(() => {
+              this.loading = false;
+              this.getCode();
+            });
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style rel="stylesheet/scss" lang="scss" scoped>
+.logo-page {
+  height: 100%;
+  background-image: url("../assets/image/login-background.png");
+  background-size: cover;
+  overflow: hidden;
+
+  .logo-png {
+    font-size: 24px;
+    display: flex;
+    align-items: center;
+    font-weight: bold;
+    color: #333;
+    padding: 3.4% 0 0 74px;
+  }
+
+  .login {
+    display: flex;
+    justify-content: space-between;
+    padding: 0 17.24%;
+    height: calc(100% - 73px * 2);
+    align-items: center;
+  }
+
+  .title {
+    font-size: 22px;
+    color: #38bcbf;
+    margin-bottom: 22px;
+    font-weight: 600;
+  }
+
+  .login-form {
+    border-radius: 10px;
+    background: #ffffff;
+    width: 32%;
+    padding: 25px 25px 5px 25px;
+
+    .el-input {
+      height: 38px;
+
+      input {
+        height: 38px;
+      }
+    }
+
+    .input-icon {
+      height: 39px;
+      width: 14px;
+      margin-left: 2px;
+    }
+  }
+
+  .login-tip {
+    font-size: 13px;
+    text-align: center;
+    color: #bfbfbf;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/login/auth-redirect.vue b/energy_management_ui/src/views/login/auth-redirect.vue
new file mode 100644
index 0000000..7df8934
--- /dev/null
+++ b/energy_management_ui/src/views/login/auth-redirect.vue
@@ -0,0 +1,15 @@
+<script>
+export default {
+  name: 'AuthRedirect',
+  created() {
+    const hash = window.location.search.slice(1)
+    if (window.localStorage) {
+      window.localStorage.setItem('x-admin-oauth-code', hash)
+      window.close()
+    }
+  },
+  render: function(h) {
+    return h() // avoid warning message
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/login/components/SocialSignin.vue b/energy_management_ui/src/views/login/components/SocialSignin.vue
new file mode 100644
index 0000000..e9bf4f2
--- /dev/null
+++ b/energy_management_ui/src/views/login/components/SocialSignin.vue
@@ -0,0 +1,72 @@
+<template>
+  <div class="social-signup-container">
+    <div class="sign-btn" @click="wechatHandleClick('wechat')">
+      <span class="wx-svg-container"><svg-icon icon-class="wechat" class="icon" /></span>
+      WeChat
+    </div>
+    <div class="sign-btn" @click="tencentHandleClick('tencent')">
+      <span class="qq-svg-container"><svg-icon icon-class="qq" class="icon" /></span>
+      QQ
+    </div>
+  </div>
+</template>
+
+<script>
+// import openWindow from '@/utils/open-window'
+
+export default {
+  name: 'SocialSignin',
+  methods: {
+    wechatHandleClick(thirdpart) {
+      alert('ok')
+      // this.$store.commit('SET_AUTH_TYPE', thirdpart)
+      // const appid = 'xxxxx'
+      // const redirect_uri = encodeURIComponent('xxx/redirect?redirect=' + window.location.origin + '/auth-redirect')
+      // const url = 'https://open.weixin.qq.com/connect/qrconnect?appid=' + appid + '&redirect_uri=' + redirect_uri + '&response_type=code&scope=snsapi_login#wechat_redirect'
+      // openWindow(url, thirdpart, 540, 540)
+    },
+    tencentHandleClick(thirdpart) {
+      alert('ok')
+      // this.$store.commit('SET_AUTH_TYPE', thirdpart)
+      // const client_id = 'xxxxx'
+      // const redirect_uri = encodeURIComponent('xxx/redirect?redirect=' + window.location.origin + '/auth-redirect')
+      // const url = 'https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=' + client_id + '&redirect_uri=' + redirect_uri
+      // openWindow(url, thirdpart, 540, 540)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .social-signup-container {
+    margin: 20px 0;
+    .sign-btn {
+      display: inline-block;
+      cursor: pointer;
+    }
+    .icon {
+      color: #fff;
+      font-size: 24px;
+      margin-top: 8px;
+    }
+    .wx-svg-container,
+    .qq-svg-container {
+      display: inline-block;
+      width: 40px;
+      height: 40px;
+      line-height: 40px;
+      text-align: center;
+      padding-top: 1px;
+      border-radius: 4px;
+      margin-bottom: 20px;
+      margin-right: 5px;
+    }
+    .wx-svg-container {
+      background-color: #24da70;
+    }
+    .qq-svg-container {
+      background-color: #6BA2D6;
+      margin-left: 50px;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/meter/implement/importFileTable.vue b/energy_management_ui/src/views/meter/implement/importFileTable.vue
new file mode 100644
index 0000000..8a00c5f
--- /dev/null
+++ b/energy_management_ui/src/views/meter/implement/importFileTable.vue
@@ -0,0 +1,205 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?implementId=' + queryParams.implementId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+      <el-button slot="trigger" size="small" type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitFileForm">涓婁紶鍒版湇鍔″櫒</el-button>
+      <div class="el-upload__tip" style="color:red" slot="tip">娉ㄦ剰鎺у埗鏂囦欢澶у皬锛屼笉瑕佽秴杩�50M</div>
+    </el-upload>
+
+    <el-row>
+      <el-table v-loading="loading" :data="annexList" >
+        <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName"  />
+        <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"  />
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="seeImpFile(scope.row)"
+              v-hasPermi="['meter:annex:assignDownload']"
+            >鏌ョ湅</el-button>
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['meter:annex:remove']"
+            >鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listAnnex,delAnnex } from "@/api/meter/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/meter/annex/fileImport"
+      },
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(impid,code) {
+      this.reset();
+      this.queryParams.implementId = impid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 闄勪欢';
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+       this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delAnnex(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/meter/implement/importIndexTable.vue b/energy_management_ui/src/views/meter/implement/importIndexTable.vue
new file mode 100644
index 0000000..40837f1
--- /dev/null
+++ b/energy_management_ui/src/views/meter/implement/importIndexTable.vue
@@ -0,0 +1,168 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" :append-to-body="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item>
+        <el-button icon="el-icon-refresh" size="mini" @click="createIndex">鐢熸垚鎸囨爣</el-button>
+      </el-form-item>
+    </el-form>
+
+
+    <el-row>
+      <el-table v-loading="loading" :data="impIndexList" stripe max-height="350">
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"  />
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"  />
+        <el-table-column label="鎸囨爣绫诲瀷" align="center" prop="indexType" :formatter="indexTypeFormat" />
+        <el-table-column label="鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat" />
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['meter:annex:remove']"
+            >鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+<!--      <pagination-->
+<!--        v-show="total>0"-->
+<!--        :total="total"-->
+<!--        :page.sync="queryParams.pageNum"-->
+<!--        :limit.sync="queryParams.pageSize"-->
+<!--        @pagination="getList"-->
+<!--      />-->
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listIndex,addIndex,delIndex } from "@/api/meter/index";
+let meterid="";
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      qjcode:"",
+      // 璁¢噺鍣ㄥ叿妗f  鎸囨爣  琛ㄦ牸鏁版嵁
+      impIndexList: [],
+      // 璁¢噺鍣ㄥ叿妗f  鎸囨爣鐨� 鍗曚綅闆嗗悎
+      unitIdList: [],
+      // 璁¢噺鍣ㄥ叿妗f 鎸囨爣鐨� 绯荤粺鎸囨爣绫诲瀷
+      indexTypeList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      },
+    };
+  },
+  created() {
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdList = response.data;
+    });
+    this.getDicts("sys_index_type").then(response => {
+      this.indexTypeList = response.data;
+    });
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(impid,code) {
+      this.reset();
+      this.qjcode = code;
+      this.queryParams.implementId = impid;
+      this.meterid = impid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 鎸囨爣';
+      this.open = true;
+    },
+    // 鎸囨爣绫诲瀷瀛楀吀缈昏瘧
+    indexTypeFormat(row, column) {
+      return this.selectDictLabel(this.indexTypeList, row.indexType);
+    },
+    // 鍗曚綅 瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdList, row.unitId);
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ 璁¢噺鍣ㄥ叿鐨勬寚鏍�
+    getList() {
+      listIndex(this.queryParams.implementId).then(response => {
+        this.impIndexList = response.data;
+        this.loading = false;
+      });
+    },
+    // 鐢熸垚璁¢噺鍣ㄥ叿鎸囨爣
+    createIndex() {
+      let aa = this.meterid;
+      console.log("aa==="+aa);
+      this.$confirm('鏄惁纭閲嶆柊鐢熸垚鍣ㄥ叿缂栫爜涓�"' + this.qjcode + '"鐨勬寚鏍囧悧?閲嶆柊鐢熸垚鍚庢墍鏈夋寚鏍囦細杩樺師鍒版ā鏉跨姸鎬�', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+          return addIndex(aa);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鎸囨爣鐢熸垚鎴愬姛");
+      }).catch(function() {});
+    },
+    /** 鍏抽棴鎸夐挳鎿嶄綔 */
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎鎸囨爣缂栫爜涓�"' + row.code + '"鐨勬寚鏍囧悧?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delIndex(row.indexId);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鎸囨爣鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/meter/implement/index.vue b/energy_management_ui/src/views/meter/implement/index.vue
new file mode 100644
index 0000000..b53624f
--- /dev/null
+++ b/energy_management_ui/src/views/meter/implement/index.vue
@@ -0,0 +1,727 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="缂栫爜" prop="code">
+              <el-input
+                  v-model="queryParams.code"
+                  placeholder="璇疯緭鍏ョ紪鐮�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍣ㄥ叿鍚嶇О" prop="meterName">
+              <el-input
+                  v-model="queryParams.meterName"
+                  placeholder="璇疯緭鍏ュ櫒鍏峰悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="绉嶇被" prop="meterType">
+              <el-select v-model="queryParams.meterType" placeholder="璇烽�夋嫨绉嶇被" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in meterTypeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="娴嬮噺鑼冨洿" prop="measureRange">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.measureRange"-->
+<!--                  placeholder="璇疯緭鍏ユ祴閲忚寖鍥�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鐢熶骇鍘傚晢" prop="manufacturer">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.manufacturer"-->
+<!--                  placeholder="璇疯緭鍏ョ敓浜у巶鍟�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="瀹夎浣嶇疆" prop="installactionLocation">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.installactionLocation"-->
+<!--                  placeholder="璇疯緭鍏ュ畨瑁呬綅缃�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['meter:implement:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['meter:implement:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['meter:implement:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['meter:implement:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="info"
+              icon="el-icon-upload2"
+              size="mini"
+              @click="handleImport"
+              v-hasPermi="['meter:implement:import']"
+          >瀵煎叆
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table v-loading="loading" :data="implementList" :height="height" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="缂栫爜" align="center" prop="code" show-overflow-tooltip/>
+        <el-table-column label="鍣ㄥ叿鍚嶇О" align="center" prop="meterName" show-overflow-tooltip/>
+        <el-table-column label="绉嶇被" align="center" prop="meterType" :formatter="meterTypeFormat" show-overflow-tooltip/>
+        <el-table-column label="瑙勬牸鍨嬪彿" align="center" prop="modelNumber" show-overflow-tooltip/>
+        <el-table-column label="娴嬮噺鑼冨洿" align="center" prop="measureRange" show-overflow-tooltip/>
+        <el-table-column label="鐢熶骇鍘傚晢" align="center" prop="manufacturer" show-overflow-tooltip/>
+        <el-table-column label="瀹夎浣嶇疆" align="center" prop="installactionLocation" show-overflow-tooltip/>
+        <el-table-column label="鐘舵��" align="center" prop="meterStatus" :formatter="meterStatusFormat" show-overflow-tooltip/>
+        <el-table-column label="鎿嶄綔" align="center" width="240" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportFileTable(scope.row)"
+                v-hasPermi="['tool:gen:import']"
+            >闄勪欢
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportIndexTable(scope.row)"
+                v-hasPermi="['']"
+            >鎸囨爣
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['meter:implement:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['meter:implement:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀硅閲忓櫒鍏锋。妗堢淮鎶ゅ璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="820px" class="dialog-form-row">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="缂栫爜" prop="code" label-width="110px">
+              <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鍣ㄥ叿鍚嶇О" prop="meterName" label-width="80px">
+              <el-input v-model="form.meterName" placeholder="璇疯緭鍏ュ櫒鍏峰悕绉�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="绉嶇被" prop="meterType">
+              <el-select v-model="form.meterType" placeholder="璇烽�夋嫨绉嶇被">
+                <el-option
+                    v-for="dict in meterTypeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="瑙勬牸鍨嬪彿" prop="modelNumber" label-width="110px">
+              <el-input v-model="form.modelNumber" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="娴嬮噺鑼冨洿" prop="measureRange">
+              <el-input v-model="form.measureRange" placeholder="璇疯緭鍏ユ祴閲忚寖鍥�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鐢熶骇鍘傚晢" prop="manufacturer">
+              <el-input v-model="form.manufacturer" placeholder="璇疯緭鍏ョ敓浜у巶鍟�"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="璐熻矗浜�" prop="personCharge" label-width="110px">
+              <el-input v-model="form.personCharge" placeholder="璇疯緭鍏ヨ礋璐d汉"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="瀹夎浣嶇疆" prop="installactionLocation">
+              <el-input v-model="form.installactionLocation" placeholder="璇疯緭鍏ュ畨瑁呬綅缃�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="璧峰鏃堕棿" prop="startTime">
+              <el-date-picker clearable size="small" style="width: 100%"
+                              v-model="form.startTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="閫夋嫨璧峰鏃堕棿">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="妫�瀹氬懆鏈�(澶�)" prop="checkCycle" label-width="110px">
+              <el-input v-model="form.checkCycle" placeholder="璇疯緭鍏ユ瀹氬懆鏈�"
+                        oninput="if(value.length>4)value=value.slice(0,4)"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鐘舵��" prop="meterStatus">
+              <el-select v-model="form.meterStatus" placeholder="璇烽�夋嫨鐘舵��">
+                <el-option
+                    v-for="dict in meterStatusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎶曡繍鏃堕棿" prop="putrunTime">
+              <el-date-picker clearable size="small" style="width: 100%"
+                              v-model="form.putrunTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="閫夋嫨鎶曡繍鏃堕棿">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="鎻愰啋鍛ㄦ湡(澶�)" prop="reminderCycle" label-width="110px">
+              <el-input v-model="form.reminderCycle" placeholder="璇疯緭鍏ユ彁閱掑懆鏈�"
+                        oninput="if(value.length>4)value=value.slice(0,4)"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞" prop="remark" label-width="110px">
+              <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 璁¢噺鍣ㄥ叿妗f 瀵煎叆瀵硅瘽妗� -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" :destroy-on-close="true" width="400px">
+      <el-upload
+          ref="upload"
+          :limit="1"
+          :accept="upload.accept"
+          :headers="upload.headers"
+          :action="upload.url"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+          <em>鐐瑰嚮涓婁紶</em>
+        </div>
+        <div class="el-upload__tip" slot="tip">
+          <el-link type="info" style="font-size:12px;color:blue;" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+        </div>
+        <div class="el-upload__tip" style="color:red" slot="tip">
+          瀵煎叆鎻愮ず锛�<br>1銆佹柊澧炲鍏�,浠呭厑璁稿鍏モ�渪ls鈥濇垨鈥渪lsx鈥濇牸寮忔枃浠讹紒
+          <br>2銆佺紪鐮佸繀椤诲敮涓�,閲嶅鏁版嵁鏃犳硶瀵煎叆
+          <br>3銆佺绫诲拰鐘舵�佸~鍐欓敊璇殑鏁版嵁鏃犳硶瀵煎叆
+          <br>4銆佹瀹氬懆鏈熴�佹彁閱掑懆鏈熷ぇ浜�0姝f暣鏁�,濉啓閿欒鍒欓粯璁や负1
+          <br>5銆佽捣濮嬫椂闂村~鍐欓敊璇垨涓嶅~鍒欓粯璁や负绌�
+        </div>
+
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+        <el-button @click="upload.open = false">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <importFileTable ref="importFile" @ok="handleFjQuery"/>
+
+    <importIndexTable ref="importIndex" @ok="handleFjQuery"/>
+
+  </div>
+</template>
+
+<script>
+import {
+  listImplement,
+  getImplement,
+  delImplement,
+  addImplement,
+  updateImplement,
+  exportImplement,
+  importTemplate
+} from "@/api/meter/implement";
+import {getToken} from "@/utils/auth";
+import importFileTable from "./importFileTable";
+import importIndexTable from "./importIndexTable";
+import mixins from "@/layout/mixin/getHeight";
+
+const mystatus = "0";
+const myType = "0";
+export default {
+  name: "implement",
+  components: {importFileTable, importIndexTable},
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 閫変腑鏁扮粍
+      codes: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f缁存姢琛ㄦ牸鏁版嵁
+      implementList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 缂栫爜瀛楀吀
+      codeOptions: [],
+      // 鍣ㄥ叿鍚嶇О瀛楀吀
+      meterNameOptions: [],
+      // 绉嶇被瀛楀吀
+      meterTypeOptions: [],
+      // 瑙勬牸鍨嬪彿瀛楀吀
+      modelNumberOptions: [],
+      // 娴嬮噺鑼冨洿瀛楀吀
+      measureRangeOptions: [],
+      // 鐢熶骇鍘傚晢瀛楀吀
+      manufacturerOptions: [],
+      // 璐熻矗浜哄瓧鍏�
+      personChargeOptions: [],
+      // 瀹夎浣嶇疆瀛楀吀
+      installactionLocationOptions: [],
+      // 璧峰鏃堕棿瀛楀吀
+      startTimeOptions: [],
+      // 妫�瀹氬懆鏈熷瓧鍏�
+      checkCycleOptions: [],
+      // 鎻愰啋鍛ㄦ湡瀛楀吀
+      reminderCycleOptions: [],
+      // 鐘舵�佸瓧鍏�
+      meterStatusOptions: [],
+      // 閫昏緫鍒犻櫎鏍囧織,Y宸插垹闄�,N鏈垹闄ゅ瓧鍏�
+      delFlageOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 寤虹珛浜哄瓧鍏�
+      createByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      // 鐢ㄦ埛瀵煎叆鍙傛暟
+      height: null,
+      upload: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        //涓婁紶鏂囦欢绫诲瀷鎺у埗
+        accept: undefined,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: undefined,
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勮閲忓櫒鍏锋。妗�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: {Authorization: "Bearer " + getToken()},
+        // 涓婁紶鐨勫湴鍧�
+        url: ""
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        meterName: undefined,
+        meterType: undefined,
+        measureRange: undefined,
+        manufacturer: undefined,
+        installactionLocation: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        code: [
+          {required: true, message: "缂栫爜涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        meterName: [
+          {required: true, message: "鍣ㄥ叿鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        // meterType: [
+        //   { required: true, message: "绉嶇被涓嶈兘涓虹┖", trigger: "blur" }
+        // ],
+        installactionLocation: [
+          {required: true, message: "瀹夎浣嶇疆涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        // meterStatus: [
+        //   { required: true, message: "鐘舵�佷笉鑳戒负绌�", trigger: "blur" }
+        // ],
+        startTime: [
+          {required: true, message: "璧峰鏃堕棿涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        putrunTime: [
+          {required: true, message: "鎶曡繍鏃堕棿涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        checkCycle: [
+          {required: true, pattern: /^\+?[1-9]\d*$/, message: "妫�瀹氬懆鏈熷繀椤绘槸澶т簬0鐨勬鏁存暟", trigger: "blur"}
+        ],
+        reminderCycle: [
+          {required: true, pattern: /^\+?[1-9]\d*$/, message: "鎻愰啋鍛ㄦ湡蹇呴』鏄ぇ浜�0鐨勬鏁存暟", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_device_type").then(response => {
+
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.myType = response.data[i].dictValue;
+        }
+      }
+      this.meterTypeOptions = response.data;
+    });
+    this.getDicts("meter_status").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.mystatus = response.data[i].dictValue;
+
+        }
+      }
+      this.meterStatusOptions = response.data;
+    });
+    this.tttt();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ璁¢噺鍣ㄥ叿妗f缁存姢鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listImplement(this.queryParams).then(response => {
+        this.implementList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 绉嶇被瀛楀吀缈昏瘧
+    meterTypeFormat(row, column) {
+      return this.selectDictLabel(this.meterTypeOptions, row.meterType);
+    },
+    // 鐘舵�佸瓧鍏哥炕璇�
+    meterStatusFormat(row, column) {
+      return this.selectDictLabel(this.meterStatusOptions, row.meterStatus);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        meterName: undefined,
+        meterType: undefined,
+        modelNumber: undefined,
+        measureRange: undefined,
+        manufacturer: undefined,
+        personCharge: undefined,
+        installactionLocation: undefined,
+        startTime: undefined,
+        checkCycle: undefined,
+        reminderCycle: undefined,
+        meterStatus: undefined,
+        delFlage: undefined,
+        remark: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.codes = selection.map(item => item.code)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞璁¢噺鍣ㄥ叿妗f缁存姢";
+      this.form.meterType = this.myType;
+      this.form.meterStatus = this.mystatus;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getImplement(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼璁¢噺鍣ㄥ叿妗f缁存姢";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateImplement(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addImplement(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const codes = row.code || this.codes;
+      this.$confirm('鏄惁纭鍒犻櫎璁¢噺鍣ㄥ叿妗f缁存姢缂栧彿涓�"' + codes + '"鐨勮閲忓櫒鍏锋。妗�?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delImplement(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎閲忓櫒鍏锋。妗堢淮鎶ゆ暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportImplement(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      //this.$refs.upload.clearFiles();
+      this.upload.title = "璁¢噺鍣ㄥ叿妗f瀵煎叆";
+      this.upload.accept = ".xlsx, .xls";
+      this.upload.url = process.env.VUE_APP_BASE_API + "/meter/implement/importData?updateSupport=0";
+      this.upload.open = true;
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      importTemplate().then(response => {
+        this.download(response.msg);
+      });
+    },
+    // 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "瀵煎叆缁撴灉", {dangerouslyUseHTMLString: true});
+      this.getList();
+    },
+    // 鎻愪氦涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportFileTable(row) {
+      let impid = row.id;
+      let impcode = row.code;
+      this.$refs.importFile.show(impid, impcode);
+    },
+    /** 闄勪欢鎼滅储鎸夐挳鎿嶄綔 */
+    handleFjQuery() {
+      // this.queryParams.pageNum = 1;
+      // this.getList();
+    },
+    /** 鎵撳紑鎸囨爣琛ㄥ脊绐� */
+    openImportIndexTable(row) {
+      let impid = row.id;
+      let impcode = row.code;
+      this.$refs.importIndex.show(impid, impcode);
+    },
+    tttt() {
+      console.log("meterTypeOptions==" + this.meterTypeOptions.length);
+      console.log("meterStatusOptions==" + this.meterTypeOptions.length);
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+
+.dialog-form-row {
+  .el-row {
+    margin-bottom: 0;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/meter/implementCount/importFileTable.vue b/energy_management_ui/src/views/meter/implementCount/importFileTable.vue
new file mode 100644
index 0000000..71e3a74
--- /dev/null
+++ b/energy_management_ui/src/views/meter/implementCount/importFileTable.vue
@@ -0,0 +1,195 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?implementId=' + queryParams.implementId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+    </el-upload>
+
+    <el-row>
+      <el-table v-loading="loading" :data="annexList" >
+        <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName"  />
+        <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"  />
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="seeImpFile(scope.row)"
+              v-hasPermi="['meter:annex:assignDownload']"
+            >鏌ョ湅</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listAnnex,delAnnex } from "@/api/meter/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/meter/annex/fileImport"
+      },
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(impid,code) {
+      this.reset();
+      this.queryParams.implementId = impid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 闄勪欢';
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+       this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delAnnex(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/meter/implementCount/importIndexTable.vue b/energy_management_ui/src/views/meter/implementCount/importIndexTable.vue
new file mode 100644
index 0000000..ccd2d9e
--- /dev/null
+++ b/energy_management_ui/src/views/meter/implementCount/importIndexTable.vue
@@ -0,0 +1,168 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" :append-to-body="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item>
+       <!-- <el-button icon="el-icon-refresh" size="mini" @click="createIndex">鐢熸垚鎸囨爣</el-button>-->
+      </el-form-item>
+    </el-form>
+
+
+    <el-row>
+      <el-table v-loading="loading" :data="impIndexList" stripe max-height="350">
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="code"  />
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="name"  />
+        <el-table-column label="鎸囨爣绫诲瀷" align="center" prop="indexType" :formatter="indexTypeFormat" />
+        <el-table-column label="鍗曚綅" align="center" prop="unitId" :formatter="unitIdFormat" />
+       <!-- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            &lt;!&ndash;<el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['meter:annex:remove']"
+            >鍒犻櫎</el-button>&ndash;&gt;
+          </template>
+        </el-table-column>-->
+      </el-table>
+<!--      <pagination-->
+<!--        v-show="total>0"-->
+<!--        :total="total"-->
+<!--        :page.sync="queryParams.pageNum"-->
+<!--        :limit.sync="queryParams.pageSize"-->
+<!--        @pagination="getList"-->
+<!--      />-->
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listIndex,addIndex,delIndex } from "@/api/meter/index";
+let meterid="";
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      qjcode:"",
+      // 璁¢噺鍣ㄥ叿妗f  鎸囨爣  琛ㄦ牸鏁版嵁
+      impIndexList: [],
+      // 璁¢噺鍣ㄥ叿妗f  鎸囨爣鐨� 鍗曚綅闆嗗悎
+      unitIdList: [],
+      // 璁¢噺鍣ㄥ叿妗f 鎸囨爣鐨� 绯荤粺鎸囨爣绫诲瀷
+      indexTypeList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      },
+    };
+  },
+  created() {
+    this.getDicts("sys_unit").then(response => {
+      this.unitIdList = response.data;
+    });
+    this.getDicts("sys_index_type").then(response => {
+      this.indexTypeList = response.data;
+    });
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(impid,code) {
+      this.reset();
+      this.qjcode = code;
+      this.queryParams.implementId = impid;
+      this.meterid = impid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 鎸囨爣';
+      this.open = true;
+    },
+    // 鎸囨爣绫诲瀷瀛楀吀缈昏瘧
+    indexTypeFormat(row, column) {
+      return this.selectDictLabel(this.indexTypeList, row.indexType);
+    },
+    // 鍗曚綅 瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdList, row.unitId);
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        implementId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ 璁¢噺鍣ㄥ叿鐨勬寚鏍�
+    getList() {
+      listIndex(this.queryParams.implementId).then(response => {
+        this.impIndexList = response.data;
+        this.loading = false;
+      });
+    },
+    // 鐢熸垚璁¢噺鍣ㄥ叿鎸囨爣
+    createIndex() {
+      let aa = this.meterid;
+      console.log("aa==="+aa);
+      this.$confirm('鏄惁纭閲嶆柊鐢熸垚鍣ㄥ叿缂栫爜涓�"' + this.qjcode + '"鐨勬寚鏍囧悧?閲嶆柊鐢熸垚鍚庢墍鏈夋寚鏍囦細杩樺師鍒版ā鏉跨姸鎬�', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+          return addIndex(aa);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鎸囨爣鐢熸垚鎴愬姛");
+      }).catch(function() {});
+    },
+    /** 鍏抽棴鎸夐挳鎿嶄綔 */
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎鎸囨爣缂栫爜涓�"' + row.code + '"鐨勬寚鏍囧悧?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delIndex(row.indexId);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鎸囨爣鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/meter/implementCount/index.vue b/energy_management_ui/src/views/meter/implementCount/index.vue
new file mode 100644
index 0000000..a333175
--- /dev/null
+++ b/energy_management_ui/src/views/meter/implementCount/index.vue
@@ -0,0 +1,808 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="缂栫爜" prop="code">
+              <el-input
+                  v-model="queryParams.code"
+                  placeholder="璇疯緭鍏ョ紪鐮�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍣ㄥ叿鍚嶇О" prop="meterName">
+              <el-input
+                  v-model="queryParams.meterName"
+                  placeholder="璇疯緭鍏ュ櫒鍏峰悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="绉嶇被" prop="meterType">
+              <el-select v-model="queryParams.meterType" placeholder="璇烽�夋嫨绉嶇被" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in meterTypeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="娴嬮噺鑼冨洿" prop="measureRange">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.measureRange"-->
+<!--                  placeholder="璇疯緭鍏ユ祴閲忚寖鍥�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鐢熶骇鍘傚晢" prop="manufacturer">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.manufacturer"-->
+<!--                  placeholder="璇疯緭鍏ョ敓浜у巶鍟�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="瀹夎浣嶇疆" prop="installactionLocation">-->
+<!--              <el-input-->
+<!--                  v-model="queryParams.installactionLocation"-->
+<!--                  placeholder="璇疯緭鍏ュ畨瑁呬綅缃�"-->
+<!--                  clearable-->
+<!--                  size="small"-->
+<!--                  @keyup.enter.native="handleQuery"-->
+<!--              />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <!--<el-col :span="1.5">
+          <el-button
+            type="primary"
+            icon="el-icon-plus"
+            size="mini"
+            @click="handleAdd"
+            v-hasPermi="['meter:implementCount:add']"
+          >鏂板</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="success"
+            icon="el-icon-edit"
+            size="mini"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['meter:implementCount:edit']"
+          >淇敼</el-button>
+        </el-col>-->
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['meter:implementCount:remove']"
+          >閲嶇疆鏃堕棿
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['meter:implementCount:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table v-loading="loading" :data="implementCountList" :row-class-name="tableRowClassName"
+                :height="height"
+                @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="缂栫爜" align="center" prop="code" show-overflow-tooltip/>
+        <el-table-column label="鍣ㄥ叿鍚嶇О" align="center" prop="meterName" show-overflow-tooltip/>
+        <el-table-column label="绉嶇被" align="center" prop="meterType" :formatter="meterTypeFormat" show-overflow-tooltip/>
+        <el-table-column label="瑙勬牸鍨嬪彿" align="center" prop="modelNumber" show-overflow-tooltip/>
+        <el-table-column label="娴嬮噺鑼冨洿" align="center" prop="measureRange" show-overflow-tooltip/>
+        <el-table-column label="鐢熶骇鍘傚晢" align="center" prop="manufacturer" show-overflow-tooltip/>
+        <el-table-column label="瀹夎浣嶇疆" align="center" prop="installactionLocation" show-overflow-tooltip/>
+        <el-table-column label="鐘舵��" align="center" prop="meterStatus" :formatter="meterStatusFormat" show-overflow-tooltip/>
+        <el-table-column label="鎿嶄綔" align="center" width="250" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['meter:implementCount:edit']"
+            >鏌ョ湅
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportFileTable(scope.row)"
+                v-hasPermi="['tool:gen:import']"
+            >闄勪欢
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportIndexTable(scope.row)"
+                v-hasPermi="['']"
+            >鎸囨爣
+            </el-button>
+            <el-button v-if="scope.row.txflage"
+                       size="mini"
+                       type="text"
+                       icon="el-icon-delete"
+                       @click="handleDelete(scope.row)"
+                       v-hasPermi="['meter:implementCount:remove']"
+            >閲嶇疆鏃堕棿
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!--&lt;!&ndash; 娣诲姞鎴栦慨鏀硅閲忓櫒鍏风粺璁℃煡璇㈠璇濇 &ndash;&gt;
+    <el-dialog :title="title" :visible.sync="open" width="800px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鍣ㄥ叿鍚嶇О" prop="meterName">
+          <el-input v-model="form.meterName" placeholder="璇疯緭鍏ュ櫒鍏峰悕绉�" />
+        </el-form-item>
+        <el-form-item label="绉嶇被">
+          <el-select v-model="form.meterType" placeholder="璇烽�夋嫨绉嶇被">
+            <el-option
+              v-for="dict in meterTypeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="瑙勬牸鍨嬪彿" prop="modelNumber">
+          <el-input v-model="form.modelNumber" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+        </el-form-item>
+        <el-form-item label="娴嬮噺鑼冨洿" prop="measureRange">
+          <el-input v-model="form.measureRange" placeholder="璇疯緭鍏ユ祴閲忚寖鍥�" />
+        </el-form-item>
+        <el-form-item label="涓婚敭" prop="id">
+          <el-input v-model="form.id" placeholder="璇疯緭鍏ヤ富閿�" />
+        </el-form-item>
+        <el-form-item label="鐢熶骇鍘傚晢" prop="manufacturer">
+          <el-input v-model="form.manufacturer" placeholder="璇疯緭鍏ョ敓浜у巶鍟�" />
+        </el-form-item>
+        <el-form-item label="璐熻矗浜�" prop="personCharge">
+          <el-input v-model="form.personCharge" placeholder="璇疯緭鍏ヨ礋璐d汉" />
+        </el-form-item>
+        <el-form-item label="瀹夎浣嶇疆" prop="installactionLocation">
+          <el-input v-model="form.installactionLocation" placeholder="璇疯緭鍏ュ畨瑁呬綅缃�" />
+        </el-form-item>
+        <el-form-item label="璧峰鏃堕棿" prop="startTime">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.startTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨璧峰鏃堕棿">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鐘舵��">
+          <el-select v-model="form.meterStatus" placeholder="璇烽�夋嫨鐘舵��">
+            <el-option
+              v-for="dict in meterStatusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>-->
+
+    <!-- 娣诲姞鎴栦慨鏀硅閲忓櫒鍏锋。妗堢淮鎶ゅ璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px">
+      <el-form ref="form" :model="form" :rules="rules" disabled="true" label-width="120px">
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="缂栫爜" prop="code">
+              <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鍣ㄥ叿鍚嶇О" prop="meterName">
+              <el-input v-model="form.meterName" placeholder="璇疯緭鍏ュ櫒鍏峰悕绉�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="绉嶇被" prop="meterType">
+              <el-select v-model="form.meterType" placeholder="璇烽�夋嫨绉嶇被">
+                <el-option
+                    v-for="dict in meterTypeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瑙勬牸鍨嬪彿" prop="modelNumber">
+              <el-input v-model="form.modelNumber" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="娴嬮噺鑼冨洿" prop="measureRange">
+              <el-input v-model="form.measureRange" placeholder="璇疯緭鍏ユ祴閲忚寖鍥�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐢熶骇鍘傚晢" prop="manufacturer">
+              <el-input v-model="form.manufacturer" placeholder="璇疯緭鍏ョ敓浜у巶鍟�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璐熻矗浜�" prop="personCharge">
+              <el-input v-model="form.personCharge" placeholder="璇疯緭鍏ヨ礋璐d汉"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹夎浣嶇疆" prop="installactionLocation">
+              <el-input v-model="form.installactionLocation" placeholder="璇疯緭鍏ュ畨瑁呬綅缃�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="9">
+            <el-form-item label="璧峰鏃堕棿" prop="startTime">
+              <el-date-picker clearable size="small" style="width: 180px"
+                              v-model="form.startTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="閫夋嫨璧峰鏃堕棿">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎶曡繍鏃堕棿" prop="putrunTime">
+              <el-date-picker clearable size="small" style="width: 180px"
+                              v-model="form.putrunTime"
+                              type="date"
+                              value-format="yyyy-MM-dd"
+                              placeholder="閫夋嫨鎶曡繍鏃堕棿">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="7">
+            <el-form-item label="鐘舵��" prop="meterStatus">
+              <el-select v-model="form.meterStatus" placeholder="璇烽�夋嫨鐘舵��">
+                <el-option
+                    v-for="dict in meterStatusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="妫�瀹氬懆鏈�(澶�)" prop="checkCycle">
+              <el-input v-model="form.checkCycle" placeholder="璇疯緭鍏ユ瀹氬懆鏈�"
+                        oninput="if(value.length>4)value=value.slice(0,4)"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎻愰啋鍛ㄦ湡(澶�)" prop="reminderCycle">
+              <el-input v-model="form.reminderCycle" placeholder="璇疯緭鍏ユ彁閱掑懆鏈�"
+                        oninput="if(value.length>4)value=value.slice(0,4)"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <!--  <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>-->
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <importFileTable ref="importFile" @ok="handleFjQuery"/>
+
+    <importIndexTable ref="importIndex" @ok="handleFjQuery"/>
+
+  </div>
+</template>
+
+<style scoped lang="scss">
+.el-table .warning-row {
+  background: #ffb8a9;
+}
+</style>
+
+<script>
+import {
+  listImplementCount,
+  getImplementCount,
+  delImplementCount,
+  addImplementCount,
+  updateImplementCount,
+  exportImplementCount
+} from "@/api/meter/implementCount";
+
+import {getToken} from "@/utils/auth";
+import importFileTable from "./importFileTable";
+import importIndexTable from "./importIndexTable";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+
+  name: "implementCount",
+  components: {importFileTable, importIndexTable},
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿缁熻鏌ヨ琛ㄦ牸鏁版嵁
+      implementCountList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 缂栫爜瀛楀吀
+      codeOptions: [],
+      // 鍣ㄥ叿鍚嶇О瀛楀吀
+      meterNameOptions: [],
+      // 绉嶇被瀛楀吀
+      meterTypeOptions: [],
+      // 瑙勬牸鍨嬪彿瀛楀吀
+      modelNumberOptions: [],
+      // 娴嬮噺鑼冨洿瀛楀吀
+      measureRangeOptions: [],
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鐢熶骇鍘傚晢瀛楀吀
+      manufacturerOptions: [],
+      // 璐熻矗浜哄瓧鍏�
+      personChargeOptions: [],
+      // 瀹夎浣嶇疆瀛楀吀
+      installactionLocationOptions: [],
+      // 璧峰鏃堕棿瀛楀吀
+      startTimeOptions: [],
+      // 妫�瀹氬懆鏈熷瓧鍏�
+      checkCycleOptions: [],
+      // 鎻愰啋鍛ㄦ湡瀛楀吀
+      reminderCycleOptions: [],
+      // 鐘舵�佸瓧鍏�
+      meterStatusOptions: [],
+      // 閫昏緫鍒犻櫎鏍囧織,Y宸插垹闄�,N鏈垹闄ゅ瓧鍏�
+      delFlageOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 寤虹珛浜哄瓧鍏�
+      createByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        meterName: undefined,
+        meterType: undefined,
+        measureRange: undefined,
+        manufacturer: undefined,
+        installactionLocation: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      height:null,
+      rules: {
+        code: [
+          {required: true, message: "缂栫爜涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        meterName: [
+          {required: true, message: "鍣ㄥ叿鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        meterType: [
+          {required: true, message: "绉嶇被涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        id: [
+          {required: true, message: "涓婚敭涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        installactionLocation: [
+          {required: true, message: "瀹夎浣嶇疆涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        meterStatus: [
+          {required: true, message: "鐘舵�佷笉鑳戒负绌�", trigger: "blur"}
+        ],
+        /* startTime: [
+           { required: true, message: "璧峰鏃堕棿涓嶈兘涓虹┖", trigger: "blur" }
+         ],
+         checkCycle: [
+           { required: true, pattern:/^\+?[1-9]\d*$/,message: "妫�瀹氬懆鏈熷繀椤绘槸澶т簬0鐨勬鏁存暟", trigger: "blur" }
+         ],
+         reminderCycle: [
+           { required: true, pattern:/^\+?[1-9]\d*$/,message: "鎻愰啋鍛ㄦ湡蹇呴』鏄ぇ浜�0鐨勬鏁存暟", trigger: "blur" }
+         ],*/
+      }
+    };
+  },
+  created() {
+    this.getList();
+    /*this.getDicts("${column.dictType}").then(response => {
+      this.codeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.meterNameOptions = response.data;
+    });
+    this.getDicts("sys_device_type").then(response => {
+      this.meterTypeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.modelNumberOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.measureRangeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.idOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.manufacturerOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.personChargeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.installactionLocationOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.startTimeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.checkCycleOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.reminderCycleOptions = response.data;
+    });
+    this.getDicts("meter_status").then(response => {
+      this.meterStatusOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.delFlageOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.remarkOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.createTimeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.createByOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.updateTimeOptions = response.data;
+    });
+    this.getDicts("${column.dictType}").then(response => {
+      this.updateByOptions = response.data;
+    });*/
+    this.getDicts("sys_device_type").then(response => {
+
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.myType = response.data[i].dictValue;
+        }
+      }
+      this.meterTypeOptions = response.data;
+    });
+    this.getDicts("meter_status").then(response => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.mystatus = response.data[i].dictValue;
+
+        }
+      }
+      this.meterStatusOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    tableRowClassName({row, rowIndex}) {
+      if (row.txflage) {
+        return 'warning-row';
+      }
+      return '';
+    },
+    /** 鏌ヨ璁¢噺鍣ㄥ叿缁熻鏌ヨ鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listImplementCount(this.queryParams).then(response => {
+        this.implementCountList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 缂栫爜瀛楀吀缈昏瘧
+    codeFormat(row, column) {
+      return this.selectDictLabel(this.codeOptions, row.code);
+    },
+    // 鍣ㄥ叿鍚嶇О瀛楀吀缈昏瘧
+    meterNameFormat(row, column) {
+      return this.selectDictLabel(this.meterNameOptions, row.meterName);
+    },
+    // 绉嶇被瀛楀吀缈昏瘧
+    meterTypeFormat(row, column) {
+      return this.selectDictLabel(this.meterTypeOptions, row.meterType);
+    },
+    // 瑙勬牸鍨嬪彿瀛楀吀缈昏瘧
+    modelNumberFormat(row, column) {
+      return this.selectDictLabel(this.modelNumberOptions, row.modelNumber);
+    },
+    // 娴嬮噺鑼冨洿瀛楀吀缈昏瘧
+    measureRangeFormat(row, column) {
+      return this.selectDictLabel(this.measureRangeOptions, row.measureRange);
+    },
+    // 涓婚敭瀛楀吀缈昏瘧
+    idFormat(row, column) {
+      return this.selectDictLabel(this.idOptions, row.id);
+    },
+    // 鐢熶骇鍘傚晢瀛楀吀缈昏瘧
+    manufacturerFormat(row, column) {
+      return this.selectDictLabel(this.manufacturerOptions, row.manufacturer);
+    },
+    // 璐熻矗浜哄瓧鍏哥炕璇�
+    personChargeFormat(row, column) {
+      return this.selectDictLabel(this.personChargeOptions, row.personCharge);
+    },
+    // 瀹夎浣嶇疆瀛楀吀缈昏瘧
+    installactionLocationFormat(row, column) {
+      return this.selectDictLabel(this.installactionLocationOptions, row.installactionLocation);
+    },
+    // 璧峰鏃堕棿瀛楀吀缈昏瘧
+    startTimeFormat(row, column) {
+      return this.selectDictLabel(this.startTimeOptions, row.startTime);
+    },
+    // 妫�瀹氬懆鏈熷瓧鍏哥炕璇�
+    checkCycleFormat(row, column) {
+      return this.selectDictLabel(this.checkCycleOptions, row.checkCycle);
+    },
+    // 鎻愰啋鍛ㄦ湡瀛楀吀缈昏瘧
+    reminderCycleFormat(row, column) {
+      return this.selectDictLabel(this.reminderCycleOptions, row.reminderCycle);
+    },
+    // 鐘舵�佸瓧鍏哥炕璇�
+    meterStatusFormat(row, column) {
+      return this.selectDictLabel(this.meterStatusOptions, row.meterStatus);
+    },
+    // 閫昏緫鍒犻櫎鏍囧織,Y宸插垹闄�,N鏈垹闄ゅ瓧鍏哥炕璇�
+    delFlageFormat(row, column) {
+      return this.selectDictLabel(this.delFlageOptions, row.delFlage);
+    },
+    // 澶囨敞瀛楀吀缈昏瘧
+    remarkFormat(row, column) {
+      return this.selectDictLabel(this.remarkOptions, row.remark);
+    },
+    // 寤虹珛鏃堕棿瀛楀吀缈昏瘧
+    createTimeFormat(row, column) {
+      return this.selectDictLabel(this.createTimeOptions, row.createTime);
+    },
+    // 寤虹珛浜哄瓧鍏哥炕璇�
+    createByFormat(row, column) {
+      return this.selectDictLabel(this.createByOptions, row.createBy);
+    },
+    // 淇敼鏃堕棿瀛楀吀缈昏瘧
+    updateTimeFormat(row, column) {
+      return this.selectDictLabel(this.updateTimeOptions, row.updateTime);
+    },
+    // 淇敼浜哄瓧鍏哥炕璇�
+    updateByFormat(row, column) {
+      return this.selectDictLabel(this.updateByOptions, row.updateBy);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        code: undefined,
+        meterName: undefined,
+        meterType: undefined,
+        modelNumber: undefined,
+        measureRange: undefined,
+        id: undefined,
+        manufacturer: undefined,
+        personCharge: undefined,
+        installactionLocation: undefined,
+        startTime: undefined,
+        checkCycle: undefined,
+        reminderCycle: undefined,
+        meterStatus: undefined,
+        delFlage: undefined,
+        remark: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.code)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞璁¢噺鍣ㄥ叿缁熻鏌ヨ";
+      this.form.meterType = this.myType;
+      this.form.meterStatus = this.mystatus;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const code = row.code || this.ids
+      getImplementCount(code).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "鏌ョ湅璁¢噺鍣ㄥ叿淇℃伅";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.code != undefined) {
+            updateImplementCount(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addImplementCount(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const codes = row.code || this.ids;
+      this.$confirm('鏄惁纭閲嶇疆璁¢噺鍣ㄥ叿缁熻鏌ヨ缂栧彿涓�"' + codes + '"鐨勬椂闂�?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delImplementCount(codes);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("閲嶇疆鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎閲忓櫒鍏风粺璁℃煡璇㈡暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportImplementCount(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportFileTable(row) {
+      let impid = row.id;
+      let impcode = row.code;
+      this.$refs.importFile.show(impid, impcode);
+    },
+    /** 闄勪欢鎼滅储鎸夐挳鎿嶄綔 */
+    handleFjQuery() {
+      // this.queryParams.pageNum = 1;
+      // this.getList();
+    },
+    /** 鎵撳紑鎸囨爣琛ㄥ脊绐� */
+    openImportIndexTable(row) {
+      let impid = row.id;
+      let impcode = row.code;
+      this.$refs.importIndex.show(impid, impcode);
+    },
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form{
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/monitor/druid/index.vue b/energy_management_ui/src/views/monitor/druid/index.vue
new file mode 100644
index 0000000..da5b08f
--- /dev/null
+++ b/energy_management_ui/src/views/monitor/druid/index.vue
@@ -0,0 +1,26 @@
+<template>
+  <div v-loading="loading" :style="'height:'+ height">
+    <iframe :src="src" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
+  </div>
+</template>
+<script>
+export default {
+  name: "Druid",
+  data() {
+    return {
+      src: process.env.VUE_APP_BASE_API + "/druid/index.html",
+      height: document.documentElement.clientHeight - 94.5 + "px;",
+      loading: true
+    };
+  },
+  mounted: function() {
+    setTimeout(() => {
+      this.loading = false;
+    }, 230);
+    const that = this;
+    window.onresize = function temp() {
+      that.height = document.documentElement.clientHeight - 94.5 + "px;";
+    };
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/monitor/job/index.vue b/energy_management_ui/src/views/monitor/job/index.vue
new file mode 100644
index 0000000..db2a0e1
--- /dev/null
+++ b/energy_management_ui/src/views/monitor/job/index.vue
@@ -0,0 +1,5 @@
+<template>
+  <div class="app-container">
+   瀹氭椂浠诲姟
+  </div>
+</template>
\ No newline at end of file
diff --git a/energy_management_ui/src/views/monitor/logininfor/index.vue b/energy_management_ui/src/views/monitor/logininfor/index.vue
new file mode 100644
index 0000000..6eee313
--- /dev/null
+++ b/energy_management_ui/src/views/monitor/logininfor/index.vue
@@ -0,0 +1,260 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr">
+              <el-input
+                  v-model="queryParams.ipaddr"
+                  placeholder="璇疯緭鍏ョ櫥褰曞湴鍧�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
+              <el-input
+                  v-model="queryParams.userName"
+                  placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐘舵��" prop="status">
+              <el-select
+                  v-model="queryParams.status"
+                  placeholder="鐧诲綍鐘舵��"
+                  clearable
+                  size="small"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐧诲綍鏃堕棿">
+              <el-date-picker
+                  v-model="dateRange"
+                  size="small"
+                  style="width: 100%"
+                  value-format="yyyy-MM-dd"
+                  type="daterange"
+                  range-separator="-"
+                  start-placeholder="寮�濮嬫棩鏈�"
+                  end-placeholder="缁撴潫鏃ユ湡"
+              ></el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['monitor:logininfor:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              @click="handleClean"
+              v-hasPermi="['monitor:logininfor:remove']"
+          >娓呯┖
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:logininfor:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table  :height="height" v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="璁块棶缂栧彿" align="center" prop="infoId"/>
+        <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" prop="userName"/>
+        <el-table-column label="鐧诲綍鍦板潃" align="center" prop="ipaddr" width="130" :show-overflow-tooltip="true"/>
+        <el-table-column label="鐧诲綍鍦扮偣" align="center" prop="loginLocation"/>
+        <el-table-column label="娴忚鍣�" align="center" prop="browser"/>
+        <el-table-column label="鎿嶄綔绯荤粺" align="center" prop="os"/>
+        <el-table-column label="鐧诲綍鐘舵��" align="center" prop="status" :formatter="statusFormat"/>
+        <el-table-column label="鎿嶄綔淇℃伅" align="center" prop="msg"/>
+        <el-table-column label="鐧诲綍鏃ユ湡" align="center" prop="loginTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.loginTime) }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {list, delLogininfor, cleanLogininfor, exportLogininfor} from "@/api/monitor/logininfor";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "Logininfor",
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 琛ㄦ牸鏁版嵁
+      list: [],
+      // 鐘舵�佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        ipaddr: undefined,
+        userName: undefined,
+        status: undefined,
+        beginTime: undefined,
+        endTime: undefined
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_common_status").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 250 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 410;
+    },
+    /** 鏌ヨ鐧诲綍鏃ュ織鍒楄〃 */
+    getList() {
+      this.loading = true;
+      list(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+            this.list = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          }
+      );
+    },
+    // 鐧诲綍鐘舵�佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.infoId)
+      this.multiple = !selection.length
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const infoIds = row.infoId || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎璁块棶缂栧彿涓�"' + infoIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delLogininfor(infoIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 娓呯┖鎸夐挳鎿嶄綔 */
+    handleClean() {
+      this.$confirm('鏄惁纭娓呯┖鎵�鏈夌櫥褰曟棩蹇楁暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return cleanLogininfor();
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("娓呯┖鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋搷浣滄棩蹇楁暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportLogininfor(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
+
diff --git a/energy_management_ui/src/views/monitor/online/index.vue b/energy_management_ui/src/views/monitor/online/index.vue
new file mode 100644
index 0000000..462a2ac
--- /dev/null
+++ b/energy_management_ui/src/views/monitor/online/index.vue
@@ -0,0 +1,128 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true">
+      <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr">
+        <el-input
+          v-model="queryParams.ipaddr"
+          placeholder="璇疯緭鍏ョ櫥褰曞湴鍧�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
+        <el-input
+          v-model="queryParams.userName"
+          placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      :data="list.slice((pageNum-1)*pageSize,pageNum*pageSize)"
+      style="width: 100%;"
+    >
+      <el-table-column label="搴忓彿" type="index" align="center">
+        <template slot-scope="scope">
+          <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="浼氳瘽缂栧彿" align="center" prop="tokenId" :show-overflow-tooltip="true" />
+      <el-table-column label="鐧诲綍鍚嶇О" align="center" prop="userName" :show-overflow-tooltip="true" />
+      <el-table-column label="閮ㄩ棬鍚嶇О" align="center" prop="deptName" />
+      <el-table-column label="涓绘満" align="center" prop="ipaddr" :show-overflow-tooltip="true" />
+      <el-table-column label="鐧诲綍鍦扮偣" align="center" prop="loginLocation" />
+      <el-table-column label="娴忚鍣�" align="center" prop="browser" />
+      <el-table-column label="鎿嶄綔绯荤粺" align="center" prop="os" />
+      <el-table-column label="鐧诲綍鏃堕棿" align="center" prop="loginTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.loginTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleForceLogout(scope.row)"
+            v-hasPermi="['monitor:online:forceLogout']"
+          >寮洪��</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="total>0" :total="total" :page.sync="pageNum" :limit.sync="pageSize" />
+  </div>
+</template>
+
+<script>
+import { list, forceLogout } from "@/api/monitor/online";
+
+export default {
+  name: "Online",
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 琛ㄦ牸鏁版嵁
+      list: [],
+      pageNum: 1,
+      pageSize: 10,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        ipaddr: undefined,
+        userName: undefined
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ鐧诲綍鏃ュ織鍒楄〃 */
+    getList() {
+      this.loading = true;
+      list(this.queryParams).then(response => {
+        this.list = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 寮洪��鎸夐挳鎿嶄綔 */
+    handleForceLogout(row) {
+      this.$confirm('鏄惁纭寮洪��鍚嶇О涓�"' + row.userName + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return forceLogout(row.tokenId);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("寮洪��鎴愬姛");
+        }).catch(function() {});
+    }
+  }
+};
+</script>
+
diff --git a/energy_management_ui/src/views/monitor/operlog/index.vue b/energy_management_ui/src/views/monitor/operlog/index.vue
new file mode 100644
index 0000000..3319bea
--- /dev/null
+++ b/energy_management_ui/src/views/monitor/operlog/index.vue
@@ -0,0 +1,356 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="73px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="绯荤粺妯″潡" prop="title">
+              <el-input
+                  v-model="queryParams.title"
+                  placeholder="璇疯緭鍏ョ郴缁熸ā鍧�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鎿嶄綔浜哄憳" prop="operName">
+              <el-input
+                  v-model="queryParams.operName"
+                  placeholder="璇疯緭鍏ユ搷浣滀汉鍛�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="绫诲瀷" prop="businessType">
+              <el-select
+                  v-model="queryParams.businessType"
+                  placeholder="鎿嶄綔绫诲瀷"
+                  clearable
+                  size="small"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="dict in typeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐘舵��" prop="status">
+              <el-select
+                  v-model="queryParams.status"
+                  placeholder="鎿嶄綔鐘舵��"
+                  clearable
+                  size="small"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鎿嶄綔鏃堕棿">
+              <el-date-picker
+                  v-model="dateRange"
+                  size="small"
+                  style="width: 100%"
+                  value-format="yyyy-MM-dd"
+                  type="daterange"
+                  range-separator="-"
+                  start-placeholder="寮�濮嬫棩鏈�"
+                  end-placeholder="缁撴潫鏃ユ湡"
+              ></el-date-picker>
+            </el-form-item>
+
+          </el-col>
+          <el-col :span="18">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['monitor:operlog:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              @click="handleClean"
+              v-hasPermi="['monitor:operlog:remove']"
+          >娓呯┖
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:config:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table :height="height" v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鏃ュ織缂栧彿" align="center" prop="operId"/>
+        <el-table-column label="绯荤粺妯″潡" align="center" prop="title"/>
+        <el-table-column label="鎿嶄綔绫诲瀷" align="center" prop="businessType" :formatter="typeFormat"/>
+        <el-table-column label="璇锋眰鏂瑰紡" align="center" prop="requestMethod"/>
+        <el-table-column label="鎿嶄綔浜哄憳" align="center" prop="operName"/>
+        <el-table-column label="涓绘満" align="center" prop="operIp" width="130" :show-overflow-tooltip="true"/>
+        <el-table-column label="鎿嶄綔鍦扮偣" align="center" prop="operLocation"/>
+        <el-table-column label="鎿嶄綔鐘舵��" align="center" prop="status" :formatter="statusFormat"/>
+        <el-table-column label="鎿嶄綔鏃ユ湡" align="center" prop="operTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.operTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-view"
+                @click="handleView(scope.row,scope.index)"
+                v-hasPermi="['monitor:operlog:query']"
+            >璇︾粏
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 鎿嶄綔鏃ュ織璇︾粏 -->
+    <el-dialog title="鎿嶄綔鏃ュ織璇︾粏" :visible.sync="open" width="700px">
+      <el-form ref="form" :model="form" label-width="100px" size="mini">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎿嶄綔妯″潡锛�">{{ form.title }} / 淇敼</el-form-item>
+            <el-form-item
+                label="鐧诲綍淇℃伅锛�"
+            >{{ form.operName }} / {{ form.operIp }} / {{ form.operLocation }}
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇锋眰鍦板潃锛�">{{ form.operUrl }}</el-form-item>
+            <el-form-item label="璇锋眰鏂瑰紡锛�">{{ form.requestMethod }}</el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鎿嶄綔鏂规硶锛�">{{ form.method }}</el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇锋眰鍙傛暟锛�">{{ form.operParam }}</el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="杩斿洖鍙傛暟锛�">{{ form.jsonResult }}</el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎿嶄綔鐘舵�侊細">
+              <div v-if="form.status === 0">姝e父</div>
+              <div v-else-if="form.status === 1">澶辫触</div>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎿嶄綔鏃堕棿锛�">{{ parseTime(form.operTime) }}</el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="寮傚父淇℃伅锛�" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="open = false">鍏� 闂�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {list, delOperlog, cleanOperlog, exportOperlog} from "@/api/monitor/operlog";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "Operlog",
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 琛ㄦ牸鏁版嵁
+      list: [],
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 绫诲瀷鏁版嵁瀛楀吀
+      typeOptions: [],
+      // 绫诲瀷鏁版嵁瀛楀吀
+      statusOptions: [],
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: undefined,
+        operName: undefined,
+        businessType: undefined,
+        status: undefined,
+        beginTime: undefined,
+        endTime: undefined
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_oper_type").then(response => {
+      this.typeOptions = response.data;
+    });
+    this.getDicts("sys_common_status").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 250 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 410;
+    },
+    /** 鏌ヨ鐧诲綍鏃ュ織 */
+    getList() {
+      this.loading = true;
+      list(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+            this.list = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          }
+      );
+    },
+    // 鎿嶄綔鏃ュ織鐘舵�佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    // 鎿嶄綔鏃ュ織绫诲瀷瀛楀吀缈昏瘧
+    typeFormat(row, column) {
+      return this.selectDictLabel(this.typeOptions, row.businessType);
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.operId)
+      this.multiple = !selection.length
+    },
+    /** 璇︾粏鎸夐挳鎿嶄綔 */
+    handleView(row) {
+      this.open = true;
+      this.form = row;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const operIds = row.operId || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鏃ュ織缂栧彿涓�"' + operIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delOperlog(operIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 娓呯┖鎸夐挳鎿嶄綔 */
+    handleClean() {
+      this.$confirm('鏄惁纭娓呯┖鎵�鏈夋搷浣滄棩蹇楁暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return cleanOperlog();
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("娓呯┖鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋搷浣滄棩蹇楁暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportOperlog(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
+
diff --git a/energy_management_ui/src/views/monitor/server/index.vue b/energy_management_ui/src/views/monitor/server/index.vue
new file mode 100644
index 0000000..8ba3082
--- /dev/null
+++ b/energy_management_ui/src/views/monitor/server/index.vue
@@ -0,0 +1,210 @@
+<template>
+  <div class="app-container">
+    <el-row>
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <div slot="header"><span>CPU</span></div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+                <tr>
+                  <th class="is-leaf"><div class="cell">灞炴��</div></th>
+                  <th class="is-leaf"><div class="cell">鍊�</div></th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td><div class="cell">鏍稿績鏁�</div></td>
+                  <td><div class="cell" v-if="server.cpu">{{ server.cpu.cpuNum }}</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">鐢ㄦ埛浣跨敤鐜�</div></td>
+                  <td><div class="cell" v-if="server.cpu">{{ server.cpu.used }}%</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">绯荤粺浣跨敤鐜�</div></td>
+                  <td><div class="cell" v-if="server.cpu">{{ server.cpu.sys }}%</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">褰撳墠绌洪棽鐜�</div></td>
+                  <td><div class="cell" v-if="server.cpu">{{ server.cpu.free }}%</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="12" class="card-box">
+        <el-card>
+          <div slot="header"><span>鍐呭瓨</span></div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+                <tr>
+                  <th class="is-leaf"><div class="cell">灞炴��</div></th>
+                  <th class="is-leaf"><div class="cell">鍐呭瓨</div></th>
+                  <th class="is-leaf"><div class="cell">JVM</div></th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <td><div class="cell">鎬诲唴瀛�</div></td>
+                  <td><div class="cell" v-if="server.mem">{{ server.mem.total }}G</div></td>
+                  <td><div class="cell" v-if="server.jvm">{{ server.jvm.total }}M</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">宸茬敤鍐呭瓨</div></td>
+                  <td><div class="cell" v-if="server.mem">{{ server.mem.used}}G</div></td>
+                  <td><div class="cell" v-if="server.jvm">{{ server.jvm.used}}M</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">鍓╀綑鍐呭瓨</div></td>
+                  <td><div class="cell" v-if="server.mem">{{ server.mem.free }}G</div></td>
+                  <td><div class="cell" v-if="server.jvm">{{ server.jvm.free }}M</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">浣跨敤鐜�</div></td>
+                  <td><div class="cell" v-if="server.mem" :class="{'text-danger': server.mem.usage > 80}">{{ server.mem.usage }}%</div></td>
+                  <td><div class="cell" v-if="server.jvm" :class="{'text-danger': server.jvm.usage > 80}">{{ server.jvm.usage }}%</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <div slot="header">
+            <span>鏈嶅姟鍣ㄤ俊鎭�</span>
+          </div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <tbody>
+                <tr>
+                  <td><div class="cell">鏈嶅姟鍣ㄥ悕绉�</div></td>
+                  <td><div class="cell" v-if="server.sys">{{ server.sys.computerName }}</div></td>
+                  <td><div class="cell">鎿嶄綔绯荤粺</div></td>
+                  <td><div class="cell" v-if="server.sys">{{ server.sys.osName }}</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">鏈嶅姟鍣↖P</div></td>
+                  <td><div class="cell" v-if="server.sys">{{ server.sys.computerIp }}</div></td>
+                  <td><div class="cell">绯荤粺鏋舵瀯</div></td>
+                  <td><div class="cell" v-if="server.sys">{{ server.sys.osArch }}</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <div slot="header">
+            <span>Java铏氭嫙鏈轰俊鎭�</span>
+          </div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <tbody>
+                <tr>
+                  <td><div class="cell">Java鍚嶇О</div></td>
+                  <td><div class="cell" v-if="server.jvm">{{ server.jvm.name }}</div></td>
+                  <td><div class="cell">Java鐗堟湰</div></td>
+                  <td><div class="cell" v-if="server.jvm">{{ server.jvm.version }}</div></td>
+                </tr>
+                <tr>
+                  <td><div class="cell">鍚姩鏃堕棿</div></td>
+                  <td><div class="cell" v-if="server.jvm">{{ server.jvm.startTime }}</div></td>
+                  <td><div class="cell">杩愯鏃堕暱</div></td>
+                  <td><div class="cell" v-if="server.jvm">{{ server.jvm.runTime }}</div></td>
+                </tr>
+                <tr>
+                  <td colspan="1"><div class="cell">瀹夎璺緞</div></td>
+                  <td colspan="3"><div class="cell" v-if="server.jvm">{{ server.jvm.home }}</div></td>
+                </tr>
+                <tr>
+                  <td colspan="1"><div class="cell">椤圭洰璺緞</div></td>
+                  <td colspan="3"><div class="cell" v-if="server.sys">{{ server.sys.userDir }}</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+
+      <el-col :span="24" class="card-box">
+        <el-card>
+          <div slot="header">
+            <span>纾佺洏鐘舵��</span>
+          </div>
+          <div class="el-table el-table--enable-row-hover el-table--medium">
+            <table cellspacing="0" style="width: 100%;">
+              <thead>
+                <tr>
+                  <th class="is-leaf"><div class="cell">鐩樼璺緞</div></th>
+                  <th class="is-leaf"><div class="cell">鏂囦欢绯荤粺</div></th>
+                  <th class="is-leaf"><div class="cell">鐩樼绫诲瀷</div></th>
+                  <th class="is-leaf"><div class="cell">鎬诲ぇ灏�</div></th>
+                  <th class="is-leaf"><div class="cell">鍙敤澶у皬</div></th>
+                  <th class="is-leaf"><div class="cell">宸茬敤澶у皬</div></th>
+                  <th class="is-leaf"><div class="cell">宸茬敤鐧惧垎姣�</div></th>
+                </tr>
+              </thead>
+              <tbody v-if="server.sysFiles">
+                <tr v-for="sysFile in server.sysFiles">
+                  <td><div class="cell">{{ sysFile.dirName }}</div></td>
+                  <td><div class="cell">{{ sysFile.sysTypeName }}</div></td>
+                  <td><div class="cell">{{ sysFile.typeName }}</div></td>
+                  <td><div class="cell">{{ sysFile.total }}</div></td>
+                  <td><div class="cell">{{ sysFile.free }}</div></td>
+                  <td><div class="cell">{{ sysFile.used }}</div></td>
+                  <td><div class="cell" :class="{'text-danger': sysFile.usage > 80}">{{ sysFile.usage }}%</div></td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { getServer } from "@/api/monitor/server";
+
+export default {
+  name: "Server",
+  data() {
+    return {
+      // 鍔犺浇灞備俊鎭�
+      loading: [],
+      // 鏈嶅姟鍣ㄤ俊鎭�
+      server: []
+    };
+  },
+  created() {
+    this.getList();
+    this.openLoading();
+  },
+  methods: {
+    /** 鏌ヨ鏈嶅姟鍣ㄤ俊鎭� */
+    getList() {
+      getServer().then(response => {
+        this.server = response.data;
+        this.loading.close();
+      });
+    },
+    // 鎵撳紑鍔犺浇灞�
+    openLoading() {
+      this.loading = this.$loading({
+        lock: true,
+        text: "鎷煎懡璇诲彇涓�",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)"
+      });
+    }
+  }
+};
+</script>
\ No newline at end of file
diff --git a/energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/importAnnexTable.vue b/energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/importAnnexTable.vue
new file mode 100644
index 0000000..30f6e30
--- /dev/null
+++ b/energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/importAnnexTable.vue
@@ -0,0 +1,138 @@
+<template>
+
+</template>
+
+<script>
+import { listAnnex,delAnnex } from "@/api/facility/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/facility/annex/fileImport"
+      },
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(facid,code) {
+      this.reset();
+      this.queryParams.facilityId = facid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 闄勪欢';
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+       this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delAnnex(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/index.vue b/energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/index.vue
new file mode 100644
index 0000000..232346c
--- /dev/null
+++ b/energy_management_ui/src/views/onlineMonitoring/gatewayAdministration/index.vue
@@ -0,0 +1,651 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form
+        class="special-form"
+        :model="queryParams"
+        ref="queryForm"
+        label-width="72px"
+      >
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="缃戝叧缂栧彿" prop="gatewayNum">
+              <el-input
+                v-model="queryParams.gatewayNum"
+                placeholder="璇疯緭鍏ョ紪鐮�"
+                clearable
+                size="small"
+                @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍦扮偣鍚嶇О" prop="address">
+              <el-input
+                v-model="queryParams.address"
+                placeholder="璇疯緭鍏ュ湴鐐瑰悕绉�"
+                clearable
+                size="small"
+                @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button
+                type="primary"
+                icon="el-icon-search"
+                size="mini"
+                @click="handleQuery"
+                >鎼滅储</el-button
+              >
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+                >閲嶇疆</el-button
+              >
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            icon="el-icon-plus"
+            size="mini"
+            @click="handleAdd"
+            v-hasPermi="['facility:archives:add']"
+            >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="success"
+            icon="el-icon-edit"
+            size="mini"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['facility:archives:edit']"
+            >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+            type="danger"
+            icon="el-icon-delete"
+            size="mini"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['facility:archives:remove']"
+            >鍒犻櫎
+          </el-button>
+        </el-col>
+
+        <!--        <el-col :span="1.5">-->
+        <!--          <el-button-->
+        <!--              type="info"-->
+        <!--              icon="el-icon-upload2"-->
+        <!--              size="mini"-->
+        <!--              @click="handleImport"-->
+        <!--              v-hasPermi="['facility:archives:import']"-->
+        <!--          >瀵煎叆-->
+        <!--          </el-button>-->
+        <!--        </el-col>-->
+      </el-row>
+      <el-table
+        v-loading="loading"
+        :data="archivesList"
+        @selection-change="handleSelectionChange"
+        :height="height"
+      >
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column
+          label="缃戝叧缂栧彿"
+          align="center"
+          prop="gatewayNum"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍘傚尯"
+          align="center"
+          prop="plantArea"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍦扮偣"
+          align="center"
+          prop="address"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="淇敼浜�"
+          align="center"
+          prop="updateBy"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="淇敼鏃堕棿"
+          align="center"
+          prop="updateTime"
+          show-overflow-tooltip
+        />
+
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          width="200"
+          class-name="small-padding fixed-width"
+          show-overflow-tooltip
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="handleUpdate(scope.row)"
+              v-hasPermi="['facility:archives:edit']"
+              >淇敼
+            </el-button>
+
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['facility:archives:remove']"
+              >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+      <!-- 娣诲姞鎴栦慨鏀硅澶囨。妗堝璇濇 -->
+      <el-dialog
+        :title="title"
+        :visible.sync="open"
+        width="820px"
+        class="dialog-form-row"
+      >
+        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+          <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="缃戝叧缂栧彿" prop="gatewayNum">
+                <el-input v-model="form.gatewayNum" placeholder="璇疯緭鍏ョ紪鐮�" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鍘傚尯" prop="plantArea">
+                <el-input
+                  v-model="form.plantArea"
+                  placeholder="璇疯緭鍏ュ巶鍖哄悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鍦板潃" prop="address">
+                <el-input v-model="form.address" placeholder="璇疯緭鍏ュ湴鍧�鍚嶇О" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <div slot="footer" class="dialog-footer" style="padding-top: 5px">
+          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+      <!-- 璁惧妗f 瀵煎叆瀵硅瘽妗� -->
+      <el-dialog
+        :title="upload.title"
+        :visible.sync="upload.open"
+        :destroy-on-close="true"
+        width="400px"
+      >
+        <el-upload
+          ref="upload"
+          :limit="1"
+          :accept="upload.accept"
+          :headers="upload.headers"
+          :action="upload.url"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">
+            灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+            <em>鐐瑰嚮涓婁紶</em>
+          </div>
+          <div class="el-upload__tip" slot="tip">
+            <el-link
+              type="info"
+              style="font-size: 12px; color: blue"
+              @click="importTemplate"
+              >涓嬭浇妯℃澘</el-link
+            >
+          </div>
+          <div class="el-upload__tip" style="color: red" slot="tip">
+            瀵煎叆鎻愮ず锛�<br />1銆佹柊澧炲鍏�,浠呭厑璁稿鍏モ�渪ls鈥濇垨鈥渪lsx鈥濇牸寮忔枃浠讹紒
+            <br />2銆佺紪鐮佸繀椤诲敮涓�,閲嶅鏁版嵁鏃犳硶瀵煎叆
+            <br />3銆佽澶囩绫汇�佷娇鐢ㄥ垎鍘傘�佽兘婧愮瓑绾у~鍐欓敊璇殑鏁版嵁鏃犳硶瀵煎叆
+            <br />4銆佹瀹氬懆鏈熴�佹彁閱掑懆鏈熷ぇ浜�0姝f暣鏁�,濉啓閿欒鍒欓粯璁や负1
+            <br />5銆佽捣濮嬫椂闂村~鍐欓敊璇垨涓嶅~鍒欓粯璁や负绌�
+          </div>
+        </el-upload>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+          <el-button @click="upload.open = false">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+      <importAnnexTable ref="importAnnex" />
+    </basic-container>
+  </div>
+</template>
+<style scoped>
+.el-dialog__body {
+  padding: 10px 10px 10px 10px;
+  color: #606266;
+  font-size: 14px;
+  word-break: break-all;
+}
+</style>
+<script>
+import {
+  listArchives,
+  getArchives,
+  delArchives,
+  addArchives,
+  updateArchives,
+  exportArchives,
+  importTemplate,
+} from "@/api/onlineMonitoring/index";
+import { getToken } from "@/utils/auth";
+import importAnnexTable from "./importAnnexTable";
+import mixins from "@/layout/mixin/getHeight";
+
+const facilityType = "0";
+const branchFactory = "0";
+const facilityGrade = "0";
+export default {
+  name: "importAnnex",
+  components: { importAnnexTable },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 缂栫爜閫変腑鏁扮粍
+      codes: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁惧妗f琛ㄦ牸鏁版嵁
+      archivesList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭id瀛楀吀
+      idOptions: [],
+      // 缂栫爜瀛楀吀
+      codeOptions: [],
+      // 璁惧鍚嶇О瀛楀吀
+      facilityNameOptions: [],
+      // 璁惧绫诲瀷瀛楀吀
+      facilityTypeOptions: [],
+      // 閲嶇偣璁惧瀛楀吀
+      pointFlagOptions: [],
+      // 浣跨敤鍒嗗巶瀛楀吀
+      branchFactoryOptions: [],
+      // 鐗╃悊浣嶇疆瀛楀吀
+      istallationLocationnOptions: [],
+      // 鑳借�楃瓑绾у瓧鍏�
+      facilityGradeOptions: [],
+      // 棰濆畾鍔熺巼瀛楀吀
+      ratedPowerOptions: [],
+      // 鐢熶骇鏃ユ湡瀛楀吀
+      productionDateOptions: [],
+      // 鎶曡繍鏃ユ湡瀛楀吀
+      putrunDateOptions: [],
+      // 鐢熶骇鍘傚瀛楀吀
+      manufacturerOptions: [],
+      // 璐熻矗浜哄瓧鍏�
+      personChargeOptions: [],
+      // 鎶�鏈弬鏁板瓧鍏�
+      technicalDataOptions: [],
+      // 璧峰鏃堕棿瀛楀吀
+      startTimeOptions: [],
+      // 妫�瀹氬懆鏈熷瓧鍏�
+      checkCycleOptions: [],
+      // 鎻愰啋鍛ㄦ湡瀛楀吀
+      reminderCycleOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 鐩戠悊浜哄瓧鍏�
+      createByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      upload: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        //涓婁紶鏂囦欢绫诲瀷鎺у埗
+        accept: undefined,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: undefined,
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勮閲忓櫒鍏锋。妗�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: "",
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        branchFactory: undefined,
+        pointFlag: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        manufacturer: undefined,
+        ratedPower: undefined,
+      },
+      height: null,
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        gatewayNum: [{ required: true, message: "缃戝叧缂栧彿涓嶈兘涓虹┖", trigger: "blur" }],
+        plantArea: [
+          { required: true, message: "鍘傚尯涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        address: [
+          { required: true, message: "鍦板潃涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("facility_type").then((response) => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.facilityType = response.data[i].dictValue;
+        }
+      }
+      this.facilityTypeOptions = response.data;
+    });
+    this.getDicts("pointFlag").then((response) => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.pointFlag = response.data[i].dictValue;
+        }
+      }
+      this.pointFlagOptions = response.data;
+    });
+    this.getDicts("branch_factory").then((response) => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.branchFactory = response.data[i].dictValue;
+        }
+      }
+      this.branchFactoryOptions = response.data;
+    });
+    this.getDicts("facility_grade").then((response) => {
+      for (let i = 0; i < response.data.length; i++) {
+        if (response.data[i].isDefault == "Y") {
+          this.facilityGrade = response.data[i].dictValue;
+        }
+      }
+      this.facilityGradeOptions = response.data;
+    });
+    this.getDicts("ratedPower").then((response) => {
+      this.ratedPowerOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + "px",
+        overflow: "hidden",
+      };
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ璁惧妗f鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listArchives(this.queryParams).then((response) => {
+        this.archivesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 璁惧绫诲瀷瀛楀吀缈昏瘧
+    facilityTypeFormat(row, column) {
+      return this.selectDictLabel(this.facilityTypeOptions, row.facilityType);
+    },
+    // 浣跨敤鍒嗗巶瀛楀吀缈昏瘧
+    branchFactoryFormat(row, column) {
+      return this.selectDictLabel(this.branchFactoryOptions, row.branchFactory);
+    },
+    // 閲嶇偣璁惧瀛楀吀缈昏瘧
+    pointFlagFactoryFormat(row, column) {
+      return this.selectDictLabel(this.pointFlagOptions, row.pointFlag);
+    },
+    // 鑳借�楃瓑绾у瓧鍏哥炕璇�
+    facilityGradeFormat(row, column) {
+      return this.selectDictLabel(this.facilityGradeOptions, row.facilityGrade);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        branchFactory: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        ratedPower: undefined,
+        productionDate: undefined,
+        putrunDate: undefined,
+        manufacturer: undefined,
+        personCharge: undefined,
+        technicalData: undefined,
+        startTime: undefined,
+        checkCycle: undefined,
+        reminderCycle: undefined,
+        remark: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.codes = selection.map((item) => item.code);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞";
+      this.form.facilityGrade = this.facilityGrade;
+      this.form.facilityType = this.facilityType;
+      this.form.branchFactory = this.branchFactory;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      //this.reset();
+      const id = row.id || this.ids;
+       this.form = row;
+        this.open = true;
+        this.title = "淇敼";
+      getArchives(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateArchives(this.form).then((response) => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addArchives(this.form).then((response) => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const codes = row.code || this.codes;
+      this.$confirm(
+        '鏄惁纭鍒犻櫎?',
+        "璀﹀憡",
+        {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning",
+        }
+      )
+        .then(function () {
+          return delArchives(ids);
+          this.resetForm("queryForm");
+        })
+        .then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(function () {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭鎵�鏈夎澶囨。妗堟暟鎹」?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(function () {
+          return exportArchives(queryParams);
+        })
+        .then((response) => {
+          this.download(response.msg);
+        })
+        .catch(function () {});
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      //this.$refs.upload.clearFiles();
+      this.upload.title = "璁惧妗f瀵煎叆";
+      this.upload.accept = ".xlsx, .xls";
+      this.upload.url =
+        process.env.VUE_APP_BASE_API +
+        "/facility/archives/imporel-colata?updateSupport=0";
+      this.upload.open = true;
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      importTemplate().then((response) => {
+        this.download(response.msg);
+      });
+    },
+    // 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 鎻愪氦涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportAnnexTable(row) {
+      let facid = row.id;
+      let faccode = row.code;
+      this.$refs.importAnnex.show(facid, faccode);
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+
+.dialog-form-row {
+  .el-row {
+    margin-bottom: 0;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/importAnnexTable.vue b/energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/importAnnexTable.vue
new file mode 100644
index 0000000..30f6e30
--- /dev/null
+++ b/energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/importAnnexTable.vue
@@ -0,0 +1,138 @@
+<template>
+
+</template>
+
+<script>
+import { listAnnex,delAnnex } from "@/api/facility/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁¢噺鍣ㄥ叿妗f闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈meter_implement.id瀛楀吀
+      implementIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/facility/annex/fileImport"
+      },
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(facid,code) {
+      this.reset();
+      this.queryParams.facilityId = facid;
+      this.getList();
+      this.title='缂栧彿 '+code+' 闄勪欢';
+      this.open = true;
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.queryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        facilityId:'',
+        tableName: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("queryForm");
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+       this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+        return delAnnex(row.id);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+
+</script>
diff --git a/energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/index.vue b/energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/index.vue
new file mode 100644
index 0000000..b3ecd67
--- /dev/null
+++ b/energy_management_ui/src/views/onlineMonitoring/gatewayMonitoring/index.vue
@@ -0,0 +1,484 @@
+<template>
+  <div>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+     <el-table
+        v-loading="loading"
+        :data="archivesList"
+
+        :height="height"
+      >
+        <el-table-column
+          label="缃戝叧缂栧彿"
+          align="center"
+          prop="gatewayNum"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍘傚尯"
+          align="center"
+          prop="plantArea"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍦扮偣"
+          align="center"
+          prop="address"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鐘舵��"
+          align="center"
+          prop="state"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鏈�鍚庤繛鎺ユ椂闂�"
+          align="center"
+          prop="hbtTime"
+          show-overflow-tooltip
+        />
+
+     </el-table>
+
+      <!-- 娣诲姞鎴栦慨鏀硅澶囨。妗堝璇濇 -->
+      <el-dialog
+        :title="title"
+        :visible.sync="open"
+        width="820px"
+        class="dialog-form-row"
+      >
+        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+          <el-row :gutter="24">
+            <el-col :span="8">
+              <el-form-item label="缃戝叧缂栧彿" prop="gatewayNum">
+                <el-input v-model="form.gatewayNum" placeholder="璇疯緭鍏ョ紪鐮�" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鍘傚尯" prop="plantArea">
+                <el-input
+                  v-model="form.plantArea"
+                  placeholder="璇疯緭鍏ヨ澶囧悕绉�"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鍦板潃" prop="address">
+                <el-input v-model="form.address" placeholder="璇疯緭鍏ヨ澶囧悕绉�" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <div slot="footer" class="dialog-footer" style="padding-top: 5px">
+          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+      <!-- 璁惧妗f 瀵煎叆瀵硅瘽妗� -->
+      <el-dialog
+        :title="upload.title"
+        :visible.sync="upload.open"
+        :destroy-on-close="true"
+        width="400px"
+      >
+        <el-upload
+          ref="upload"
+          :limit="1"
+          :accept="upload.accept"
+          :headers="upload.headers"
+          :action="upload.url"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">
+            灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+            <em>鐐瑰嚮涓婁紶</em>
+          </div>
+          <div class="el-upload__tip" slot="tip">
+            <el-link
+              type="info"
+              style="font-size: 12px; color: blue"
+              @click="importTemplate"
+              >涓嬭浇妯℃澘</el-link
+            >
+          </div>
+          <div class="el-upload__tip" style="color: red" slot="tip">
+            瀵煎叆鎻愮ず锛�<br />1銆佹柊澧炲鍏�,浠呭厑璁稿鍏モ�渪ls鈥濇垨鈥渪lsx鈥濇牸寮忔枃浠讹紒
+            <br />2銆佺紪鐮佸繀椤诲敮涓�,閲嶅鏁版嵁鏃犳硶瀵煎叆
+            <br />3銆佽澶囩绫汇�佷娇鐢ㄥ垎鍘傘�佽兘婧愮瓑绾у~鍐欓敊璇殑鏁版嵁鏃犳硶瀵煎叆
+            <br />4銆佹瀹氬懆鏈熴�佹彁閱掑懆鏈熷ぇ浜�0姝f暣鏁�,濉啓閿欒鍒欓粯璁や负1
+            <br />5銆佽捣濮嬫椂闂村~鍐欓敊璇垨涓嶅~鍒欓粯璁や负绌�
+          </div>
+        </el-upload>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+          <el-button @click="upload.open = false">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+      <importAnnexTable ref="importAnnex" />
+    </basic-container>
+  </div>
+</template>
+<style scoped>
+.el-dialog__body {
+  padding: 10px 10px 10px 10px;
+  color: #606266;
+  font-size: 14px;
+  word-break: break-all;
+}
+</style>
+<script>
+import {
+  getlist
+} from "@/api/onlineMonitoring/index";
+import { getToken } from "@/utils/auth";
+import importAnnexTable from "./importAnnexTable";
+import mixins from "@/layout/mixin/getHeight";
+
+const facilityType = "0";
+const branchFactory = "0";
+const facilityGrade = "0";
+export default {
+  name: "importAnnex",
+  components: { importAnnexTable },
+  mixins: [mixins],
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 缂栫爜閫変腑鏁扮粍
+      codes: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 璁惧妗f琛ㄦ牸鏁版嵁
+      archivesList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭id瀛楀吀
+      idOptions: [],
+      // 缂栫爜瀛楀吀
+      codeOptions: [],
+      // 璁惧鍚嶇О瀛楀吀
+      facilityNameOptions: [],
+      // 璁惧绫诲瀷瀛楀吀
+      facilityTypeOptions: [],
+      // 閲嶇偣璁惧瀛楀吀
+      pointFlagOptions: [],
+      // 浣跨敤鍒嗗巶瀛楀吀
+      branchFactoryOptions: [],
+      // 鐗╃悊浣嶇疆瀛楀吀
+      istallationLocationnOptions: [],
+      // 鑳借�楃瓑绾у瓧鍏�
+      facilityGradeOptions: [],
+      // 棰濆畾鍔熺巼瀛楀吀
+      ratedPowerOptions: [],
+      // 鐢熶骇鏃ユ湡瀛楀吀
+      productionDateOptions: [],
+      // 鎶曡繍鏃ユ湡瀛楀吀
+      putrunDateOptions: [],
+      // 鐢熶骇鍘傚瀛楀吀
+      manufacturerOptions: [],
+      // 璐熻矗浜哄瓧鍏�
+      personChargeOptions: [],
+      // 鎶�鏈弬鏁板瓧鍏�
+      technicalDataOptions: [],
+      // 璧峰鏃堕棿瀛楀吀
+      startTimeOptions: [],
+      // 妫�瀹氬懆鏈熷瓧鍏�
+      checkCycleOptions: [],
+      // 鎻愰啋鍛ㄦ湡瀛楀吀
+      reminderCycleOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 鐩戠悊浜哄瓧鍏�
+      createByOptions: [],
+      // 淇敼鏃堕棿瀛楀吀
+      updateTimeOptions: [],
+      // 淇敼浜哄瓧鍏�
+      updateByOptions: [],
+      upload: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        //涓婁紶鏂囦欢绫诲瀷鎺у埗
+        accept: undefined,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: undefined,
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勮閲忓櫒鍏锋。妗�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: "",
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        branchFactory: undefined,
+        pointFlag: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        manufacturer: undefined,
+        ratedPower: undefined,
+      },
+      height: null,
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        gatewayNum: [{ required: true, message: "缃戝叧缂栧彿涓嶈兘涓虹┖", trigger: "blur" }],
+        plantArea: [
+          { required: true, message: "鍘傚尯涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+        address: [
+          { required: true, message: "鍦板潃涓嶈兘涓虹┖", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  created() {
+    this.getList();
+
+ },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + "px",
+        overflow: "hidden",
+      };
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ璁惧妗f鍒楄〃 */
+    getList() {
+      this.loading = true;
+      getlist().then((response) => {
+        this.archivesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 璁惧绫诲瀷瀛楀吀缈昏瘧
+    facilityTypeFormat(row, column) {
+      return this.selectDictLabel(this.facilityTypeOptions, row.facilityType);
+    },
+    // 浣跨敤鍒嗗巶瀛楀吀缈昏瘧
+    branchFactoryFormat(row, column) {
+      return this.selectDictLabel(this.branchFactoryOptions, row.branchFactory);
+    },
+    // 閲嶇偣璁惧瀛楀吀缈昏瘧
+    pointFlagFactoryFormat(row, column) {
+      return this.selectDictLabel(this.pointFlagOptions, row.pointFlag);
+    },
+    // 鑳借�楃瓑绾у瓧鍏哥炕璇�
+    facilityGradeFormat(row, column) {
+      return this.selectDictLabel(this.facilityGradeOptions, row.facilityGrade);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        facilityName: undefined,
+        facilityType: undefined,
+        branchFactory: undefined,
+        istallationLocationn: undefined,
+        facilityGrade: undefined,
+        ratedPower: undefined,
+        productionDate: undefined,
+        putrunDate: undefined,
+        manufacturer: undefined,
+        personCharge: undefined,
+        technicalData: undefined,
+        startTime: undefined,
+        checkCycle: undefined,
+        reminderCycle: undefined,
+        remark: undefined,
+        createTime: undefined,
+        createBy: undefined,
+        updateTime: undefined,
+        updateBy: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.codes = selection.map((item) => item.code);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞";
+      this.form.facilityGrade = this.facilityGrade;
+      this.form.facilityType = this.facilityType;
+      this.form.branchFactory = this.branchFactory;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      //this.reset();
+      const id = row.id || this.ids;
+       this.form = row;
+        this.open = true;
+        this.title = "淇敼";
+      getArchives(id).then((response) => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateArchives(this.form).then((response) => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addArchives(this.form).then((response) => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const codes = row.code || this.codes;
+      this.$confirm(
+        '鏄惁纭鍒犻櫎?',
+        "璀﹀憡",
+        {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning",
+        }
+      )
+        .then(function () {
+          return delArchives(ids);
+          this.resetForm("queryForm");
+        })
+        .then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(function () {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm("鏄惁纭瀵煎嚭鎵�鏈夎澶囨。妗堟暟鎹」?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(function () {
+          return exportArchives(queryParams);
+        })
+        .then((response) => {
+          this.download(response.msg);
+        })
+        .catch(function () {});
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      //this.$refs.upload.clearFiles();
+      this.upload.title = "璁惧妗f瀵煎叆";
+      this.upload.accept = ".xlsx, .xls";
+      this.upload.url =
+        process.env.VUE_APP_BASE_API +
+        "/facility/archives/imporel-colata?updateSupport=0";
+      this.upload.open = true;
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      importTemplate().then((response) => {
+        this.download(response.msg);
+      });
+    },
+    // 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 鎻愪氦涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportAnnexTable(row) {
+      let facid = row.id;
+      let faccode = row.code;
+      this.$refs.importAnnex.show(facid, faccode);
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+
+.dialog-form-row {
+  .el-row {
+    margin-bottom: 0;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/policy/policyInsert/importFileTable.vue b/energy_management_ui/src/views/policy/policyInsert/importFileTable.vue
new file mode 100644
index 0000000..8c4272e
--- /dev/null
+++ b/energy_management_ui/src/views/policy/policyInsert/importFileTable.vue
@@ -0,0 +1,236 @@
+<template>
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?regulationsId=' + queryParams.regulationsId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+      <el-button slot="trigger" size="small" type="primary">閫夊彇鏂囦欢</el-button>
+      <el-button style="margin-left: 10px;" size="small" type="success" @click="submitFileForm">涓婁紶鍒版湇鍔″櫒</el-button>
+      <div class="el-upload__tip" style="color:red" slot="tip">娉ㄦ剰鎺у埗鏂囦欢澶у皬锛屼笉瑕佽秴杩�50M</div>
+    </el-upload>
+
+    <el-row>
+    <el-table v-loading="loading" :data="annexList">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"/>
+      <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="seeImpFile(scope.row)"
+            v-hasPermi="['policy:annex:assignDownload']"
+          >涓嬭浇</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['policy:annex:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    </el-row>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listAnnex, delAnnex, addAnnex, updateAnnex, exportAnnex } from "@/api/policy/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鏀跨瓥娉曡闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏂囦欢璺緞瀛楀吀
+      filePathOptions: [],
+      // 鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄ゅ瓧鍏�
+      delFlageOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 淇敼鏃ユ湡瀛楀吀
+      updateTimeOptions: [],
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈policy_regulations瀛楀吀
+      regulationsIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏂囦欢鍚庣紑瀛楀吀
+      fileSuffixOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        regulationsId:'',
+        createTime: undefined,
+        fileName: undefined,
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/policy/annex/fileImport"
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "涓婚敭涓嶈兘涓虹┖", trigger: "blur" }
+        ],      }
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+   show(impid) {
+      this.reset();
+      this.queryParams.regulationsId = impid;
+      this.getList();
+      this.title=' 闄勪欢';
+      this.open = true;
+    },
+     /** 鏌ヨ鏀跨瓥娉曡闄勪欢鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        filePath: undefined,
+        delFlage: undefined,
+        createTime: undefined,
+        createOperator: undefined,
+        updateTime: undefined,
+        updateOperator: undefined,
+        id: undefined,
+        regulationsId:undefined,
+        fileName: undefined,
+        fileSuffix: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("form");
+    },
+    /**鍙栨秷*/
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delAnnex(row.id);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/policy/policyInsert/index.vue b/energy_management_ui/src/views/policy/policyInsert/index.vue
new file mode 100644
index 0000000..54133cd
--- /dev/null
+++ b/energy_management_ui/src/views/policy/policyInsert/index.vue
@@ -0,0 +1,396 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form class="special-form" :model="queryParams" ref="queryForm" label-width="72px">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鏍囬" prop="titleName">
+              <el-input
+                  v-model="queryParams.titleName"
+                  placeholder="璇疯緭鍏ユ爣棰�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍐呭" prop="content">
+              <el-input
+                  v-model="queryParams.content"
+                  placeholder="璇疯緭鍏ュ唴瀹�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍒嗙被" prop="sort">
+              <el-select v-model="queryParams.sort" placeholder="璇烽�夋嫨绉嶇被" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in sortOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['policy:policyInsert:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['policy:policyInsert:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['policy:policyInsert:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['policy:policyInsert:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table v-loading="loading" :data="policyInsertList" :height="height" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" show-overflow-tooltip/>
+        <el-table-column label="鏍囬" align="center" prop="titleName" show-overflow-tooltip/>
+        <el-table-column label="鍐呭" align="center" prop="content" show-overflow-tooltip/>
+        <el-table-column label="鍒嗙被" align="center" prop="sort" show-overflow-tooltip/>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="creationTime" width="180" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.creationTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔浜哄憳" align="center" prop="operator" show-overflow-tooltip/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportFileTable(scope.row)"
+                v-hasPermi="['tool:gen:import']"
+            >闄勪欢
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['policy:policyInsert:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['policy:policyInsert:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      /> <!-- 娣诲姞鎴栦慨鏀规斂绛栨硶瑙勭淮鎶ゅ璇濇 -->
+    </basic-container>
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+
+        <el-form-item label="鏍囬" prop="titleName">
+          <el-input v-model="form.titleName" placeholder="璇疯緭鍏ユ爣棰�"/>
+        </el-form-item>
+        <el-form-item label="鍐呭" prop="content">
+          <el-input v-model="form.content" placeholder="璇疯緭鍏ュ唴瀹�"/>
+        </el-form-item>
+        <el-form-item label="鍒嗙被" prop="sort">
+          <el-select v-model="form.sort" placeholder="璇烽�夋嫨绉嶇被">
+            <el-option
+                v-for="dict in sortOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <importFileTable ref="importFile" @ok="handleFjQuery"/>
+  </div>
+</template>
+
+<script>
+import {
+  listPolicyInsert,
+  getPolicyInsert,
+  delPolicyInsert,
+  addPolicyInsert,
+  updatePolicyInsert,
+  exportPolicyInsert
+} from "@/api/policy/policyInsert";
+import {getToken} from "@/utils/auth";
+import importFileTable from "./importFileTable";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "policyInsert",
+  components: {importFileTable},
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      titleNames: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鏀跨瓥娉曡缁存姢琛ㄦ牸鏁版嵁
+      policyInsertList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鍒嗙被瀛楀吀
+      sortOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        titleName: undefined,
+        content: undefined,
+        sort: undefined,
+        creationTime: undefined,
+        operator: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          {required: true, message: "搴忓彿涓嶈兘涓虹┖", trigger: "blur"}
+        ], titleName: [
+          {required: true, message: "鏍囬涓嶈兘涓虹┖", trigger: "blur"}
+        ], content: [
+          {required: true, message: "鍐呭涓嶈兘涓虹┖", trigger: "blur"}
+        ], sort: [
+          {required: true, message: "鍒嗙被涓嶈兘涓虹┖", trigger: "blur"}
+        ], creationTime: [
+          {required: true, message: "鍒涘缓鏃堕棿涓嶈兘涓虹┖", trigger: "blur"}
+        ], operator: [
+          {required: true, message: "鎿嶄綔浜哄憳涓嶈兘涓虹┖", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("policy_sort").then(response => {
+      this.sortOptions = response.data;
+
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ鏀跨瓥娉曡缁存姢鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listPolicyInsert(this.queryParams).then(response => {
+        this.policyInsertList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    // 鍒嗙被瀛楀吀缈昏瘧
+    sortFormat(row, column) {
+      return this.selectDictLabel(this.sortOptions, row.sort);
+    },
+
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        titleName: undefined,
+        content: undefined,
+        sort: undefined,
+        creationTime: undefined,
+        operator: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.titleNames = selection.map(item => item.titleName)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鏀跨瓥娉曡缁存姢";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPolicyInsert(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鏀跨瓥娉曡缁存姢";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updatePolicyInsert(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addPolicyInsert(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const titleNames = row.titleName || this.titleNames;
+      this.$confirm('鏄惁纭鍒犻櫎鏀跨瓥娉曡缁存姢鏍囬涓�"' + titleNames + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delPolicyInsert(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋斂绛栨硶瑙勬煡璇㈡暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportPolicyInsert(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportFileTable(row) {
+      let impid = row.id;
+      this.$refs.importFile.show(impid);
+    },
+    /** 闄勪欢鎼滅储鎸夐挳鎿嶄綔 */
+    handleFjQuery() {
+      // this.queryParams.pageNum = 1;
+      // this.getList();
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form{
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/policy/policySelete/importFileTable.vue b/energy_management_ui/src/views/policy/policySelete/importFileTable.vue
new file mode 100644
index 0000000..9cbba3d
--- /dev/null
+++ b/energy_management_ui/src/views/policy/policySelete/importFileTable.vue
@@ -0,0 +1,227 @@
+<template>
+  <el-dialog :title="title" :visible.sync="open"  :destroy-on-close="true" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鏂囦欢鍚�" prop="fileName">
+        <el-input
+          v-model="queryParams.fileName"
+          placeholder="璇疯緭鍏ユ枃浠跺悕"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-upload
+      ref="upload"
+      :limit="1"
+      :headers="uploadData.headers"
+      :action="uploadData.url + '?regulationsId=' + queryParams.regulationsId"
+      :on-preview="handlePreview"
+      :on-progress="handleFileUploadProgress"
+      :on-success="handleFileSuccess"
+      :auto-upload="false"
+    >
+    </el-upload>
+
+    <el-row>
+    <el-table v-loading="loading" :data="annexList">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName" />
+      <el-table-column label="涓婁紶鏃堕棿" align="center" prop="createTime"/>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="seeImpFile(scope.row)"
+            v-hasPermi="['policy:annex:assignDownload']"
+          >涓嬭浇</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    </el-row>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="handclose">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listAnnex, delAnnex, addAnnex, updateAnnex, exportAnnex } from "@/api/policy/annex";
+import { getToken } from "@/utils/auth";
+const baseURL = process.env.VUE_APP_BASE_API
+// 閫氱敤涓嬭浇鏂规硶
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鏀跨瓥娉曡闄勪欢琛ㄦ牸鏁版嵁
+      annexList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏂囦欢璺緞瀛楀吀
+      filePathOptions: [],
+      // 鍒犻櫎鏍囧織Y鍒犻櫎 N涓哄垹闄ゅ瓧鍏�
+      delFlageOptions: [],
+      // 寤虹珛鏃堕棿瀛楀吀
+      createTimeOptions: [],
+      // 淇敼鏃ユ湡瀛楀吀
+      updateTimeOptions: [],
+      // 涓婚敭瀛楀吀
+      idOptions: [],
+      // 鍏宠仈policy_regulations瀛楀吀
+      regulationsIdOptions: [],
+      // 鏂囦欢鍚嶅瓧鍏�
+      fileNameOptions: [],
+      // 鏂囦欢鍚庣紑瀛楀吀
+      fileSuffixOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        regulationsId:'',
+        createTime: undefined,
+        fileName: undefined,
+      },
+      uploadData: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙璁¢噺鍣ㄥ叿妗f瀵煎叆锛�
+        title: "",
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: "Bearer " + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + "/policy/annex/fileImport"
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "涓婚敭涓嶈兘涓虹┖", trigger: "blur" }
+        ],      }
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show(impid) {
+      this.reset();
+      this.queryParams.regulationsId = impid;
+      this.getList();
+      this.title=' 闄勪欢';
+      this.open = true;
+    },
+    /** 鏌ヨ鏀跨瓥娉曡闄勪欢鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listAnnex(this.queryParams).then(response => {
+        this.annexList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        filePath: undefined,
+        delFlage: undefined,
+        createTime: undefined,
+        createOperator: undefined,
+        updateTime: undefined,
+        updateOperator: undefined,
+        id: undefined,
+        regulationsId:'',
+        fileName: undefined,
+        fileSuffix: undefined
+      };
+      //娓呯┖涓婁紶缁勪欢鐨勬枃浠跺垪琛�
+      this.resetForm("form");
+    },
+    /**鍙栨秷*/
+    handclose()
+    {
+      this.open=false;
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+    seeImpFile(row) {
+      this.fileDownload(row.fileName,row.filePath,false);
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎闄勪欢鍚嶇О涓�"' + row.fileName + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delAnnex(row.id);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    // 闄勪欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.uploadData.isUploading = true;
+    },
+    // 闄勪欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.uploadData.open = false;
+      this.uploadData.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert(response.msg, "闄勪欢缁撴灉", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 闄勪欢涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit();
+    },
+    handlePreview(file) {
+      console.log(file);
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/policy/policySelete/index.vue b/energy_management_ui/src/views/policy/policySelete/index.vue
new file mode 100644
index 0000000..8754c6f
--- /dev/null
+++ b/energy_management_ui/src/views/policy/policySelete/index.vue
@@ -0,0 +1,368 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form class="special-form" :model="queryParams" ref="queryForm" label-width="76px">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鏍囬" prop="titleName">
+              <el-input
+                  v-model="queryParams.titleName"
+                  placeholder="璇疯緭鍏ユ爣棰�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍐呭" prop="content">
+              <el-input
+                  v-model="queryParams.content"
+                  placeholder="璇疯緭鍏ュ唴瀹�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍒嗙被" prop="sort">
+              <el-select v-model="queryParams.sort" placeholder="璇烽�夋嫨绉嶇被" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in sortOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鍒涘缓鏃堕棿" prop="creationTime">-->
+<!--              <el-date-picker clearable size="small" style="width: 100%"-->
+<!--                              v-model="queryParams.creationTime"-->
+<!--                              type="date"-->
+<!--                              value-format="yyyy-MM-dd"-->
+<!--                              placeholder="閫夋嫨鍒涘缓鏃堕棿">-->
+<!--              </el-date-picker>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['policy:policyselete:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table v-loading="loading" :data="policyseleteList" :height="height" :row-class-name="tableRowClassName"
+                @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" show-overflow-tooltip/>
+        <el-table-column label="鏍囬" align="center" prop="titleName" show-overflow-tooltip/>
+        <el-table-column label="鍐呭" align="center" prop="content" show-overflow-tooltip/>
+        <el-table-column label="鍒嗙被" align="center" prop="sort" show-overflow-tooltip/>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="creationTime" width="180" show-overflow-tooltip>
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.creationTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔浜哄憳" align="center" prop="operator" show-overflow-tooltip/>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['policy:policySelete:edit']"
+            >鏌ョ湅
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="openImportFileTable(scope.row)"
+                v-hasPermi="['tool:gen:import']"
+            >闄勪欢
+            </el-button>
+
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀规斂绛栨硶瑙勭淮鎶ゅ璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" disabled="true" label-width="80px">
+
+        <el-form-item label="鏍囬" prop="titleName">
+          <el-input v-model="form.titleName" placeholder="璇疯緭鍏ユ爣棰�"/>
+        </el-form-item>
+        <el-form-item label="鍐呭" prop="content">
+          <el-input v-model="form.content" placeholder="璇疯緭鍏ュ唴瀹�"/>
+        </el-form-item>
+        <el-form-item label="鍒嗙被" prop="sort">
+          <el-select v-model="queryParams.sort" placeholder="璇烽�夋嫨绉嶇被">
+            <el-option
+                v-for="dict in sortOptions"
+                :key="dict.dictValue"
+                :label="dict.dictLabel"
+                :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <importFileTable ref="importFile" @ok="handleFjQuery"/>
+  </div>
+</template>
+
+<script>
+import {
+  listPolicyselete,
+  getPolicyselete,
+  delPolicyselete,
+  addPolicyselete,
+  updatePolicyselete,
+  exportPolicyselete
+} from "@/api/policy/policySelete";
+import {getToken} from "@/utils/auth";
+import importFileTable from "./importFileTable";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "policySelete",
+  components: {importFileTable},
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鏀跨瓥娉曡鏌ヨ琛ㄦ牸鏁版嵁
+      policyseleteList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鍒嗙被瀛楀吀
+      sortOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        titleName: undefined,
+        content: undefined,
+        sort: undefined,
+        creationTime: undefined,
+        operator: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          {required: true, message: "搴忓彿涓嶈兘涓虹┖", trigger: "blur"}
+        ], titleName: [
+          {required: true, message: "鏍囬涓嶈兘涓虹┖", trigger: "blur"}
+        ], content: [
+          {required: true, message: "鍐呭涓嶈兘涓虹┖", trigger: "blur"}
+        ], sort: [
+          {required: true, message: "鍒嗙被涓嶈兘涓虹┖", trigger: "blur"}
+        ], creationTime: [
+          {required: true, message: "鍒涘缓鏃堕棿涓嶈兘涓虹┖", trigger: "blur"}
+        ], operator: [
+          {required: true, message: "鎿嶄綔浜哄憳涓嶈兘涓虹┖", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("policy_sort").then(response => {
+      this.sortOptions = response.data;
+      this.queryParams.sort = this.sortOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    tableRowClassName({row, rowIndex}) {
+      if (row.txflage) {
+        return 'warning-row';
+      }
+      return '';
+    },
+    /** 鏌ヨ鏀跨瓥娉曡鏌ヨ鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listPolicyselete(this.queryParams).then(response => {
+        this.policyseleteList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍒嗙被瀛楀吀缈昏瘧
+    sortFormat(row, column) {
+      return this.selectDictLabel(this.sortOptions, row.sort);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        titleName: undefined,
+        content: undefined,
+        sort: undefined,
+        creationTime: undefined,
+        operator: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鏀跨瓥娉曡鏌ヨ";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getPolicyselete(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "鏌ョ湅鏀跨瓥娉曡淇℃伅";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updatePolicyselete(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addPolicyselete(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鏀跨瓥娉曡鏌ヨ缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delPolicyselete(ids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋斂绛栨硶瑙勬煡璇㈡暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportPolicyselete(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    /** 闄勪欢鎼滅储鎸夐挳鎿嶄綔 */
+    handleFjQuery() {
+      // this.queryParams.pageNum = 1;
+      // this.getList();
+    },
+    /** 鎵撳紑闄勪欢琛ㄥ脊绐� */
+    openImportFileTable(row) {
+      let impid = row.id;
+      this.$refs.importFile.show(impid);
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form{
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/power-statistics-analyse/func/columns.js b/energy_management_ui/src/views/power-statistics-analyse/func/columns.js
new file mode 100644
index 0000000..b86f999
--- /dev/null
+++ b/energy_management_ui/src/views/power-statistics-analyse/func/columns.js
@@ -0,0 +1,62 @@
+export function getColumns(data, energyType,compareTxt, energyTypeOption) {
+    const columns = [];
+    try {
+        columns[0] = {
+            dataIndex: 'unitName',
+            title: '缁勭粐鏈烘瀯鍚嶇О',
+            align: 'center',
+            width: 140,
+        };
+        const energyTypes =
+            energyType === null || energyType === ''
+                ? []
+                : energyType.split('/');
+        let every = {};
+        data[0].children.forEach((e) => {
+            const isHave =
+                energyTypes.length > 0
+                    ? energyTypes.some((item) => item === e.energyType)
+                    : true;
+                
+            if (isHave) {
+                // let unit =  (e.energyUnit?'('+e.energyUnit+')':'')
+                let curEnergy = energyTypeOption.filter(item => {
+                  return item.energyValue === e.energyType
+                })
+                let unit = ''
+                if (curEnergy.length > 0) {
+                  unit = curEnergy[0].energyUnit ? '('+ curEnergy[0].energyUnit +')' : ''
+                }
+                every = {
+                    dataIndex: `${Math.random()}`,
+                    title:e.energyName,
+                    align: 'center',
+                    children: [
+                        {
+                            title: '鏈湡鍊�'+unit,
+                            dataIndex: `currentValue${e.energyType}`,
+                            align: 'center',
+                            width: 100,
+                        },
+                        {
+                            title: '鍚屾湡鍊�'+unit,
+                            dataIndex: `oldValue${e.energyType}`,
+                            align: 'center',
+                            width: 100,
+                        },
+                        {
+                            title: compareTxt+'(%)',
+                            dataIndex: `ratio${e.energyType}`,
+                            align: 'center',
+                            width: 100,
+                        },
+                    ],
+                };
+                columns.push(every);
+            }
+        });
+        return columns;
+    } catch (e) {
+        return [];
+    }
+}
diff --git a/energy_management_ui/src/views/power-statistics-analyse/func/merge-object.js b/energy_management_ui/src/views/power-statistics-analyse/func/merge-object.js
new file mode 100644
index 0000000..6c8abf0
--- /dev/null
+++ b/energy_management_ui/src/views/power-statistics-analyse/func/merge-object.js
@@ -0,0 +1,23 @@
+// 灏嗙浉鍚屽瓧娈祏nitName鐨勫�兼斁鍒板悓涓�鏁扮粍涓�
+export function mergeObject(data) {
+    const arr = [];
+    try {
+        data.forEach((item) => {
+            if (item.dataType !== 1) {
+                for (let i = 0; i < arr.length; i++) {
+                    if (arr[i].unitName === item.unitName) {
+                        arr[i].children.push(item);
+                        return;
+                    }
+                }
+                arr.push({
+                    unitName: item.unitName,
+                    children: [item],
+                });
+            }
+        });
+        return arr;
+    } catch (e) {
+        return [];
+    }
+}
diff --git a/energy_management_ui/src/views/power-statistics-analyse/pari-passu/BarChart.vue b/energy_management_ui/src/views/power-statistics-analyse/pari-passu/BarChart.vue
new file mode 100644
index 0000000..b28189f
--- /dev/null
+++ b/energy_management_ui/src/views/power-statistics-analyse/pari-passu/BarChart.vue
@@ -0,0 +1,220 @@
+<template>
+  <div
+    id="barchartId"
+    :class="className"
+    :style="{ height: height, width: width }"
+  />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+import resize from "../../dashboard/mixins/resize";
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "450px"
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions({ expectedData, actualData, deviceData, ratioData, type } = {}) {
+      this.chart.setOption({
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+            type: "shadow" // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+          },
+          // axisPointer: { animation: false },
+          appendToBody: true,
+          formatter: params => {
+            return (
+              `<div style="text-align:left">` +
+              params[0].marker +
+              params[0].seriesName +
+              `<b style="float: right;margin-left: 10px">` +
+              params[0].value +
+              `</b></div>
+                    <div style="text-align:left">` +
+              params[1].marker +
+              params[1].seriesName +
+              `<b style="float: right">` +
+              params[1].value +
+              `</b></div>
+                    <div style="text-align:left">` +
+              params[2].marker +
+              params[2].seriesName +
+              `<b style="margin-left: 10px; float: right">` +
+              params[2].value +
+              `%</b></div>`
+            );
+          }
+        },
+        legend: {
+          right: 0
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: "10%",
+          top: 30,
+          containLabel: true
+        },
+        xAxis: [
+          {
+            // type: "category",
+            data: deviceData,
+            axisLabel: { interval: 0, rotate: 30 }
+            // axisTick: {
+            //   alignWithLabel: true
+            // }
+          }
+        ],
+        yAxis: [
+          {
+            type: "value",
+            axisTick: {
+              show: false
+            }
+          },
+          {
+            type: "value",
+            min: -100,
+            max: 100,
+            axisLabel: {
+              formatter: "{value}%"
+            }
+          }
+        ],
+        dataZoom: [
+          {
+            startValue: deviceData[0],
+            endValue:
+              deviceData.length > 7
+                ? deviceData[7]
+                : deviceData[deviceData.length - 1]
+          },
+          {
+            type: "inside"
+          }
+        ],
+        series: [
+          {
+            name: "鍚屾湡鍊�",
+            itemStyle: {
+              normal: {
+                color: "#478ef7",
+                lineStyle: {
+                  color: "#478ef7",
+                  width: 2
+                }
+              }
+            },
+            smooth: true,
+            type: "bar",
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: "cubicInOut"
+          },
+          {
+            name: "鏈湡鍊�",
+            itemStyle: {
+              normal: {
+                color: "#62c4c7",
+                lineStyle: {
+                  color: "#62c4c7",
+                  width: 2
+                }
+              }
+            },
+            smooth: true,
+            type: "bar",
+            data: actualData,
+            animationDuration: 2800,
+            animationEasing: "cubicInOut"
+          },
+          {
+            name: type,
+            itemStyle: {
+              normal: {
+                color: "#f08e58",
+                lineStyle: {
+                  color: "#f08e58",
+                  width: 2
+                }
+              }
+            },
+            // smooth: true,
+            type: "line",
+            // animationDuration: 2800,
+            // animationEasing: "cubicInOut",
+            yAxisIndex: 1,
+            // tooltip: {
+            //   valueFormatter: function(value) {
+            //     return value + "%";
+            //   },
+            //   formatter: value => {
+            //     return value + "%";
+            //   }
+            // },
+            tooltip: {
+              valueFormatter: function(value) {
+                return value + " %";
+              }
+            },
+            data: ratioData
+          }
+        ]
+      });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/power-statistics-analyse/pari-passu/LineChart.vue b/energy_management_ui/src/views/power-statistics-analyse/pari-passu/LineChart.vue
new file mode 100644
index 0000000..0a01de0
--- /dev/null
+++ b/energy_management_ui/src/views/power-statistics-analyse/pari-passu/LineChart.vue
@@ -0,0 +1,152 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+import resize from "../../dashboard/mixins/resize";
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "300px"
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions({ expectedData, actualData, title } = {}) {
+      this.chart.setOption({
+        // title: {
+        //   text: title,
+        //   left: "left",
+        //   textStyle: {
+        //     color: "#606266"
+        //   }
+        // },
+        xAxis: {
+          data: [
+            "1鏈�",
+            "2鏈�",
+            "3鏈�",
+            "4鏈�",
+            "5鏈�",
+            "6鏈�",
+            "7鏈�",
+            "8鏈�",
+            "9鏈�",
+            "10鏈�",
+            "11鏈�",
+            "12鏈�"
+          ],
+          type: "category"
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 10,
+          top: 10,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "cross"
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [
+          {
+            name: "鍚屾湡鍊�",
+            itemStyle: {
+              normal: {
+                color: "#FF005A",
+                lineStyle: {
+                  color: "#FF005A",
+                  width: 2
+                }
+              }
+            },
+            smooth: true,
+            type: "line",
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: "cubicInOut"
+          },
+          {
+            name: "鏈湡鍊�",
+            itemStyle: {
+              normal: {
+                color: "#62c4c7",
+                lineStyle: {
+                  color: "#62c4c7",
+                  width: 2
+                }
+              }
+            },
+            smooth: true,
+            type: "line",
+            data: actualData,
+            animationDuration: 2800,
+            animationEasing: "cubicInOut"
+          }
+        ]
+      });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/power-statistics-analyse/pari-passu/index.vue b/energy_management_ui/src/views/power-statistics-analyse/pari-passu/index.vue
new file mode 100644
index 0000000..92444df
--- /dev/null
+++ b/energy_management_ui/src/views/power-statistics-analyse/pari-passu/index.vue
@@ -0,0 +1,421 @@
+<template>
+  <div>
+    <el-row type="flex">
+      <el-col
+        :style="{ width: isCollapse ? '0' : '280px', position: 'relative' }"
+        v-show="!isCollapse"
+      >
+        <basic-container title="鍚屾瘮鍒嗘瀽" :bodyStyle="bodyStyle">
+          <ModelNode
+            ref="modelNode"
+            @changeNode="changeNode"
+            :showOpt="false"
+            :modelCode="modelCode"
+          ></ModelNode>
+        </basic-container>
+        <img
+          src="~@/assets/image/rectangle.png"
+          alt=""
+          class="shrink-col-block"
+          @click="toggleCollapse"
+        />
+      </el-col>
+      <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse" />
+      <el-col
+        :style="{
+          width: isCollapse ? 'calc(100% - 48px)' : 'calc(100% - 280px)',
+          paddingLeft: isCollapse ? 0 : '14px'
+        }"
+      >
+        <div :style="bodyStyleRight">
+          <basic-container class="search-wrapper">
+            <el-radio-group
+              v-model="queryParams.timeType"
+              @change="changeRadio"
+              size="small"
+            >
+              <!-- <el-radio-button label="YEAR">骞�</el-radio-button> -->
+              <el-radio-button label="MONTH">鏈�</el-radio-button>
+              <el-radio-button label="DAY">鏃�</el-radio-button>
+              <!-- <el-radio-button label="HOUR">灏忔椂</el-radio-button> -->
+            </el-radio-group>
+            <el-date-picker
+              clearable
+              size="small"
+              style="width: 200px; margin: 0 10px"
+              v-model="queryParams.dataTime"
+              :type="queryParams.pickerType"
+              :clearable="false"
+              placeholder="閫夋嫨鏃ユ湡"
+              :value-format="valueFormat"
+            >
+            </el-date-picker>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="small"
+              @click="handleQuery"
+              >鏌ヨ</el-button
+            >
+            <el-button icon="el-icon-refresh" size="small" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+            <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="small"
+              @click="handleExport"
+              >瀵煎嚭</el-button
+            >
+          </basic-container>
+          <div class="chart-list">
+            <el-card style="margin-bottom: 12px">
+              <div slot="header" class="clearfix">
+                <span>{{ chartData.title }}({{ chartData.unit }})</span>
+              </div>
+              <div class="chart-wrapper">
+                <bar-chart ref="barChartRef" :chart-data="chartData" />
+              </div>
+            </el-card>
+            <div>
+              <el-table :data="tableData" show-summary height="320px">
+                <el-table-column
+                  prop="energyUnitName"
+                  label="鐢ㄨ兘鍗曞厓"
+                  align="center"
+                  width="150"
+                  show-overflow-tooltip
+                ></el-table-column>
+                <el-table-column
+                  prop="oldValue"
+                  label="鍚屾湡鍊�"
+                  align="center"
+                ></el-table-column>
+                <el-table-column
+                  prop="currentValue"
+                  label="鏈湡鍊�"
+                  align="center"
+                ></el-table-column>
+                <el-table-column prop="ratio" label="鍚屾瘮" align="center">
+                  <template slot-scope="scope">
+                    {{ scope.row.ratio }}%
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {
+  queryDataComparison,
+  exportDataComparison
+} from "@/api/powerAnalyse/index.js";
+import BarChart from "../pari-passu/BarChart.vue";
+import mixins from "@/layout/mixin/getHeight";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import ShrinkCol from "@/components/shrink/index.vue";
+import moment from "moment";
+export default {
+  components: {
+    BarChart,
+    ModelNode,
+    ShrinkCol
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      momentFormat: "yyyy-MM-DD",
+      valueFormat: "yyyy-MM-dd",
+      dateTypeOptions: [],
+      energyList: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        nodeId: "",
+        dataTime: "",
+        pickerType: "date",
+        timeType: "DAY" // YEAR,MONTH,DAY,HOUR
+      },
+      chartData: {
+        expectedData: [],
+        actualData: [],
+        deviceData: [],
+        title: "姘村悓姣斿垎鏋�",
+        type: "鍚屾瘮",
+        unit: ""
+      },
+      tableData: [],
+      modelCode: undefined,
+      isCollapse: false,
+      bodyStyleRight: {},
+      energyType: ""
+    };
+  },
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+    this.energyType = this.$route.query.energyType;
+    this.chartData.title =
+      this.energyType == "water" ? "姘村悓姣斿垎鏋�" : "鐢靛悓姣斿垎鏋�";
+    this.getTime();
+  },
+  methods: {
+    changeRadio(e) {
+      console.log(e);
+      if (e == "YEAR") {
+        this.queryParams.pickerType = "year";
+        this.valueFormat = "yyyy";
+        this.momentFormat = "yyyy";
+      } else if (e == "MONTH") {
+        this.queryParams.pickerType = "month";
+        this.valueFormat = "yyyy-MM";
+        this.momentFormat = "yyyy-MM";
+      } else if (e == "DAY") {
+        this.queryParams.pickerType = "date";
+        this.valueFormat = "yyyy-MM-dd";
+        this.momentFormat = "yyyy-MM-DD";
+      } else {
+        this.queryParams.pickerType = "datetime";
+        this.valueFormat = "yyyy-MM-dd HH";
+        this.momentFormat = "yyyy-MM-DD HH";
+      }
+      this.getTime();
+    },
+    getTime() {
+      if (this.queryParams.timeType !== "HOUR") {
+        this.queryParams.dataTime = moment().format(this.momentFormat);
+      } else {
+        this.queryParams.dataTime = moment().format("yyyy-MM-DD HH");
+      }
+    },
+    getList() {
+      let query = {
+        ...this.queryParams
+      };
+      if (this.queryParams.timeType === "YEAR") {
+        query.beginTime = this.queryParams.dataTime + "-01-01 00:00:00";
+        query.endTime = this.queryParams.dataTime + "-12-31 00:00:00";
+      } else if (this.queryParams.timeType == "MONTH") {
+        query.beginTime = this.queryParams.dataTime + "-01 00:00:00";
+        let paraYear = moment(this.queryParams.dataTime).year();
+        let paraMonth = moment(this.queryParams.dataTime).month();
+        let monthStartDate = new Date(paraYear, paraMonth, 1);
+        let monthEndDate = new Date(paraYear, paraMonth + 1, 1);
+        var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
+        query.endTime = this.queryParams.dataTime + "-" + days + " 00:00:00";
+      } else if (this.queryParams.timeType == "DAY") {
+        query.beginTime = this.queryParams.dataTime + " 00:00:00";
+        query.endTime = this.queryParams.dataTime + " 23:59:59";
+      } else {
+        let dataTime = moment(this.queryParams.dataTime).format(
+          "YYYY-MM-DD HH"
+        );
+        query.beginTime = dataTime + ":00:00";
+        query.endTime = dataTime + ":59:59";
+      }
+      console.log("query", query);
+      queryDataComparison(query, this.energyType, 1).then(res => {
+        if (res.code == 200) {
+          this.tableData = res.data || [];
+          if (res.data && res.data.length) {
+            let expectedData = res.data.map(item => {
+              return item.oldValue;
+            });
+            let actualData = res.data.map(item => {
+              return item.currentValue;
+            });
+            let deviceData = res.data.map(item => {
+              return item.energyUnitName;
+            });
+            let ratioData = res.data.map(item => {
+              return item.ratio;
+            });
+            this.chartData = {
+              ...this.chartData,
+              expectedData,
+              actualData,
+              deviceData,
+              ratioData,
+              unit: res.data[0].unit
+            };
+          }
+        }
+      });
+    },
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + "px";
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 105 + "px"
+      };
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.queryParams.timeType = "DAY";
+      this.queryParams.pickerType = "date";
+      this.valueFormat = "yyyy-MM-dd";
+      this.momentFormat = "yyyy-MM-DD";
+
+      this.getTime();
+      this.handleQuery();
+    },
+
+    changeNode: function(node) {
+      this.queryParams.nodeId = node.id;
+      this.getList();
+    },
+    changeModel: function(item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse;
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      let query = {
+        ...this.queryParams
+      };
+      if (this.queryParams.timeType === "YEAR") {
+        query.beginTime = this.queryParams.dataTime + "-01-01 00:00:00";
+        query.endTime = this.queryParams.dataTime + "-12-31 00:00:00";
+      } else if (this.queryParams.timeType == "MONTH") {
+        query.beginTime = this.queryParams.dataTime + "-01 00:00:00";
+        let paraYear = moment(this.queryParams.dataTime).year();
+        let paraMonth = moment(this.queryParams.dataTime).month();
+        let monthStartDate = new Date(paraYear, paraMonth, 1);
+        let monthEndDate = new Date(paraYear, paraMonth + 1, 1);
+        var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
+        query.endTime = this.queryParams.dataTime + "-" + days + " 00:00:00";
+      } else if (this.queryParams.timeType == "DAY") {
+        query.beginTime = this.queryParams.dataTime + " 00:00:00";
+        query.endTime = this.queryParams.dataTime + " 23:59:59";
+      } else {
+        let dataTime = moment(this.queryParams.dataTime).format(
+          "YYYY-MM-DD HH"
+        );
+        query.beginTime = dataTime + ":00:00";
+        query.endTime = dataTime + ":59:59";
+      }
+      // this.$confirm("鏄惁纭瀵煎嚭?", "璀﹀憡", {
+      //   confirmButtonText: "纭畾",
+      //   cancelButtonText: "鍙栨秷",
+      //   type: "warning"
+      // })
+      //   .then(function() {
+      //     return exportDataComparison(query, this.energyType, 1);
+      //   })
+      //   .then(response => {
+      //     this.download(response.msg);
+      //   })
+      //   .catch(function() {});
+      exportDataComparison(query, this.energyType, 1).then(response => {
+        this.download(response.msg);
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.search-wrapper {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  height: 90px;
+}
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+.el-form-item {
+  margin-bottom: 0;
+}
+.chart-list {
+  margin-top: 16px;
+  ::v-deep .el-card__body {
+    padding: 10px 12px;
+  }
+}
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/power-statistics-analyse/per-passu/index.vue b/energy_management_ui/src/views/power-statistics-analyse/per-passu/index.vue
new file mode 100644
index 0000000..f178e64
--- /dev/null
+++ b/energy_management_ui/src/views/power-statistics-analyse/per-passu/index.vue
@@ -0,0 +1,421 @@
+<template>
+  <div>
+    <el-row type="flex">
+      <el-col
+        :style="{ width: isCollapse ? '0' : '280px', position: 'relative' }"
+        v-show="!isCollapse"
+      >
+        <basic-container title="鐜瘮鍒嗘瀽" :bodyStyle="bodyStyle">
+          <ModelNode
+            ref="modelNode"
+            @changeNode="changeNode"
+            :showOpt="false"
+            :modelCode="modelCode"
+          ></ModelNode>
+        </basic-container>
+        <img
+          src="~@/assets/image/rectangle.png"
+          alt=""
+          class="shrink-col-block"
+          @click="toggleCollapse"
+        />
+      </el-col>
+      <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse" />
+      <el-col
+        :style="{
+          width: isCollapse ? 'calc(100% - 48px)' : 'calc(100% - 280px)',
+          paddingLeft: isCollapse ? 0 : '14px'
+        }"
+      >
+        <div :style="bodyStyleRight">
+          <basic-container class="search-wrapper">
+            <el-radio-group
+              v-model="queryParams.timeType"
+              @change="changeRadio"
+              size="small"
+            >
+              <el-radio-button label="YEAR">骞�</el-radio-button>
+              <el-radio-button label="MONTH">鏈�</el-radio-button>
+              <el-radio-button label="DAY">鏃�</el-radio-button>
+              <!-- <el-radio-button label="HOUR">灏忔椂</el-radio-button> -->
+            </el-radio-group>
+            <el-date-picker
+              clearable
+              size="small"
+              style="width: 200px; margin: 0 10px"
+              v-model="queryParams.dataTime"
+              :type="queryParams.pickerType"
+              :clearable="false"
+              placeholder="閫夋嫨鏃ユ湡"
+              :value-format="valueFormat"
+            >
+            </el-date-picker>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="small"
+              @click="handleQuery"
+              >鏌ヨ</el-button
+            >
+            <el-button icon="el-icon-refresh" size="small" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+            <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="small"
+              @click="handleExport"
+              >瀵煎嚭</el-button
+            >
+          </basic-container>
+          <div class="chart-list">
+            <el-card style="margin-bottom: 12px">
+              <div slot="header" class="clearfix">
+                <span>{{ chartData.title }}({{ chartData.unit }})</span>
+              </div>
+              <div class="chart-wrapper">
+                <bar-chart ref="barChartRef" :chart-data="chartData" />
+              </div>
+            </el-card>
+            <div>
+              <el-table :data="tableData" show-summary height="320px">
+                <el-table-column
+                  prop="energyUnitName"
+                  label="鐢ㄨ兘鍗曞厓"
+                  align="center"
+                  width="150"
+                  show-overflow-tooltip
+                ></el-table-column>
+                <el-table-column
+                  prop="oldValue"
+                  label="鍚屾湡鍊�"
+                  align="center"
+                ></el-table-column>
+                <el-table-column
+                  prop="currentValue"
+                  label="鏈湡鍊�"
+                  align="center"
+                ></el-table-column>
+                <el-table-column prop="ratio" label="鐜瘮" align="center">
+                  <template slot-scope="scope">
+                    {{ scope.row.ratio }}%
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import {
+  queryDataComparison,
+  exportDataComparison
+} from "@/api/powerAnalyse/index.js";
+import BarChart from "../pari-passu/BarChart.vue";
+import mixins from "@/layout/mixin/getHeight";
+import ModelNode from "../../basicsetting/modelNode/modelNode";
+import ShrinkCol from "@/components/shrink/index.vue";
+import moment from "moment";
+export default {
+  components: {
+    BarChart,
+    ModelNode,
+    ShrinkCol
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      momentFormat: "yyyy-MM-DD",
+      valueFormat: "yyyy-MM-dd",
+      dateTypeOptions: [],
+      energyList: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        nodeId: "",
+        dataTime: "",
+        pickerType: "date",
+        timeType: "DAY" // YEAR,MONTH,DAY,HOUR
+      },
+      chartData: {
+        expectedData: [],
+        actualData: [],
+        deviceData: [],
+        title: "姘寸幆姣斿垎鏋�",
+        type: "鐜瘮",
+        unit: ""
+      },
+      tableData: [],
+      modelCode: undefined,
+      isCollapse: false,
+      bodyStyleRight: {},
+      energyType: ""
+    };
+  },
+  created() {
+    this.modelCode = this.$route.query.modelCode;
+    this.energyType = this.$route.query.energyType;
+    this.chartData.title =
+      this.energyType == "water" ? "姘寸幆姣斿垎鏋�" : "鐢电幆姣斿垎鏋�";
+    this.getTime();
+  },
+  methods: {
+    changeRadio(e) {
+      console.log(e);
+      if (e == "YEAR") {
+        this.queryParams.pickerType = "year";
+        this.valueFormat = "yyyy";
+        this.momentFormat = "yyyy";
+      } else if (e == "MONTH") {
+        this.queryParams.pickerType = "month";
+        this.valueFormat = "yyyy-MM";
+        this.momentFormat = "yyyy-MM";
+      } else if (e == "DAY") {
+        this.queryParams.pickerType = "date";
+        this.valueFormat = "yyyy-MM-dd";
+        this.momentFormat = "yyyy-MM-DD";
+      } else {
+        this.queryParams.pickerType = "datetime";
+        this.valueFormat = "yyyy-MM-dd HH";
+        this.momentFormat = "yyyy-MM-DD HH";
+      }
+      this.getTime();
+    },
+    getTime() {
+      if (this.queryParams.timeType !== "HOUR") {
+        this.queryParams.dataTime = moment().format(this.momentFormat);
+      } else {
+        this.queryParams.dataTime = moment().format("yyyy-MM-DD HH");
+      }
+    },
+    getList() {
+      let query = {
+        ...this.queryParams
+      };
+      if (this.queryParams.timeType === "YEAR") {
+        query.beginTime = this.queryParams.dataTime + "-01-01 00:00:00";
+        query.endTime = this.queryParams.dataTime + "-12-31 00:00:00";
+      } else if (this.queryParams.timeType == "MONTH") {
+        query.beginTime = this.queryParams.dataTime + "-01 00:00:00";
+        let paraYear = moment(this.queryParams.dataTime).year();
+        let paraMonth = moment(this.queryParams.dataTime).month();
+        let monthStartDate = new Date(paraYear, paraMonth, 1);
+        let monthEndDate = new Date(paraYear, paraMonth + 1, 1);
+        var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
+        query.endTime = this.queryParams.dataTime + "-" + days + " 00:00:00";
+      } else if (this.queryParams.timeType == "DAY") {
+        query.beginTime = this.queryParams.dataTime + " 00:00:00";
+        query.endTime = this.queryParams.dataTime + " 23:59:59";
+      } else {
+        let dataTime = moment(this.queryParams.dataTime).format(
+          "YYYY-MM-DD HH"
+        );
+        query.beginTime = dataTime + ":00:00";
+        query.endTime = dataTime + ":59:59";
+      }
+      console.log("query", query);
+      queryDataComparison(query, this.energyType, 2).then(res => {
+        if (res.code == 200) {
+          this.tableData = res.data || [];
+          if (res.data && res.data.length) {
+            let expectedData = res.data.map(item => {
+              return item.oldValue;
+            });
+            let actualData = res.data.map(item => {
+              return item.currentValue;
+            });
+            let deviceData = res.data.map(item => {
+              return item.energyUnitName;
+            });
+            let ratioData = res.data.map(item => {
+              return item.ratio;
+            });
+            this.chartData = {
+              ...this.chartData,
+              expectedData,
+              actualData,
+              deviceData,
+              ratioData,
+              unit: res.data[0].unit
+            };
+          }
+        }
+      });
+    },
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + "px";
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 105 + "px"
+      };
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.queryParams.timeType = "DAY";
+      this.queryParams.pickerType = "date";
+      this.valueFormat = "yyyy-MM-dd";
+      this.momentFormat = "yyyy-MM-DD";
+
+      this.getTime();
+      this.handleQuery();
+    },
+
+    changeNode: function(node) {
+      this.queryParams.nodeId = node.id;
+      this.getList();
+    },
+    changeModel: function(item) {
+      this.$refs.modelNode.getList(item);
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse;
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      let query = {
+        ...this.queryParams
+      };
+      if (this.queryParams.timeType === "YEAR") {
+        query.beginTime = this.queryParams.dataTime + "-01-01 00:00:00";
+        query.endTime = this.queryParams.dataTime + "-12-31 00:00:00";
+      } else if (this.queryParams.timeType == "MONTH") {
+        query.beginTime = this.queryParams.dataTime + "-01 00:00:00";
+        let paraYear = moment(this.queryParams.dataTime).year();
+        let paraMonth = moment(this.queryParams.dataTime).month();
+        let monthStartDate = new Date(paraYear, paraMonth, 1);
+        let monthEndDate = new Date(paraYear, paraMonth + 1, 1);
+        var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
+        query.endTime = this.queryParams.dataTime + "-" + days + " 00:00:00";
+      } else if (this.queryParams.timeType == "DAY") {
+        query.beginTime = this.queryParams.dataTime + " 00:00:00";
+        query.endTime = this.queryParams.dataTime + " 23:59:59";
+      } else {
+        let dataTime = moment(this.queryParams.dataTime).format(
+          "YYYY-MM-DD HH"
+        );
+        query.beginTime = dataTime + ":00:00";
+        query.endTime = dataTime + ":59:59";
+      }
+      // this.$confirm("鏄惁纭瀵煎嚭?", "璀﹀憡", {
+      //   confirmButtonText: "纭畾",
+      //   cancelButtonText: "鍙栨秷",
+      //   type: "warning"
+      // })
+      //   .then(function() {
+      //     return exportDataComparison(query, this.energyType, 1);
+      //   })
+      //   .then(response => {
+      //     this.download(response.msg);
+      //   })
+      //   .catch(function() {});
+      exportDataComparison(query, this.energyType, 2).then(response => {
+        this.download(response.msg);
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.search-wrapper {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  height: 90px;
+}
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+.el-form-item {
+  margin-bottom: 0;
+}
+.chart-list {
+  margin-top: 16px;
+  ::v-deep .el-card__body {
+    padding: 10px 12px;
+  }
+}
+.dashboard-editor-container {
+  padding: 32px;
+  background-color: rgb(240, 242, 245);
+  position: relative;
+
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+}
+
+@media (max-width: 1024px) {
+  .chart-wrapper {
+    padding: 8px;
+  }
+}
+
+.live {
+  position: fixed;
+  right: 0px;
+  top: 70px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  width: 100px;
+  height: 60px;
+  background-color: red;
+  animation: fade 600ms infinite;
+  -webkit-animation: fade 600ms infinite;
+}
+
+.live_content {
+  font-size: 18px;
+  color: white;
+  font-weight: bold;
+}
+
+.live_number {
+  font-size: 32px;
+  color: white;
+  font-weight: bolder;
+}
+
+@keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+@-webkit-keyframes fade {
+  from {
+    opacity: 1;
+  }
+  50% {
+    opacity: 0.4;
+  }
+  to {
+    opacity: 1;
+  }
+}
+
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/redirect.vue b/energy_management_ui/src/views/redirect.vue
new file mode 100644
index 0000000..db4c1d6
--- /dev/null
+++ b/energy_management_ui/src/views/redirect.vue
@@ -0,0 +1,12 @@
+<script>
+export default {
+  created() {
+    const { params, query } = this.$route
+    const { path } = params
+    this.$router.replace({ path: '/' + path, query })
+  },
+  render: function(h) {
+    return h() // avoid warning message
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/reportForm/annualReport/index.vue b/energy_management_ui/src/views/reportForm/annualReport/index.vue
new file mode 100644
index 0000000..8576371
--- /dev/null
+++ b/energy_management_ui/src/views/reportForm/annualReport/index.vue
@@ -0,0 +1,168 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑳芥簮绫诲瀷">
+        <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+          <el-option
+            v-for="dict in indexCategoryOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>-->
+      <el-form-item label="缁熻鏃堕棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="year"
+                        value-format="yyyy"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="list" border style="width: 100%; margin-top: 20px" class="tableList" >
+      <el-table-column fixed prop="indexName" align="center" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+      <el-table-column label="1鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value1)}}</template></el-table-column>
+      <el-table-column label="2鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value2)}}</template></el-table-column>
+      <el-table-column label="3鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value3)}}</template></el-table-column>
+      <el-table-column label="4鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value4)}}</template></el-table-column>
+      <el-table-column label="5鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value5)}}</template></el-table-column>
+      <el-table-column label="6鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value6)}}</template></el-table-column>
+      <el-table-column label="7鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value7)}}</template></el-table-column>
+      <el-table-column label="8鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value8)}}</template></el-table-column>
+      <el-table-column label="9鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value9)}}</template></el-table-column>
+      <el-table-column label="10鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value10)}}</template></el-table-column>
+      <el-table-column label="11鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value11)}}</template></el-table-column>
+      <el-table-column label="12鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value12)}}</template></el-table-column>
+    </el-table>
+
+  </div>
+</template>
+
+<script>
+  import { reportStatisticsList,exportList} from "@/api/reportForm/annualReport/annualReport";
+
+  export default {
+    data() {
+      return {
+        list: [],
+        skinName:"",
+        queryParams:{
+          timeType:"MONTH",
+          energyId:undefined,
+          dataTime:undefined,
+          beginTime:undefined,
+          endTime:undefined,
+          indexCode:undefined,
+          indexStorageId:undefined,
+        },
+        indexCategoryOptions:[],
+      };
+    },
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+      /*this.getDicts("report_form").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });*/
+      this.getDicts("energy_type").then(response => {
+        this.indexCategoryOptions = response.data;
+        //this.queryParams.indexStorageId = this.indexCategoryOptions[0].dictValue;
+      });
+      this.getConfigKey("report_statistics").then(response => {
+        this.skinName=response.msg;
+      });
+      this.getTime();
+      this.getList();
+    },
+    methods: {
+      /** 鏌ヨ閮ㄩ棬鍒楄〃 */
+      getList() {
+        //this.loading = true;
+        this.queryParams.indexCode=this.modelCode;
+        let times=this.queryParams.dataTime.slice(0,4);
+        this.queryParams.beginTime=times+"-01-01 00:00:00"
+        this.queryParams.endTime=times+"-12-31 00:00:00"
+        reportStatisticsList(this.queryParams).then(response => {
+          this.list=response.data;
+          this.loading = false;
+        });
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        queryParams.dataTime=queryParams.dataTime+"-01-01";
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋姤琛ㄦ暟鎹�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportList(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      handleTime(date){
+        if(date=='MONTH'){
+          this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+        }else if(date=='DAY'){
+          this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+        }else{
+          this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+        }
+      },
+      getTime(){
+        var date = new Date()
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1
+        var date = date.getDate()
+        month = month < 10 ? '0' + month : month
+        date = date < 10 ? '0' + date : date
+        this.queryParams.dataTime=year + '-' + month
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '' && value !== null) {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '--'
+        }
+        return realVal
+      },
+    }
+  };
+</script>
+<style scoped>
+  .tableList th.is-leaf, .tableList td{
+    border-bottom: 1px solid #000000 !important;
+    border-right: 1px solid #000000 !important;
+  }
+  .tableList{
+    border: 1px solid #000000 !important;
+  }
+</style>
diff --git a/energy_management_ui/src/views/reportForm/consolidatedStatements/index.vue b/energy_management_ui/src/views/reportForm/consolidatedStatements/index.vue
new file mode 100644
index 0000000..18b46ac
--- /dev/null
+++ b/energy_management_ui/src/views/reportForm/consolidatedStatements/index.vue
@@ -0,0 +1,324 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="缁熻鏃堕棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="month"
+                        value-format="yyyy-MM"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="paymentChanges">璁$畻</el-button>
+        <el-button type="primary" icon="el-icon-plus" size="mini" @click="submitForm">淇濆瓨</el-button>
+        <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="el-table el-table--fit el-table--scrollable-x el-table--enable-row-hover el-table--medium" >
+      <div class="el-table__body-wrapper is-scrolling-left">
+        <el-form ref="form" :model="form">
+        <table class="el-table__body tableList" cellspacing="0" cellpadding="0">
+          <tr>
+            <td style="background: rgb(240 242 245);width: 140px">鎶曞叆</td>
+            <td style="background: rgb(240 242 245);width: 140px">鎸囨爣绯绘暟</td>
+            <td style="background: rgb(240 242 245);width: 140px">瀹炵墿閲忥紙t锛�</td>
+            <td style="background: rgb(240 242 245);width: 140px">鎸囨爣鍑嗙叅锛坱锛�</td>
+            <td style="background: rgb(240 242 245);width: 140px">浜у嚭</td>
+            <td style="background: rgb(240 242 245);width: 140px">鎶樻爣绯绘暟</td>
+            <td style="background: rgb(240 242 245);width: 140px">瀹炵墿閲忥紙t锛�</td>
+            <td style="background: rgb(240 242 245);width: 140px">鎶樻爣鍑嗙叅锛坱锛�</td>
+          </tr>
+          <tr>
+            <td>鍏ョ倝绮剧叅</td>
+            <td><el-input type="text" v-model="form.trRljmZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.trRljmSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td ><el-input v-model="form.trRljmZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td>鐒︾偔</td>
+            <td><el-input v-model="form.ccJtZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccJtSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccJtZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+          </tr>
+          <tr>
+            <td>鐢�</td>
+            <td><el-input v-model="form.trDianZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.trDianSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.trDianZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td>鐒︽补</td>
+            <td><el-input v-model="form.ccJyZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccJySwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccJyZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+          </tr>
+          <tr>
+            <td>姘�</td>
+            <td><el-input v-model="form.trShuiZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.trShuiSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.trShuiZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td>绮楄嫰</td>
+            <td><el-input v-model="form.ccCbZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccCbSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccCbZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+          </tr>
+          <tr>
+            <td>钂告苯</td>
+            <td><el-input v-model="form.trZqZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.trZqSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.trZqZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td>鐓ゆ皵</td>
+            <td><el-input v-model="form.ccMqZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccMqSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccMqZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+          </tr>
+          <tr>
+            <td></td>
+            <td></td>
+            <td></td>
+            <td></td>
+            <td>鐢�</td>
+            <td><el-input v-model="form.ccDianZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccDianSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccDianZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+          </tr>
+          <tr>
+            <td></td>
+            <td></td>
+            <td></td>
+            <td></td>
+            <td>钂告苯</td>
+            <td><el-input v-model="form.ccZqZb" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccZqSwl" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+            <td><el-input v-model="form.ccZqZbzm" oninput="value=value.replace(/[^\d.]/g,'')"/></td>
+          </tr>
+          <tr>
+            <td>鍚堣</td>
+            <td colspan ="3"><el-input v-model.number="form.trZbzm" disabled="disabled"/></td>
+            <td></td>
+            <td colspan ="3"><el-input v-model.number="form.ccZbzm" disabled="disabled"/></td>
+          </tr>
+          <tr>
+            <td colspan ="2">鍑�鑰楁爣鐓わ細</td>
+            <td colspan ="2"><el-input v-model.number="form.jhbm" disabled="disabled"/></td>
+            <td colspan ="2">宸ュ簭缁煎悎鑳借�楋細</td>
+            <td colspan ="2"><el-input v-model.number="form.zhnh" disabled="disabled"/></td>
+          </tr>
+        </table>
+        </el-form>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { listConsolidatedStatements, getConsolidatedStatements, delConsolidatedStatements, addConsolidatedStatements, updateConsolidatedStatements, exportConsolidatedStatements } from "@/api/reportForm/consolidatedStatements";
+
+  export default {
+    data() {
+      return {
+        // 閬僵灞�
+        //loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        form: {},
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          dataTime:undefined,
+          timeType:"MONTH",
+        },
+       forms : {
+          id: "",
+          trRljmZb: "",
+          trRljmSwl: "",
+          trRljmZbzm: "",
+          trDianZb: "",
+          trDianSwl: "",
+          trDianZbzm: "",
+          trShuiZb: "",
+          trShuiSwl: "",
+          trShuiZbzm: "",
+          trZqZb: "",
+          trZqSwl: "",
+          trZqZbzm: "",
+          ccJtZb: "",
+          ccJtSwl: "",
+          ccJtZbzm: "",
+          ccJyZb: "",
+          ccJySwl: "",
+          ccJyZbzm: "",
+          ccCbZb: "",
+          ccCbSwl: "",
+          ccCbZbzm: "",
+          ccMqZb: "",
+          ccMqSwl: "",
+          ccMqZbzm: "",
+          ccDianZb: "",
+          ccDianSwl: "",
+          ccDianZbzm: "",
+          ccZqZb: "",
+          ccZqSwl: "",
+          ccZqZbzm: "",
+        },
+      };
+    },
+    created() {
+      this.getList();
+      this.getTime();
+    },
+    methods: {
+      getList() {
+          listConsolidatedStatements(this.queryParams).then(response => {
+            if(response.data.length>0){
+              this.form=response.data[0];
+            }else{
+              this.form=this.forms;
+            }
+        })
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.reset();
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      reset() {
+        this.form = {
+          id: "",
+          trRljmZb: "",
+          trRljmSwl: "",
+          trRljmZbzm: "",
+          trDianZb: "",
+          trDianSwl: "",
+          trDianZbzm: "",
+          trShuiZb: "",
+          trShuiSwl: "",
+          trShuiZbzm: "",
+          trZqZb: "",
+          trZqSwl: "",
+          trZqZbzm: "",
+          ccJtZb: "",
+          ccJtSwl: "",
+          ccJtZbzm: "",
+          ccJyZb: "",
+          ccJySwl: "",
+          ccJyZbzm: "",
+          ccCbZb: "",
+          ccCbSwl: "",
+          ccCbZbzm: "",
+          ccMqZb: "",
+          ccMqSwl: "",
+          ccMqZbzm: "",
+          ccDianZb: "",
+          ccDianSwl: "",
+          ccDianZbzm: "",
+          ccZqZb: "",
+          ccZqSwl: "",
+          ccZqZbzm: "",
+        };
+        this.resetForm("form");
+      },
+      paymentChanges: function() {
+        this.form.trRljmZbzm=parseFloat(this.numFilter(this.form.trRljmZb)) * parseFloat(this.numFilter(this.form.trRljmSwl))
+        this.form.trDianZbzm=parseFloat(this.numFilter(this.form.trDianZb)) * parseFloat(this.numFilter(this.form.trDianSwl))
+        this.form.trShuiZbzm=parseFloat(this.numFilter(this.form.trShuiZb)) * parseFloat(this.numFilter(this.form.trShuiSwl))
+        this.form.trZqZbzm=parseFloat(this.numFilter(this.form.trZqZb)) * parseFloat(this.numFilter(this.form.trZqSwl))
+        this.form.ccJtZbzm=parseFloat(this.numFilter(this.form.ccJtZb)) * parseFloat(this.numFilter(this.form.ccJtSwl))
+        this.form.ccJyZbzm=parseFloat(this.numFilter(this.form.ccJyZb)) * parseFloat(this.numFilter(this.form.ccJySwl))
+        this.form.ccCbZbzm=parseFloat(this.numFilter(this.form.ccCbZb))* parseFloat(this.numFilter(this.form.ccCbSwl))
+        this.form.ccMqZbzm=parseFloat(this.numFilter(this.form.ccMqZb))* parseFloat(this.numFilter(this.form.ccMqSwl))
+        this.form.ccDianZbzm=parseFloat(this.numFilter(this.form.ccDianZb))* parseFloat(this.numFilter(this.form.ccDianSwl))
+        this.form.ccZqZbzm=parseFloat(this.numFilter(this.form.ccZqZb)) * parseFloat(this.numFilter(this.form.ccZqSwl))
+        this.form.trZbzm=parseFloat(this.numFilter(this.form.trRljmZbzm))+parseFloat(this.numFilter(this.form.trDianZbzm))+parseFloat(this.numFilter(this.form.trShuiZbzm))+ parseFloat(this.numFilter(this.form.trZqZbzm))
+        this.form.ccZbzm=parseFloat(this.numFilter(this.form.ccJtZbzm))+parseFloat(this.numFilter(this.form.ccJyZbzm))+parseFloat(this.numFilter(this.form.ccCbZbzm))+parseFloat(this.numFilter(this.form.ccMqZbzm))+parseFloat(this.numFilter(this.form.ccDianZbzm))+ parseFloat(this.numFilter(this.form.ccZqZbzm))
+        this.form.jhbm=parseFloat(this.numFilter(this.form.trZbzm))-parseFloat(this.numFilter(this.form.ccZbzm))
+        this.form.zhnh=parseFloat(this.numFilter(this.form.jhbm)) / parseFloat(this.numFilter(this.form.ccJtSwl))
+      },
+      /** 淇濆瓨鎸夐挳 */
+      submitForm: function() {
+        if (this.form.id != undefined && this.form.id != "" && this.form.id != null) {
+          updateConsolidatedStatements(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("淇敼鎴愬姛");
+              this.getList();
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+        } else {
+          this.form.dataTime=this.queryParams.dataTime
+          addConsolidatedStatements(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("鏂板鎴愬姛");
+              this.getList();
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+        }
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭鎶ヨ〃鏁版嵁?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportConsolidatedStatements(queryParams);
+        }).then(response => {
+          if(response.msg !=="" && response.msg!=null){
+            this.download(response.msg);
+          }else{
+            this.msgSuccess("瀵煎嚭澶辫触鎴栬�呮病鏈夊鍑虹殑鏁版嵁");
+            this.getList();
+          }
+        }).catch(function () {
+        });
+      },
+      getTime(){
+        var date = new Date()
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1
+        var date = date.getDate()
+        month = month < 10 ? '0' + month : month
+        date = date < 10 ? '0' + date : date
+        this.queryParams.dataTime=year + '-' + month
+      },
+      numFilter(value) {
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '' && value !== null) {
+          realVal = value
+        }else{
+          realVal = '0'
+        }
+        return realVal
+      },
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .tableList th.is-leaf, .tableList td{
+    border-bottom: 1px solid #000000 !important;
+    border-right: 1px solid #000000 !important;
+    text-align: center;
+  }
+  .tableList{
+    border: 1px solid #000000 !important;
+  }
+</style>
diff --git a/energy_management_ui/src/views/reportForm/dailyReport/index.vue b/energy_management_ui/src/views/reportForm/dailyReport/index.vue
new file mode 100644
index 0000000..85176c7
--- /dev/null
+++ b/energy_management_ui/src/views/reportForm/dailyReport/index.vue
@@ -0,0 +1,175 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑳芥簮绫诲瀷">
+        <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+          <el-option
+            v-for="dict in indexCategoryOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>-->
+      <el-form-item label="缁熻鏃堕棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button type="warning" icon="el-icon-download" size="mini" v-hasPermi="['report:dailyReport:export']" @click="handleExport">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table :data="list" border style="width: 100%; margin-top: 20px;" class="tableList" >
+      <el-table-column fixed prop="indexName" fixed align="center" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+      <el-table-column label="0鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value0)}}</template></el-table-column>
+      <el-table-column label="1鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value1)}}</template></el-table-column>
+      <el-table-column label="2鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value2)}}</template></el-table-column>
+      <el-table-column label="3鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value3)}}</template></el-table-column>
+      <el-table-column label="4鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value4)}}</template></el-table-column>
+      <el-table-column label="5鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value5)}}</template></el-table-column>
+      <el-table-column label="6鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value6)}}</template></el-table-column>
+      <el-table-column label="7鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value7)}}</template></el-table-column>
+      <el-table-column label="8鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value8)}}</template></el-table-column>
+      <el-table-column label="9鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value9)}}</template></el-table-column>
+      <el-table-column label="10鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value10)}}</template></el-table-column>
+      <el-table-column label="11鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value11)}}</template></el-table-column>
+      <el-table-column label="12鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value12)}}</template></el-table-column>
+      <el-table-column label="13鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value13)}}</template></el-table-column>
+      <el-table-column label="14鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value14)}}</template></el-table-column>
+      <el-table-column label="15鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value15)}}</template></el-table-column>
+      <el-table-column label="16鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value16)}}</template></el-table-column>
+      <el-table-column label="17鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value17)}}</template></el-table-column>
+      <el-table-column label="18鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value18)}}</template></el-table-column>
+      <el-table-column label="19鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value19)}}</template></el-table-column>
+      <el-table-column label="20鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value20)}}</template></el-table-column>
+      <el-table-column label="21鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value21)}}</template></el-table-column>
+      <el-table-column label="22鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value22)}}</template></el-table-column>
+      <el-table-column label="23鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value23)}}</template></el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import { reportStatisticsList,exportList} from "@/api/reportForm/dailyReport/dailyReport";
+
+  export default {
+    data() {
+      return {
+        list: [],
+        skinName:"",
+        queryParams:{
+          timeType:"HOUR",
+          energyId:undefined,
+          dataTime:undefined,
+          beginTime:undefined,
+          endTime:undefined,
+          indexCode:undefined,
+          indexStorageId:undefined,
+        },
+        indexCategoryOptions:[],
+      };
+    },
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+      /*this.getDicts("report_form").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });*/
+      this.getDicts("energy_type").then(response => {
+        this.indexCategoryOptions = response.data;
+        //this.queryParams.indexStorageId = this.indexCategoryOptions[0].dictValue;
+      });
+      this.getConfigKey("report_statistics").then(response => {
+        this.skinName=response.msg;
+      });
+      this.getTime();
+      this.getList();
+    },
+    methods: {
+      /** 鏌ヨ閮ㄩ棬鍒楄〃 */
+      getList() {
+        //this.loading = true;
+        this.queryParams.indexCode=this.modelCode;
+        reportStatisticsList(this.queryParams).then(response => {
+          this.list=response.data;
+          this.loading = false;
+        });
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋姤琛ㄦ暟鎹�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportList(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      handleTime(date){
+        if(date=='MONTH'){
+          this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+        }else if(date=='DAY'){
+          this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+        }else{
+          this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+        }
+      },
+      getTime(){
+        var date = new Date()
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1
+        var date = date.getDate()
+        month = month < 10 ? '0' + month : month
+        date = date < 10 ? '0' + date : date
+        this.queryParams.dataTime=year + '-' + month + '-' + date
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '' && value !== null) {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '--'
+        }
+        return realVal
+      },
+    }
+  };
+</script>
+<style scoped>
+  .tableList th.is-leaf, .tableList td{
+    border-bottom: 1px solid #000000 !important;
+    border-right: 1px solid #000000 !important;
+  }
+  .tableList{
+    border: 1px solid #000000 !important;
+  }
+</style>
diff --git a/energy_management_ui/src/views/reportForm/index.vue b/energy_management_ui/src/views/reportForm/index.vue
new file mode 100644
index 0000000..46df082
--- /dev/null
+++ b/energy_management_ui/src/views/reportForm/index.vue
@@ -0,0 +1,281 @@
+<template>
+  <div class="app-container">
+    <el-table :data="tableData" :span-method="objectSpanMethod" border style="width: 100%; margin-top: 20px">
+      <!--<el-table-column prop="times">
+
+      </el-table-column>-->
+      <el-table-column prop="parentName" label="鑳芥簮鍝佺" min-width="200px"></el-table-column>
+      <el-table-column prop="name" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+      <el-table-column label="1鏈堟妱琛ㄥ��" min-width="140px">
+       <template slot-scope="scope" v-if="scope.row.value1 !=null">
+          {{numFilter(scope.row.value1)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="1鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value13 !=null">
+          {{numFilter(scope.row.value1-scope.row.value13)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value13 ===null &&scope.row.value1 !=null">
+          {{numFilter(scope.row.value1)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="2鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value2 !=null">
+          {{numFilter(scope.row.value2)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="2鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value1 !=null">
+          {{numFilter(scope.row.value2-scope.row.value1)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value1 ==null &&scope.row.value2 !=null">
+          {{numFilter(scope.row.value2)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="3鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value3 !=null">
+          {{numFilter(scope.row.value3)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="3鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value2 !=null">
+          {{numFilter(scope.row.value3-scope.row.value2)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value2 ==null &&scope.row.value3 !=null">
+          {{numFilter(scope.row.value3)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="4鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value4 !=null">
+          {{numFilter(scope.row.value4)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="4鏈堟秷鑰楅噺" min-width="140px">
+          <template slot-scope="scope" v-if="scope.row.value3 !=null">
+            {{numFilter(scope.row.value4-scope.row.value3)}}
+          </template>
+          <template slot-scope="scope" v-if="scope.row.value3 ==null &&scope.row.value4 !=null">
+            {{numFilter(scope.row.value4)}}
+          </template>
+      </el-table-column>
+      <el-table-column label="5鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value5 !=null">
+          {{numFilter(scope.row.value5)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="5鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value4 !=null">
+          {{numFilter(scope.row.value5-scope.row.value4)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value4 ==null &&scope.row.value5 !=null">
+          {{numFilter(scope.row.value5)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="6鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value6 !=null">
+          {{numFilter(scope.row.value6)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="6鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value5 !=null">
+          {{numFilter(scope.row.value6-scope.row.value5)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value5 ==null &&scope.row.value6 !=null">
+          {{numFilter(scope.row.value6)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="7鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value7 !=null">
+          {{numFilter(scope.row.value7)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="7鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value6 !=null">
+          {{numFilter(scope.row.value7-scope.row.value6)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value6 ==null &&scope.row.value7 !=null">
+          {{numFilter(scope.row.value7)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="8鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value8 !=null">
+          {{numFilter(scope.row.value8)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="8鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value7 !=null">
+          {{numFilter(scope.row.value8-scope.row.value7)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value7 ==null &&scope.row.value8 !=null">
+          {{numFilter(scope.row.value8)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="9鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value9 !=null">
+          {{numFilter(scope.row.value9)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="9鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value8 !=null">
+          {{numFilter(scope.row.value9-scope.row.value8)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value8 ==null &&scope.row.value9 !=null">
+          {{numFilter(scope.row.value9)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="10鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value10 !=null">
+          {{numFilter(scope.row.value10)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="10鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value9 !=null">
+          {{numFilter(scope.row.value10-scope.row.value9)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value9 ==null &&scope.row.value10 !=null">
+          {{numFilter(scope.row.value10)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="11鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value11 !=null">
+          {{numFilter(scope.row.value11)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="11鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value10 !=null">
+          {{numFilter(scope.row.value11-scope.row.value10)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value10 ==null &&scope.row.value11 !=null">
+          {{numFilter(scope.row.value11)}}
+        </template>
+      </el-table-column>
+      <el-table-column label="12鏈堟妱琛ㄥ��" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value12 !=null">
+          {{numFilter(scope.row.value12)}}
+        </template>
+      </el-table-column>
+      <el-table-column prop="amount1" label="12鏈堟秷鑰楅噺" min-width="140px">
+        <template slot-scope="scope" v-if="scope.row.value11 !=null">
+          {{numFilter(scope.row.value12-scope.row.value11)}}
+        </template>
+        <template slot-scope="scope" v-if="scope.row.value11 ==null &&scope.row.value12 !=null">
+          {{numFilter(scope.row.value12)}}
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  import { reportFormList} from "@/api/reportForm/reportForm";
+
+  export default {
+    data() {
+      return {
+        tableData: [],
+        date:new Date(),
+        times:"",
+        rowIndex: '-1',
+        OrderIndexArr: [],
+        hoverOrderArr: [],
+        skinName:"",
+        queryParams:{
+          timeDate:"",
+          timeYear:"",
+          code:"",
+          timeType:"DAY",
+        },
+        modelCode:undefined,
+      };
+    },
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+      this.getList();
+      this.getConfigKey("reportd").then(response => {
+        this.skinName=response.msg;
+      });
+    },
+    methods: {
+      /** 鏌ヨ閮ㄩ棬鍒楄〃 */
+      getList() {
+        this.loading = true;
+        this.queryParams.timeDate=this.dateFormat(this.date);
+        this.queryParams.timeYear=(this.dateFormat(this.date)-1)+"-12"
+        this.queryParams.code=this.modelCode;
+        reportFormList(this.queryParams).then(response => {
+          //console.log(response.data);
+          this.tableData=response.data;
+          //this.getOrderNumber();
+          this.loading = false;
+        });
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '') {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = ''
+        }
+        return realVal
+      },
+      getOrderNumber() {
+        let OrderObj = {}
+        this.tableData.forEach((element, index) => {
+          element.rowIndex = index;
+          if (OrderObj[element.parentName]) {
+            OrderObj[element.parentName].push(index)
+          } else {
+            OrderObj[element.parentName] = []
+            OrderObj[element.parentName].push(index)
+          }
+        })
+
+        // 灏嗘暟缁勯暱搴﹀ぇ浜�1鐨勫�� 瀛樺偍鍒皌his.OrderIndexArr锛堜篃灏辨槸闇�瑕佸悎骞剁殑椤癸級
+        for (let k in OrderObj) {
+          if (OrderObj[k].length > 1) {
+            this.OrderIndexArr.push(OrderObj[k])
+          }
+        }
+      },
+      objectSpanMethod({ row, column, rowIndex, columnIndex }) {
+        console.log(row)
+        if (columnIndex === 0) {
+          for (let i = 0; i < this.OrderIndexArr.length; i++) {
+            let element = this.OrderIndexArr[i]
+            for (let j = 0; j < element.length; j++) {
+              let item = element[j]
+              if (rowIndex == item) {
+                if (j == 0) {
+                  return {
+                    rowspan: element.length,
+                    colspan: 1
+                  }
+                } else if (j != 0) {
+                  return {
+                    rowspan: 0,
+                    colspan: 0
+                  }
+                }
+              }
+            }
+          }
+        }
+      },
+      dateFormat(time) {
+        var date=new Date(time);
+        var year=date.getFullYear();
+        /* 鍦ㄦ棩鏈熸牸寮忎腑锛屾湀浠芥槸浠�0寮�濮嬬殑锛屽洜姝よ鍔�0
+         * 浣跨敤涓夊厓琛ㄨ揪寮忓湪灏忎簬10鐨勫墠闈㈠姞0锛屼互杈惧埌鏍煎紡缁熶竴  濡� 09:11:05
+         * */
+        var month= date.getMonth()+1<10 ? "0"+(date.getMonth()+1) : date.getMonth()+1;
+        var day=date.getDate()<10 ? "0"+date.getDate() : date.getDate();
+        var hours=date.getHours()<10 ? "0"+date.getHours() : date.getHours();
+        var minutes=date.getMinutes()<10 ? "0"+date.getMinutes() : date.getMinutes();
+        var seconds=date.getSeconds()<10 ? "0"+date.getSeconds() : date.getSeconds();
+        // 鎷兼帴
+        return year;
+        //return year+"-"+month+"-"+day+" "+hours+":"+minutes+":"+seconds;
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/reportForm/monthlyReport/index.vue b/energy_management_ui/src/views/reportForm/monthlyReport/index.vue
new file mode 100644
index 0000000..b6ce4b8
--- /dev/null
+++ b/energy_management_ui/src/views/reportForm/monthlyReport/index.vue
@@ -0,0 +1,246 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑳芥簮绫诲瀷">
+        <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+          <el-option
+            v-for="dict in indexCategoryOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷">
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>-->
+      <el-form-item label="缁熻鏃堕棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="month"
+                        value-format="yyyy-MM"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>
+      </el-form-item>
+    </el-form>
+    <div class="el-table el-table--fit el-table--scrollable-x el-table--enable-row-hover el-table--medium" >
+      <div class="el-table__body-wrapper is-scrolling-left">
+        <table class="el-table__body tableList" cellspacing="0" cellpadding="0" style="width: 2600px">
+          <thead>
+          <tr v-for="item in tableHead" >
+            <td style="background: #dfe6ec;">鑳芥簮鎸囨爣鍚嶇О</td>
+            <td>{{item.value1}}</td>
+            <td>{{item.value2}}</td>
+            <td>{{item.value3}}</td>
+            <td>{{item.value4}}</td>
+            <td>{{item.value5}}</td>
+            <td>{{item.value6}}</td>
+            <td>{{item.value7}}</td>
+            <td>{{item.value8}}</td>
+            <td>{{item.value9}}</td>
+            <td>{{item.value10}}</td>
+            <td>{{item.value11}}</td>
+            <td>{{item.value12}}</td>
+            <td>{{item.value13}}</td>
+            <td>{{item.value14}}</td>
+            <td>{{item.value15}}</td>
+            <td>{{item.value16}}</td>
+            <td>{{item.value17}}</td>
+            <td>{{item.value18}}</td>
+            <td>{{item.value19}}</td>
+            <td>{{item.value20}}</td>
+            <td>{{item.value21}}</td>
+            <td>{{item.value22}}</td>
+            <td>{{item.value23}}</td>
+            <td>{{item.value24}}</td>
+            <td>{{item.value25}}</td>
+            <td>{{item.value26}}</td>
+            <td>{{item.value27}}</td>
+            <td v-if="item.value29 !=null">{{item.value28}}</td>
+            <td v-if="item.value29 !=null">{{item.value29}}</td>
+            <td v-if="item.value30 !=null">{{item.value30}}</td>
+            <td v-if="item.value31 !=null">{{item.value31}}</td>
+          </tr>
+          </thead>
+          <tbody>
+          <tr v-for="data in tableData">
+            <td>{{data.indexName}}</td>
+            <td>{{numFilter(data.value1)}}</td>
+            <td>{{numFilter(data.value2)}}</td>
+            <td>{{numFilter(data.value3)}}</td>
+            <td>{{numFilter(data.value4)}}</td>
+            <td>{{numFilter(data.value5)}}</td>
+            <td>{{numFilter(data.value6)}}</td>
+            <td>{{numFilter(data.value7)}}</td>
+            <td>{{numFilter(data.value8)}}</td>
+            <td>{{numFilter(data.value9)}}</td>
+            <td>{{numFilter(data.value10)}}</td>
+            <td>{{numFilter(data.value11)}}</td>
+            <td>{{numFilter(data.value12)}}</td>
+            <td>{{numFilter(data.value13)}}</td>
+            <td>{{numFilter(data.value14)}}</td>
+            <td>{{numFilter(data.value15)}}</td>
+            <td>{{numFilter(data.value16)}}</td>
+            <td>{{numFilter(data.value17)}}</td>
+            <td>{{numFilter(data.value18)}}</td>
+            <td>{{numFilter(data.value19)}}</td>
+            <td>{{numFilter(data.value20)}}</td>
+            <td>{{numFilter(data.value21)}}</td>
+            <td>{{numFilter(data.value22)}}</td>
+            <td>{{numFilter(data.value23)}}</td>
+            <td>{{numFilter(data.value24)}}</td>
+            <td>{{numFilter(data.value25)}}</td>
+            <td>{{numFilter(data.value26)}}</td>
+            <td>{{numFilter(data.value27)}}</td>
+            <td v-if="data.count>=28">{{numFilter(data.value28)}}</td>
+            <td v-if="data.count>=29">{{numFilter(data.value29)}}</td>
+            <td v-if="data.count>=30">{{numFilter(data.value30)}}</td>
+            <td v-if="data.count==31">{{numFilter(data.value31)}}</td>
+          </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+  import { reportStatisticsList,exportList} from "@/api/reportForm/monthlyReport/monthlyReport";
+  export default {
+    data() {
+      return {
+        tableData: [],
+        tableHead:[],
+        skinName:"",
+        queryParams:{
+          timeType:"DAY",
+          energyId:undefined,
+          dataTime:undefined,
+          beginTime:undefined,
+          endTime:undefined,
+          indexCode:undefined,
+          indexStorageId:undefined,
+        },
+        indexCategoryOptions:[],
+      };
+    },
+    created() {
+      this.modelCode=this.$route.query.modelCode;
+      /*this.getDicts("report_form").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });*/
+      this.getDicts("energy_type").then(response => {
+        this.indexCategoryOptions = response.data;
+        //this.queryParams.indexStorageId = this.indexCategoryOptions[0].dictValue;
+      });
+      this.getConfigKey("report_statistics").then(response => {
+        this.skinName=response.msg;
+      });
+      this.getTime();
+      this.getList();
+    },
+    methods: {
+      /** 鏌ヨ閮ㄩ棬鍒楄〃 */
+      getList() {
+        //this.loading = true;
+        this.queryParams.indexCode=this.modelCode;
+        reportStatisticsList(this.queryParams).then(response => {
+          console.log(response.data)
+          this.tableData=response.data.tabledata
+          this.tableHead=response.data.tablehead
+          //this.list=response.data;
+          this.loading = false;
+        });
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋姤琛ㄦ暟鎹�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function () {
+          return exportList(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function () {
+        });
+      },
+      handleTime(date){
+        if(date=='MONTH'){
+          this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+        }else if(date=='DAY'){
+          this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+        }else{
+          this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+        }
+      },
+      getTime(){
+        var date = new Date()
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1
+        var date = date.getDate()
+        month = month < 10 ? '0' + month : month
+        date = date < 10 ? '0' + date : date
+        this.queryParams.dataTime=year + '-' + month
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '' && value !== null) {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '--'
+        }
+        return realVal
+      },
+    }
+  };
+</script>
+<style scoped>
+  .tableList th.is-leaf, .tableList td{
+    text-align: center;
+    width:180px !important;
+    border-bottom: 1px solid #000000 !important;
+    border-right: 1px solid #000000 !important;
+  }
+  .tableList{
+    border: 1px solid #000000 !important;
+    max-height: 300px;
+  }
+
+/*  .tableList thead tr > th:first-child,*/
+  .tableList tr > td:first-child {
+    position: sticky;
+    left: 0;
+    z-index: 1;
+    background: #fff;
+    width: 240px;
+  }
+  .tableList thead tr {
+    position: sticky;
+    top: 0;
+    z-index: 2;
+    background: #dfe6ec;
+  }
+</style>
diff --git a/energy_management_ui/src/views/reportForm/statements/BarChart.vue b/energy_management_ui/src/views/reportForm/statements/BarChart.vue
new file mode 100644
index 0000000..d43373c
--- /dev/null
+++ b/energy_management_ui/src/views/reportForm/statements/BarChart.vue
@@ -0,0 +1,110 @@
+<template>
+  <div :class="className" :style="{ height: height, width: width }" />
+</template>
+
+<script>
+import echarts from "echarts";
+require("echarts/theme/macarons"); // echarts theme
+import resize from "../../dashboard/mixins/resize";
+import moment from "moment";
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: "chart"
+    },
+    width: {
+      type: String,
+      default: "100%"
+    },
+    height: {
+      type: String,
+      default: "300px"
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    };
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val);
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+    });
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return;
+    }
+    this.chart.dispose();
+    this.chart = null;
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, "macarons");
+      this.setOptions(this.chartData);
+    },
+    setOptions({ barChartData, dataTime } = {}) {
+      let curYear = moment(dataTime).year();
+      let yearArr = [curYear - 3, curYear - 2, curYear - 1, curYear];
+      let option = {
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            // Use axis to trigger tooltip
+            type: "shadow" // 'shadow' as default; can also be 'line' or 'shadow'
+          }
+        },
+        legend: {},
+        grid: {
+          left: "3%",
+          right: "4%",
+          bottom: "3%",
+          containLabel: true
+        },
+        barWidth: "40%",
+        xAxis: {
+          type: "category",
+          data: yearArr
+        },
+        yAxis: {
+          type: "value"
+        },
+        series: barChartData.map(item => {
+          return {
+            name: item.energyUnit,
+            type: "bar",
+            stack: "total",
+            label: {
+              show: true
+            },
+            emphasis: {
+              focus: "series"
+            },
+            data: item.dataArr
+          };
+        })
+      };
+      this.chart.setOption(option);
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/reportForm/statements/index.vue b/energy_management_ui/src/views/reportForm/statements/index.vue
new file mode 100644
index 0000000..43c53b4
--- /dev/null
+++ b/energy_management_ui/src/views/reportForm/statements/index.vue
@@ -0,0 +1,327 @@
+<template>
+  <div>
+    <div class="dashboard-editor-container">
+      <el-card>
+        <el-form
+          :model="queryParams"
+          ref="queryForm"
+          :inline="true"
+          label-width="68px"
+        >
+          <el-form-item label="鏃ユ湡" label-width="40px">
+            <!-- <el-radio-group v-model="queryParams.timeType">
+              <el-radio
+                style="margin-right: 10px"
+                v-for="dict in dateTypeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictValue"
+                @change="handleTime(dict.dictValue)"
+                >{{ dict.dictLabel }}</el-radio
+              >
+            </el-radio-group> -->
+            <el-date-picker
+              :clearable="false"
+              v-model="queryParams.time"
+              type="month"
+              value-format="yyyy-MM"
+              placeholder="閫夋嫨鏃ユ湡"
+            ></el-date-picker>
+          </el-form-item>
+          <el-form-item label="鑳芥簮鍝佺">
+            <el-select
+              v-model="queryParams.energyType"
+              placeholder="璇烽�夋嫨鑳芥簮"
+              @change="changeEnergyType"
+            >
+              <el-option
+                style="width: 150px"
+                v-for="dict in powerTypeOptions"
+                :key="dict.value"
+                :label="dict.label"
+                :value="dict.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              size="mini"
+              @click="handleQuery"
+              >鏌ヨ</el-button
+            >
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+              >閲嶇疆</el-button
+            >
+            <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="small"
+              @click="htmlToPdf($refs.pdfRef, fileName)"
+              >瀵煎嚭PDF</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </el-card>
+    </div>
+    <div :style="bodyStyle">
+      <div ref="pdfRef" class="pdf-wrapper" style="width: 84%; margin: 0 auto;">
+        <div class="table-wrapper">
+          <el-card>
+            <div slot="header" class="clearfix">
+              <span>鐢▄{ queryParams.energyTypeName }}鎬婚噺</span>
+            </div>
+            <el-table :data="tableData" show-summary>
+              <el-table-column
+                prop="energyUnit"
+                label="鐢ㄨ兘鍗曞厓"
+                align="center"
+                width="150"
+                show-overflow-tooltip
+              ></el-table-column>
+              <el-table-column
+                :prop="item.prop"
+                :label="item.label"
+                align="center"
+                v-for="item in columnsTime"
+                :key="item.prop"
+              ></el-table-column>
+              <!-- <el-table-column prop="yoy" label="鐢ㄨ兘鍗曞厓" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.yoy }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="qoq" label="娑堣�楅噺" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.yoy }}</span>
+              </template>
+            </el-table-column> -->
+            </el-table>
+          </el-card>
+        </div>
+        <el-card style="margin-top: 16px">
+          <div slot="header" class="clearfix">
+            <span>缁煎悎鑳借��</span>
+          </div>
+          <div>
+            <bar-chart
+              ref="barChartRef"
+              :chart-data="{ barChartData, dataTime: queryParams.time }"
+            />
+          </div>
+        </el-card>
+        <el-card style="margin-top: 16px">
+          <div slot="header" class="clearfix">
+            <span>鑳芥簮娑堣�楀崰姣�</span>
+          </div>
+          <div>
+            <pie-chart :chart-data="firstPieData" pieTitle="鑳芥簮娑堣�楀崰姣�" />
+          </div>
+        </el-card>
+        <el-card style="margin-top: 16px">
+          <div slot="header" class="clearfix">
+            <span>璁惧鐢ㄨ兘鍗犳瘮</span>
+          </div>
+          <div>
+            <pie-chart :chart-data="secondPieData" pieTitle="璁惧鐢ㄨ兘鍗犳瘮" />
+          </div>
+        </el-card>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import mixins from "@/layout/mixin/getHeight";
+import PieChart from "../../dashboard/PieChart.vue";
+import LineChart from "../../dashboard/LineChart";
+import BarChart from "./BarChart";
+import {
+  queryComprehensiveList,
+  getEnergyConsumptionRatio,
+  getEnergyUnitConsumptionRatio,
+  queryComprehensiveUnitChart
+} from "@/api/statement/index.js";
+import { listEnergyType } from "@/api/home/home";
+import moment from "moment";
+export default {
+  mixins: [mixins],
+  components: {
+    LineChart,
+    BarChart,
+    PieChart
+  },
+  data() {
+    return {
+      modelCode: "",
+      firstPieData: [],
+      secondPieData: [],
+      barChartData: [],
+      queryParams: {
+        time: "",
+        energyType: "",
+        energyTypeName: ""
+      },
+      powerTypeOptions: [],
+      dateTypes: "month",
+      tableData: [],
+      columnsTime: [],
+      fileName: ""
+    };
+  },
+  created() {
+    this.modelCode = this.$route.query.modelCode || "Home_Cumulative";
+    this.queryParams.time = moment().format("yyyy-MM");
+    this.fileName = moment().format("yyyy骞碝M鏈�") + "缁煎悎鎶ヨ〃";
+
+    this.getColumns();
+    this.getEnergyType();
+  },
+  methods: {
+    changeEnergyType(e) {
+      console.log(e);
+      for (let i = 0; i < this.powerTypeOptions.length; i++) {
+        if (e == this.powerTypeOptions[i].value) {
+          this.queryParams.energyTypeName = this.powerTypeOptions[i].label;
+        }
+      }
+      this.handleQuery();
+    },
+    getColumns() {
+      let currentYear = moment(this.queryParams.time).year();
+      let month = moment(this.queryParams.time).format("MM");
+      let arr = [
+        currentYear - 3 + "-" + month,
+        currentYear - 2 + "-" + month,
+        currentYear - 1 + "-" + month,
+        this.queryParams.time
+      ];
+      this.columnsTime = arr.map(item => {
+        return {
+          label: moment(item).format("yyyy骞碝M鏈�"),
+          prop: moment(item).format("yyyyMM")
+        };
+      });
+    },
+    getList() {
+      this.fileName =
+        moment(this.queryParams.time).format("yyyy骞碝M鏈�") + "缁煎悎鎶ヨ〃";
+      queryComprehensiveList({
+        ...this.queryParams,
+        modeCode: "Home_Cumulative"
+      }).then(res => {
+        this.tableData = res.data.map(item => {
+          return {
+            ...item,
+            [this.columnsTime[0].prop]: item.value4,
+            [this.columnsTime[1].prop]: item.value3,
+            [this.columnsTime[2].prop]: item.value2,
+            [this.columnsTime[3].prop]: item.value
+          };
+        });
+      });
+      queryComprehensiveUnitChart({
+        ...this.queryParams,
+        modeCode: "Home_Equipment"
+      }).then(res => {
+        this.barChartData = res.data.map(item => {
+          return {
+            energyUnit: item.energyUnit,
+            dataArr: [item.value4, item.value3, item.value2, item.value]
+          };
+        });
+      });
+
+      getEnergyConsumptionRatio({
+        ...this.queryParams,
+        modeCode: "Home_Equipment"
+      }).then(res => {
+        this.firstPieData = res.data
+          ? res.data.map(item => {
+              return {
+                name: item.item,
+                value: item.count || 0,
+                unit: item.unit
+              };
+            })
+          : [];
+      });
+
+      getEnergyUnitConsumptionRatio({
+        ...this.queryParams,
+        modeCode: "Home_Equipment"
+      }).then(res => {
+        this.secondPieData = res.data
+          ? res.data.map(item => {
+              return {
+                ...item
+              };
+            })
+          : [];
+      });
+    },
+    getEnergyType() {
+      listEnergyType()
+        .then(res => {
+          if (res.code === 200) {
+            this.powerTypeOptions =
+              res.data.map(item => ({
+                ...item,
+                value: item.energy,
+                label: item.energyName
+              })) || [];
+            this.queryParams.energyType =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].value
+                : "";
+            this.queryParams.energyTypeName =
+              this.powerTypeOptions.length > 0
+                ? this.powerTypeOptions[0].label
+                : "";
+            this.getList();
+          }
+        })
+        .catch(e => {
+          console.log("鑾峰彇鑳芥簮绫诲瀷鍒楄〃", e);
+        });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getColumns();
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.queryParams = {
+        time: moment().format("yyyy-MM")
+      };
+      this.handleQuery();
+    },
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + "px";
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 100 + "px"
+      };
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.dashboard-editor-container {
+  margin-bottom: 16px;
+  ::v-deep {
+    .el-card__body {
+      padding: 20px 12px 0 12px;
+    }
+  }
+  .pdf-wrapper {
+    width: 80%;
+    margin: 0 auto;
+  }
+  .table-wrapper {
+    margin-top: 16px;
+  }
+}
+</style>
diff --git a/energy_management_ui/src/views/reportInfo/index.vue b/energy_management_ui/src/views/reportInfo/index.vue
new file mode 100644
index 0000000..dfe461a
--- /dev/null
+++ b/energy_management_ui/src/views/reportInfo/index.vue
@@ -0,0 +1,384 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="5">
+            <el-form-item label="鏃ユ湡鍒囨崲" prop="enerclassname">
+              <div class="flex-row">
+                <el-button :type="activeDate == 'month' ? 'primary' : ''" size="mini" @click="handleSwitchDate('month')">鏈�</el-button>
+                <el-button :type="activeDate == 'date' ? 'primary' : ''" size="mini" @click="handleSwitchDate('date')">鏃�</el-button>
+              </div>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鏃ユ湡閫夋嫨" prop="enerclassname">
+              <el-date-picker
+                v-if="activeDate == 'month'"
+                v-model="queryParams.dateValue"
+                type="month"
+                size="small"
+                @change="changeDate"
+                placeholder="閫夋嫨鏃ユ湡">
+              </el-date-picker>
+              <el-date-picker
+                v-else
+                v-model="queryParams.dateValue"
+                type="date"
+                size="small"
+                @change="changeDate"
+                placeholder="閫夋嫨鏃ユ湡">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <!-- <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['enerInfoManage:enerclass:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['enerInfoManage:enerclass:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['enerInfoManage:enerclass:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+      </el-row> -->
+      <el-table :height="height" v-loading="loading" :data="reportList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鎸囨爣缂栫爜" align="center" prop="indexCode"/>
+        <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="indexName" show-overflow-tooltip width="200"/>
+        <el-table-column label="涓婃姤鎵�灞炴湡" align="center" prop="timeCode"/>
+        <el-table-column label="涓婃姤鍊�" align="center" prop="value"/>
+        <el-table-column label="鍘熷鍊�" align="center" prop="originValue"/>
+        <el-table-column label="涓婇檺" align="center" prop="reportUpperLimit"/>
+        <el-table-column label="涓婇檺鏇挎崲鍊�" align="center" prop="reportUpperReplace"/>
+        <el-table-column label="涓嬮檺" align="center" prop="reportLowerLimit"/>
+        <el-table-column label="涓嬮檺鏇挎崲鍊�" align="center" prop="reportLowerReplace"/>
+        <!-- <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['enerInfoManage:enerclass:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['enerInfoManage:enerclass:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column> -->
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {
+  govReportList
+} from "@/api/reportInfo/index";
+import mixins from "@/layout/mixin/getHeight";
+import moment from 'moment';
+
+export default {
+  mixins: [mixins],
+  data() {
+    return {
+      activeDate: '',
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鑳芥簮鍝佺璁剧疆琛ㄦ牸鏁版嵁
+      reportList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鑳芥簮绫诲埆ID瀛楀吀
+      enerclassidOptions: [],
+      // 鑳芥簮绫诲埆鍚嶇О瀛楀吀
+      enerclassnameOptions: [],
+      // 鎿嶄綔浜哄瓧鍏�
+      oprManOptions: [],
+      // 鎿嶄綔鏃堕棿瀛楀吀
+      oprTimeOptions: [],
+      // 鏇存柊浜哄瓧鍏�
+      modManOptions: [],
+      // 鏇存柊鏃堕棿瀛楀吀
+      modTimeOptions: [],
+      // 澶囨敞瀛楀吀
+      noteOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dateValue: '',
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        enerclassname: [
+          {required: true, message: "鑳芥簮绫诲埆鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    handleSwitchDate(type) {
+      this.activeDate = type
+      if (type == 'month') {
+        this.queryParams.dateValue = moment(new Date()).format('YYYY-MM')
+      } else {
+        this.queryParams.dateValue = moment(new Date()).format('YYYY-MM-DD')
+      }
+      this.getList();
+    },
+    changeDate(e) {
+      console.log(e)
+      // if (e == null) {
+      //   this.queryParams.dateValue = ''
+      // }
+      this.getList();
+    },
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 320;
+    },
+    getList() {
+      this.loading = true;
+      let timeCode = ''
+      if (this.activeDate && this.queryParams.dateValue){
+        timeCode = this.activeDate == 'month' ? moment(this.queryParams.dateValue).format('YYYYMM') 
+          : (this.activeDate == 'date' ? moment(this.queryParams.dateValue).format('YYYYMMDD') : '')
+      } else {
+        timeCode = this.queryParams.dateValue ? moment(this.queryParams.dateValue).format('YYYYMMDD') : ''
+      }
+      govReportList({
+        ...this.queryParams,
+        timeCode,
+        timeType: this.activeDate == 'month' ? 'MONTH' : (this.activeDate == 'date' ? 'DAY' : '')
+      }).then(response => {
+        this.reportList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鑳芥簮绫诲埆ID瀛楀吀缈昏瘧
+    enerclassidFormat(row, column) {
+      return this.selectDictLabel(this.enerclassidOptions, row.enerclassid);
+    },
+    // 鑳芥簮绫诲埆鍚嶇О瀛楀吀缈昏瘧
+    enerclassnameFormat(row, column) {
+      return this.selectDictLabel(this.enerclassnameOptions, row.enerclassname);
+    },
+    // 鎿嶄綔浜哄瓧鍏哥炕璇�
+    oprManFormat(row, column) {
+      return this.selectDictLabel(this.oprManOptions, row.oprMan);
+    },
+    // 鎿嶄綔鏃堕棿瀛楀吀缈昏瘧
+    oprTimeFormat(row, column) {
+      return this.selectDictLabel(this.oprTimeOptions, row.oprTime);
+    },
+    // 鏇存柊浜哄瓧鍏哥炕璇�
+    modManFormat(row, column) {
+      return this.selectDictLabel(this.modManOptions, row.modMan);
+    },
+    // 鏇存柊鏃堕棿瀛楀吀缈昏瘧
+    modTimeFormat(row, column) {
+      return this.selectDictLabel(this.modTimeOptions, row.modTime);
+    },
+    // 澶囨敞瀛楀吀缈昏瘧
+    noteFormat(row, column) {
+      return this.selectDictLabel(this.noteOptions, row.note);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        enerclassid: undefined,
+        enerclassname: undefined,
+        oprMan: undefined,
+        oprTime: undefined,
+        modMan: undefined,
+        modTime: undefined,
+        note: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.dateValue = ''
+      this.activeDate = ''
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.enerclassid)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鑳芥簮鍝佺璁剧疆";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const enerclassid = row.enerclassid || this.ids
+      getEnerclass(enerclassid).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑳芥簮鍝佺璁剧疆";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.enerclassid != undefined) {
+            updateEnerclass(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnerclass(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const enerclassname = row.enerclassname || this.enerclassname;
+      const enerclassids = row.enerclassid || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鑳芥簮绫诲瀷鍚嶇О涓�"' + enerclassname + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delEnerclass(enerclassids);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎兘婧愬搧绉嶈缃暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportEnerclass(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+.flex-row {
+  display: flex;
+  justify-content: flex-start;
+  align-items: center;
+  height: 36px;
+  // span {
+  //   display: inline-block;
+  //   background: #333;
+  //   color: #fff;
+  //   width: 60px;
+  //   height: 40px;
+  // }
+}
+</style>
diff --git a/energy_management_ui/src/views/reportSet/cjdIndex.vue b/energy_management_ui/src/views/reportSet/cjdIndex.vue
new file mode 100644
index 0000000..4c3a339
--- /dev/null
+++ b/energy_management_ui/src/views/reportSet/cjdIndex.vue
@@ -0,0 +1,271 @@
+<template>
+  <div class="app-container item-style" style="padding:0">
+
+    <!--琛ㄦ牸-->
+    <el-form :rules="model.rules" :model="model" ref="form">
+      <el-table v-loading="loading" :data="model.energyindexList"  height="570">
+        <el-table-column label="琛ㄥ叿鍚嶇О" align="center" prop="meterName"/>
+        <el-table-column label="閲囬泦鐐瑰悕绉�" align="center" prop="indexName"/>
+        <el-table-column label="閲囬泦鐐圭紪鐮�" align="center" prop="indexCode"/>
+        <el-table-column label="鎿嶄綔" align="center" >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="setting(scope.row)"
+              v-hasPermi="['basicsetting:template:edit']"
+            >璁剧疆
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!--鎶ヨ鐣岄潰start-->
+    <el-dialog :title="settingModel.title" :visible.sync="settingModel.open" width="800px" :close-on-click-modal="false"
+               @close='closeYjDialog'>
+      <el-form ref="settingForm" :model="settingModel" :rules="settingModel.rules" label-width="80px">
+        <el-table v-loading="loading" :data="settingModel.settingOptions" border >
+          <el-table-column label="鏃堕棿绫诲瀷" align="center" prop="dateTypeShow"/>
+          <el-table-column label="涓婇檺鍊�" align="center" prop="limitValUp" >
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitValUp" size="small" controls-position="right" placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="涓婇檺鏇挎崲鍊�" align="center" prop="limitReplaceValUp" >
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitReplaceValUp" size="small" controls-position="right" placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="涓嬮檺鍊�" align="center" prop="limitValDown" >
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitValDown" size="small" controls-position="right" placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="涓嬮檺鏇挎崲鍊�" align="center" prop="limitReplaceValDown" >
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitReplaceValDown" size="small" controls-position="right" placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="settingSubmitForm">纭� 瀹�</el-button>
+        <el-button @click="yjSetCancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!--棰勮鐣岄潰end-->
+  </div>
+</template>
+
+<script>
+import {
+  listSet,
+  getSettingIndex,
+  updateDialogForm,
+} from "@/api/reportSet/index"
+import {listLimitType} from "@/api/basicsetting/limitType"
+
+const myModelNode = undefined;
+export default {
+  name: 'EnergyIndex',
+  data() {
+    const checkNum = (rule, value, callback) => {
+      let reg = /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/;
+      if (!reg.test(value) && value != "") {
+        callback(new Error('鏁板瓧鍙�2浣嶅皬鏁�'));
+      } else {
+        callback();
+      }
+    };
+    return {
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      //table
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        supplier2: "",
+        type: "",
+        desc: "",
+        input: "",
+        min: "",
+        max: ""
+      },
+      //閰嶇疆琛ㄤ娇鐢ㄦā鍨�
+      settingModel: {
+        title: "",
+        open: false,
+        settingOptions: [
+          // {
+          //   interval:",
+          //   limit:"",
+          //   limit_value:"",
+          // },
+        ],
+        // 鏃舵鏁扮粍
+        timeSlotOptions: [],
+        limitTypeOptions: [],
+        //鎶ヨ绾у埆
+        alarmLevelOptions: [],
+        //鍝嶅簲
+        resposeList: [],
+        stateById: "",
+        rules: {
+          numRule: [
+            {type: "number", validator: checkNum, trigger: "change"},
+          ],
+        },
+      },
+      model: {
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        energyindexList: [],
+        rules: {
+          numRule: [
+            {type: "number", validator: checkNum, trigger: "change"},
+            // {pattern: /^\d+(\.\d{0,2})?$/, message: '鏁板瓧鍙�2浣嶅皬鏁�', trigger: "change"}
+          ],
+        },
+      },
+      //涓昏〃閫変腑鐨勫惎鍋滅姸鎬佹暟缁�
+      startStopOptions: [],
+
+      editModeEnabled: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      indexIdOptions: [],
+      // 鎸囨爣鍚嶇О瀛楀吀
+      nameOptions: [],
+      // 鎸囨爣缂栫爜瀛楀吀
+      codeOptions: [],
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+      indexCategoryOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 鍗曚綅瀛楀吀
+      unitIdOptions: [],
+      //鎶ヨ绾у埆
+      alarmLevel: "",
+      // 榛樿鍊�
+      dictDefaultVal: undefined,
+      // 鏌ヨ鍙傛暟
+      hbCount: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        code: undefined,
+        indexCategory: undefined,
+        nodeId: undefined,
+        //鎸囨爣index
+        indexType: "COLLECT"
+      },
+      currentNode: undefined,
+      indexCategoryDefaultVal: undefined,
+      unitDefaultVal: undefined
+    };
+  },
+  created() {
+    this.getDicts("warn_time_slot").then(response => {
+      this.settingModel.timeSlotOptions = response.data;
+    });
+    listLimitType(this.queryParams).then(response => {
+      this.hbCount = response.rows.length;
+      this.settingModel.limitTypeOptions = response.rows;
+    });
+    this.getDicts("alarm_type").then(response => {
+      this.settingModel.alarmTypeOptions = response.data;
+    });
+    this.getDicts("alarm_level").then(response => {
+      this.settingModel.alarmLevelOptions = response.data;
+      this.dictDefaultVal = this.settingModel.alarmLevelOptions.find(f => f.isDefault === 'Y');
+    });
+  },
+  methods: {
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    setModelNode(modelNode) {
+      this.myModelNode = modelNode;
+      this.currentNode = modelNode;
+      this.getList();
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList() {
+      if (this.myModelNode) {
+        this.loading = true;
+        this.queryParams.nodeId = this.myModelNode.id;
+        //鎺ュ彛
+        getSettingIndex(this.queryParams).then(response => {
+          this.model.energyindexList = response.data;
+          this.total = response.total;
+          this.loading = false;
+        });
+      } else {
+        this.energyindexList = [];
+      }
+    },
+    yjSetCancel() {
+      this.settingModel.open = false;
+      this.settingModel.settingOptions = [];
+    },
+    //缂栬緫
+    setting(e) {
+      listSet({indexId: e.indexId, nodeId: this.currentNode.id}).then(response => {
+        this.settingModel.settingOptions = response.rows;
+        this.settingModel.open = true;
+        this.settingModel.title = "鎸囨爣缂栧彿锛�" + e.indexCode;
+      });
+    },
+    //琛ㄥ崟鎻愪氦
+    settingSubmitForm() {
+      console.log(JSON.stringify(this.settingModel.settingOptions));
+      this.$refs["settingForm"].validate(valid => {
+        if (valid) {
+          updateDialogForm(this.settingModel.settingOptions || "").then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.settingModel.settingOptions = [];
+              this.settingModel.open = false;
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+          this.settingModel.open = false;
+        }
+      });
+    },
+    closeYjDialog() {
+      this.settingModel.settingOptions = [];
+      return false;
+    },
+  }
+};
+</script>
+<style>
+.item-style .el-form-item__content {
+  margin-left: 0px !important;
+}
+</style>
diff --git a/energy_management_ui/src/views/reportSet/index.vue b/energy_management_ui/src/views/reportSet/index.vue
new file mode 100644
index 0000000..c81ae17
--- /dev/null
+++ b/energy_management_ui/src/views/reportSet/index.vue
@@ -0,0 +1,79 @@
+<template>
+  <el-row type="flex">
+    <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+      <basic-container title="涓婃姤璁剧疆" :bodyStyle="bodyStyle">
+        <ModelNode ref="modelNode" @changeNode="changeNode"
+                   :modelCode="modelCode"
+                   :showOpt="false"/>
+      </basic-container>
+      <img src="~@/assets/image/rectangle.png" alt=""
+           class="shrink-col-block"
+           @click="toggleCollapse">
+    </el-col>
+    <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+    <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+      <basic-container :title="currentNode ? currentNode.label+'--閰嶇疆' : '閰嶇疆'" :bodyStyle="bodyStyleRight">
+        <WarnSetting ref="WarnSetting"/>
+      </basic-container>
+    </el-col>
+  </el-row>
+
+</template>
+
+<script>
+import WarnSetting from './modelWarnSetting'
+import ModelNode from '../basicsetting/modelNode/modelNode'
+import mixins from '@/layout/mixin/getHeight'
+import ShrinkCol from '@/components/shrink/index'
+
+export default {
+  components: { WarnSetting, ModelNode, ShrinkCol },
+  created() {
+    this.modelCode = this.$route.query.modelCode
+  },
+  mixins: [mixins],
+  data() {
+    return {
+      modelData: '',
+      modelInfoOptions: [],
+      modelCode: undefined,
+      isCollapse: false,
+      bodyStyleRight: {},
+      currentNode: ''
+    }
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle.height = window.innerHeight - 155 + 'px'
+      this.bodyStyleRight = {
+        ...this.bodyStyle,
+        height: window.innerHeight - 155 + 'px'
+      }
+    },
+    changeNode: function(node) {
+      if (node) {
+        this.currentNode = node
+      }
+      this.$refs.WarnSetting.modelNodeChange(node)
+    },
+    manageModel: function() {
+      this.$router.push('/model')
+    },
+    changeModel: function(item) {
+      this.$refs.modelNode.getList(item)
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/reportSet/modelWarnSetting.vue b/energy_management_ui/src/views/reportSet/modelWarnSetting.vue
new file mode 100644
index 0000000..c0d8af8
--- /dev/null
+++ b/energy_management_ui/src/views/reportSet/modelWarnSetting.vue
@@ -0,0 +1,67 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-tabs>
+<!--      <el-tab-pane :disabled="disabledSetting">-->
+<!--        <span slot="label"><i class="el-icon-setting"></i> 閲囬泦鐐圭鐞�</span>-->
+<!--        <cjdIndex ref="cjdIndex"></cjdIndex>-->
+<!--      </el-tab-pane>-->
+      <el-tab-pane :disabled="disabledSetting">
+        <span slot="label"><i class="el-icon-setting"></i> 缁熻鎸囨爣绠$悊</span>
+        <zbIndex ref="zbIndex"></zbIndex>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import zbIndex from "./zbIndex";
+import cjdIndex from "./cjdIndex";
+
+export default {
+  name: "modelWarnSetting",
+  components: {zbIndex, cjdIndex},
+  data() {
+    return {
+      currentNode: '',
+      deviceDialog: false,
+      energyDialog: false,
+      productDialog: false,
+      collectIndexDialog: false,
+      indexLoading: false,
+      deviceLoading: false,
+      energyLoading: false,
+      productLoading: false,
+      settingEnergyList: [],
+      settingDeviceList: [],
+      settingProductList: [],
+      settingIndexList: [],
+      disabledSetting: true
+    }
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.settingDeviceList = [];
+      this.settingIndexList = [];
+      this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+      this.$refs.zbIndex.setModelNode(modelNode);
+      this.$refs.cjdIndex.setModelNode(modelNode);
+      if (modelNode) {
+        this.currentNode = modelNode;
+
+      }
+    },
+    collectIndexSetting() {
+      this.collectIndexDialog = true;
+    },
+    showCollectIndexDialog() {
+      this.$nextTick(() => {
+        this.$refs.collectIndexSetting.init(this.currentNode, this.settingIndexList);
+      })
+    },
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/energy_management_ui/src/views/reportSet/zbIndex.vue b/energy_management_ui/src/views/reportSet/zbIndex.vue
new file mode 100644
index 0000000..df98eb8
--- /dev/null
+++ b/energy_management_ui/src/views/reportSet/zbIndex.vue
@@ -0,0 +1,443 @@
+<template>
+  <div class="app-container item-style" style="padding:0">
+
+    <!--琛ㄦ牸-->
+    <el-form :rules="model.rules" :model="model" ref="form">
+      <el-table v-loading="loading" :data="model.energyindexList" height="570">
+        <!--        <el-table-column label="琛ㄥ叿鍚嶇О" align="center" prop="meterName"/>-->
+        <el-table-column label="鎸囨爣鐐瑰悕绉�" align="center" prop="indexName"/>
+        <el-table-column label="鎸囨爣鐐圭紪鐮�" align="center" prop="indexCode"/>
+        <el-table-column label="闄愬�煎惎鐢ㄧ姸鎬�" align="center">
+          <template slot-scope="scope">
+            <el-switch
+              v-model="scope.row.enableLimitValue"
+              @change="updateStatus(scope.row)"
+              active-text="鍚敤"
+              inactive-text="绂佺敤">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              @click="setting(scope.row)"
+              v-hasPermi="['basicsetting:template:edit']"
+            >璁剧疆
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!--鎶ヨ鐣岄潰start-->
+    <el-dialog :title="settingModel.title" :visible.sync="settingModel.open" width="800px" :close-on-click-modal="false"
+               @close='closeYjDialog'>
+      <el-form ref="settingForm" :model="settingModel" :rules="settingModel.rules" label-width="80px">
+        <el-table v-loading="loading" :data="settingModel.settingOptions" border>
+          <el-table-column label="鏃堕棿绫诲瀷" align="center" prop="dateTypeShow"/>
+          <el-table-column label="涓婇檺鍊�" align="center" prop="limitValUp">
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitValUp" size="small" controls-position="right" placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="涓婇檺鏇挎崲鍊�" align="center" prop="limitReplaceValUp">
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitReplaceValUp" size="small" controls-position="right"
+                               placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="涓嬮檺鍊�" align="center" prop="limitValDown">
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitValDown" size="small" controls-position="right"
+                               placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="涓嬮檺鏇挎崲鍊�" align="center" prop="limitReplaceValDown">
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.limitReplaceValDown" size="small" controls-position="right"
+                               placeholder="璇疯緭鍏ュ��"
+                               clearable></el-input-number>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="settingSubmitForm">纭� 瀹�</el-button>
+        <el-button @click="yjSetCancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!--棰勮鐣岄潰end-->
+  </div>
+</template>
+
+<script>
+import {
+  listSet,
+  getSettingIndex,
+  updateDialogForm,
+  updateEnableStatus
+} from "@/api/reportSet/index"
+import {listLimitType} from "@/api/basicsetting/limitType"
+
+const myModelNode = undefined;
+export default {
+  name: 'EnergyIndex',
+  data() {
+    const checkNum = (rule, value, callback) => {
+      let reg = /(^([-]?)[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^([-]?)(0){1}$)|(^([-]?)[0-9]\.[0-9]([0-9])?$)/;
+      if (!reg.test(value) && value != "") {
+        callback(new Error('鏁板瓧鍙�2浣嶅皬鏁�'));
+      } else {
+        callback();
+      }
+    };
+    return {
+      // 閬僵灞�
+      loading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      names: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      //table
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        supplier2: "",
+        type: "",
+        desc: "",
+        input: "",
+        min: "",
+        max: ""
+      },
+      //閰嶇疆琛ㄤ娇鐢ㄦā鍨�
+      settingModel: {
+        title: "",
+        open: false,
+        settingOptions: [
+          // {
+          //   interval:",
+          //   limit:"",
+          //   limit_value:"",
+          // },
+        ],
+        // 鏃舵鏁扮粍
+        timeSlotOptions: [],
+        limitTypeOptions: [],
+        //鎶ヨ绾у埆
+        alarmLevelOptions: [],
+        //鍝嶅簲
+        resposeList: [],
+        stateById: "",
+        rules: {
+          numRule: [
+            {type: "number", validator: checkNum, trigger: "change"},
+          ],
+        },
+      },
+      model: {
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        energyindexList: [],
+        rules: {
+          numRule: [
+            {type: "number", validator: checkNum, trigger: "change"},
+            // {pattern: /^\d+(\.\d{0,2})?$/, message: '鏁板瓧鍙�2浣嶅皬鏁�', trigger: "change"}
+          ],
+        },
+      },
+      //涓昏〃閫変腑鐨勫惎鍋滅姸鎬佹暟缁�
+      startStopOptions: [],
+
+      editModeEnabled: true,
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 涓婚敭瀛楀吀
+      indexIdOptions: [],
+      // 鎸囨爣鍚嶇О瀛楀吀
+      nameOptions: [],
+      // 鎸囨爣缂栫爜瀛楀吀
+      codeOptions: [],
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+      indexCategoryOptions: [],
+      // 澶囨敞瀛楀吀
+      remarkOptions: [],
+      // 鍗曚綅瀛楀吀
+      unitIdOptions: [],
+      //鎶ヨ绾у埆
+      alarmLevel: "",
+      // 榛樿鍊�
+      dictDefaultVal: undefined,
+      // 鏌ヨ鍙傛暟
+      hbCount: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: undefined,
+        code: undefined,
+        indexCategory: undefined,
+        nodeId: undefined,
+        //鎸囨爣index
+        indexType: "STATISTIC"
+      },
+      currentNode: undefined,
+      indexCategoryDefaultVal: undefined,
+      unitDefaultVal: undefined
+    };
+  },
+  created() {
+    // this.getList();
+    this.getDicts("warn_time_slot").then(response => {
+      this.settingModel.timeSlotOptions = response.data;
+    });
+    listLimitType(this.queryParams).then(response => {
+      this.hbCount = response.rows.length;
+      this.settingModel.limitTypeOptions = response.rows;
+    });
+    this.getDicts("alarm_type").then(response => {
+      this.settingModel.alarmTypeOptions = response.data;
+    });
+    this.getDicts("alarm_level").then(response => {
+      this.settingModel.alarmLevelOptions = response.data;
+      this.dictDefaultVal = this.settingModel.alarmLevelOptions.find(f => f.isDefault === 'Y');
+    });
+  },
+  methods: {
+    updateStatus(row) {
+      console.log(row);
+      const that = this
+      updateEnableStatus({
+        nodeId: this.currentNode.id,
+        indexId: row.indexId,
+        enableStatus: row.enableLimitValue
+      }).then(response => {
+        console.log("response--------", response);
+        if (response.code == 200) {
+          if (response.data > 0) {
+            that.msgSuccess("鐘舵�佹洿鏂版垚鍔�");
+          } else {
+            that.msgError("鐘舵�佹洿鏂板け璐�,璇峰厛璁剧疆寮傚父鏁版嵁澶勭悊淇℃伅");
+          }
+        } else {
+          that.msgError("鐘舵�佹洿鏂板け璐�," + response.msg);
+        }
+        this.getList()
+      });
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    setModelNode(modelNode) {
+      this.myModelNode = modelNode;
+      this.currentNode = modelNode;
+      this.getList();
+    },
+    /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+    getList() {
+      if (this.myModelNode) {
+        this.loading = true;
+        this.queryParams.nodeId = this.myModelNode.id;
+        //鎺ュ彛
+        getSettingIndex(this.queryParams).then(response => {
+          this.model.energyindexList = response.data;
+          this.total = response.total;
+          this.loading = false;
+        });
+      } else {
+        this.energyindexList = [];
+      }
+    },
+    // 鍗曚綅瀛楀吀缈昏瘧
+    unitIdFormat(row, column) {
+      return this.selectDictLabel(this.unitIdOptions, row.unitId);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        indexId: undefined,
+        name: undefined,
+        code: undefined,
+        indexCategory: undefined,
+        remark: undefined,
+        unitId: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList(this.currentNode);
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.indexId);
+      this.names = selection.map(item => item.name);
+      this.single = selection.length !== 1;
+      this.multiple = !selection.length
+      this.startStopOptions = selection.map(item => item.indexCategory);
+      this.codeOptions = selection.map(item => item.code);
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      if (this.indexCategoryDefaultVal) {
+        this.form.indexCategory = this.indexCategoryDefaultVal.dictValue;
+      }
+      if (this.unitDefaultVal) {
+        this.form.unitId = this.unitDefaultVal.dictValue;
+      }
+      this.open = true;
+      this.title = "娣诲姞鎸囨爣淇℃伅";
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.indexId !== undefined) {
+            updateEnergyindex(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList(this.currentNode);
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addEnergyindex(this.currentNode.id, this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList(this.currentNode);
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const indexIds = row.indexId || this.ids;
+      const indexNames = row.name || this.names;
+      this.$confirm('鏄惁纭鍒犻櫎鎸囨爣鍚嶄负"' + indexNames + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delEnergyindex(indexIds);
+      }).then(() => {
+        this.getList(this.currentNode);
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋寚鏍囦俊鎭暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportEnergyindex(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    //淇濆瓨
+    save(row) {
+      this.$refs["form"].validate((valid, model) => {
+        const indexId = row.indexId || this.ids;
+      })
+    },
+    yjSetSubmitForm() {
+      this.settingModel.open = false;
+      this.settingModel.settingOptions = [];
+    },
+    yjSetCancel() {
+      this.settingModel.open = false;
+      this.settingModel.settingOptions = [];
+    },
+    arraySpanMethod({row, column, rowIndex, columnIndex}) {
+      if (columnIndex === 0) {
+        if (rowIndex % this.hbCount === 0) {
+          return {
+            rowspan: this.hbCount,
+            colspan: 1
+          };
+        } else {
+          return {
+            rowspan: 0,
+            colspan: 0
+          };
+        }
+      }
+    },
+    //缂栬緫
+    setting(e) {
+      listSet({indexId: e.indexId, nodeId: this.currentNode.id}).then(response => {
+        this.settingModel.settingOptions = response.rows;
+        this.settingModel.open = true;
+        this.settingModel.title = "鎸囨爣缂栧彿锛�" + e.indexCode;
+      });
+    },
+    //琛ㄥ崟鎻愪氦
+    settingSubmitForm() {
+      console.log(JSON.stringify(this.settingModel.settingOptions));
+      this.$refs["settingForm"].validate(valid => {
+        if (valid) {
+          updateDialogForm(this.settingModel.settingOptions || "").then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              // this.getList();
+              this.settingModel.settingOptions = [];
+              this.settingModel.open = false;
+            } else {
+              this.msgError(response.msg);
+            }
+            this.getList();
+          });
+          this.settingModel.open = false;
+        }
+      });
+    },
+    closeYjDialog() {
+      this.settingModel.settingOptions = [];
+      return false;
+    },
+    // 瀛楀吀缈昏瘧
+    typeFormat(row, column) {
+      return this.selectDictLabel(this.settingModel.alarmTypeOptions, row.alarmType);
+    },
+  }
+};
+</script>
+<style>
+.item-style .el-form-item__content {
+  margin-left: 0px !important;
+}
+</style>
diff --git a/energy_management_ui/src/views/stage/alarm/LinChart.vue b/energy_management_ui/src/views/stage/alarm/LinChart.vue
new file mode 100644
index 0000000..ba88800
--- /dev/null
+++ b/energy_management_ui/src/views/stage/alarm/LinChart.vue
@@ -0,0 +1,125 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+/*import resize from './mixins/resize'*/
+
+export default {
+ /* mixins: [resize],*/
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '350px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData } = {}) {
+      this.chart.setOption({
+
+        title: {
+          text: '鍏宠仈鐐逛綅鑳借��(鍗曚綅: Kwh)'
+        },
+        tooltip: {
+          trigger: 'axis'
+        },
+        legend: {
+          data: ['FT01', 'FT02' , 'FT03' , 'FT04']
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true
+        },
+        toolbox: {
+          feature: {
+            saveAsImage: {}
+          }
+        },
+        xAxis: {
+          type: 'category',
+          boundaryGap: false,
+          data: ['2鏈�1鏃�', '2鏈�2鏃�', '2鏈�3鏃�', '2鏈�4鏃�']
+        },
+        yAxis: {
+          type: 'value'
+        },
+        series: [
+          {
+            name: 'FT01',
+            type: 'line',
+            stack: '鎬婚噺',
+            data: [210, 172, 181, 224]
+          },
+          {
+            name: 'FT02',
+            type: 'line',
+            stack: '鎬婚噺',
+            data: [210, 182, 191, 234]
+          },
+          {
+            name: 'FT03',
+            type: 'line',
+            stack: '鎬婚噺',
+            data: [210, 182, 191, 234]
+          },
+          {
+            name: 'FT04',
+            type: 'line',
+            stack: '鎬婚噺',
+            data: [210, 182, 191, 234, 290]
+          },
+        ]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/stage/alarm/alarmIndex.vue b/energy_management_ui/src/views/stage/alarm/alarmIndex.vue
new file mode 100644
index 0000000..d20c304
--- /dev/null
+++ b/energy_management_ui/src/views/stage/alarm/alarmIndex.vue
@@ -0,0 +1,569 @@
+<template>
+  <div class="app-container" style="padding:0">
+    <el-card class="box-card">
+      <div slot="header" class="clearfix">
+        <span>{{currentNode?currentNode.label:''}}--鑺傜偣璁剧疆</span>
+      </div>
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px" class="query-form">
+      <el-form-item label="鎸囨爣缂栫爜" prop="name">
+      <el-select v-model="value" multiple filterable allow-create default-first-option placeholder="璇疯緭鍏ヤ綅鍙�">
+        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+      </el-form-item>
+      <el-form-item label="鎸囨爣鍚嶇О" prop="code">
+        <el-select v-model="values" multiple filterable allow-create default-first-option placeholder="璇疯緭鍏ユ寚鏍囧悕绉�">
+          <el-option v-for="item in option" :key="item.values" :label="item.label" :value="item.values">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鏃堕棿">
+        <el-date-picker
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="鏄惁澶勭悊" prop="">
+        <el-select v-model="value" placeholder="璇烽�夋嫨鏄惁澶勭悊" clearable size="small">
+          <el-option
+            v-for="dict in value"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click=""
+          v-hasPermi="['']"
+        >瀵煎嚭
+        </el-button>
+      </el-col>
+    </el-row>
+    <el-table :data="tableData" v-loading="loading" border @selection-change=""  @row-click="openDlog">
+      <el-table-column label="鎸囨爣缂栫爜" align="center" prop="name"   />
+      <el-table-column label="鎸囨爣鍚嶇О" align="center" prop="number"/>
+      <el-table-column label="瀹為檯鍊�" align="center" prop="value"/>
+      <el-table-column label="瓒呴檺鐧惧垎姣�" align="center" prop="values"/>
+      <el-table-column label="鏄惁澶勭悊" align="center" prop="code"/>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-table>
+    <!--寮规-->
+    <el-dialog :title="title" :visible.sync="open" width="1000px" :close-on-click-modal="false"  >
+      <el-table  :data="tableData"   :show-header="hiddenTableHeader"  border="1px" >
+        <el-table-column label="鎶ヨ鏃堕棿"prop="oa"  />
+        <el-table-column label="鎶ヨ鍊�"  prop="ob"  />
+        <el-table-column label="瀹為檯鍊�"  prop="oc"  />
+      </el-table>
+      <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
+        <line-chart :chart-data="lineChartData" />
+      </el-row>
+      <el-table  :data="tableData"   :show-header="hiddenTableHeader"  border="1px" >
+        <el-table-column label="鎶ヨ鏃堕棿"prop="one"  />
+        <el-table-column label="鎶ヨ鍊�"  prop="two"  />
+        <el-table-column label="瀹為檯鍊�"  prop="three"  />
+        <el-table-column label="瀹為檯鍊�"  prop="four"  />
+        <el-table-column label="瀹為檯鍊�"  prop="five"  />
+
+      </el-table>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    </el-card>
+  </div>
+</template>
+
+
+<script>
+  const lineChartData = {
+    newVisitis: {
+    }
+  }
+  import {
+    addEnergyindex,
+    delEnergyindex,
+    exportEnergyindex,
+    getEnergyindex,
+    listEnergyindex,
+    updateEnergyindex
+  } from "@/api/basicsetting/energyindex";
+  import LineChart from './LinChart'
+  import {List} from "@/api/basicsetting/state"
+
+
+
+  export default {
+    name: 'energyIndex',
+    components: {
+      LineChart
+    },
+    data() {
+      return {
+        options: [{
+          value: 'FT01',
+          label: 'FT01'
+        }, {
+          value: 'FT02',
+          label: 'FT02'
+        }, {
+          value: 'FT03',
+          label: 'FT03'
+        }, {
+          value: 'FT04',
+          label: 'FT04'
+        }, {
+          value: 'BUG',
+          label: 'BUG'
+        }],
+        value: [],
+        option: [{
+          values: '98013',
+          label: '98013'
+        }, {
+          values: '98014',
+          label: '98014'
+        }, {
+          values: '98015',
+          label: '98015'
+        }, {
+          values: '98016',
+          label: '98016'
+        }, {
+          values: '98017',
+          label: '98017'
+        }],
+        facilityType:'1',
+        values: [],
+        currentNode: '',
+        hiddenTableHeader:false,
+        lineChartData: lineChartData.newVisitis,
+        // 閬僵灞�
+        loading: false,
+        // 閫変腑鏁扮粍
+        ids: [],
+        dateRange: [],
+        names: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鎸囨爣淇℃伅琛ㄦ牸鏁版嵁
+        List: [],
+        energyindexList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 涓婚敭瀛楀吀
+        indexIdOptions: [],
+        // 鎸囨爣鍚嶇О瀛楀吀
+        nameOptions: [],
+        // 鎸囨爣缂栫爜瀛楀吀
+        codeOptions: [],
+        // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀
+        indexCategoryOptions: [],
+        // 澶囨敞瀛楀吀
+        remarkOptions: [],
+        // 鍗曚綅瀛楀吀
+        unitIdOptions: [],
+        // 鏌ヨ鍙傛暟
+        lineChartData:{
+          newVisitis:null,
+        },
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          nodeId: undefined
+        },
+
+        tableData: [],
+        datas: [{
+          name: 'FT01',
+          number: '98013',
+          value: '500',
+          values: '20%',
+          code: '鏄�',
+          what: '5',
+          one: '浣嶅彿',
+          two: '2鏈�1鏃�',
+          three: '2鏈�2鏃�',
+          four : '2鏈�3鏃�',
+          five :'2鏈�4鏃�',
+          oa : '浣嶅彿',
+          ob : '鎸囨爣鍚嶇О',
+          oc : '瀹為檯鍊�',
+
+        },
+          {
+            name: 'FT02',
+            number: '98014',
+            value: '500',
+            values: '20%',
+            code: '鏄�',
+            what: '5',
+            one: 'F01',
+            two: '210',
+            three: '210',
+            four : '210',
+            five :'210',
+            oa : 'F01',
+            ob : '1#绌哄帇鏈烘鐩告湁鍔熸�荤數鑳�',
+            oc : '3',
+          },
+          {
+            name: 'FT03',
+            number: '98015',
+            value : '500',
+            values: '20%',
+            code: '鏄�',
+            what: '5',
+            one :'F02',
+            two :'210',
+            three :'172',
+            four : '181',
+            five :'224',
+            oa : 'F02',
+            ob : '2#绌哄帇鏈烘鐩告湁鍔熸�荤數鑳�',
+            oc : '6',
+
+        },
+       {
+         name: 'FT04',
+           number: '98016',
+         value : '500',
+         values: '35%',
+         code: '鍚�',
+         what: '5',
+         one :'F03',
+         two :'210',
+         three :'182',
+         four : '191',
+         five :'234',
+         oa : 'F03',
+         ob : '3#绌哄帇鏈烘鐩告湁鍔熸�荤數鑳�',
+         oc : '5',
+       },
+          {
+            name: 'BUG',
+            number: '98017',
+            value : '500',
+            values: '22%',
+            code: '鍚�',
+            what: '5',
+            one :'F04',
+            two :'210',
+            three :'182',
+            four : '191',
+            five :'234',
+            oa : 'F04',
+            ob : '4#绌哄帇鏈烘鐩告湁鍔熸�荤數鑳�',
+            oc : '6',
+
+          }
+        ],
+
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          name: [
+            {required: true, message: "鎸囨爣鍚嶇О涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'}
+          ], code: [
+            {required: true, message: "鎸囨爣缂栫爜涓嶈兘涓虹┖", trigger: "blur"},
+            {min: 2, max: 20, message: '闀垮害鍦� 2 鍒� 20 涓瓧绗�', trigger: 'blur'},
+            {pattern: /^[a-zA-Z][A-Za-z0-9_-]+$/, message: '蹇呴』涓烘暟瀛椼�佸瓧姣嶃��- 鎴朹 锛屼笖棣栧瓧绗﹀彧鑳戒负瀛楁瘝'}
+          ], indexCategory: [
+            {required: true, message: "璇烽�夋嫨鎸囨爣鍒嗙被", trigger: "blur"}
+          ]
+        },
+        currentNode: undefined,
+        indexCategoryDefaultVal: undefined,
+        unitDefaultVal: undefined
+      };
+    },
+
+    created() {
+      /*  this.getList();*/
+      this.getDicts("sys_index_category").then(response => {
+        this.indexCategoryOptions = response.data;
+        this.indexCategoryDefaultVal = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+      });
+      this.getDicts("sys_unit").then(response => {
+        this.unitIdOptions = response.data;
+        this.unitDefaultVal = this.unitIdOptions.find(f => f.isDefault === 'Y');
+      });
+      setInterval(this.getList(), 30000);
+
+      this.bpy()
+
+    },
+    methods: {
+      /** 鏌ヨ鎸囨爣淇℃伅鍒楄〃 */
+      getList(modelNode) {
+        this.currentNode = modelNode;
+        if (modelNode) {
+          this.loading = true;
+          this.queryParams.nodeId = modelNode.id;
+          listEnergyindex(this.queryParams).then(response => {
+            this.energyindexList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          });
+        } else {
+          this.energyindexList = [];
+        }
+
+      },
+      bpy() {
+        this.tableData = this.datas;
+      },
+      /** 鏌ョ湅鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        const indexId = row.indexId || this.ids;
+        /*  getEnergyindex(indexId).then(response => {
+            this.form = response.data;
+    this.title = "寮傚父淇℃伅"+  response.data.name ;
+          });*/
+
+        this.open = true;
+        this.title = "FT01鍏宠仈鐐逛綅";
+      },
+      // 绯荤粺鎸囨爣鍒嗙被锛�1-鑳芥簮绫伙紝2-浜у搧绫伙紝3-鑳芥晥绫伙紝4-缁忚惀绫伙紝5-鍏朵粬瀛楀吀缈昏瘧
+      indexCategoryFormat(row, column) {
+        return this.selectDictLabel(this.indexCategoryOptions, row.indexCategory);
+      },
+
+      // 鍗曚綅瀛楀吀缈昏瘧
+      unitIdFormat(row, column) {
+        return this.selectDictLabel(this.unitIdOptions, row.unitId);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          indexId: undefined,
+          name: undefined,
+          code: undefined,
+          indexCategory: undefined,
+          remark: undefined,
+          unitId: undefined
+        };
+        this.resetForm("form");
+      },
+      modelNodeChange(modelNode) {
+        this.nodeId = modelNode.id;
+        this.getList(this.nodeId);
+        this.settingDeviceList = [];
+        this.settingIndexList = [];
+        this.disabledSetting = modelNode === undefined || modelNode === '' || modelNode === null;
+        if (modelNode) {
+          this.currentNode = modelNode;
+          this.deviceLoading = true;
+   /*       getSettingDevice(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingDeviceList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.deviceLoading = false;
+          });*/
+
+        /*  this.energyLoading = true;
+          getSettingEnergy(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingEnergyList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.energyLoading = false;
+          });*/
+
+          this.productLoading = true;
+        /*  getSettingProduct(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingProductList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.productLoading = false;
+          });*/
+
+     /*     this.indexLoading = true;
+          getSettingIndex(modelNode.id).then((response) => {
+            if (response.code === 200) {
+              this.settingIndexList = response.data;
+            } else {
+              this.$message.error(response.msg);
+            }
+            this.indexLoading = false;
+          });*/
+
+          // this.$refs.energyIndex.getList(modelNode);
+        }
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList(this.currentNode);
+      },
+      getList(e)
+      {
+        List("STATISTIC",e).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = response.data;
+          } else {
+            this.$message.error(response.msg);
+          }
+          this.indexLoading = false;
+        });
+
+      },
+      deviceSetting() {
+        this.deviceDialog = true;
+      },
+      energySetting() {
+        this.energyDialog = true;
+      },
+      productSetting() {
+        this.productDialog = true;
+      },
+      collectIndexSetting() {
+        this.collectIndexDialog = true;
+      },
+      showDeviceDialog() {
+        this.$nextTick(() => {
+          this.$refs.deviceSetting.init(this.settingDeviceList);
+        })
+      },
+      showEnergyDialog() {
+        this.$nextTick(() => {
+          this.$refs.energySetting.init(this.settingEnergyList);
+        })
+      },
+      showProductDialog() {
+        this.$nextTick(() => {
+          this.$refs.productSetting.init(this.settingProductList);
+        })
+      },
+      showCollectIndexDialog() {
+        this.$nextTick(() => {
+          this.$refs.collectIndexSetting.init(this.currentNode, this.settingIndexList);
+        })
+      },
+      deviceConfirmSelect(selectedDevice) {
+        this.settingDeviceList = selectedDevice;
+        let deviceIds = selectedDevice.map(item => item.id);
+        setDevice(this.currentNode.id, deviceIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      energyConfirmSelect(selectedEnergy) {
+        this.settingEnergyList = selectedEnergy;
+        let energyIds = selectedEnergy.map(item => item.enerid);
+        setEnergy(this.currentNode.id, energyIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      productConfirmSelect(selectedProduct) {
+        this.settingProductList = selectedProduct;
+        let productIds = selectedProduct.map(item => item.productid);
+        setProduct(this.currentNode.id, productIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      collectIndexConfirmSelect(selectedIndex) {
+        this.settingIndexList = selectedIndex;
+        let indexIds = selectedIndex.map(item => item.indexId);
+        setNodeToIndex(this.currentNode.id, indexIds).then((response) => {
+          if (response.code !== 200) {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      handleSelectionChange() {
+      },
+      delDevice(row) {
+        delDevice(this.currentNode.id, row.id).then((response) => {
+          if (response.code === 200) {
+            this.settingDeviceList = this.settingDeviceList.filter(f => f.id !== row.id);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      delEnergy(row) {
+        delEnergy(this.currentNode.id, row.enerid).then((response) => {
+          if (response.code === 200) {
+            this.settingEnergyList = this.settingEnergyList.filter(f => f.enerid !== row.enerid);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      delProduct(row) {
+        delProduct(this.currentNode.id, row.productid).then((response) => {
+          if (response.code === 200) {
+            this.settingProductList = this.settingProductList.filter(f => f.productid !== row.productid);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      bpq(){
+        this.tableData=this.datab;
+      },
+      delIndex(row) {
+        delIndex(this.currentNode.id, row.indexId).then((response) => {
+          if (response.code === 200) {
+            this.settingIndexList = this.settingIndexList.filter(f => f.indexId !== row.indexId);
+          } else {
+            this.$message.error(response.msg);
+          }
+        });
+      },
+      openDlog (){
+        this.open=true;
+      }
+
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/stage/alarm/index.vue b/energy_management_ui/src/views/stage/alarm/index.vue
new file mode 100644
index 0000000..d9ad6a1
--- /dev/null
+++ b/energy_management_ui/src/views/stage/alarm/index.vue
@@ -0,0 +1,70 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            <el-select v-model="modelData" placeholder="璇烽�夋嫨妯″瀷"
+                       style="width:220px"
+                       size="small"
+                       @change="changeModel">
+              <el-option
+                v-for="model in modelInfoOptions"
+                :key="model.modelCode"
+                :label="model.modelName"
+                :value="model.modelCode"
+              />
+            </el-select>
+           <!-- <el-button icon="el-icon-setting" circle title="绠$悊妯″瀷" style="float:right;padding:8px"
+                       @click="manageModel"></el-button>-->
+          </div>
+          <ModelNode ref="modelNode" @changeNode="changeNode" :showOpt="false"></ModelNode>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <el-main style="padding:0">
+          <AlarmIndex ref="AlarmIndex"></AlarmIndex>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+  import AlarmIndex from "./alarmIndex";
+  import ModelNode from "../../basicsetting/modelNode/modelNode";
+  import {listModel} from "@/api/basicsetting/model";
+
+
+
+  export default {
+    components: {AlarmIndex, ModelNode},
+    created() {
+      listModel({isShow: 1}).then(response => {
+        this.modelInfoOptions = response.data;
+        if (this.modelInfoOptions.length > 0) {
+          this.modelData = this.modelInfoOptions[0].modelCode;
+          this.$refs.modelNode.getList(this.modelData);
+        }
+      });
+    },
+
+    data() {
+      return {
+        modelData: '',
+        modelInfoOptions: []
+      }
+    },
+    methods: {
+      changeNode: function (node) {
+        this.$refs.AlarmIndex.modelNodeChange(node);
+      },
+      manageModel: function () {
+        this.$router.push('/model');
+      },
+      changeModel: function (item) {
+        this.$refs.modelNode.getList(item);
+      },
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/statisticalData/gxdhcount/gxdhcountindex.vue b/energy_management_ui/src/views/statisticalData/gxdhcount/gxdhcountindex.vue
new file mode 100644
index 0000000..af74eb9
--- /dev/null
+++ b/energy_management_ui/src/views/statisticalData/gxdhcount/gxdhcountindex.vue
@@ -0,0 +1,185 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+        <el-form-item label="浜у搧绫诲瀷" prop="repProductType">
+          <el-select v-model="queryParams.repProductType" placeholder="璇烽�夋嫨浜у搧绫诲瀷" clearable size="small">
+            <el-option
+              v-for="dict in repProductTypeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="骞村害" prop="selectYear">
+          <el-select v-model="queryParams.selectYear" placeholder="璇烽�夋嫨骞村害" clearable size="small">
+            <el-option
+              v-for="dict in selectYearOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table v-loading="loading" :data="gxdhcountList" >
+      <el-table-column label="鑳芥簮鍝佺" align="center" prop="varietyType" min-width="100px"/>
+      <el-table-column label="1鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a1"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a2"/>
+        <el-table-column label="钂告苯" align="center" prop="a3"/>
+      </el-table-column>
+      <el-table-column label="2鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a4"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a5"/>
+        <el-table-column label="钂告苯" align="center" prop="a6"/>
+      </el-table-column>
+      <el-table-column label="3鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a7"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a8"/>
+        <el-table-column label="钂告苯" align="center" prop="a9"/>
+      </el-table-column>
+      <el-table-column label="4鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a10"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a11"/>
+        <el-table-column label="钂告苯" align="center" prop="a12"/>
+      </el-table-column>
+      <el-table-column label="5鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a13"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a14"/>
+        <el-table-column label="钂告苯" align="center" prop="a15"/>
+      </el-table-column>
+      <el-table-column label="6鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a16"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a17"/>
+        <el-table-column label="钂告苯" align="center" prop="a18"/>
+      </el-table-column>
+      <el-table-column label="7鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a19"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a20"/>
+        <el-table-column label="钂告苯" align="center" prop="a21"/>
+      </el-table-column>
+      <el-table-column label="8鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a22"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a23"/>
+        <el-table-column label="钂告苯" align="center" prop="a24"/>
+      </el-table-column>
+      <el-table-column label="9鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a25"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a26"/>
+        <el-table-column label="钂告苯" align="center" prop="a27"/>
+      </el-table-column>
+      <el-table-column label="10鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a28"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a29"/>
+        <el-table-column label="钂告苯" align="center" prop="a30"/>
+      </el-table-column>
+      <el-table-column label="11鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a31"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a32"/>
+        <el-table-column label="钂告苯" align="center" prop="a33"/>
+      </el-table-column>
+      <el-table-column label="12鏈�" align="center">
+        <el-table-column label="鐢�" align="center" prop="a34"/>
+        <el-table-column label="鐓ゆ苯" align="center" prop="a35"/>
+        <el-table-column label="钂告苯" align="center" prop="a36"/>
+      </el-table-column>
+    </el-table>
+
+
+  </div>
+</template>
+
+<script>
+import { listGxdhcountIndex } from "@/api/statisticalData/gxdhcount";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 宸ュ簭鍗曡�楃粺璁″姛鑳借〃鏍兼暟鎹�
+      gxdhcountList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 閰嶇疆涓婚敭瀛楀吀
+      idOptions: [],
+      // 浜у搧绫诲瀷瀛楀吀
+      repProductTypeOptions: [],
+      // 涓嬫媺骞村害閫夋嫨
+      selectYearOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        repProductType: "JT",
+        selectYear: "2020",
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+            }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("rep_product_type").then(response => {
+      this.repProductTypeOptions = response.data;
+    });
+    this.getDicts("selectyear").then(response => {
+      this.selectYearOptions = response.data;
+    });
+  },
+  methods: {
+    /** 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳藉垪琛� */
+    getList() {
+      this.loading = true;
+      listGxdhcountIndex(this.queryParams).then(response => {
+        this.gxdhcountList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        repProductType: undefined,
+        electricIndex: undefined,
+        gasIndex: undefined,
+        steamIndex: undefined,
+        varietyType: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/statisticalData/gxdhcount/index.vue b/energy_management_ui/src/views/statisticalData/gxdhcount/index.vue
new file mode 100644
index 0000000..c2d0b9f
--- /dev/null
+++ b/energy_management_ui/src/views/statisticalData/gxdhcount/index.vue
@@ -0,0 +1,329 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+        <el-form-item label="浜у搧绫诲瀷" prop="repProductType">
+        <el-select v-model="queryParams.repProductType" placeholder="璇烽�夋嫨浜у搧绫诲瀷" clearable size="small">
+          <el-option
+            v-for="dict in repProductTypeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+        <el-form-item label="鑳芥簮鍝佺" prop="varietyType">
+        <el-select v-model="queryParams.varietyType" placeholder="璇烽�夋嫨鑳芥簮鍝佺" clearable size="small">
+          <el-option
+            v-for="dict in varietyTypeOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['statisticalData:gxdhcount:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['statisticalData:gxdhcount:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['statisticalData:gxdhcount:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['statisticalData:gxdhcount:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="gxdhcountList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="浜у搧绫诲瀷" align="center" prop="repProductType" :formatter="repProductTypeFormat" />
+      <el-table-column label="鐢垫寚鏍�" align="center" prop="electricIndex"  />
+      <el-table-column label="鐓ゆ皵鎸囨爣" align="center" prop="gasIndex"  />
+      <el-table-column label="钂告苯鎸囨爣" align="center" prop="steamIndex"  />
+      <el-table-column label="鑳芥簮鍝佺" align="center" prop="varietyType" :formatter="varietyTypeFormat" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['statisticalData:gxdhcount:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['statisticalData:gxdhcount:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀瑰伐搴忓崟鑰楃粺璁″姛鑳藉璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="浜у搧绫诲瀷">
+          <el-select v-model="form.repProductType" placeholder="璇烽�夋嫨浜у搧绫诲瀷">
+            <el-option
+              v-for="dict in repProductTypeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鐢垫寚鏍�" prop="electricIndex">
+          <el-input v-model="form.electricIndex" placeholder="璇疯緭鍏ョ數鎸囨爣" />
+        </el-form-item>
+        <el-form-item label="鐓ゆ皵鎸囨爣" prop="gasIndex">
+          <el-input v-model="form.gasIndex" placeholder="璇疯緭鍏ョ叅姘旀寚鏍�" />
+        </el-form-item>
+        <el-form-item label="钂告苯鎸囨爣" prop="steamIndex">
+          <el-input v-model="form.steamIndex" placeholder="璇疯緭鍏ヨ捀姹芥寚鏍�" />
+        </el-form-item>
+        <el-form-item label="鑳芥簮鍝佺">
+          <el-select v-model="form.varietyType" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+            <el-option
+              v-for="dict in varietyTypeOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listGxdhcount, getGxdhcount, delGxdhcount, addGxdhcount, updateGxdhcount, exportGxdhcount } from "@/api/statisticalData/gxdhcount";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 宸ュ簭鍗曡�楃粺璁″姛鑳借〃鏍兼暟鎹�
+      gxdhcountList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 閰嶇疆涓婚敭瀛楀吀
+      idOptions: [],
+      // 浜у搧绫诲瀷瀛楀吀
+      repProductTypeOptions: [],
+      // 鐢垫寚鏍囧瓧鍏�
+      electricIndexOptions: [],
+      // 鐓ゆ皵鎸囨爣瀛楀吀
+      gasIndexOptions: [],
+      // 钂告苯鎸囨爣瀛楀吀
+      steamIndexOptions: [],
+      // 鑳芥簮鍝佺瀛楀吀
+      varietyTypeOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        repProductType: undefined,
+        varietyType: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+            }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("rep_product_type").then(response => {
+      this.repProductTypeOptions = response.data;
+    });
+    this.getDicts("variety_type").then(response => {
+      this.varietyTypeOptions = response.data;
+    });
+  },
+  methods: {
+    /** 鏌ヨ宸ュ簭鍗曡�楃粺璁″姛鑳藉垪琛� */
+    getList() {
+      this.loading = true;
+      listGxdhcount(this.queryParams).then(response => {
+        this.gxdhcountList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    // 浜у搧绫诲瀷瀛楀吀缈昏瘧
+    repProductTypeFormat(row, column) {
+      return this.selectDictLabel(this.repProductTypeOptions, row.repProductType);
+    },
+    // 鑳芥簮鍝佺瀛楀吀缈昏瘧
+    varietyTypeFormat(row, column) {
+      return this.selectDictLabel(this.varietyTypeOptions, row.varietyType);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        repProductType: undefined,
+        electricIndex: undefined,
+        gasIndex: undefined,
+        steamIndex: undefined,
+        varietyType: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞宸ュ簭鍗曡�楃粺璁″姛鑳�";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getGxdhcount(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼宸ュ簭鍗曡�楃粺璁″姛鑳�";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateGxdhcount(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addGxdhcount(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎宸ュ簭鍗曡�楃粺璁″姛鑳界紪鍙蜂负"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delGxdhcount(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夊伐搴忓崟鑰楃粺璁″姛鑳芥暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportGxdhcount(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/system/config/index.vue b/energy_management_ui/src/views/system/config/index.vue
new file mode 100644
index 0000000..ac55db6
--- /dev/null
+++ b/energy_management_ui/src/views/system/config/index.vue
@@ -0,0 +1,381 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鍙傛暟鍚嶇О" prop="configName">
+              <el-input
+                  v-model="queryParams.configName"
+                  placeholder="璇疯緭鍏ュ弬鏁板悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鍙傛暟閿悕" prop="configKey">
+              <el-input
+                  v-model="queryParams.configKey"
+                  placeholder="璇疯緭鍏ュ弬鏁伴敭鍚�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="绯荤粺鍐呯疆" prop="configType">
+              <el-select v-model="queryParams.configType" placeholder="绯荤粺鍐呯疆" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in typeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鍒涘缓鏃堕棿">-->
+<!--              <el-date-picker-->
+<!--                  v-model="dateRange"-->
+<!--                  size="small"-->
+<!--                  style="width: 100%"-->
+<!--                  value-format="yyyy-MM-dd"-->
+<!--                  type="daterange"-->
+<!--                  range-separator="-"-->
+<!--                  start-placeholder="寮�濮嬫棩鏈�"-->
+<!--                  end-placeholder="缁撴潫鏃ユ湡"-->
+<!--              ></el-date-picker>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:config:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:config:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:config:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:config:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table  :height="height" v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="鍙傛暟涓婚敭" align="center" prop="configId"/>
+        <el-table-column label="鍙傛暟鍚嶇О" align="center" prop="configName" :show-overflow-tooltip="true"/>
+        <el-table-column label="鍙傛暟閿悕" align="center" prop="configKey" :show-overflow-tooltip="true"/>
+        <el-table-column label="鍙傛暟閿��" align="center" prop="configValue"/>
+        <el-table-column label="绯荤粺鍐呯疆" align="center" prop="configType" :formatter="typeFormat"/>
+        <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true"/>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:config:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:config:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鍙傛暟鍚嶇О" prop="configName">
+          <el-input v-model="form.configName" placeholder="璇疯緭鍏ュ弬鏁板悕绉�"/>
+        </el-form-item>
+        <el-form-item label="鍙傛暟閿悕" prop="configKey">
+          <el-input v-model="form.configKey" placeholder="璇疯緭鍏ュ弬鏁伴敭鍚�"/>
+        </el-form-item>
+        <el-form-item label="鍙傛暟閿��" prop="configValue">
+          <el-input v-model="form.configValue" placeholder="璇疯緭鍏ュ弬鏁伴敭鍊�"/>
+        </el-form-item>
+        <el-form-item label="绯荤粺鍐呯疆" prop="configType">
+          <el-radio-group v-model="form.configType">
+            <el-radio
+                v-for="dict in typeOptions"
+                :key="dict.dictValue"
+                :label="dict.dictValue"
+            >{{ dict.dictLabel }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig} from "@/api/system/config";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "Config",
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鍙傛暟琛ㄦ牸鏁版嵁
+      configList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 绫诲瀷鏁版嵁瀛楀吀
+      typeOptions: [],
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        configName: undefined,
+        configKey: undefined,
+        configType: undefined,
+        endTime: undefined,
+        beginTime: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        configName: [
+          {required: true, message: "鍙傛暟鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        configKey: [
+          {required: true, message: "鍙傛暟閿悕涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        configValue: [
+          {required: true, message: "鍙傛暟閿�间笉鑳戒负绌�", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_yes_no").then(response => {
+      this.typeOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ鍙傛暟鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listConfig(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+            this.configList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          }
+      );
+    },
+    // 鍙傛暟绯荤粺鍐呯疆瀛楀吀缈昏瘧
+    typeFormat(row, column) {
+      return this.selectDictLabel(this.typeOptions, row.configType);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        configId: undefined,
+        configName: undefined,
+        configKey: undefined,
+        configValue: undefined,
+        configType: "Y",
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鍙傛暟";
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.configId)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const configId = row.configId || this.ids
+      getConfig(configId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鍙傛暟";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.configId != undefined) {
+            updateConfig(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addConfig(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const configIds = row.configId || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鍙傛暟缂栧彿涓�"' + configIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delConfig(configIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夊弬鏁版暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportConfig(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/system/dept/index.vue b/energy_management_ui/src/views/system/dept/index.vue
new file mode 100644
index 0000000..30abf70
--- /dev/null
+++ b/energy_management_ui/src/views/system/dept/index.vue
@@ -0,0 +1,341 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form class="special-form" label-width="72px">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="閮ㄩ棬鍚嶇О">
+              <el-input
+                  v-model="queryParams.deptName"
+                  placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐘舵��">
+              <el-select v-model="queryParams.status" placeholder="閮ㄩ棬鐘舵��" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item class="operation">
+              <el-button
+                  class="filter-item"
+                  type="primary"
+                  icon="el-icon-search"
+                  size="mini"
+                  @click="handleQuery"
+              >鎼滅储
+              </el-button>
+              <el-button
+                  class="filter-item"
+                  type="primary"
+                  icon="el-icon-plus"
+                  size="mini"
+                  @click="handleAdd"
+                  v-hasPermi="['system:dept:add']"
+              >鏂板
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-table
+          :height="height"
+          v-loading="loading"
+          :data="deptList"
+          row-key="deptId"
+          default-expand-all
+          :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+      >
+        <el-table-column prop="deptName" label="閮ㄩ棬鍚嶇О" width="200" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="orderNum" label="鎺掑簭" width="200"></el-table-column>
+        <el-table-column prop="status" label="鐘舵��" :formatter="statusFormat" width="100"></el-table-column>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="200">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:dept:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-plus"
+                @click="handleAdd(scope.row)"
+                v-hasPermi="['system:dept:add']"
+            >鏂板
+            </el-button>
+            <el-button
+                v-if="scope.row.parentId != 0"
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:dept:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀归儴闂ㄥ璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="24" v-if="form.parentId !== 0">
+            <el-form-item label="涓婄骇閮ㄩ棬" prop="parentId">
+              <treeselect v-model="form.parentId" :options="deptOptions" placeholder="閫夋嫨涓婄骇閮ㄩ棬"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+              <el-input v-model="form.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
+              <el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璐熻矗浜�" prop="leader">
+              <el-input v-model="form.leader" placeholder="璇疯緭鍏ヨ礋璐d汉" maxlength="20"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
+              <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="閭" prop="email">
+              <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="閮ㄩ棬鐘舵��">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictValue"
+                >{{ dict.dictLabel }}
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listDept, getDept, treeselect, delDept, addDept, updateDept} from "@/api/system/dept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "Dept",
+  components: {Treeselect},
+  mixins: [mixins],
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 琛ㄦ牸鏍戞暟鎹�
+      deptList: [],
+      // 閮ㄩ棬鏍戦�夐」
+      deptOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鐘舵�佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        deptName: undefined,
+        status: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        parentId: [
+          {required: true, message: "涓婄骇閮ㄩ棬涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        deptName: [
+          {required: true, message: "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        orderNum: [
+          {required: true, message: "鑿滃崟椤哄簭涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        email: [
+          {
+            type: "email",
+            message: "'璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"]
+          }
+        ],
+        phone: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur"
+          }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 270;
+    },
+    /** 鏌ヨ閮ㄩ棬鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listDept(this.queryParams).then(response => {
+        this.deptList = response.data;
+        this.loading = false;
+      });
+    },
+    /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
+    getTreeselect() {
+      treeselect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 瀛楀吀鐘舵�佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        deptId: undefined,
+        parentId: undefined,
+        deptName: undefined,
+        orderNum: undefined,
+        leader: undefined,
+        phone: undefined,
+        email: undefined,
+        status: "0"
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd(row) {
+      this.reset();
+      this.getTreeselect();
+      if (row != undefined) {
+        this.form.parentId = row.deptId;
+      }
+      this.open = true;
+      this.title = "娣诲姞閮ㄩ棬";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.getTreeselect();
+      getDept(row.deptId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼閮ㄩ棬";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.deptId != undefined) {
+            updateDept(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addDept(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delDept(row.deptId);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/system/dict/data.vue b/energy_management_ui/src/views/system/dict/data.vue
new file mode 100644
index 0000000..5965302
--- /dev/null
+++ b/energy_management_ui/src/views/system/dict/data.vue
@@ -0,0 +1,375 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true">
+      <el-form-item label="瀛楀吀鍚嶇О" prop="dictType">
+        <el-select v-model="queryParams.dictType" filterable size="small">
+          <el-option
+            v-for="item in typeOptions"
+            :key="item.dictId"
+            :label="item.dictName"
+            :value="item.dictType"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="瀛楀吀鏍囩" prop="dictLabel">
+        <el-input
+          v-model="queryParams.dictLabel"
+          placeholder="璇疯緭鍏ュ瓧鍏告爣绛�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐘舵��" prop="status">
+        <el-select v-model="queryParams.status" placeholder="鏁版嵁鐘舵��" clearable size="small">
+          <el-option
+            v-for="dict in statusOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['system:dict:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['system:dict:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['system:dict:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['system:dict:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange" height="600">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="瀛楀吀缂栫爜" align="center" prop="dictCode" />
+      <el-table-column label="瀛楀吀鏍囩" align="center" prop="dictLabel" />
+      <el-table-column label="瀛楀吀閿��" align="center" prop="dictValue" />
+      <el-table-column label="瀛楀吀鎺掑簭" align="center" prop="dictSort" />
+      <el-table-column label="鐘舵��" align="center" prop="status" :formatter="statusFormat" />
+      <el-table-column label="鏄惁榛樿" align="center" prop="isDefault" :formatter="nowisDefaultFormat" />
+      <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['system:dict:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:dict:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="瀛楀吀绫诲瀷">
+          <el-input v-model="form.dictType" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="瀛楀吀鏍囩" prop="dictLabel">
+          <el-input v-model="form.dictLabel" placeholder="璇疯緭鍏ュ瓧鍏告爣绛�" />
+        </el-form-item>
+        <el-form-item label="鏁版嵁閿��" prop="dictValue">
+          <el-input v-model="form.dictValue" placeholder="璇疯緭鍏ユ暟鎹敭鍊�" />
+        </el-form-item>
+        <el-form-item label="鏄剧ず鎺掑簭" prop="dictSort">
+          <el-input-number v-model="form.dictSort" controls-position="right" :min="0" />
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictValue"
+            >{{dict.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="鏄惁榛樿" prop="isDefault">
+          <el-radio-group v-model="form.isDefault">
+            <el-radio
+              v-for="dict in isDefaultOptions"
+              :key="dict.dictValue"
+              :label="dict.dictValue"
+            >{{dict.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listData, getData, delData, addData, updateData, exportData } from "@/api/system/dict/data";
+import { listType, getType } from "@/api/system/dict/type";
+
+export default {
+  name: "Data",
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 瀛楀吀琛ㄦ牸鏁版嵁
+      dataList: [],
+      // 榛樿瀛楀吀绫诲瀷
+      defaultDictType: "",
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鐘舵�佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 绫诲瀷鏁版嵁瀛楀吀
+      typeOptions: [],
+      // 鏄惁榛樿鐨勬暟鎹瓧鍏�
+      isDefaultOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dictName: undefined,
+        dictType: undefined,
+        status: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        dictLabel: [
+          { required: true, message: "鏁版嵁鏍囩涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        dictValue: [
+          { required: true, message: "鏁版嵁閿�间笉鑳戒负绌�", trigger: "blur" }
+        ],
+        dictSort: [
+          { required: true, message: "鏁版嵁椤哄簭涓嶈兘涓虹┖", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    const dictId = this.$route.params && this.$route.params.dictId;
+    this.getType(dictId);
+    this.getTypeList();
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("sys_is_default").then(response => {
+      this.isDefaultOptions = response.data;
+    });
+  },
+  methods: {
+    /** 鏌ヨ瀛楀吀绫诲瀷璇︾粏 */
+    getType(dictId) {
+      getType(dictId).then(response => {
+        this.queryParams.dictType = response.data.dictType;
+        this.defaultDictType = response.data.dictType;
+        this.getList();
+      });
+    },
+    /** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */
+    getTypeList() {
+      listType().then(response => {
+        this.typeOptions = response.rows;
+      });
+    },
+    /** 鏌ヨ瀛楀吀鏁版嵁鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listData(this.queryParams).then(response => {
+        this.dataList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鏁版嵁鐘舵�佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    // 鏄惁榛樿瀛楀吀缈昏瘧
+    nowisDefaultFormat(row, column) {
+      return this.selectDictLabel(this.isDefaultOptions, row.isDefault);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        dictCode: undefined,
+        dictLabel: undefined,
+        dictValue: undefined,
+        dictSort: 0,
+        status: "0",
+        isDefault:"Y",
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.queryParams.dictType = this.defaultDictType;
+      this.handleQuery();
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞瀛楀吀鏁版嵁";
+      this.form.dictType = this.queryParams.dictType;
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.dictCode)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const dictCode = row.dictCode || this.ids
+      getData(dictCode).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼瀛楀吀鏁版嵁";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.dictCode != undefined) {
+            updateData(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addData(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const dictCodes = row.dictCode || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎瀛楀吀缂栫爜涓�"' + dictCodes + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delData(dictCodes);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportData(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/system/dict/index.vue b/energy_management_ui/src/views/system/dict/index.vue
new file mode 100644
index 0000000..65c3100
--- /dev/null
+++ b/energy_management_ui/src/views/system/dict/index.vue
@@ -0,0 +1,376 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="瀛楀吀鍚嶇О" prop="dictName">
+              <el-input
+                  v-model="queryParams.dictName"
+                  placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="瀛楀吀绫诲瀷" prop="dictType">
+              <el-input
+                  v-model="queryParams.dictType"
+                  placeholder="璇疯緭鍏ュ瓧鍏哥被鍨�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐘舵��" prop="status">
+              <el-select
+                  v-model="queryParams.status"
+                  placeholder="瀛楀吀鐘舵��"
+                  clearable
+                  size="small"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鍒涘缓鏃堕棿">-->
+<!--              <el-date-picker-->
+<!--                  v-model="dateRange"-->
+<!--                  size="small"-->
+<!--                  style="width: 100%"-->
+<!--                  value-format="yyyy-MM-dd"-->
+<!--                  type="daterange"-->
+<!--                  range-separator="-"-->
+<!--                  start-placeholder="寮�濮嬫棩鏈�"-->
+<!--                  end-placeholder="缁撴潫鏃ユ湡"-->
+<!--              ></el-date-picker>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:dict:add']"
+          >鏂板</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:dict:edit']"
+          >淇敼</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:dict:remove']"
+          >鍒犻櫎</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:dict:export']"
+          >瀵煎嚭</el-button>
+        </el-col>
+      </el-row>
+      <el-table  :height="height" v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="瀛楀吀缂栧彿" align="center" prop="dictId" />
+        <el-table-column label="瀛楀吀鍚嶇О" align="center" prop="dictName" :show-overflow-tooltip="true" />
+        <el-table-column label="瀛楀吀绫诲瀷" align="center" :show-overflow-tooltip="true">
+          <template slot-scope="scope">
+            <router-link :to="'/dict/type/data/' + scope.row.dictId" class="link-type">
+              <span>{{ scope.row.dictType }}</span>
+            </router-link>
+          </template>
+        </el-table-column>
+        <el-table-column label="鐘舵��" align="center" prop="status" :formatter="statusFormat" />
+        <el-table-column label="澶囨敞" align="center" prop="remark" :show-overflow-tooltip="true" />
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:dict:edit']"
+            >淇敼</el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:dict:remove']"
+            >鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="瀛楀吀鍚嶇О" prop="dictName">
+          <el-input v-model="form.dictName" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" />
+        </el-form-item>
+        <el-form-item label="瀛楀吀绫诲瀷" prop="dictType">
+          <el-input v-model="form.dictType" placeholder="璇疯緭鍏ュ瓧鍏哥被鍨�" />
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+              v-for="dict in statusOptions"
+              :key="dict.dictValue"
+              :label="dict.dictValue"
+            >{{dict.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listType, getType, delType, addType, updateType, exportType } from "@/api/system/dict/type";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "Dict",
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 瀛楀吀琛ㄦ牸鏁版嵁
+      typeList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鐘舵�佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        beginTime:undefined,
+        endTime:undefined,
+        dictName: undefined,
+        dictType: undefined,
+        status: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        dictName: [
+          { required: true, message: "瀛楀吀鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        dictType: [
+          { required: true, message: "瀛楀吀绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listType(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+          this.typeList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    // 瀛楀吀鐘舵�佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        dictId: undefined,
+        dictName: undefined,
+        dictType: undefined,
+        status: "0",
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞瀛楀吀绫诲瀷";
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.dictId)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const dictId = row.dictId || this.ids
+      getType(dictId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼瀛楀吀绫诲瀷";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.dictId != undefined) {
+            updateType(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addType(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const dictIds = row.dictId || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎瀛楀吀缂栧彿涓�"' + dictIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delType(dictIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夌被鍨嬫暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportType(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/system/log/index.vue b/energy_management_ui/src/views/system/log/index.vue
new file mode 100644
index 0000000..7bf6148
--- /dev/null
+++ b/energy_management_ui/src/views/system/log/index.vue
@@ -0,0 +1,3 @@
+<template >
+  <router-view />
+</template>
diff --git a/energy_management_ui/src/views/system/menu/index.vue b/energy_management_ui/src/views/system/menu/index.vue
new file mode 100644
index 0000000..e6248c8
--- /dev/null
+++ b/energy_management_ui/src/views/system/menu/index.vue
@@ -0,0 +1,382 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form class="special-form" label-width="73px" :model="queryParams" ref="queryForm">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="鑿滃崟鍚嶇О">
+              <el-input
+                  v-model="queryParams.menuName"
+                  placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐘舵��">
+              <el-select v-model="queryParams.visible" placeholder="鑿滃崟鐘舵��" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in visibleOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:menu:add']">
+                鏂板
+              </el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container :bodyStyle="bodyStyle" style="margin-top: 16px">
+      <el-table
+          v-loading="loading"
+          :data="menuList"
+          row-key="menuId"
+          :height="height"
+          :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+      >
+        <el-table-column prop="menuName" label="鑿滃崟鍚嶇О" :show-overflow-tooltip="true"></el-table-column>
+        <el-table-column prop="icon" label="鍥炬爣" align="center" width="100px">
+          <template slot-scope="scope">
+            <svg-icon :icon-class="scope.row.icon"/>
+          </template>
+        </el-table-column>
+        <el-table-column prop="orderNum" label="鎺掑簭" width="60px"></el-table-column>
+        <el-table-column prop="perms" label="鏉冮檺鏍囪瘑" width="130px" :show-overflow-tooltip="true"></el-table-column>
+        <el-table-column prop="component" label="缁勪欢璺緞" width="180px" :show-overflow-tooltip="true"></el-table-column>
+        <el-table-column prop="visible" label="鍙" :formatter="visibleFormat" width="80px"></el-table-column>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" width="180" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button size="mini"
+                       type="text"
+                       icon="el-icon-edit"
+                       @click="handleUpdate(scope.row)"
+                       v-hasPermi="['system:menu:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-plus"
+                @click="handleAdd(scope.row)"
+                v-hasPermi="['system:menu:add']"
+            >鏂板
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:menu:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!-- 娣诲姞鎴栦慨鏀硅彍鍗曞璇濇 -->
+      <el-dialog :title="title" :visible.sync="open" width="600px">
+        <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+          <el-row>
+            <el-col :span="24">
+              <el-form-item label="涓婄骇鑿滃崟">
+                <treeselect
+                    v-model="form.parentId"
+                    :options="menuOptions"
+                    :show-count="true"
+                    placeholder="閫夋嫨涓婄骇鑿滃崟"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item label="鑿滃崟绫诲瀷" prop="menuType">
+                <el-radio-group v-model="form.menuType">
+                  <el-radio label="M">鐩綍</el-radio>
+                  <el-radio label="C">鑿滃崟</el-radio>
+                  <el-radio label="F">鎸夐挳</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item v-if="form.menuType != 'F'" label="鑿滃崟鍥炬爣">
+                <el-popover
+                    placement="bottom-start"
+                    width="460"
+                    trigger="click"
+                    @show="$refs['iconSelect'].reset()"
+                >
+                  <IconSelect ref="iconSelect" @selected="selected"/>
+                  <el-input slot="reference" v-model="form.icon" placeholder="鐐瑰嚮閫夋嫨鍥炬爣" readonly>
+                    <svg-icon
+                        v-if="form.icon"
+                        slot="prefix"
+                        :icon-class="form.icon"
+                        class="el-input__icon"
+                        style="height: 32px;width: 16px;"
+                    />
+                    <i v-else slot="prefix" class="el-icon-search el-input__icon"/>
+                  </el-input>
+                </el-popover>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鑿滃崟鍚嶇О" prop="menuName">
+                <el-input v-model="form.menuName" placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
+                <el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item v-if="form.menuType != 'F'" label="鏄惁澶栭摼">
+                <el-radio-group v-model="form.isFrame">
+                  <el-radio label="0">鏄�</el-radio>
+                  <el-radio label="1">鍚�</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item v-if="form.menuType != 'F'" label="璺敱鍦板潃" prop="path">
+                <el-input v-model="form.path" placeholder="璇疯緭鍏ヨ矾鐢卞湴鍧�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12" v-if="form.menuType == 'C'">
+              <el-form-item label="缁勪欢璺緞" prop="component">
+                <el-input v-model="form.component" placeholder="璇疯緭鍏ョ粍浠惰矾寰�"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item v-if="form.menuType != 'M'" label="鏉冮檺鏍囪瘑">
+                <el-input v-model="form.perms" placeholder="璇锋潈闄愭爣璇�" maxlength="50"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item v-if="form.menuType != 'F'" label="鑿滃崟鐘舵��">
+                <el-radio-group v-model="form.visible">
+                  <el-radio
+                      v-for="dict in visibleOptions"
+                      :key="dict.dictValue"
+                      :label="dict.dictValue"
+                  >{{ dict.dictLabel }}
+                  </el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="24">
+              <el-form-item v-if="form.menuType != 'F'" label="椤甸潰鍙傛暟" prop="parameter">
+                <el-input v-model="form.parameter" placeholder="璇疯緭鍏ラ〉闈㈠弬鏁�"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </el-dialog>
+    </basic-container>
+  </div>
+</template>
+
+<script>
+import {listMenu, getMenu, treeselect, delMenu, addMenu, updateMenu} from "@/api/system/menu";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import IconSelect from "@/components/IconSelect";
+import mixins from '@/layout/mixin/getHeight';
+
+export default {
+  name: "Menu",
+  mixins: [mixins],
+  components: {Treeselect, IconSelect},
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 鑿滃崟琛ㄦ牸鏍戞暟鎹�
+      menuList: [],
+      // 鑿滃崟鏍戦�夐」
+      menuOptions: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鑿滃崟鐘舵�佹暟鎹瓧鍏�
+      visibleOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        menuName: undefined,
+        visible: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        menuName: [
+          {required: true, message: "鑿滃崟鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        orderNum: [
+          {required: true, message: "鑿滃崟椤哄簭涓嶈兘涓虹┖", trigger: "blur"}
+        ]
+      },
+      height: null
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_show_hide").then(response => {
+      this.visibleOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle ={
+        height:window.innerHeight - 210+ 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 270
+    },
+    // 閫夋嫨鍥炬爣
+    selected(name) {
+      this.form.icon = name;
+    },
+    /** 鏌ヨ鑿滃崟鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listMenu(this.queryParams).then(response => {
+        this.menuList = response.data;
+        this.loading = false;
+      });
+    },
+    /** 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋� */
+    getTreeselect() {
+      treeselect().then(response => {
+        this.menuOptions = [];
+        const menu = {id: 0, label: '涓荤被鐩�', children: []};
+        menu.children = response.data;
+        this.menuOptions.push(menu);
+      });
+    },
+    // 鑿滃崟鏄剧ず鐘舵�佸瓧鍏哥炕璇�
+    visibleFormat(row, column) {
+      if (row.menuType == "F") {
+        return "";
+      }
+      return this.selectDictLabel(this.visibleOptions, row.visible);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        menuId: undefined,
+        parentId: 0,
+        menuName: undefined,
+        icon: undefined,
+        menuType: "M",
+        orderNum: undefined,
+        isFrame: "1",
+        visible: "0"
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.getList();
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd(row) {
+      this.reset();
+      this.getTreeselect();
+      if (row != null) {
+        this.form.parentId = row.menuId;
+      }
+      this.open = true;
+      this.title = "娣诲姞鑿滃崟";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.getTreeselect();
+      getMenu(row.menuId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鑿滃崟";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.menuId != undefined) {
+            updateMenu(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addMenu(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      this.$confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.menuName + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delMenu(row.menuId);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-table td, .el-table th {
+  text-align: left !important;
+}
+
+.el-form-item {
+  margin-bottom: 0;
+}
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/system/notice/index.vue b/energy_management_ui/src/views/system/notice/index.vue
new file mode 100644
index 0000000..84f035c
--- /dev/null
+++ b/energy_management_ui/src/views/system/notice/index.vue
@@ -0,0 +1,376 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+         <el-col :span="6">
+            <el-form-item label="鍏憡鏍囬" prop="noticeTitle">
+              <el-input
+                  v-model="queryParams.noticeTitle"
+                  placeholder="璇疯緭鍏ュ叕鍛婃爣棰�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+         <el-col :span="6">
+            <el-form-item label="鎿嶄綔浜哄憳" prop="createBy">
+              <el-input
+                  v-model="queryParams.createBy"
+                  placeholder="璇疯緭鍏ユ搷浣滀汉鍛�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+         <el-col :span="6">
+            <el-form-item label="绫诲瀷" prop="noticeType">
+              <el-select v-model="queryParams.noticeType" placeholder="鍏憡绫诲瀷" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in typeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+         <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:notice:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:notice:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:notice:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table  :height="height" v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="搴忓彿" align="center" prop="noticeId" width="100"/>
+        <el-table-column
+            label="鍏憡鏍囬"
+            align="center"
+            prop="noticeTitle"
+            :show-overflow-tooltip="true"
+        />
+        <el-table-column
+            label="鍏憡绫诲瀷"
+            align="center"
+            prop="noticeType"
+            :formatter="typeFormat"
+            width="100"
+        />
+        <el-table-column
+            label="鐘舵��"
+            align="center"
+            prop="status"
+            :formatter="statusFormat"
+            width="100"
+        />
+        <el-table-column label="鍒涘缓鑰�" align="center" prop="createBy" width="100"/>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="100">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:notice:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:notice:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀瑰叕鍛婂璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="780px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鍏憡鏍囬" prop="noticeTitle">
+              <el-input v-model="form.noticeTitle" placeholder="璇疯緭鍏ュ叕鍛婃爣棰�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍏憡绫诲瀷" prop="noticeType">
+              <el-select v-model="form.noticeType" placeholder="璇烽�夋嫨">
+                <el-option
+                    v-for="dict in typeOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鐘舵��">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictValue"
+                >{{ dict.dictLabel }}
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍐呭">
+              <Editor v-model="form.noticeContent"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer" style="padding-top:20px">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listNotice, getNotice, delNotice, addNotice, updateNotice, exportNotice} from "@/api/system/notice";
+import Editor from '@/components/Editor';
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "Notice",
+  mixins: [mixins],
+  components: {
+    Editor
+  },
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鍏憡琛ㄦ牸鏁版嵁
+      noticeList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 绫诲瀷鏁版嵁瀛楀吀
+      statusOptions: [],
+      // 鐘舵�佹暟鎹瓧鍏�
+      typeOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        noticeTitle: undefined,
+        createBy: undefined,
+        status: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        noticeTitle: [
+          {required: true, message: "鍏憡鏍囬涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        noticeType: [
+          {required: true, message: "鍏憡绫诲瀷涓嶈兘涓虹┖", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_notice_status").then(response => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("sys_notice_type").then(response => {
+      this.typeOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ鍏憡鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listNotice(this.queryParams).then(response => {
+        this.noticeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍏憡鐘舵�佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    // 鍏憡鐘舵�佸瓧鍏哥炕璇�
+    typeFormat(row, column) {
+      return this.selectDictLabel(this.typeOptions, row.noticeType);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        noticeId: undefined,
+        noticeTitle: undefined,
+        noticeType: undefined,
+        noticeContent: undefined,
+        status: "0"
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.noticeId)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鍏憡";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const noticeId = row.noticeId || this.ids
+      getNotice(noticeId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鍏憡";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.noticeId != undefined) {
+            updateNotice(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addNotice(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const noticeIds = row.noticeId || this.ids
+      this.$confirm('鏄惁纭鍒犻櫎鍏憡缂栧彿涓�"' + noticeIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delNotice(noticeIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
\ No newline at end of file
diff --git a/energy_management_ui/src/views/system/post/index.vue b/energy_management_ui/src/views/system/post/index.vue
new file mode 100644
index 0000000..64e796d
--- /dev/null
+++ b/energy_management_ui/src/views/system/post/index.vue
@@ -0,0 +1,360 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" label-width="72px" class="special-form">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="宀椾綅缂栫爜" prop="postCode">
+              <el-input
+                  v-model="queryParams.postCode"
+                  placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="宀椾綅鍚嶇О" prop="postName">
+              <el-input
+                  v-model="queryParams.postName"
+                  placeholder="璇疯緭鍏ュ矖浣嶅悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐘舵��" prop="status">
+              <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable size="small" style="width: 100%">
+                <el-option
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:post:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:post:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:post:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:post:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table :height="height" v-loading="loading" :data="postList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="宀椾綅缂栧彿" align="center" prop="postId"/>
+        <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode"/>
+        <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName"/>
+        <el-table-column label="宀椾綅鎺掑簭" align="center" prop="postSort"/>
+        <el-table-column label="鐘舵��" align="center" prop="status" :formatter="statusFormat"/>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:post:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:post:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="宀椾綅鍚嶇О" prop="postName">
+          <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�"/>
+        </el-form-item>
+        <el-form-item label="宀椾綅缂栫爜" prop="postCode">
+          <el-input v-model="form.postCode" placeholder="璇疯緭鍏ョ紪鐮佸悕绉�"/>
+        </el-form-item>
+        <el-form-item label="宀椾綅椤哄簭" prop="postSort">
+          <el-input-number v-model="form.postSort" controls-position="right" :min="0"/>
+        </el-form-item>
+        <el-form-item label="宀椾綅鐘舵��" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+                v-for="dict in statusOptions"
+                :key="dict.dictValue"
+                :label="dict.dictValue"
+            >{{ dict.dictLabel }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listPost, getPost, delPost, addPost, updatePost, exportPost} from "@/api/system/post";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  mixins: [mixins],
+  name: "Post",
+  data() {
+    return {
+      height: null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 宀椾綅琛ㄦ牸鏁版嵁
+      postList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鐘舵�佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        postCode: undefined,
+        postName: undefined,
+        status: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        postName: [
+          {required: true, message: "宀椾綅鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        postCode: [
+          {required: true, message: "宀椾綅缂栫爜涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        postSort: [
+          {required: true, message: "宀椾綅椤哄簭涓嶈兘涓虹┖", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ宀椾綅鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listPost(this.queryParams).then(response => {
+        this.postList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 宀椾綅鐘舵�佸瓧鍏哥炕璇�
+    statusFormat(row, column) {
+      return this.selectDictLabel(this.statusOptions, row.status);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        postId: undefined,
+        postCode: undefined,
+        postName: undefined,
+        postSort: 0,
+        status: "0",
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.postId)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞宀椾綅";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const postId = row.postId || this.ids
+      getPost(postId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼宀椾綅";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.postId != undefined) {
+            updatePost(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addPost(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const postIds = row.postId || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎宀椾綅缂栧彿涓�"' + postIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delPost(postIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夊矖浣嶆暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportPost(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
\ No newline at end of file
diff --git a/energy_management_ui/src/views/system/role/index.vue b/energy_management_ui/src/views/system/role/index.vue
new file mode 100644
index 0000000..efa6421
--- /dev/null
+++ b/energy_management_ui/src/views/system/role/index.vue
@@ -0,0 +1,597 @@
+<template>
+  <div>
+    <basic-container>
+      <el-form :model="queryParams" ref="queryForm" class="special-form" label-width="73px">
+        <el-row :gutter="24">
+          <el-col :span="6">
+            <el-form-item label="瑙掕壊鍚嶇О" prop="roleName">
+              <el-input
+                  v-model="queryParams.roleName"
+                  placeholder="璇疯緭鍏ヨ鑹插悕绉�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鏉冮檺瀛楃" prop="roleKey">
+              <el-input
+                  v-model="queryParams.roleKey"
+                  placeholder="璇疯緭鍏ユ潈闄愬瓧绗�"
+                  clearable
+                  size="small"
+                  @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="鐘舵��" prop="status">
+              <el-select
+                  v-model="queryParams.status"
+                  placeholder="瑙掕壊鐘舵��"
+                  clearable
+                  size="small"
+                  style="width: 100%"
+              >
+                <el-option
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+<!--          <el-col :span="6">-->
+<!--            <el-form-item label="鍒涘缓鏃堕棿">-->
+<!--              <el-date-picker-->
+<!--                  v-model="dateRange"-->
+<!--                  size="small"-->
+<!--                  style="width: 100%"-->
+<!--                  value-format="yyyy-MM-dd"-->
+<!--                  type="daterange"-->
+<!--                  range-separator="-"-->
+<!--                  start-placeholder="寮�濮嬫棩鏈�"-->
+<!--                  end-placeholder="缁撴潫鏃ユ湡"-->
+<!--              ></el-date-picker>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
+          <el-col :span="6">
+            <el-form-item class="operation">
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+              <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </basic-container>
+    <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+      <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+        <el-col :span="1.5">
+          <el-button
+              type="primary"
+              icon="el-icon-plus"
+              size="mini"
+              @click="handleAdd"
+              v-hasPermi="['system:role:add']"
+          >鏂板
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="success"
+              icon="el-icon-edit"
+              size="mini"
+              :disabled="single"
+              @click="handleUpdate"
+              v-hasPermi="['system:role:edit']"
+          >淇敼
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="danger"
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:role:remove']"
+          >鍒犻櫎
+          </el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['system:post:export']"
+          >瀵煎嚭
+          </el-button>
+        </el-col>
+      </el-row>
+      <el-table v-loading="loading" :data="roleList"  :height="height" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center"/>
+        <el-table-column label="瑙掕壊缂栧彿" prop="roleId" width="120"/>
+        <el-table-column label="瑙掕壊鍚嶇О" prop="roleName" :show-overflow-tooltip="true" width="150"/>
+        <el-table-column label="鏉冮檺瀛楃" prop="roleKey" :show-overflow-tooltip="true" width="150"/>
+        <el-table-column label="鏄剧ず椤哄簭" prop="roleSort" width="100"/>
+        <el-table-column label="鐘舵��" align="center" width="100">
+          <template slot-scope="scope">
+            <el-switch
+                v-model="scope.row.status"
+                active-value="0"
+                inactive-value="1"
+                @change="handleStatusChange(scope.row)"
+            ></el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.createTime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-edit"
+                @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:role:edit']"
+            >淇敼
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-circle-check"
+                @click="handleDataScope(scope.row)"
+                v-hasPermi="['system:role:edit']"
+            >鏁版嵁鏉冮檺
+            </el-button>
+            <el-button
+                size="mini"
+                type="text"
+                icon="el-icon-delete"
+                @click="handleDelete(scope.row)"
+                v-hasPermi="['system:role:remove']"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          :total="total"
+          :page.sync="queryParams.pageNum"
+          :limit.sync="queryParams.pageSize"
+          @pagination="getList"
+      />
+    </basic-container>
+    <!-- 娣诲姞鎴栦慨鏀硅鑹查厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="瑙掕壊鍚嶇О" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�"/>
+        </el-form-item>
+        <el-form-item label="鏉冮檺瀛楃" prop="roleKey">
+          <el-input v-model="form.roleKey" placeholder="璇疯緭鍏ユ潈闄愬瓧绗�"/>
+        </el-form-item>
+        <el-form-item label="瑙掕壊椤哄簭" prop="roleSort">
+          <el-input-number v-model="form.roleSort" controls-position="right" :min="1"/>
+        </el-form-item>
+        <el-form-item label="鐘舵��">
+          <el-radio-group v-model="form.status">
+            <el-radio
+                v-for="dict in statusOptions"
+                :key="dict.dictValue"
+                :label="dict.dictValue"
+            >{{ dict.dictLabel }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="鑿滃崟鏉冮檺">
+          <el-tree
+              :data="menuOptions"
+              show-checkbox
+              ref="menu"
+              node-key="id"
+              empty-text="鍔犺浇涓紝璇风◢鍚�"
+              :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+        <el-form-item label="澶囨敞">
+          <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鍒嗛厤瑙掕壊鏁版嵁鏉冮檺瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="openDataScope" width="500px">
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="瑙掕壊鍚嶇О">
+          <el-input v-model="form.roleName" :disabled="true"/>
+        </el-form-item>
+        <el-form-item label="鏉冮檺瀛楃">
+          <el-input v-model="form.roleKey" :disabled="true"/>
+        </el-form-item>
+        <el-form-item label="鏉冮檺鑼冨洿">
+          <el-select v-model="form.dataScope">
+            <el-option
+                v-for="item in dataScopeOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏁版嵁鏉冮檺" v-show="form.dataScope == 2">
+          <el-tree
+              :data="deptOptions"
+              show-checkbox
+              default-expand-all
+              ref="dept"
+              node-key="id"
+              empty-text="鍔犺浇涓紝璇风◢鍚�"
+              :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitDataScope">纭� 瀹�</el-button>
+        <el-button @click="cancelDataScope">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listRole,
+  getRole,
+  delRole,
+  addRole,
+  updateRole,
+  exportRole,
+  dataScope,
+  changeRoleStatus
+} from "@/api/system/role";
+import {treeselect as menuTreeselect, roleMenuTreeselect} from "@/api/system/menu";
+import {treeselect as deptTreeselect, roleDeptTreeselect} from "@/api/system/dept";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  name: "Role",
+  mixins: [mixins],
+  data() {
+    return {
+      height:null,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 瑙掕壊琛ㄦ牸鏁版嵁
+      roleList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏄惁鏄剧ず寮瑰嚭灞傦紙鏁版嵁鏉冮檺锛�
+      openDataScope: false,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 鐘舵�佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 鏁版嵁鑼冨洿閫夐」
+      dataScopeOptions: [
+        {
+          value: "1",
+          label: "鍏ㄩ儴鏁版嵁鏉冮檺"
+        },
+        {
+          value: "2",
+          label: "鑷畾鏁版嵁鏉冮檺"
+        },
+        {
+          value: "3",
+          label: "鏈儴闂ㄦ暟鎹潈闄�"
+        },
+        {
+          value: "4",
+          label: "鏈儴闂ㄥ強浠ヤ笅鏁版嵁鏉冮檺"
+        },
+        {
+          value: "5",
+          label: "浠呮湰浜烘暟鎹潈闄�"
+        }
+      ],
+      // 鑿滃崟鍒楄〃
+      menuOptions: [],
+      // 閮ㄩ棬鍒楄〃
+      deptOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        roleName: undefined,
+        roleKey: undefined,
+        beginTime: undefined,
+        endTime: undefined,
+        status: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      defaultProps: {
+        children: "children",
+        label: "label"
+      },
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        roleName: [
+          {required: true, message: "瑙掕壊鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        roleKey: [
+          {required: true, message: "鏉冮檺瀛楃涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        roleSort: [
+          {required: true, message: "瑙掕壊椤哄簭涓嶈兘涓虹┖", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_normal_disable").then(response => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.leftBodyStyle = {
+        height: window.innerHeight - 100 + 'px',
+        overflow: 'auto'
+      }
+      this.height = window.innerHeight - 370;
+    },
+    /** 鏌ヨ瑙掕壊鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listRole(this.addDateRange(this.queryParams, this.dateRange)).then(
+          response => {
+            this.roleList = response.rows;
+            this.total = response.total;
+            this.loading = false;
+          }
+      );
+    },
+    /** 鏌ヨ鑿滃崟鏍戠粨鏋� */
+    getMenuTreeselect() {
+      menuTreeselect().then(response => {
+        this.menuOptions = response.data;
+      });
+    },
+    /** 鏌ヨ閮ㄩ棬鏍戠粨鏋� */
+    getDeptTreeselect() {
+      deptTreeselect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 鎵�鏈夎彍鍗曡妭鐐规暟鎹�
+    getMenuAllCheckedKeys() {
+      // 鐩墠琚�変腑鐨勮彍鍗曡妭鐐�
+      let checkedKeys = this.$refs.menu.getHalfCheckedKeys();
+      // 鍗婇�変腑鐨勮彍鍗曡妭鐐�
+      let halfCheckedKeys = this.$refs.menu.getCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
+    // 鎵�鏈夐儴闂ㄨ妭鐐规暟鎹�
+    getDeptAllCheckedKeys() {
+      // 鐩墠琚�変腑鐨勯儴闂ㄨ妭鐐�
+      let checkedKeys = this.$refs.dept.getHalfCheckedKeys();
+      // 鍗婇�変腑鐨勯儴闂ㄨ妭鐐�
+      let halfCheckedKeys = this.$refs.dept.getCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
+    /** 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戠粨鏋� */
+    getRoleMenuTreeselect(roleId) {
+      roleMenuTreeselect(roleId).then(response => {
+        this.getMenuTreeselect();
+        this.$refs.menu.setCheckedKeys(response.data);
+      });
+    },
+    /** 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戠粨鏋� */
+    getRoleDeptTreeselect(roleId) {
+      roleDeptTreeselect(roleId).then(response => {
+        this.getDeptTreeselect();
+        this.$refs.dept.setCheckedKeys(response.data);
+      });
+    },
+    // 瑙掕壊鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$confirm('纭瑕�"' + text + '""' + row.roleName + '"瑙掕壊鍚�?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return changeRoleStatus(row.roleId, row.status);
+      }).then(() => {
+        this.msgSuccess(text + "鎴愬姛");
+      }).catch(function () {
+        row.status = row.status === "0" ? "1" : "0";
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 鍙栨秷鎸夐挳锛堟暟鎹潈闄愶級
+    cancelDataScope() {
+      this.openDataScope = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      if (this.$refs.tree != undefined) {
+        this.$refs.tree.setCheckedKeys([]);
+      }
+      this.form = {
+        roleId: undefined,
+        roleName: undefined,
+        roleKey: undefined,
+        roleSort: 1,
+        status: "0",
+        menuIds: [],
+        deptIds: [],
+        remark: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.roleId)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.getMenuTreeselect();
+      this.open = true;
+      this.title = "娣诲姞瑙掕壊";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const roleId = row.roleId || this.ids
+      this.$nextTick(() => {
+        this.getRoleMenuTreeselect(roleId);
+      });
+      getRole(roleId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼瑙掕壊";
+      });
+    },
+    /** 鍒嗛厤鏁版嵁鏉冮檺鎿嶄綔 */
+    handleDataScope(row) {
+      this.reset();
+      this.$nextTick(() => {
+        this.getRoleDeptTreeselect(row.roleId);
+      });
+      getRole(row.roleId).then(response => {
+        this.form = response.data;
+        this.openDataScope = true;
+        this.title = "鍒嗛厤鏁版嵁鏉冮檺";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.roleId != undefined) {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
+            updateRole(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
+            addRole(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鎻愪氦鎸夐挳锛堟暟鎹潈闄愶級 */
+    submitDataScope: function () {
+      if (this.form.roleId != undefined) {
+        this.form.deptIds = this.getDeptAllCheckedKeys();
+        dataScope(this.form).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess("淇敼鎴愬姛");
+            this.openDataScope = false;
+            this.getList();
+          } else {
+            this.msgError(response.msg);
+          }
+        });
+      }
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const roleIds = row.roleId || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎瑙掕壊缂栧彿涓�"' + roleIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return delRole(roleIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function () {
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎鑹叉暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportRole(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+</style>
diff --git a/energy_management_ui/src/views/system/user/index.vue b/energy_management_ui/src/views/system/user/index.vue
new file mode 100644
index 0000000..6242229
--- /dev/null
+++ b/energy_management_ui/src/views/system/user/index.vue
@@ -0,0 +1,742 @@
+<template>
+  <div>
+    <el-row type="flex">
+      <!--閮ㄩ棬鏁版嵁-->
+      <el-col :style="{width:isCollapse?'0': '280px',position:'relative'}" v-show="!isCollapse">
+        <basic-container :bodyStyle="leftBodyStyle" title="鐢ㄦ埛绠$悊">
+          <div>
+            <el-input
+                v-model="deptName"
+                placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+                clearable
+                size="small"
+                prefix-icon="el-icon-search"
+                style="margin-bottom: 20px"
+            />
+          </div>
+          <div style="overflow: auto">
+            <el-tree
+                :data="deptOptions"
+                :props="defaultProps"
+                :expand-on-click-node="false"
+                :filter-node-method="filterNode"
+                ref="tree"
+                default-expand-all
+                highlight-current
+                @node-click="handleNodeClick"
+            />
+          </div>
+        </basic-container>
+        <img src="~@/assets/image/rectangle.png" alt=""
+             class="shrink-col-block"
+             @click="toggleCollapse">
+      </el-col>
+      <!--鐢ㄦ埛鏁版嵁-->
+      <ShrinkCol @toggleCollapse="toggleCollapse" v-show="isCollapse"/>
+      <el-col :style="{width:isCollapse? 'calc(100% - 48px)':'calc(100% - 280px)',paddingLeft:isCollapse? 0:'14px'}">
+        <div>
+          <basic-container>
+            <el-form class="special-form" :model="queryParams" ref="queryForm" label-width="73px">
+              <el-row :gutter="24">
+                <el-col :span="8">
+                  <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
+                    <el-input
+                        v-model="queryParams.userName"
+                        placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"
+                        clearable
+                        size="small"
+                        @keyup.enter.native="handleQuery"
+                    />
+                  </el-form-item>
+                </el-col>
+                <el-col :span="8">
+                  <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+                    <el-input
+                        v-model="queryParams.phonenumber"
+                        placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�"
+                        clearable
+                        size="small"
+                        @keyup.enter.native="handleQuery"
+                    />
+                  </el-form-item>
+                </el-col>
+                <!--                <el-col :span="8">-->
+                <!--                  <el-form-item label="鐘舵��" prop="status">-->
+                <!--                    <el-select-->
+                <!--                        v-model="queryParams.status"-->
+                <!--                        placeholder="鐢ㄦ埛鐘舵��"-->
+                <!--                        clearable-->
+                <!--                        size="small"-->
+                <!--                        style="width: 100%"-->
+                <!--                    >-->
+                <!--                      <el-option-->
+                <!--                          v-for="dict in statusOptions"-->
+                <!--                          :key="dict.dictValue"-->
+                <!--                          :label="dict.dictLabel"-->
+                <!--                          :value="dict.dictValue"-->
+                <!--                      />-->
+                <!--                    </el-select>-->
+                <!--                  </el-form-item>-->
+                <!--                </el-col>-->
+                <!--                <el-col :span="8">-->
+                <!--                  <el-form-item label="鍒涘缓鏃堕棿">-->
+                <!--                    <el-date-picker-->
+                <!--                        v-model="dateRange"-->
+                <!--                        size="small"-->
+                <!--                        style="width: 100%"-->
+                <!--                        value-format="yyyy-MM-dd"-->
+                <!--                        type="daterange"-->
+                <!--                        range-separator="-"-->
+                <!--                        start-placeholder="寮�濮嬫棩鏈�"-->
+                <!--                        end-placeholder="缁撴潫鏃ユ湡"-->
+                <!--                    ></el-date-picker>-->
+                <!--                  </el-form-item>-->
+                <!--                </el-col>-->
+                <el-col :span="8">
+                  <el-form-item class="operation">
+                    <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+                    <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+          </basic-container>
+        </div>
+        <basic-container style="margin-top: 16px" :bodyStyle="bodyStyle">
+          <el-row :gutter="10" class="mb8" style="margin-bottom: 19px">
+            <el-col :span="1.5">
+              <el-button
+                  type="primary"
+                  icon="el-icon-plus"
+                  size="mini"
+                  @click="handleAdd"
+                  v-hasPermi="['system:user:add']"
+              >鏂板
+              </el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button
+                  type="success"
+                  icon="el-icon-edit"
+                  size="mini"
+                  :disabled="single"
+                  @click="handleUpdate"
+                  v-hasPermi="['system:user:edit']"
+              >淇敼
+              </el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button
+                  type="danger"
+                  icon="el-icon-delete"
+                  size="mini"
+                  :disabled="multiple"
+                  @click="handleDelete"
+                  v-hasPermi="['system:user:remove']"
+              >鍒犻櫎
+              </el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button
+                  type="info"
+                  icon="el-icon-upload2"
+                  size="mini"
+                  @click="handleImport"
+                  v-hasPermi="['system:user:import']"
+              >瀵煎叆
+              </el-button>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button
+                  type="warning"
+                  icon="el-icon-download"
+                  size="mini"
+                  @click="handleExport"
+                  v-hasPermi="['system:user:export']"
+              >瀵煎嚭
+              </el-button>
+            </el-col>
+          </el-row>
+          <el-table v-loading="loading" :data="userList"
+                    :height="height"
+                    @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="50" align="center" label=""/>
+            <el-table-column label="鐢ㄦ埛缂栧彿" align="center" prop="userId"/>
+            <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" prop="userName" :show-overflow-tooltip="true"/>
+            <el-table-column label="鐢ㄦ埛鏄电О" align="center" prop="nickName" :show-overflow-tooltip="true"/>
+            <el-table-column label="閮ㄩ棬" align="center" prop="dept.deptName" :show-overflow-tooltip="true"/>
+            <el-table-column label="鎵嬫満鍙风爜" align="center" prop="phonenumber" width="120"/>
+            <el-table-column label="鐘舵��" align="center">
+              <template slot-scope="scope">
+                <el-switch
+                    v-model="scope.row.status"
+                    active-value="0"
+                    inactive-value="1"
+                    @change="handleStatusChange(scope.row)"
+                ></el-switch>
+              </template>
+            </el-table-column>
+            <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="160">
+              <template slot-scope="scope">
+                <span>{{ parseTime(scope.row.createTime) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column
+                label="鎿嶄綔"
+                align="center"
+                width="180"
+                fixed="right"
+                class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope">
+                <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-edit"
+                    @click="handleUpdate(scope.row)"
+                    v-hasPermi="['system:user:edit']"
+                >淇敼
+                </el-button>
+                <el-button
+                    v-if="scope.row.userId !== 1"
+                    size="mini"
+                    type="text"
+                    icon="el-icon-delete"
+                    @click="handleDelete(scope.row)"
+                    v-hasPermi="['system:user:remove']"
+                >鍒犻櫎
+                </el-button>
+                <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-key"
+                    @click="handleResetPwd(scope.row)"
+                    v-hasPermi="['system:user:resetPwd']"
+                >閲嶇疆
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination
+              :total="total"
+              :page.sync="queryParams.pageNum"
+              :limit.sync="queryParams.pageSize"
+              @pagination="getList"
+          />
+        </basic-container>
+      </el-col>
+    </el-row>
+
+    <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="600px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+              <el-input v-model="form.nickName" placeholder="璇疯緭鍏ョ敤鎴锋樀绉�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="褰掑睘閮ㄩ棬" prop="deptId">
+              <treeselect v-model="form.deptId" :options="deptOptions" placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+              <el-input v-model="form.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="11"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="閭" prop="email">
+              <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
+              <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛瀵嗙爜" prop="password">
+              <el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐢ㄦ埛鎬у埆">
+              <el-select v-model="form.sex" placeholder="璇烽�夋嫨">
+                <el-option
+                    v-for="dict in sexOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictLabel"
+                    :value="dict.dictValue"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐘舵��">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                    v-for="dict in statusOptions"
+                    :key="dict.dictValue"
+                    :label="dict.dictValue"
+                >{{ dict.dictLabel }}
+                </el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="宀椾綅">
+              <el-select v-model="form.postIds" multiple placeholder="璇烽�夋嫨">
+                <el-option
+                    v-for="item in postOptions"
+                    :key="item.postId"
+                    :label="item.postName"
+                    :value="item.postId"
+                    :disabled="item.status == 1"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瑙掕壊">
+              <el-select v-model="form.roleIds" multiple placeholder="璇烽�夋嫨">
+                <el-option
+                    v-for="item in roleOptions"
+                    :key="item.roleId"
+                    :label="item.roleName"
+                    :value="item.roleId"
+                    :disabled="item.status == 1"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="澶囨敞">
+              <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" :destroy-on-close="true" width="400px">
+      <el-upload
+          ref="upload"
+          :limit="1"
+          accept=".xlsx, .xls"
+          :headers="upload.headers"
+          :action="upload.url + '?updateSupport=' + upload.updateSupport"
+          :disabled="upload.isUploading"
+          :on-progress="handleFileUploadProgress"
+          :on-success="handleFileSuccess"
+          :auto-upload="false"
+          drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          灏嗘枃浠舵嫋鍒版澶勶紝鎴�
+          <em>鐐瑰嚮涓婁紶</em>
+        </div>
+        <div class="el-upload__tip" slot="tip">
+          <el-checkbox v-model="upload.updateSupport"/>
+          鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+          <el-link type="info" style="font-size:12px" @click="importTemplate">涓嬭浇妯℃澘</el-link>
+        </div>
+        <div class="el-upload__tip" style="color:red" slot="tip">鎻愮ず锛氫粎鍏佽瀵煎叆鈥渪ls鈥濇垨鈥渪lsx鈥濇牸寮忔枃浠讹紒</div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">纭� 瀹�</el-button>
+        <el-button @click="upload.open = false">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listUser,
+  getUser,
+  delUser,
+  addUser,
+  updateUser,
+  exportUser,
+  resetUserPwd,
+  changeUserStatus,
+  importTemplate
+} from '@/api/system/user'
+import { getToken } from '@/utils/auth'
+import { treeselect } from '@/api/system/dept'
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import mixins from '@/layout/mixin/getHeight'
+import ShrinkCol from '@/components/shrink/index.vue'
+
+export default {
+  name: 'User',
+  components: { Treeselect, ShrinkCol },
+  mixins: [mixins],
+  data() {
+    return {
+      isCollapse: false,
+      height: null,
+      leftBodyStyle: {},
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: '',
+      // 閮ㄩ棬鏍戦�夐」
+      deptOptions: undefined,
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      // 鐘舵�佹暟鎹瓧鍏�
+      statusOptions: [],
+      // 鎬у埆鐘舵�佸瓧鍏�
+      sexOptions: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      // 瑙掕壊閫夐」
+      roleOptions: [],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      defaultProps: {
+        children: 'children',
+        label: 'label'
+      },
+      // 鐢ㄦ埛瀵煎叆鍙傛暟
+      upload: {
+        // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
+        open: false,
+        // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
+        title: '',
+        // 鏄惁绂佺敤涓婁紶
+        isUploading: false,
+        // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+        updateSupport: 0,
+        // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+        headers: { Authorization: 'Bearer ' + getToken() },
+        // 涓婁紶鐨勫湴鍧�
+        url: process.env.VUE_APP_BASE_API + '/system/user/importData'
+      },
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        userName: undefined,
+        phonenumber: undefined,
+        status: undefined,
+        beginTime: undefined,
+        endTime: undefined,
+        deptId: undefined
+      },
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        userName: [
+          { required: true, message: '鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        nickName: [
+          { required: true, message: '鐢ㄦ埛鏄电О涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        deptId: [
+          { required: true, message: '褰掑睘閮ㄩ棬涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        password: [
+          { required: true, message: '鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖', trigger: 'blur' }
+        ],
+        email: [
+          {
+            type: 'email',
+            message: '\'璇疯緭鍏ユ纭殑閭鍦板潃',
+            trigger: ['blur', 'change']
+          }
+        ],
+        phonenumber: [
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: '璇疯緭鍏ユ纭殑鎵嬫満鍙风爜',
+            trigger: 'blur'
+          }
+        ]
+      }
+    }
+  },
+  watch: {
+    // 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲
+    deptName(val) {
+      this.$refs.tree.filter(val)
+    }
+  },
+  created() {
+    this.getList()
+    this.getTreeselect()
+    this.getDicts('sys_normal_disable').then(response => {
+      this.statusOptions = response.data
+    })
+    this.getDicts('sys_user_sex').then(response => {
+      this.sexOptions = response.data
+    })
+    this.getConfigKey('sys.user.initPassword').then(response => {
+      this.initPassword = response.data
+    })
+  },
+  methods: {
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    },
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 210 + 'px',
+        overflow: 'hidden'
+      }
+      this.leftBodyStyle = {
+        height: window.innerHeight - 100 + 'px',
+        overflow: 'auto'
+      }
+      this.height = window.innerHeight - 370
+    },
+    /** 鏌ヨ鐢ㄦ埛鍒楄〃 */
+    getList() {
+      this.loading = true
+      listUser(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+            this.userList = response.rows
+            this.total = response.total
+            this.loading = false
+          }
+      )
+    },
+    /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
+    getTreeselect() {
+      treeselect().then(response => {
+        this.deptOptions = response.data
+      })
+    },
+    // 绛涢�夎妭鐐�
+    filterNode(value, data) {
+      if (!value) return true
+      return data.label.indexOf(value) !== -1
+    },
+    // 鑺傜偣鍗曞嚮浜嬩欢
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id
+      this.getList()
+    },
+    // 鐢ㄦ埛鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === '0' ? '鍚敤' : '鍋滅敤'
+      this.$confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?', '璀﹀憡', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(function() {
+        return changeUserStatus(row.userId, row.status)
+      }).then(() => {
+        this.msgSuccess(text + '鎴愬姛')
+      }).catch(function() {
+        row.status = row.status === '0' ? '1' : '0'
+      })
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: '0',
+        remark: undefined,
+        postIds: [],
+        roleIds: []
+      }
+      this.resetForm('form')
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.page = 1
+      this.getList()
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = []
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.userId)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset()
+      this.getTreeselect()
+      getUser().then(response => {
+        this.postOptions = response.posts
+        this.roleOptions = response.roles
+        this.open = true
+        this.title = '娣诲姞鐢ㄦ埛'
+        this.form.password = this.initPassword
+      })
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset()
+      this.getTreeselect()
+      const userId = row.userId || this.ids
+      getUser(userId).then(response => {
+        this.form = response.data
+        this.postOptions = response.posts
+        this.roleOptions = response.roles
+        this.form.postIds = response.postIds
+        this.form.roleIds = response.roleIds
+        this.open = true
+        this.title = '淇敼鐢ㄦ埛'
+        this.form.password = ''
+      })
+    },
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷'
+      }).then(({ value }) => {
+        resetUserPwd(row.userId, value).then(response => {
+          if (response.code === 200) {
+            this.msgSuccess('淇敼鎴愬姛锛屾柊瀵嗙爜鏄細' + value)
+          } else {
+            this.msgError(response.msg)
+          }
+        })
+      }).catch(() => {
+      })
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs['form'].validate(valid => {
+        if (valid) {
+          if (this.form.userId != undefined) {
+            updateUser(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess('淇敼鎴愬姛')
+                this.open = false
+                this.getList()
+              } else {
+                this.msgError(response.msg)
+              }
+            })
+          } else {
+            addUser(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess('鏂板鎴愬姛')
+                this.open = false
+                this.getList()
+              } else {
+                this.msgError(response.msg)
+              }
+            })
+          }
+        }
+      })
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids
+      this.$confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」?', '璀﹀憡', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(function() {
+        return delUser(userIds)
+      }).then(() => {
+        this.getList()
+        this.msgSuccess('鍒犻櫎鎴愬姛')
+      }).catch(function() {
+      })
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夌敤鎴锋暟鎹」?', '璀﹀憡', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(function() {
+        return exportUser(queryParams)
+      }).then(response => {
+        this.download(response.msg)
+      }).catch(function() {
+      })
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImport() {
+      this.upload.title = '鐢ㄦ埛瀵煎叆'
+      this.upload.open = true
+    },
+    /** 涓嬭浇妯℃澘鎿嶄綔 */
+    importTemplate() {
+      importTemplate().then(response => {
+        this.download(response.msg)
+      })
+    },
+    // 鏂囦欢涓婁紶涓鐞�
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true
+    },
+    // 鏂囦欢涓婁紶鎴愬姛澶勭悊
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false
+      this.upload.isUploading = false
+      this.$refs.upload.clearFiles()
+      this.$alert(response.msg, '瀵煎叆缁撴灉', { dangerouslyUseHTMLString: true })
+      this.getList()
+    },
+    // 鎻愪氦涓婁紶鏂囦欢
+    submitFileForm() {
+      this.$refs.upload.submit()
+    }
+  }
+}
+</script>
+<style scoped lang="scss">
+.special-form {
+  @import "~@/assets/styles/common-table-form.scss";
+}
+.shrink-col-block {
+  position: absolute;
+  top: 20px;
+  right: 16px;
+  cursor: pointer;
+}
+</style>
diff --git a/energy_management_ui/src/views/system/user/profile/index.vue b/energy_management_ui/src/views/system/user/profile/index.vue
new file mode 100644
index 0000000..31d7ab1
--- /dev/null
+++ b/energy_management_ui/src/views/system/user/profile/index.vue
@@ -0,0 +1,106 @@
+<template>
+  <el-row>
+    <el-col class="page-left">
+      <basic-container :bodyStyle="bodyStyle" title="涓汉淇℃伅">
+        <div>
+          <div class="text-center">
+            <userAvatar :user="user"/>
+          </div>
+          <ul class="list-group list-group-striped">
+            <li class="list-group-item">
+              <svg-icon icon-class="user"/>
+              鐢ㄦ埛鍚嶇О
+              <div class="pull-right">{{ user.userName }}</div>
+            </li>
+            <li class="list-group-item">
+              <svg-icon icon-class="phone"/>
+              鎵嬫満鍙风爜
+              <div class="pull-right">{{ user.phonenumber }}</div>
+            </li>
+            <li class="list-group-item">
+              <svg-icon icon-class="email"/>
+              鐢ㄦ埛閭
+              <div class="pull-right">{{ user.email }}</div>
+            </li>
+            <li class="list-group-item">
+              <svg-icon icon-class="tree"/>
+              鎵�灞為儴闂�
+              <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
+            </li>
+            <li class="list-group-item">
+              <svg-icon icon-class="peoples"/>
+              鎵�灞炶鑹�
+              <div class="pull-right">{{ roleGroup }}</div>
+            </li>
+            <li class="list-group-item">
+              <svg-icon icon-class="date"/>
+              鍒涘缓鏃ユ湡
+              <div class="pull-right">2018-08-23 09:11:56</div>
+            </li>
+          </ul>
+        </div>
+      </basic-container>
+    </el-col>
+    <el-col class="page-right">
+      <basic-container :bodyStyle="bodyStyle" title="鍩烘湰璧勬枡">
+        <el-tabs v-model="activeTab">
+          <el-tab-pane label="鍩烘湰璧勬枡" name="userinfo">
+            <userInfo :user="user"/>
+          </el-tab-pane>
+          <el-tab-pane label="淇敼瀵嗙爜" name="resetPwd">
+            <resetPwd :user="user"/>
+          </el-tab-pane>
+        </el-tabs>
+      </basic-container>
+    </el-col>
+  </el-row>
+</template>
+
+<script>
+import userAvatar from "./userAvatar";
+import userInfo from "./userInfo";
+import resetPwd from "./resetPwd";
+import {getUserProfile} from "@/api/system/user";
+import mixins from "@/layout/mixin/getHeight";
+
+export default {
+  components: {userAvatar, userInfo, resetPwd},
+  mixins: [mixins],
+  data() {
+    return {
+      user: {},
+      roleGroup: {},
+      postGroup: {},
+      activeTab: "userinfo"
+    };
+  },
+  created() {
+    this.getUser();
+  },
+  methods: {
+    setCharts() {
+      this.bodyStyle = {
+        height: window.innerHeight - 155 + 'px',
+        overflow: 'hidden'
+      }
+    },
+    getUser() {
+      getUserProfile().then(response => {
+        this.user = response.data;
+        this.roleGroup = response.roleGroup;
+        this.postGroup = response.postGroup;
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.page-left {
+  width: 45%;
+}
+
+.page-right {
+  width: 55%;
+  padding-left: 14px;
+}
+</style>
\ No newline at end of file
diff --git a/energy_management_ui/src/views/system/user/profile/resetPwd.vue b/energy_management_ui/src/views/system/user/profile/resetPwd.vue
new file mode 100644
index 0000000..3de5dfd
--- /dev/null
+++ b/energy_management_ui/src/views/system/user/profile/resetPwd.vue
@@ -0,0 +1,76 @@
+<template>
+  <el-form ref="form" :model="user" :rules="rules" label-width="80px">
+    <el-form-item label="鏃у瘑鐮�" prop="oldPassword">
+      <el-input v-model="user.oldPassword" placeholder="璇疯緭鍏ユ棫瀵嗙爜" type="password" />
+    </el-form-item>
+    <el-form-item label="鏂板瘑鐮�" prop="newPassword">
+      <el-input v-model="user.newPassword" placeholder="璇疯緭鍏ユ柊瀵嗙爜" type="password" />
+    </el-form-item>
+    <el-form-item label="纭瀵嗙爜" prop="confirmPassword">
+      <el-input v-model="user.confirmPassword" placeholder="璇风‘璁ゅ瘑鐮�" type="password" />
+    </el-form-item>
+    <el-form-item>
+      <el-button type="primary" size="mini" @click="submit">淇濆瓨</el-button>
+      <el-button type="danger" size="mini" @click="close">鍏抽棴</el-button>
+    </el-form-item>
+  </el-form>
+</template>
+
+<script>
+import { updateUserPwd } from "@/api/system/user";
+
+export default {
+  data() {
+    const equalToPassword = (rule, value, callback) => {
+      if (this.user.newPassword !== value) {
+        callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"));
+      } else {
+        callback();
+      }
+    };
+    return {
+      test: "1test",
+      user: {
+        oldPassword: undefined,
+        newPassword: undefined,
+        confirmPassword: undefined
+      },
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        oldPassword: [
+          { required: true, message: "鏃у瘑鐮佷笉鑳戒负绌�", trigger: "blur" }
+        ],
+        newPassword: [
+          { required: true, message: "鏂板瘑鐮佷笉鑳戒负绌�", trigger: "blur" },
+          { min: 6, max: 20, message: "闀垮害鍦� 6 鍒� 20 涓瓧绗�", trigger: "blur" }
+        ],
+        confirmPassword: [
+          { required: true, message: "纭瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+          { required: true, validator: equalToPassword, trigger: "blur" }
+        ]
+      }
+    };
+  },
+  methods: {
+    submit() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          updateUserPwd(this.user.oldPassword, this.user.newPassword).then(
+            response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+              } else {
+                this.msgError(response.msg);
+              }
+            }
+          );
+        }
+      });
+    },
+    close() {
+      this.$store.dispatch("tagsView/delView", this.$route);
+      this.$router.push({ path: "/index" });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/system/user/profile/userAvatar.vue b/energy_management_ui/src/views/system/user/profile/userAvatar.vue
new file mode 100644
index 0000000..eddcd81
--- /dev/null
+++ b/energy_management_ui/src/views/system/user/profile/userAvatar.vue
@@ -0,0 +1,138 @@
+<template>
+  <div>
+    <img v-bind:src="options.img" @click="editCropper()" title="鐐瑰嚮涓婁紶澶村儚" class="img-circle img-lg" />
+    <el-dialog :title="title" :visible.sync="open" width="800px">
+      <el-row>
+        <el-col :xs="24" :md="12" :style="{height: '350px'}">
+          <vue-cropper
+            ref="cropper"
+            :img="options.img"
+            :info="true"
+            :autoCrop="options.autoCrop"
+            :autoCropWidth="options.autoCropWidth"
+            :autoCropHeight="options.autoCropHeight"
+            :fixedBox="options.fixedBox"
+            @realTime="realTime"
+          />
+        </el-col>
+        <el-col :xs="24" :md="12" :style="{height: '350px'}">
+          <div class="avatar-upload-preview">
+            <img :src="previews.url" :style="previews.img" />
+          </div>
+        </el-col>
+      </el-row>
+      <br />
+      <el-row>
+        <el-col :lg="2" :md="2">
+          <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
+            <el-button size="small">
+              涓婁紶
+              <i class="el-icon-upload el-icon--right"></i>
+            </el-button>
+          </el-upload>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 2}" :md="2">
+          <el-button icon="el-icon-plus" size="small" @click="changeScale(1)"></el-button>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 1}" :md="2">
+          <el-button icon="el-icon-minus" size="small" @click="changeScale(-1)"></el-button>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 1}" :md="2">
+          <el-button icon="el-icon-refresh-left" size="small" @click="rotateLeft()"></el-button>
+        </el-col>
+        <el-col :lg="{span: 1, offset: 1}" :md="2">
+          <el-button icon="el-icon-refresh-right" size="small" @click="rotateRight()"></el-button>
+        </el-col>
+        <el-col :lg="{span: 2, offset: 6}" :md="2">
+          <el-button type="primary" size="small" @click="uploadImg()">鎻� 浜�</el-button>
+        </el-col>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import store from "@/store";
+import { VueCropper } from "vue-cropper";
+import { uploadAvatar } from "@/api/system/user";
+
+export default {
+  components: { VueCropper },
+  props: {
+    user: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 寮瑰嚭灞傛爣棰�
+      title: "淇敼澶村儚",
+      options: {
+        img: store.getters.avatar, //瑁佸壀鍥剧墖鐨勫湴鍧�
+        autoCrop: true, // 鏄惁榛樿鐢熸垚鎴浘妗�
+        autoCropWidth: 200, // 榛樿鐢熸垚鎴浘妗嗗搴�
+        autoCropHeight: 200, // 榛樿鐢熸垚鎴浘妗嗛珮搴�
+        fixedBox: true // 鍥哄畾鎴浘妗嗗ぇ灏� 涓嶅厑璁告敼鍙�
+      },
+      previews: {}
+    };
+  },
+  methods: {
+    // 缂栬緫澶村儚
+    editCropper() {
+      this.open = true;
+    },
+    // 瑕嗙洊榛樿鐨勪笂浼犺涓�
+    requestUpload() {
+    },
+    // 鍚戝乏鏃嬭浆
+    rotateLeft() {
+      this.$refs.cropper.rotateLeft();
+    },
+    // 鍚戝彸鏃嬭浆
+    rotateRight() {
+      this.$refs.cropper.rotateRight();
+    },
+    // 鍥剧墖缂╂斁
+    changeScale(num) {
+      num = num || 1;
+      this.$refs.cropper.changeScale(num);
+    },
+    // 涓婁紶棰勫鐞�
+    beforeUpload(file) {
+      if (file.type.indexOf("image/") == -1) {
+        this.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��");
+      } else {
+        const reader = new FileReader();
+        reader.readAsDataURL(file);
+        reader.onload = () => {
+          this.options.img = reader.result;
+        };
+      }
+    },
+    // 涓婁紶鍥剧墖
+    uploadImg() {
+      this.$refs.cropper.getCropBlob(data => {
+        let formData = new FormData();
+        formData.append("avatarfile", data);
+        uploadAvatar(formData).then(response => {
+          if (response.code === 200) {
+            this.open = false;
+            this.options.img = process.env.VUE_APP_BASE_API + response.imgUrl;
+            this.msgSuccess("淇敼鎴愬姛");
+          } else {
+            this.msgError(response.msg);
+          }
+          this.$refs.cropper.clearCrop();
+        });
+      });
+    },
+    // 瀹炴椂棰勮
+    realTime(data) {
+      this.previews = data;
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/system/user/profile/userInfo.vue b/energy_management_ui/src/views/system/user/profile/userInfo.vue
new file mode 100644
index 0000000..e50198f
--- /dev/null
+++ b/energy_management_ui/src/views/system/user/profile/userInfo.vue
@@ -0,0 +1,80 @@
+<template>
+  <el-form ref="form" :model="user" :rules="rules" label-width="80px">
+    <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+      <el-input v-model="user.nickName" />
+    </el-form-item> 
+    <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
+      <el-input v-model="user.phonenumber" maxlength="11" />
+    </el-form-item>
+    <el-form-item label="閭" prop="email">
+      <el-input v-model="user.email" maxlength="50" />
+    </el-form-item>
+    <el-form-item label="鎬у埆">
+      <el-radio-group v-model="user.sex">
+        <el-radio label="0">鐢�</el-radio>
+        <el-radio label="1">濂�</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <el-form-item>
+      <el-button type="primary" size="mini" @click="submit">淇濆瓨</el-button>
+      <el-button type="danger" size="mini" @click="close">鍏抽棴</el-button>
+    </el-form-item>
+  </el-form>
+</template>
+
+<script>
+import { updateUserProfile } from "@/api/system/user";
+
+export default {
+  props: {
+    user: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        nickName: [
+          { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        email: [
+          { required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            type: "email",
+            message: "'璇疯緭鍏ユ纭殑閭鍦板潃",
+            trigger: ["blur", "change"]
+          }
+        ],
+        phonenumber: [
+          { required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" },
+          {
+            pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+            message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
+            trigger: "blur"
+          }
+        ]
+      }
+    };
+  },
+  methods: {
+    submit() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          updateUserProfile(this.user).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("淇敼鎴愬姛");
+            } else {
+              this.msgError(response.msg);
+            }
+          });
+        }
+      });
+    },
+    close() {
+      this.$store.dispatch("tagsView/delView", this.$route);
+      this.$router.push({ path: "/index" });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/tool/build/index.vue b/energy_management_ui/src/views/tool/build/index.vue
new file mode 100644
index 0000000..5d2b73a
--- /dev/null
+++ b/energy_management_ui/src/views/tool/build/index.vue
@@ -0,0 +1,5 @@
+<template>
+  <div class="app-container">
+   鏋勫缓宸ュ叿
+  </div>
+</template>
\ No newline at end of file
diff --git a/energy_management_ui/src/views/tool/gen/basicInfoForm.vue b/energy_management_ui/src/views/tool/gen/basicInfoForm.vue
new file mode 100644
index 0000000..757962c
--- /dev/null
+++ b/energy_management_ui/src/views/tool/gen/basicInfoForm.vue
@@ -0,0 +1,61 @@
+<template>
+  <el-form ref="basicInfoForm" :model="info" :rules="rules" label-width="150px">
+    <el-row>
+      <el-col :span="12">
+        <el-form-item label="琛ㄥ悕绉�" prop="tableName">
+          <el-input placeholder="璇疯緭鍏ヤ粨搴撳悕绉�" v-model="info.tableName" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="琛ㄦ弿杩�" prop="tableComment">
+          <el-input placeholder="璇疯緭鍏�" v-model="info.tableComment" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item label="瀹炰綋绫诲悕绉�" prop="className">
+          <el-input placeholder="璇疯緭鍏�" v-model="info.className" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="浣滆��" prop="functionAuthor">
+          <el-input placeholder="璇疯緭鍏�" v-model="info.functionAuthor" />
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input type="textarea" :rows="3" v-model="info.remark"></el-input>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+export default {
+  name: "BasicInfoForm",
+  props: {
+    info: {
+      type: Object,
+      default: null
+    }
+  },
+  data() {
+    return {
+      rules: {
+        tableName: [
+          { required: true, message: "璇疯緭鍏ヨ〃鍚嶇О", trigger: "blur" }
+        ],
+        tableComment: [
+          { required: true, message: "璇疯緭鍏ヨ〃鎻忚堪", trigger: "blur" }
+        ],
+        className: [
+          { required: true, message: "璇疯緭鍏ュ疄浣撶被鍚嶇О", trigger: "blur" }
+        ],
+        functionAuthor: [
+          { required: true, message: "璇疯緭鍏ヤ綔鑰�", trigger: "blur" }
+        ]
+      }
+    };
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/tool/gen/editTable.vue b/energy_management_ui/src/views/tool/gen/editTable.vue
new file mode 100644
index 0000000..d91fb02
--- /dev/null
+++ b/energy_management_ui/src/views/tool/gen/editTable.vue
@@ -0,0 +1,204 @@
+<template>
+  <el-card>
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="鍩烘湰淇℃伅" name="basic">
+        <basic-info-form ref="basicInfo" :info="info" />
+      </el-tab-pane>
+      <el-tab-pane label="瀛楁淇℃伅" name="cloum">
+        <el-table :data="cloumns" :max-height="tableHeight">
+          <el-table-column label="搴忓彿" type="index" min-width="5%" />
+          <el-table-column
+            label="瀛楁鍒楀悕"
+            prop="columnName"
+            min-width="10%"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="瀛楁鎻忚堪"
+            prop="columnComment"
+            min-width="10%"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column
+            label="鐗╃悊绫诲瀷"
+            prop="columnType"
+            min-width="10%"
+            :show-overflow-tooltip="true"
+          />
+          <el-table-column label="Java绫诲瀷" min-width="11%">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.javaType">
+                <el-option label="Long" value="Long" />
+                <el-option label="String" value="String" />
+                <el-option label="Integer" value="Integer" />
+                <el-option label="Double" value="Double" />
+                <el-option label="BigDecimal" value="BigDecimal" />
+                <el-option label="Date" value="Date" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="java灞炴��" min-width="10%">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.javaField"></el-input>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="鎻掑叆" min-width="5%">
+            <template slot-scope="scope">
+              <el-checkbox true-label="1" v-model="scope.row.isInsert"></el-checkbox>
+            </template>
+          </el-table-column>
+          <el-table-column label="缂栬緫" min-width="5%">
+            <template slot-scope="scope">
+              <el-checkbox true-label="1" v-model="scope.row.isEdit"></el-checkbox>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍒楄〃" min-width="5%">
+            <template slot-scope="scope">
+              <el-checkbox true-label="1" v-model="scope.row.isList"></el-checkbox>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏌ヨ" min-width="5%">
+            <template slot-scope="scope">
+              <el-checkbox true-label="1" v-model="scope.row.isQuery"></el-checkbox>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏌ヨ鏂瑰紡" min-width="10%">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.queryType">
+                <el-option label="=" value="EQ" />
+                <el-option label="!=" value="NE" />
+                <el-option label=">" value="GT" />
+                <el-option label=">=" value="GTE" />
+                <el-option label="<" value="LT" />
+                <el-option label="<=" value="LTE" />
+                <el-option label="LIKE" value="LIKE" />
+                <el-option label="BETWEEN" value="BETWEEN" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="蹇呭~" min-width="5%">
+            <template slot-scope="scope">
+              <el-checkbox true-label="1" v-model="scope.row.isRequired"></el-checkbox>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏄剧ず绫诲瀷" min-width="12%">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.htmlType">
+                <el-option label="鏂囨湰妗�" value="input" />
+                <el-option label="鏂囨湰鍩�" value="textarea" />
+                <el-option label="涓嬫媺妗�" value="select" />
+                <el-option label="鍗曢�夋" value="radio" />
+                <el-option label="澶嶉�夋" value="checkbox" />
+                <el-option label="鏃ユ湡鎺т欢" value="datetime" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="瀛楀吀绫诲瀷" min-width="12%">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.dictType" clearable filterable placeholder="璇烽�夋嫨">
+                <el-option
+                  v-for="dict in dictOptions"
+                  :key="dict.dictType"
+                  :label="dict.dictName"
+                  :value="dict.dictType">
+                  <span style="float: left">{{ dict.dictName }}</span>
+                  <span style="float: right; color: #8492a6; font-size: 13px">{{ dict.dictType }}</span>
+              </el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-tab-pane>
+      <el-tab-pane label="鐢熸垚淇℃伅" name="genInfo">
+        <gen-info-form ref="genInfo" :info="info" />
+      </el-tab-pane>
+    </el-tabs>
+    <el-form label-width="100px">
+      <el-form-item style="text-align: center;margin-left:-100px;margin-top:10px;">
+        <el-button type="primary" @click="submitForm()">鎻愪氦</el-button>
+        <el-button @click="close()">杩斿洖</el-button>
+      </el-form-item>
+    </el-form>
+  </el-card>
+</template>
+<script>
+import { getGenTable, updateGenTable } from "@/api/tool/gen";
+import { optionselect as getDictOptionselect } from "@/api/system/dict/type";
+import basicInfoForm from "./basicInfoForm";
+import genInfoForm from "./genInfoForm";
+export default {
+  name: "GenEdit",
+  components: {
+    basicInfoForm,
+    genInfoForm
+  },
+  data() {
+    return {
+      // 閫変腑閫夐」鍗$殑 name
+      activeName: "cloum",
+      // 琛ㄦ牸鐨勯珮搴�
+      tableHeight: document.documentElement.scrollHeight - 245 + "px",
+      // 琛ㄥ垪淇℃伅
+      cloumns: [],
+      // 瀛楀吀淇℃伅
+      dictOptions: [],
+      // 琛ㄨ缁嗕俊鎭�
+      info: {}
+    };
+  },
+  beforeCreate() {
+    const { tableId } = this.$route.query;
+    if (tableId) {
+      // 鑾峰彇琛ㄨ缁嗕俊鎭�
+      getGenTable(tableId).then(res => {
+        this.cloumns = res.data.rows;
+        this.info = res.data.info;
+      });
+      /** 鏌ヨ瀛楀吀涓嬫媺鍒楄〃 */
+      getDictOptionselect().then(response => {
+        this.dictOptions = response.data;
+      });
+    }
+  },
+  methods: {
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      const basicForm = this.$refs.basicInfo.$refs.basicInfoForm;
+      const genForm = this.$refs.genInfo.$refs.genInfoForm;
+      Promise.all([basicForm, genForm].map(this.getFormPromise)).then(res => {
+        const validateResult = res.every(item => !!item);
+        if (validateResult) {
+          const genTable = Object.assign({}, basicForm.model, genForm.model);
+          genTable.columns = this.cloumns;
+          genTable.params = {
+            treeCode: genTable.treeCode,
+            treeName: genTable.treeName,
+            treeParentCode: genTable.treeParentCode
+          };
+          updateGenTable(genTable).then(res => {
+            this.msgSuccess(res.msg);
+            if (res.code === 200) {
+              this.close();
+            }
+          });
+        } else {
+          this.msgError("琛ㄥ崟鏍¢獙鏈�氳繃锛岃閲嶆柊妫�鏌ユ彁浜ゅ唴瀹�");
+        }
+      });
+    },
+    getFormPromise(form) {
+      return new Promise(resolve => {
+        form.validate(res => {
+          resolve(res);
+        });
+      });
+    },
+    /** 鍏抽棴鎸夐挳 */
+    close() {
+      this.$store.dispatch("tagsView/delView", this.$route);
+      this.$router.push({ path: "/tool/gen", query: { t: Date.now()}})
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/tool/gen/genInfoForm.vue b/energy_management_ui/src/views/tool/gen/genInfoForm.vue
new file mode 100644
index 0000000..5f217e9
--- /dev/null
+++ b/energy_management_ui/src/views/tool/gen/genInfoForm.vue
@@ -0,0 +1,154 @@
+<template>
+  <el-form ref="genInfoForm" :model="info" :rules="rules" label-width="150px">
+    <el-row>
+      <el-col :span="12">
+        <el-form-item prop="tplCategory">
+          <span slot="label">鐢熸垚妯℃澘</span>
+          <el-select v-model="info.tplCategory">
+            <el-option label="鍗曡〃锛堝鍒犳敼鏌ワ級" value="crud" />
+            <el-option label="鏍戣〃锛堝鍒犳敼鏌ワ級" value="tree" />
+          </el-select>
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="packageName">
+          <span slot="label">
+            鐢熸垚鍖呰矾寰�
+            <el-tooltip content="鐢熸垚鍦ㄥ摢涓猨ava鍖呬笅锛屼緥濡� com.ruoyi.system" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="info.packageName" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="moduleName">
+          <span slot="label">
+            鐢熸垚妯″潡鍚�
+            <el-tooltip content="鍙悊瑙d负瀛愮郴缁熷悕锛屼緥濡� system" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="info.moduleName" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="businessName">
+          <span slot="label">
+            鐢熸垚涓氬姟鍚�
+            <el-tooltip content="鍙悊瑙d负鍔熻兘鑻辨枃鍚嶏紝渚嬪 user" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="info.businessName" />
+        </el-form-item>
+      </el-col>
+
+      <el-col :span="12">
+        <el-form-item prop="functionName">
+          <span slot="label">
+            鐢熸垚鍔熻兘鍚�
+            <el-tooltip content="鐢ㄤ綔绫绘弿杩帮紝渚嬪 鐢ㄦ埛" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-input v-model="info.functionName" />
+        </el-form-item>
+      </el-col>
+    </el-row>
+
+    <el-row v-show="info.tplCategory == 'tree'">
+      <h4 class="form-header">鍏朵粬淇℃伅</h4>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            鏍戠紪鐮佸瓧娈�
+            <el-tooltip content="鏍戞樉绀虹殑缂栫爜瀛楁鍚嶏紝 濡傦細dept_id" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="info.treeCode" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="column in info.columns"
+              :key="column.columnName"
+              :label="column.columnName + '锛�' + column.columnComment"
+              :value="column.columnName"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            鏍戠埗缂栫爜瀛楁
+            <el-tooltip content="鏍戞樉绀虹殑鐖剁紪鐮佸瓧娈靛悕锛� 濡傦細parent_Id" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="info.treeParentCode" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="column in info.columns"
+              :key="column.columnName"
+              :label="column.columnName + '锛�' + column.columnComment"
+              :value="column.columnName"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item>
+          <span slot="label">
+            鏍戝悕绉板瓧娈�
+            <el-tooltip content="鏍戣妭鐐圭殑鏄剧ず鍚嶇О瀛楁鍚嶏紝 濡傦細dept_name" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+          </span>
+          <el-select v-model="info.treeName" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="column in info.columns"
+              :key="column.columnName"
+              :label="column.columnName + '锛�' + column.columnComment"
+              :value="column.columnName"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+<script>
+export default {
+  name: "BasicInfoForm",
+  props: {
+    info: {
+      type: Object,
+      default: null
+    }
+  },
+  data() {
+    return {
+      rules: {
+        tplCategory: [
+          { required: true, message: "璇烽�夋嫨鐢熸垚妯℃澘", trigger: "blur" }
+        ],
+        packageName: [
+          { required: true, message: "璇疯緭鍏ョ敓鎴愬寘璺緞", trigger: "blur" }
+        ],
+        moduleName: [
+          { required: true, message: "璇疯緭鍏ョ敓鎴愭ā鍧楀悕", trigger: "blur" }
+        ],
+        businessName: [
+          { required: true, message: "璇疯緭鍏ョ敓鎴愪笟鍔″悕", trigger: "blur" }
+        ],
+        functionName: [
+          { required: true, message: "璇疯緭鍏ョ敓鎴愬姛鑳藉悕", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {}
+};
+</script>
diff --git a/energy_management_ui/src/views/tool/gen/importTable.vue b/energy_management_ui/src/views/tool/gen/importTable.vue
new file mode 100644
index 0000000..e4b30c2
--- /dev/null
+++ b/energy_management_ui/src/views/tool/gen/importTable.vue
@@ -0,0 +1,114 @@
+<template>
+  <!-- 瀵煎叆琛� -->
+  <el-dialog title="瀵煎叆琛�" :visible.sync="visible" width="800px" top="5vh">
+    <el-form :model="queryParams" ref="queryForm" :inline="true">
+      <el-form-item label="琛ㄥ悕绉�" prop="tableName">
+        <el-input
+          v-model="queryParams.tableName"
+          placeholder="璇疯緭鍏ヨ〃鍚嶇О"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="琛ㄦ弿杩�" prop="tableComment">
+        <el-input
+          v-model="queryParams.tableComment"
+          placeholder="璇疯緭鍏ヨ〃鎻忚堪"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row>
+      <el-table :data="dbTableList" @selection-change="handleSelectionChange" height="260px">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="tableName" label="琛ㄥ悕绉�"></el-table-column>
+        <el-table-column prop="tableComment" label="琛ㄦ弿杩�"></el-table-column>
+        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿"></el-table-column>
+        <el-table-column prop="updateTime" label="鏇存柊鏃堕棿"></el-table-column>
+      </el-table>
+      <pagination
+        v-show="total>0"
+        :total="total"
+        :page.sync="queryParams.pageNum"
+        :limit.sync="queryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="handleImportTable">纭� 瀹�</el-button>
+      <el-button @click="visible = false">鍙� 娑�</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listDbTable, importTable } from "@/api/tool/gen";
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      visible: false,
+      // 閫変腑鏁扮粍鍊�
+      tables: [],
+      // 鎬绘潯鏁�
+      total: 0,
+      // 琛ㄦ暟鎹�
+      dbTableList: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        tableName: undefined,
+        tableComment: undefined
+      }
+    };
+  },
+  methods: {
+    // 鏄剧ず寮规
+    show() {
+      this.getList();
+      this.visible = true;
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.tables = selection.map(item => item.tableName);
+    },
+    // 鏌ヨ琛ㄦ暟鎹�
+    getList() {
+      listDbTable(this.queryParams).then(res => {
+        if (res.code === 200) {
+          this.dbTableList = res.rows;
+          this.total = res.total;
+        }
+      });
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 瀵煎叆鎸夐挳鎿嶄綔 */
+    handleImportTable() {
+      importTable({ tables: this.tables.join(",") }).then(res => {
+        this.msgSuccess(res.msg);
+        if (res.code === 200) {
+          this.visible = false;
+          this.$emit("ok");
+        }
+      });
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/tool/gen/index.vue b/energy_management_ui/src/views/tool/gen/index.vue
new file mode 100644
index 0000000..28fb5bc
--- /dev/null
+++ b/energy_management_ui/src/views/tool/gen/index.vue
@@ -0,0 +1,287 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="琛ㄥ悕绉�" prop="tableName">
+        <el-input
+          v-model="queryParams.tableName"
+          placeholder="璇疯緭鍏ヨ〃鍚嶇О"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="琛ㄦ弿杩�" prop="tableComment">
+        <el-input
+          v-model="queryParams.tableComment"
+          placeholder="璇疯緭鍏ヨ〃鎻忚堪"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鍒涘缓鏃堕棿">
+        <el-date-picker
+          v-model="dateRange"
+          size="small"
+          style="width: 240px"
+          value-format="yyyy-MM-dd"
+          type="daterange"
+          range-separator="-"
+          start-placeholder="寮�濮嬫棩鏈�"
+          end-placeholder="缁撴潫鏃ユ湡"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleGenTable"
+          v-hasPermi="['tool:gen:code']"
+        >鐢熸垚</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          icon="el-icon-upload"
+          size="mini"
+          @click="openImportTable"
+          v-hasPermi="['tool:gen:import']"
+        >瀵煎叆</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleEditTable"
+          v-hasPermi="['tool:gen:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['tool:gen:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="tableList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55"></el-table-column>
+      <el-table-column label="搴忓彿" align="center" prop="tableId" width="50px" />
+      <el-table-column
+        label="琛ㄥ悕绉�"
+        align="center"
+        prop="tableName"
+        :show-overflow-tooltip="true"
+        width="130"
+      />
+      <el-table-column
+        label="琛ㄦ弿杩�"
+        align="center"
+        prop="tableComment"
+        :show-overflow-tooltip="true"
+        width="130"
+      />
+      <el-table-column
+        label="瀹炰綋"
+        align="center"
+        prop="className"
+        :show-overflow-tooltip="true"
+        width="130"
+      />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="160" />
+      <el-table-column label="鏇存柊鏃堕棿" align="center" prop="updateTime" width="160" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            type="text"
+            size="small"
+            icon="el-icon-view"
+            @click="handlePreview(scope.row)"
+            v-hasPermi="['tool:gen:preview']"
+          >棰勮</el-button>
+          <el-button
+            type="text"
+            size="small"
+            icon="el-icon-edit"
+            @click="handleEditTable(scope.row)"
+            v-hasPermi="['tool:gen:edit']"
+          >缂栬緫</el-button>
+          <el-button
+            type="text"
+            size="small"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['tool:gen:remove']"
+          >鍒犻櫎</el-button>
+          <el-button
+            type="text"
+            size="small"
+            icon="el-icon-download"
+            @click="handleGenTable(scope.row)"
+            v-hasPermi="['tool:gen:code']"
+          >鐢熸垚浠g爜</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <!-- 棰勮鐣岄潰 -->
+    <el-dialog :title="preview.title" :visible.sync="preview.open" width="80%" top="5vh">
+      <el-tabs v-model="preview.activeName">
+        <el-tab-pane
+          v-for="(value, key) in preview.data"
+          :label="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))"
+          :name="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))"
+          :key="key"
+        >
+          <pre>{{ value }}</pre>
+        </el-tab-pane>
+      </el-tabs>
+    </el-dialog>
+    <import-table ref="import" @ok="handleQuery" />
+  </div>
+</template>
+
+<script>
+import { listTable, previewTable, delTable } from "@/api/tool/gen";
+import importTable from "./importTable";
+import { downLoadZip } from "@/utils/zipdownload";
+export default {
+  name: "Gen",
+  components: { importTable },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 鍞竴鏍囪瘑绗�
+      uniqueId: "",
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 閫変腑琛ㄦ暟缁�
+      tableNames: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 琛ㄦ暟鎹�
+      tableList: [],
+      // 鏃ユ湡鑼冨洿
+      dateRange: "",
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        tableName: undefined,
+        tableComment: undefined
+      },
+      // 棰勮鍙傛暟
+      preview: {
+        open: false,
+        title: "浠g爜棰勮",
+        data: {},
+        activeName: "domain.java"
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  activated() {
+    const time = this.$route.query.t;
+    if (time != null && time != this.uniqueId) {
+      this.uniqueId = time;
+      this.resetQuery();
+    }
+  },
+  methods: {
+    /** 鏌ヨ琛ㄩ泦鍚� */
+    getList() {
+      this.loading = true;
+      listTable(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+          this.tableList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        }
+      );
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 鐢熸垚浠g爜鎿嶄綔 */
+    handleGenTable(row) {
+      const tableNames = row.tableName || this.tableNames;
+      if (tableNames == "") {
+        this.msgError("璇烽�夋嫨瑕佺敓鎴愮殑鏁版嵁");
+        return;
+      }
+      downLoadZip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi");
+    },
+    /** 鎵撳紑瀵煎叆琛ㄥ脊绐� */
+    openImportTable() {
+      this.$refs.import.show();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 棰勮鎸夐挳 */
+    handlePreview(row) {
+      previewTable(row.tableId).then(response => {
+        this.preview.data = response.data;
+        this.preview.open = true;
+      });
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.tableId);
+      this.tableNames = selection.map(item => item.tableName);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleEditTable(row) {
+      const tableId = row.tableId || this.ids[0];
+      this.$router.push({ path: "/gen/edit", query: { tableId: tableId } });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const tableIds = row.tableId || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎琛ㄧ紪鍙蜂负"' + tableIds + '"鐨勬暟鎹」?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function() {
+          return delTable(tableIds);
+      }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+      }).catch(function() {});
+    }
+  }
+};
+</script>
\ No newline at end of file
diff --git a/energy_management_ui/src/views/tool/swagger/index.vue b/energy_management_ui/src/views/tool/swagger/index.vue
new file mode 100644
index 0000000..61cfcca
--- /dev/null
+++ b/energy_management_ui/src/views/tool/swagger/index.vue
@@ -0,0 +1,26 @@
+<template>
+  <div v-loading="loading" :style="'height:'+ height">
+    <iframe :src="src" frameborder="no" style="width: 100%;height: 100%" scrolling="auto" />
+  </div>
+</template>
+<script>
+export default {
+  name: "Swagger",
+  data() {
+    return {
+      src: process.env.VUE_APP_BASE_API + "/swagger-ui.html",
+      height: document.documentElement.clientHeight - 94.5 + "px;",
+      loading: true
+    };
+  },
+  mounted: function() {
+    setTimeout(() => {
+      this.loading = false;
+    }, 230);
+    const that = this;
+    window.onresize = function temp() {
+      that.height = document.documentElement.clientHeight - 94.5 + "px;";
+    };
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/workforce/dutyManagement/rostering_duty.vue b/energy_management_ui/src/views/workforce/dutyManagement/rostering_duty.vue
new file mode 100644
index 0000000..a40839d
--- /dev/null
+++ b/energy_management_ui/src/views/workforce/dutyManagement/rostering_duty.vue
@@ -0,0 +1,303 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['workforce:dutyManagement:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['workforce:dutyManagement:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['workforce:dutyManagement:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['workforce:dutyManagement:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="managementList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="缂栧彿" align="center" prop="code" />
+      <el-table-column label="椤哄簭鍙�" align="center" prop="orderNo" />
+      <el-table-column label="缁勭粐缁撴瀯" align="center" prop="deptName"  />
+      <el-table-column label="鍊兼鍚嶇О" align="center" prop="name" />
+      <el-table-column label="鎻忚堪" align="center" prop="description" />
+      <el-table-column label="鍒涘缓浜�" align="center" prop="createBy" />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="淇敼浜�" align="center" prop="updateBy" />
+      <el-table-column label="淇敼鏃堕棿" align="center" prop="updateTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updateTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['workforce:dutyManagement:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['workforce:dutyManagement:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀规帓鐝鐞嗗璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="缁勭粐缁撴瀯" prop="deptName">
+          <span>{{form.deptName}}</span>
+        </el-form-item>
+        <el-form-item label="缂栧彿" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鍙�" />
+        </el-form-item>
+        <el-form-item label="鍊兼鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ�兼鍚嶇О" />
+        </el-form-item>
+        <el-form-item label="椤哄簭鍙�" prop="orderNo">
+          <el-input v-model="form.orderNo" placeholder="璇疯緭鍏ラ『搴忓彿" />
+        </el-form-item>
+        <el-form-item label="鎻忚堪" prop="description">
+          <el-input v-model="form.description" placeholder="璇疯緭鍏ユ弿杩�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listManagement, getManagement, delManagement, addManagement, updateManagement, exportManagement } from "@/api/workforce/duty_management";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鎺掔彮绠$悊琛ㄦ牸鏁版嵁
+      managementList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        name: undefined,
+        deptId: undefined,
+        orderNo: undefined,
+        description: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined
+      },
+      node:"",
+      deptName:"",
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          { required: true, message: "id涓嶈兘涓虹┖", trigger: "blur" }
+        ],        code: [
+          { required: true, message: "缂栧彿涓嶈兘涓虹┖", trigger: "blur" }
+        ],        name: [
+          { required: true, message: "鍊兼鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+        ],      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      /* console.log(modelNode.id);
+       console.log(modelNode.label);*/
+      this.node= modelNode.id;
+      this.deptName= modelNode.label;
+      this.getList();
+    },
+    /** 鏌ヨ鎺掔彮绠$悊鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listManagement(this.queryParams).then(response => {
+        this.managementList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        deptId: undefined,
+        orderNo: undefined,
+        description: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.form.deptId=this.node;
+      this.form.deptName=this.deptName;
+      this.title = "娣诲姞鎺掔彮绠$悊";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      this.form.deptId=this.node;
+      this.form.deptName=this.deptName;
+      const id = row.id || this.ids
+      getManagement(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鎺掔彮绠$悊";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateManagement(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addManagement(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎鎺掔彮绠$悊缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delManagement(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋帓鐝鐞嗘暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportManagement(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/workforce/management/scheme.vue b/energy_management_ui/src/views/workforce/management/scheme.vue
new file mode 100644
index 0000000..2478e22
--- /dev/null
+++ b/energy_management_ui/src/views/workforce/management/scheme.vue
@@ -0,0 +1,374 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="璇疯緭鍏ョ紪鐮�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ュ悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="杞�兼柟妗堢被鍨�" prop="rosteringschemekind" label-width="100px">
+        <el-select v-model="queryParams.rosteringschemekind" placeholder="璇烽�夋嫨杞�肩被鍨�" clearable size="small">
+        <el-option
+          v-for="dict in rosteringschemekindOptions"
+          :key="dict.dictValue"
+          :label="dict.dictLabel"
+          :value="dict.dictValue"
+        />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['rosteringSrcheme:scheme:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['rosteringSrcheme:scheme:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['rosteringSrcheme:scheme:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['rosteringSrcheme:scheme:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="schemeList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="缂栫爜" align="center" prop="code"/>
+      <el-table-column label="鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="缁勭粐鍚嶇О" align="center" prop="departMember"/>
+      <el-table-column label="杞�兼柟妗堢被鍨�" align="center" prop="rosteringschemekind" :formatter="rosteringschemekindFormat" />
+      <el-table-column label="鍙傜収鏃ユ湡" align="center" prop="referencedate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.referencedate) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鏄惁鑷姩鎺掔彮" align="center" prop="isautorostering" :formatter="isautorosteringFormat" />
+      <el-table-column label="鎻忚堪" align="center" prop="description"/>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['rosteringSrcheme:scheme:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['rosteringSrcheme:scheme:remove']"
+          >鍒犻櫎</el-button>
+          <router-link :to="'/rosteringSchemeitem/list/' + scope.row.id" class="link-type">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-edit"
+              v-hasPermi="['rosteringSchemeitem:schemeItem:list']"
+            >杞�兼柟妗堢粏鍒�</el-button>
+
+          </router-link>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀硅疆鍊兼柟妗堝璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
+        </el-form-item>
+        <el-form-item label="缁勭粐缁撴瀯" prop="departmember">
+          <!--<el-input v-model="form.departmemberid" placeholder="璇疯緭鍏ョ粍缁囩粨鏋�" />-->
+          <span>{{form.departmember}}</span>
+        </el-form-item>
+        <el-form-item label="杞�兼柟妗堢被鍨�" prop="rosteringschemekind">
+          <el-select v-model="form.rosteringschemekind" placeholder="璇烽�夋嫨杞�肩被鍨�" clearable size="small">
+            <el-option
+              v-for="dict in rosteringschemekindOptions"
+              :key="dict.dictValue"
+              :label="dict.dictLabel"
+              :value="dict.dictValue"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏄惁鑷姩鎺掔彮" prop="isautorostering">
+          <el-radio-group v-model="form.isautorostering">
+            <el-radio v-for="dict in isautorosteringOptions" :key="dict.dictValue" :label="dict.dictValue">{{dict.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="鍙傜収鏃ユ湡" prop="referencedate">
+          <el-date-picker clearable size="small" style="width: 200px"
+            v-model="form.referencedate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨鍙傜収鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鎻忚堪" prop="description">
+          <el-input type="textarea" :rows="2" v-model="form.description" placeholder="璇疯緭鍏ユ弿杩�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listScheme, getScheme, delScheme, addScheme, updateScheme, exportScheme } from "@/api/workforce/scheme";
+
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 杞�兼柟妗堣〃鏍兼暟鎹�
+      schemeList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 杞�兼柟妗堢被鍨嬪瓧鍏�
+      rosteringschemekindOptions: [],
+      // 鏄惁鑷姩鎺掔彮瀛楀吀
+      isautorosteringOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        name: undefined,
+        departMemberId: undefined,
+        departmember: undefined,
+        rosteringschemekind: undefined,
+        referencedate: undefined,
+        isautorostering: undefined,
+        description: undefined,
+      },
+      currentNode:"",
+      currentName:"",
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        code: [{ required: true, message: "缂栫爜涓嶈兘涓虹┖", trigger: "blur" }],
+        name: [{ required: true, message: "鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+        rosteringschemekind: [{ required: true, message: "杞�兼柟妗堢被鍨嬩笉鑳戒负绌�", trigger: "blur" }],
+      }
+    };
+  },
+  created() {
+    //this.getList();
+    this.getDicts("rotation_type").then(response => {
+      this.rosteringschemekindOptions = response.data;
+    });
+    this.getDicts("isAutoRostering").then(response => {
+      this.isautorosteringOptions = response.data;
+    });
+  },
+  methods: {
+    modelNodeChange(modelNode) {
+      this.currentNode = modelNode.id;
+      this.currentName = modelNode.label;
+      this.getList();
+    },
+    /** 鏌ヨ杞�兼柟妗堝垪琛� */
+    getList() {
+      this.loading = true;
+      listScheme(this.queryParams).then(response => {
+        this.schemeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 杞�兼柟妗堢被鍨嬪瓧鍏哥炕璇�
+    rosteringschemekindFormat(row, column) {
+      return this.selectDictLabel(this.rosteringschemekindOptions, row.rosteringschemekind);
+    },
+    // 鏄惁鑷姩鎺掔彮瀛楀吀缈昏瘧
+    isautorosteringFormat(row, column) {
+      return this.selectDictLabel(this.isautorosteringOptions, row.isautorostering);
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        departMemberId: undefined,
+        rosteringschemekind: undefined,
+        referencedate: undefined,
+        isautorostering: undefined,
+        description: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.form.departMemberId=this.currentNode;
+      this.form.departmember=this.currentName;
+      this.form.isautorostering="0";
+      this.title = "娣诲姞杞�兼柟妗�";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getScheme(id).then(response => {
+        this.form = response.data;
+        this.form.departMemberId=this.currentNode;
+        this.form.departmember=this.currentName;
+        this.open = true;
+        this.title = "淇敼杞�兼柟妗�";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          console.log(this.form.departMemberId);
+          if (this.form.id != undefined) {
+            updateScheme(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addScheme(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎杞�兼柟妗堢紪鍙蜂负"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delScheme(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎疆鍊兼柟妗堟暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportScheme(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/workforce/management/schemeItem.vue b/energy_management_ui/src/views/workforce/management/schemeItem.vue
new file mode 100644
index 0000000..2efc2e1
--- /dev/null
+++ b/energy_management_ui/src/views/workforce/management/schemeItem.vue
@@ -0,0 +1,361 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="缂栫爜" prop="code">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="璇疯緭鍏ョ紪鐮�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ュ悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+        <el-form-item label="鐝" prop="shiftId">
+        <el-select v-model="queryParams.shiftId" placeholder="璇烽�夋嫨鍊兼" clearable size="small">
+          <el-option
+            v-for="dict in shiftIdOptions"
+            :key="dict.id"
+            :label="dict.name"
+            :value="dict.id"
+          />
+        </el-select>
+      </el-form-item>
+        <el-form-item label="鍊兼" prop="dutyId">
+        <el-select v-model="queryParams.dutyId" placeholder="璇烽�夋嫨鍊兼" clearable size="small">
+          <el-option
+            v-for="dict in dutyIdOptions"
+            :key="dict.id"
+            :label="dict.name"
+            :value="dict.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['rosteringSchemeitem:schemeItem:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['rosteringSchemeitem:schemeItem:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['rosteringSchemeitem:schemeItem:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['rosteringSchemeitem:schemeItem:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="schemeItemList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="缂栫爜" align="center" prop="code"/>
+      <el-table-column label="鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="杞�兼柟妗�" align="center" prop="schemeName"/>
+      <el-table-column label="澶╂" align="center" prop="dayofloopdays"/>
+      <el-table-column label="鐝" align="center" prop="shiftName"/>
+      <el-table-column label="鍊兼" align="center" prop="dutyName" />
+      <el-table-column label="鎻忚堪" align="center" prop="description"/>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['rosteringSchemeitem:schemeItem:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['rosteringSchemeitem:schemeItem:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀硅疆鍊兼柟妗堝璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
+        </el-form-item>
+        <el-form-item label="杞�兼柟妗�">
+          <span>{{form.schemeName}}</span>
+        </el-form-item>
+        <el-form-item label="澶╂" prop="dayofloopdays">
+          <el-input v-model="form.dayofloopdays" placeholder="璇疯緭鍏ュぉ娆�" />
+        </el-form-item>
+        <el-form-item label="鐝" prop="shiftId">
+          <el-select v-model="form.shiftId" placeholder="璇烽�夋嫨鐝">
+            <el-option
+              v-for="dict in shiftIdOptions"
+              :key="dict.id"
+              :label="dict.name"
+              :value="dict.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍊兼" prop="dutyId">
+          <el-select v-model="form.dutyId" placeholder="璇烽�夋嫨鍊兼">
+            <el-option
+              v-for="dict in dutyIdOptions"
+              :key="dict.id"
+              :label="dict.name"
+              :value="dict.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎻忚堪" prop="description">
+          <el-input v-model="form.description" placeholder="璇疯緭鍏ユ弿杩�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listSchemeItem, getSchemeItem, delSchemeItem, addSchemeItem, updateSchemeItem, exportSchemeItem,listDutyManagement } from "@/api/workforce/schemeItem";
+import { getScheme} from "@/api/workforce/scheme";
+import { listManagement} from "@/api/workforce/management";
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 杞�兼柟妗堣〃鏍兼暟鎹�
+      schemeItemList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 杞�兼柟妗堝瓧鍏�
+      schemeIdOptions: [],
+      // 鐝瀛楀吀
+      shiftIdOptions: [],
+      // 鍊兼瀛楀吀
+      dutyIdOptions: [],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        description: undefined,
+        code: undefined,
+        name: undefined,
+        schemeId: undefined,
+        dayofloopdays: undefined,
+        shiftId: undefined,
+        dutyId: undefined
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        name: [ { required: true, message: "鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }  ],
+        shiftId: [ { required: true, message: "鐝涓嶈兘涓虹┖", trigger: "blur" }  ],
+        dutyId: [ { required: true, message: "鍊兼涓嶈兘涓虹┖", trigger: "blur" }  ],
+      },
+      schemeId:"",
+      schemeName:"",
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ杞�兼柟妗堝垪琛� */
+    getList() {
+      this.loading = true;
+      this.queryParams.schemeId = this.$route.params && this.$route.params.id;
+      listSchemeItem(this.queryParams).then(response => {
+        this.schemeItemList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+      const id=this.$route.params && this.$route.params.id;
+      getScheme(id).then(response => {
+        this.schemeId=response.data.id;
+        this.schemeName=response.data.name;
+      });
+      listManagement().then(response=>{
+        this.shiftIdOptions=response.rows;
+      });
+      listDutyManagement().then(response=>{
+        this.dutyIdOptions=response.rows;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        description: undefined,
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        schemeId: undefined,
+        dayofloopdays: undefined,
+        shiftId: undefined,
+        dutyId: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.description)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.form.schemeId=this.schemeId;
+      this.form.schemeName=this.schemeName;
+      this.title = "娣诲姞杞�兼柟妗�";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const description = row.description || this.ids
+      getSchemeItem(description).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼杞�兼柟妗�";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.description != undefined) {
+            updateSchemeItem(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addSchemeItem(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const descriptions = row.description || this.ids;
+      this.$confirm('鏄惁纭鍒犻櫎杞�兼柟妗堢紪鍙蜂负"' + descriptions + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delSchemeItem(descriptions);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夎疆鍊兼柟妗堟暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportSchemeItem(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/workforce/rosteringManagement/index.vue b/energy_management_ui/src/views/workforce/rosteringManagement/index.vue
new file mode 100644
index 0000000..820510f
--- /dev/null
+++ b/energy_management_ui/src/views/workforce/rosteringManagement/index.vue
@@ -0,0 +1,121 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'25%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鎺掔彮鍩虹鏌ヨ
+          </div>
+          <el-input
+              placeholder="杈撳叆鍏抽敭瀛楄繘琛岃繃婊�"
+              prefix-icon="el-icon-search"
+              v-model="filterText">
+          </el-input>
+          <el-tree
+              class="modelnode-tree"
+              :data="modelNodeData"
+              node-key="id"
+              highlight-current
+              :expand-on-click-node="false"
+              empty-text=""
+              ref="modelNodeTree"
+              :filter-node-method="filterNode"
+              :default-expanded-keys="treeExpandData"
+              @node-click="changeNode"
+          >
+            <span class="custom-tree-node" slot-scope="{ node, data }">
+            <el-tooltip class="item" effect="dark" :content="node.label" placement="top-end">
+              <span>{{ node.label.length > 4 ? node.label.slice(0, 4) + '...' : node.label }}</span>
+                  <span class="tree-text-node-common">{{ node.label }}</span>
+              </el-tooltip>
+          </span>
+          </el-tree>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <scheduling_basis ref="scheduling_basis" style="padding:10px"></scheduling_basis>
+        </el-main>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+
+import {treeList} from "@/api/workforce/management"
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import scheduling_basis from "./scheduling_basis";
+
+export default {
+  components: {Treeselect, scheduling_basis},
+  watch: {
+    filterText(val) {
+      this.$refs.modelNodeTree.filter(val);
+    }
+  },
+  data() {
+    return {
+      filterText: '',
+      // 琛ㄦ牸鏍戞暟鎹�
+      modelNodeData: [],
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        deptName: undefined,
+        status: undefined
+      },
+      treeExpandData: [],
+      activeName: '',
+      modelCode: undefined,
+      isCollapse: false,
+    }
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    filterNode(value, data) {
+      if (!value) {
+        return true;
+      }
+      return data.label.indexOf(value) !== -1;
+    },
+
+    getList() {
+      treeList().then(response => {
+        this.modelNodeData = response.data;
+        this.loading = false;
+        if (this.modelNodeData.length > 0) {
+          this.treeExpandData.push(this.modelNodeData[0].id);
+          this.$emit("changeNode", this.modelNodeData[0]);
+          this.$refs.scheduling_basis.modelNodeChange(this.modelNodeData[0]);
+        } else {
+          this.$emit("changeNode", '');
+        }
+        this.$nextTick(() => {
+          if (this.modelNodeData.length > 0) {
+            this.$refs.modelNodeTree.setCurrentKey(this.modelNodeData[0].id);
+          }
+        })
+      });
+    },
+    changeNode(data, node, ev) {
+      this.$emit("changeNode", data);
+      this.$refs.scheduling_basis.modelNodeChange(data);
+    },
+    handleClick(tab, event) {
+      this.activeName = tab.name;
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/workforce/rosteringManagement/scheduling_basis.vue b/energy_management_ui/src/views/workforce/rosteringManagement/scheduling_basis.vue
new file mode 100644
index 0000000..02ac873
--- /dev/null
+++ b/energy_management_ui/src/views/workforce/rosteringManagement/scheduling_basis.vue
@@ -0,0 +1,361 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="杞�兼柟妗�" prop="name" label-width="100px">
+        <el-select v-model="queryParam.id" placeholder="璇烽�夋嫨杞�兼柟妗�" clearable size="small">
+          <el-option
+            v-for="dict in schemeList"
+            :key="dict.id"
+            :label="dict.name"
+            :value="dict.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="寮�濮嬫椂闂�" prop="beginTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.beginTimes"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="閫夋嫨寮�濮嬫椂闂�">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="缁撴潫鏃堕棿" prop="endTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.endTimes"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="閫夋嫨缁撴潫鏃堕棿">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="success" icon="el-icon-edit" size="mini" @click="generateAdd"  v-hasPermi="['workforce:rosteringManagement:add']">鐢熸垚</el-button>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['workforce:rosteringManagement:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          @click="handleDelete"
+          v-hasPermi="['workforce:rosteringManagement:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="rosteringManagementList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="缂栫爜" align="center" prop="code" />
+      <el-table-column label="缁勭粐缁撴瀯" align="center" prop="deptName" />
+      <el-table-column label="鍚嶇О" align="center" prop="name"  />
+      <el-table-column label="杞�兼柟妗�" align="center" prop="schemeName" />
+      <el-table-column label="鐝" align="center" prop="shiftName"  />
+      <el-table-column label="鍊兼" align="center" prop="dutyName" />
+      <el-table-column label="寮�濮嬫椂闂�" align="center" prop="beginTimes" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.beginTimes) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="缁撴潫鏃堕棿" align="center" prop="endTimes" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.endTimes) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎻忚堪" align="center" prop="description"/>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button  v-if="currentTime < parseTime(scope.row.beginTimes) "
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['workforce:rosteringManagement:edit']"
+          >淇敼</el-button>
+          <el-button v-if="currentTime < parseTime(scope.row.beginTimes)"
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['workforce:rosteringManagement:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+    <!-- 娣诲姞鎴栦慨鏀规帓鐝〃鏌ヨ瀵硅瘽妗� -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="缂栫爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" />
+        </el-form-item>
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" />
+        </el-form-item>
+        <el-form-item label="鐝" prop="shiftName">
+          <el-input v-model="form.shiftName" placeholder="璇疯緭鍏ョ彮娆�" />
+        </el-form-item>
+        <el-form-item label="鍊兼" prop="dutyName">
+          <el-input v-model="form.dutyName" placeholder="璇疯緭鍏ュ�兼" />
+        </el-form-item>
+        <el-form-item label="寮�濮嬫椂闂�" prop="beginTimes">
+          <el-date-picker clearable size="small" style="width: 200px"
+                          v-model="form.beginTimes"
+                          type="datetime"
+                          value-format="yyyy-MM-dd HH:mm:ss"
+                          placeholder="閫夋嫨寮�濮嬫椂闂�">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="缁撴潫鏃堕棿" prop="endTimes">
+          <el-date-picker clearable size="small" style="width: 200px"
+                          v-model="form.endTimes"
+                          type="datetime"
+                          value-format="yyyy-MM-dd HH:mm:ss"
+                          placeholder="閫夋嫨缁撴潫鏃堕棿">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鎻忚堪" prop="description">
+          <el-input v-model="form.description" placeholder="璇疯緭鍏ユ弿杩�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getschemeNameList,listRosteringManagement, getRosteringManagement, delRosteringManagement, addRosteringManagement, updateRosteringManagement, exportRosteringManagement } from "@/api/workforce/rosteringManagement";
+import { listSchemeItem ,getSchemeItem} from "@/api/workforce/schemeItem";
+export default {
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      codes:[],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鎺掔彮琛ㄦ煡璇㈣〃鏍兼暟鎹�
+      rosteringManagementList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+     /*杞�兼柟妗堝悕绉版暟鎹�*/
+      schemeList:[],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        schemeId: undefined,
+        departMemberId:undefined,
+        beginTimes:undefined,
+        endTimes:undefined,
+      },
+      dateRange:[],
+      //鏌ヨ杞�肩被鍨嬪悕绉板弬鏁�
+      queryParam: {
+       id: undefined,
+       name:undefined,
+      },
+      schemeNameList:[],
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      //鐢熸垚琛ㄥ崟鍙傛暟
+      generateform:{},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [{ required: true, message: "id涓嶈兘涓虹┖", trigger: "blur" }],
+      },
+      //缁勭粐缁撴瀯id
+      currentNode:"",
+      //缁勭粐缁撴瀯鍚嶇О
+      currentName:"",
+      currentTime: '',
+    };
+  },
+  created() {
+    //this.getList();
+  },
+  methods: {
+    /** 鏌ヨ鎺掔彮琛ㄦ煡璇㈠垪琛� */
+    modelNodeChange(modelNode) {
+      this.currentNode = modelNode.id;
+      this.currentName = modelNode.label;
+      this.getList();
+    },
+    getList() {
+      this.loading = true;
+      listRosteringManagement(this.queryParams).then(response => {
+        this.currentTime = this.format(new Date(), "yyyy-MM-dd HH:mm:ss");
+        this.rosteringManagementList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+      getschemeNameList(this.queryParam).then(response => {
+        this.schemeList = response.rows;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        schemeId: undefined,
+        shiftId: undefined,
+        dutyId: undefined,
+        dutyName: undefined,
+        description: undefined,
+        departMemberId: undefined,
+        beginTimes:undefined,
+        endTimes:undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.codes = selection.map(item => item.code)
+      this.single = selection.length!=1
+      this.multiple = !selection.length
+    },
+    /* 鐢熸垚鎸夐挳鎿嶄綔*/
+    generateAdd:function(){
+      this.form.schemeId=this.queryParam.id;/*杞�兼柟妗坕d*/
+      this.form.departMemberId=this.currentNode;/*缁勭粐缁撴瀯id*/
+      this.form.beginTimes=this.queryParams.beginTimes;
+      this.form.endTimes=this.queryParams.endTimes;
+      addRosteringManagement(this.form).then(response => {
+        if (response.code === 200) {
+          this.msgSuccess("鏂板鎴愬姛");
+          this.open = false;
+          this.getList();
+        } else {
+          this.msgError(response.msg);
+        }
+      });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getRosteringManagement(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鎺掔彮琛ㄦ煡璇�";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != undefined) {
+            updateRosteringManagement(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("淇敼鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          } else {
+            addRosteringManagement(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("鏂板鎴愬姛");
+                this.open = false;
+                this.getList();
+              } else {
+                this.msgError(response.msg);
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      const codes = row.code || this.codes;
+      this.$confirm('鏄惁纭鍒犻櫎鎺掔彮琛ㄦ煡璇㈢紪鍙蜂负"' + codes + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delRosteringManagement(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋帓鐝〃鏌ヨ鏁版嵁椤�?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportRosteringManagement(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    },
+    format(date, fmt) {
+      let o = {
+        "M+": date.getMonth() + 1, //鏈堜唤
+        "d+": date.getDate(), //鏃�
+        "H+": date.getHours(), //灏忔椂
+        "m+": date.getMinutes(), //鍒�
+        "s+": date.getSeconds(), //绉�
+        "q+": Math.floor((date.getMonth() + 3) / 3), //瀛e害
+        "S": date.getMilliseconds() //姣
+      };
+      if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
+      for (let k in o)
+        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+      return fmt;
+    }
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/workforce/shiftManagement/index.vue b/energy_management_ui/src/views/workforce/shiftManagement/index.vue
new file mode 100644
index 0000000..4b964af
--- /dev/null
+++ b/energy_management_ui/src/views/workforce/shiftManagement/index.vue
@@ -0,0 +1,144 @@
+<template>
+  <div class="app-container" style="padding: 0">
+    <el-container class="split-container">
+      <el-aside class="left-content" :width="isCollapse?'0px':'25%'">
+        <el-card class="box-card">
+          <div slot="header" class="clearfix" style="height:32px">
+            鎺掔彮鍩虹璁剧疆
+          </div>
+          <el-input
+              placeholder="杈撳叆鍏抽敭瀛楄繘琛岃繃婊�"
+              prefix-icon="el-icon-search"
+              v-model="filterText">
+          </el-input>
+          <el-tree
+              class="modelnode-tree"
+              :data="modelNodeData"
+              node-key="id"
+              highlight-current
+              :expand-on-click-node="false"
+              empty-text=""
+              ref="modelNodeTree"
+              :filter-node-method="filterNode"
+              :default-expanded-keys="treeExpandData"
+              @node-click="changeNode"
+          >
+            <span class="custom-tree-node" slot-scope="{ node, data }">
+              <el-tooltip class="item" effect="dark" :content="node.label" placement="top-end">
+                <span>{{ node.label.length > 4 ? node.label.slice(0, 4) + '...' : node.label }}</span>
+              </el-tooltip>
+            <span>{{ node.label }}</span>
+          </span>
+          </el-tree>
+        </el-card>
+      </el-aside>
+      <el-container>
+        <div style="cursor:pointer;" @click="toggleCollapse">
+          <img src="@/assets/image/configureChart.png" style="width: 100%;height: 100%">
+        </div>
+        <el-main style="padding:0">
+          <el-tabs @tab-click="handleClick">
+            <el-tab-pane>
+              <span slot="label"><i class="el-icon-pie-chart"></i> 鐝璁剧疆</span>
+              <RosteringShift ref="rostering_shift"></RosteringShift>
+            </el-tab-pane>
+            <el-tab-pane>
+              <span slot="label"><i class="el-icon-pie-chart"></i> 鍊兼璁剧疆</span>
+              <RosteringDuty ref="rostering_duty"></RosteringDuty>
+            </el-tab-pane>
+            <el-tab-pane>
+              <span slot="label"><i class="el-icon-pie-chart"></i> 杞�兼柟妗堣缃�</span>
+              <scheme ref="scheme"></scheme>
+            </el-tab-pane>
+          </el-tabs>
+        </el-main>
+      </el-container>
+    </el-container>
+
+
+  </div>
+</template>
+
+<script>
+
+import {treeList} from "@/api/workforce/management"
+import RosteringShift from "./rostering_shift";
+import RosteringDuty from "../dutyManagement/rostering_duty";
+import scheme from "../management/scheme";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  components: {RosteringShift, RosteringDuty, Treeselect, scheme},
+  created() {
+  },
+  watch: {
+    filterText(val) {
+      this.$refs.modelNodeTree.filter(val);
+    }
+  },
+  data() {
+    return {
+      filterText: '',
+      // 琛ㄦ牸鏍戞暟鎹�
+      modelNodeData: [],
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        deptName: undefined,
+        status: undefined
+      },
+      treeExpandData: [],
+      activeName: '',
+      modelCode: undefined,
+      isCollapse: false,
+    }
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    filterNode(value, data) {
+      if (!value) {
+        return true;
+      }
+      return data.label.indexOf(value) !== -1;
+    },
+
+    getList() {
+      treeList().then(response => {
+        this.modelNodeData = response.data;
+        this.loading = false;
+        if (this.modelNodeData.length > 0) {
+          this.treeExpandData.push(this.modelNodeData[0].id);
+          this.$emit("changeNode", this.modelNodeData[0]);
+          this.$refs.rostering_shift.modelNodeChange(this.modelNodeData[0]);
+          this.$refs.rostering_duty.modelNodeChange(this.modelNodeData[0]);
+          this.$refs.scheme.modelNodeChange(this.modelNodeData[0]);
+        } else {
+          this.$emit("changeNode", '');
+        }
+        this.$nextTick(() => {
+          if (this.modelNodeData.length > 0) {
+            this.$refs.modelNodeTree.setCurrentKey(this.modelNodeData[0].id);
+          }
+        })
+      });
+    },
+    changeNode(data, node, ev) {
+      this.$emit("changeNode", data);
+      this.$refs.rostering_shift.modelNodeChange(data);
+      this.$refs.rostering_duty.modelNodeChange(data);
+      this.$refs.scheme.modelNodeChange(data);
+    },
+    handleClick(tab, event) {
+      this.activeName = tab.name;
+    },
+    // 鐐瑰嚮鎸夐挳锛屽垏鎹㈡姌鍙犱笌灞曞紑
+    toggleCollapse() {
+      this.isCollapse = !this.isCollapse
+    },
+  }
+};
+</script>
diff --git a/energy_management_ui/src/views/workforce/shiftManagement/rostering_shift.vue b/energy_management_ui/src/views/workforce/shiftManagement/rostering_shift.vue
new file mode 100644
index 0000000..3ec450a
--- /dev/null
+++ b/energy_management_ui/src/views/workforce/shiftManagement/rostering_shift.vue
@@ -0,0 +1,342 @@
+<template>
+  <div class="app-container">
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['workforce:shiftManagement:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['workforce:shiftManagement:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['workforce:shiftManagement:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['workforce:shiftManagement:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+    </el-row>
+
+    <el-table v-loading="loading" :data="managementList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="缂栧彿" align="center" prop="code" />
+      <el-table-column label="椤哄簭鍙�" align="center" prop="orderNo"  />
+      <el-table-column label="缁勭粐缁撴瀯" align="center" prop="deptName"  />
+      <el-table-column label="鐝鍚嶇О" align="center" prop="name" />
+      <el-table-column label="寮�濮嬫椂闂�" align="center" prop="startTime" width="180"/>
+      <el-table-column label="缁撴潫鏃堕棿" align="center" prop="enddTime" width="180"/>
+      <el-table-column label="鏄惁璺ㄥぉ" align="center" prop="isCrossDay" :formatter="isCrossDayFormat" />
+      <el-table-column label="鎻忚堪" align="center" prop="description"  />
+      <el-table-column label="鍒涘缓浜�" align="center" prop="createBy"  />
+      <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="淇敼浜�" align="center" prop="updateBy"  />
+      <el-table-column label="淇敼鏃堕棿" align="center" prop="updateTime" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.updateTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['workforce:shiftManagement:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['workforce:shiftManagement:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀规帓鐝鐞嗚缃璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="缁勭粐缁撴瀯" prop="deptName">
+          <span>{{form.deptName}}</span>
+        </el-form-item>
+        <el-form-item label="缂栧彿" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鍙�" />
+        </el-form-item>
+        <el-form-item label="鐝鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ョ彮娆″悕绉�" />
+        </el-form-item>
+        <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
+          <el-time-picker clearable size="small" style="width: 200px"
+            v-model="form.startTime"
+            format='HH:mm:ss'
+            value-format="HH:mm:ss"
+            placeholder="閫夋嫨寮�濮嬫椂闂�">
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="缁撴潫鏃堕棿" prop="enddTime">
+          <el-time-picker clearable size="small" style="width: 200px"
+            v-model="form.enddTime"
+            format='HH:mm:ss'
+            value-format="HH:mm:ss"
+            placeholder="閫夋嫨缁撴潫鏃堕棿">
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="鏄惁璺ㄥぉ">
+          <el-radio-group v-model="form.isCrossDay">
+            <el-radio
+              v-for="dict in isCrossDayOptions"
+              :key="dict.dictValue"
+              :label="dict.dictValue"
+            >{{dict.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="椤哄簭鍙�" prop="orderNo">
+          <el-input v-model="form.orderNo" placeholder="璇疯緭鍏ラ『搴忓彿" />
+        </el-form-item>
+        <el-form-item label="鎻忚堪" prop="description">
+          <el-input v-model="form.description" placeholder="璇疯緭鍏ユ弿杩�" />
+        </el-form-item>
+
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import { listManagement, getManagement, delManagement, addManagement, updateManagement, exportManagement } from "@/api/workforce/management";
+
+  export default {
+    data() {
+      return {
+        // 閬僵灞�
+        loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        // 鎺掔彮绠$悊璁剧疆琛ㄦ牸鏁版嵁
+        managementList: [],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 鏄惁璺ㄥぉ瀛楀吀
+        isCrossDayOptions: [],
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          code: undefined,
+          name: undefined,
+          deptId: undefined,
+          startTime: undefined,
+          enddTime: undefined,
+          isCrossDay: undefined,
+          orderNo: undefined,
+          description: undefined,
+          createBy: undefined,
+          createTime: undefined,
+          updateBy: undefined,
+          updateTime:undefined,
+        },
+        node:"",
+        deptName:"",
+        // 琛ㄥ崟鍙傛暟
+        form: {},
+        // 琛ㄥ崟鏍¢獙
+        rules: {
+          id: [
+            { required: true, message: "id涓嶈兘涓虹┖", trigger: "blur" }
+          ],        code: [
+            { required: true, message: "缂栧彿涓嶈兘涓虹┖", trigger: "blur" }
+          ],        name: [
+            { required: true, message: "鐝鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+          ],        startTime: [
+            { required: true, message: "寮�濮嬫椂闂翠笉鑳戒负绌�", trigger: "blur" }
+          ],        enddTime: [
+            { required: true, message: "缁撴潫鏃堕棿涓嶈兘涓虹┖", trigger: "blur" }
+          ],      }
+      };
+    },
+    created() {
+      this.getList();
+      this.getDicts("sys_yes_no").then(response => {
+        this.isCrossDayOptions = response.data;
+      });
+    },
+    methods: {
+      modelNodeChange(modelNode) {
+        /* console.log(modelNode.id);
+         console.log(modelNode.label);*/
+        this.node= modelNode.id;
+        this.deptName= modelNode.label;
+        this.getList();
+      },
+      /** 鏌ヨ鎺掔彮绠$悊璁剧疆鍒楄〃 */
+      getList() {
+        this.loading = true;
+        listManagement(this.queryParams).then(response => {
+          this.managementList = response.rows;
+          this.total = response.total;
+          this.loading = false;
+        });
+      },
+      // 鏄惁璺ㄥぉ瀛楀吀缈昏瘧
+      isCrossDayFormat(row, column) {
+        return this.selectDictLabel(this.isCrossDayOptions, row.isCrossDay);
+      },
+      // 鍙栨秷鎸夐挳
+      cancel() {
+        this.open = false;
+        this.reset();
+      },
+      // 琛ㄥ崟閲嶇疆
+      reset() {
+        this.form = {
+          id: undefined,
+          code: undefined,
+          name: undefined,
+          deptId: undefined,
+          startTime: undefined,
+          enddTime: undefined,
+          isCrossDay: "0",
+          orderNo: undefined,
+          description: undefined,
+          createBy: undefined,
+          createTime: undefined,
+          updateBy: undefined,
+          updateTime: undefined
+        };
+        this.resetForm("form");
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.id)
+        this.single = selection.length!=1
+        this.multiple = !selection.length
+      },
+      /** 鏂板鎸夐挳鎿嶄綔 */
+      handleAdd() {
+        this.reset();
+        this.open = true;
+        this.form.deptId=this.node;
+        this.form.deptName=this.deptName;
+        this.title = "娣诲姞鎺掔彮绠$悊璁剧疆";
+      },
+      /** 淇敼鎸夐挳鎿嶄綔 */
+      handleUpdate(row) {
+        this.reset();
+        this.form.deptId=this.node;
+        this.form.deptName=this.deptName;
+        const id = row.id || this.ids
+        getManagement(id).then(response => {
+          this.form = response.data;
+          this.open = true;
+          this.title = "淇敼鎺掔彮绠$悊璁剧疆";
+        });
+      },
+      /** 鎻愪氦鎸夐挳 */
+      submitForm: function() {
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            /*console.log(this.form);*/
+            if (this.form.id != undefined) {
+              updateManagement(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("淇敼鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            } else {
+              addManagement(this.form).then(response => {
+                if (response.code === 200) {
+                  this.msgSuccess("鏂板鎴愬姛");
+                  this.open = false;
+                  this.getList();
+                } else {
+                  this.msgError(response.msg);
+                }
+              });
+            }
+          }
+        });
+      },
+      /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+      handleDelete(row) {
+        const ids = row.id || this.ids;
+        this.$confirm('鏄惁纭鍒犻櫎鎺掔彮绠$悊璁剧疆缂栧彿涓�"' + ids + '"鐨勬暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return delManagement(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("鍒犻櫎鎴愬姛");
+        }).catch(function() {});
+      },
+      /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+      handleExport() {
+        const queryParams = this.queryParams;
+        this.$confirm('鏄惁纭瀵煎嚭鎵�鏈夋帓鐝鐞嗚缃暟鎹」?', "璀﹀憡", {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        }).then(function() {
+          return exportManagement(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+      }
+    }
+  };
+</script>
diff --git a/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/BarChart.vue b/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/BarChart.vue
new file mode 100644
index 0000000..cc9a0a7
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 30,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/LineChart.vue b/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/index.vue b/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/index.vue
new file mode 100644
index 0000000..b085ebf
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/dailyWorkingProcedure/index.vue
@@ -0,0 +1,325 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑳芥簮绫诲瀷">
+        <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+          <el-option
+            v-for="dict in indexCategoryOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷" >
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>-->
+      <el-form-item label="缁熻鍖洪棿" prop="dataTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        :type="dateTypes"
+                        :value-format="valueFormat"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+    <el-table :data="energyList" border style="width: 100%; margin-top: 20px" class="tableList" >
+      <el-table-column fixed label="鏇茬嚎閫夋嫨">
+        <template slot-scope="scope">
+          <el-button icon="el-icon-search" circle @click="selectChange(scope.row)" style="font-size: 10px"></el-button>
+        </template>
+      </el-table-column>
+      <el-table-column fixed prop="indexName" align="center" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+      <el-table-column label="0鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value0)}}</template></el-table-column>
+      <el-table-column label="1鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value1)}}</template></el-table-column>
+      <el-table-column label="2鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value2)}}</template></el-table-column>
+      <el-table-column label="3鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value3)}}</template></el-table-column>
+      <el-table-column label="4鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value4)}}</template></el-table-column>
+      <el-table-column label="5鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value5)}}</template></el-table-column>
+      <el-table-column label="6鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value6)}}</template></el-table-column>
+      <el-table-column label="7鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value7)}}</template></el-table-column>
+      <el-table-column label="8鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value8)}}</template></el-table-column>
+      <el-table-column label="9鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value9)}}</template></el-table-column>
+      <el-table-column label="20鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value20)}}</template></el-table-column>
+      <el-table-column label="11鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value11)}}</template></el-table-column>
+      <el-table-column label="12鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value12)}}</template></el-table-column>
+      <el-table-column label="13鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value13)}}</template></el-table-column>
+      <el-table-column label="14鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value14)}}</template></el-table-column>
+      <el-table-column label="15鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value15)}}</template></el-table-column>
+      <el-table-column label="16鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value16)}}</template></el-table-column>
+      <el-table-column label="17鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value17)}}</template></el-table-column>
+      <el-table-column label="18鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value18)}}</template></el-table-column>
+      <el-table-column label="19鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value19)}}</template></el-table-column>
+      <el-table-column label="20鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value20)}}</template></el-table-column>
+      <el-table-column label="21鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value21)}}</template></el-table-column>
+      <el-table-column label="22鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value22)}}</template></el-table-column>
+      <el-table-column label="23鏃�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value23)}}</template></el-table-column>
+    </el-table>
+    <el-row :gutter="32" style="margin:30px 0">
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <line-chart ref="LineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <bar-chart ref="BarChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import {getDataList,getlistChart} from "@/api/workingProcedure/dailyComprehensive/dailyComprehensive";
+  import LineChart from './LineChart'
+  import BarChart from "./BarChart";
+  export default {
+    components: {
+      LineChart,
+      BarChart
+    },
+    data() {
+      return {
+        // 閬僵灞�
+        //loading: true,
+        // 閫変腑鏁扮粍
+        ids: [],
+        // 闈炲崟涓鐢�
+        single: true,
+        // 闈炲涓鐢�
+        multiple: true,
+        // 鎬绘潯鏁�
+        total: 0,
+        dateTypeOptions:[],
+        energyList: [],
+        tableData: [],
+        tableHead:[],
+        indexCategoryOptions:[],
+        // 寮瑰嚭灞傛爣棰�
+        title: "",
+        // 鏄惁鏄剧ず寮瑰嚭灞�
+        open: false,
+        // 鏌ヨ鍙傛暟
+        queryParams: {
+          pageNum: 1,
+          pageSize: 10,
+          indexId: undefined,
+          dataTime:undefined,
+          timeType:"HOUR",
+          indexType:undefined,
+          indexStorageId:undefined,
+        },
+        skinName:"",
+        dateTypes: 'date',
+        valueFormat:"yyyy-MM-dd",
+        lineChartData:{expectedData: [],actualData: []},
+      };
+    },
+    created() {
+      this.getList();
+      this.getTime();
+      /*this.getDicts("statisticalType").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });*/
+      this.getDicts("report_form").then(response => {
+        this.dateTypeOptions = response.data;
+        this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+      });
+      this.getConfigKey("processEnergy").then(response => {
+        this.skinName=response.msg;
+      });
+      this.getDicts("energy_type").then(response => {
+        this.indexCategoryOptions = response.data;
+        //this.queryParams.indexStorageId = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+      });
+    },
+    methods: {
+      getList(){
+        this.queryParams.indexCode = this.$route.query.modelCode;
+        getDataList(this.queryParams).then(response => {
+          /*this.tableData=response.data.tabledata;
+          this.tableHead=response.data.tablehead;*/
+          this.energyList=response.data;
+        })
+      },
+      selectChange(row){
+        this.queryParams.indexId=row.indexId;
+        getlistChart(this.queryParams).then(response => {
+          let actualData=[];
+          let expectedData=[];
+          let title="";
+          response.data.forEach(item => {
+            expectedData.push(this.numFilter(item.value));
+            actualData.push(item.timeCode.slice(item.timeCode.length-2,item.timeCode.length)+"鏃�");
+            title=item.indexName+"("+item.unitId+")";
+          })
+          this.lineChartData.actualData=actualData;
+          this.lineChartData.expectedData=expectedData;
+          this.lineChartData.title=title
+          this.$refs.LineChart.initChart(this.lineChartData);
+          this.$refs.BarChart.initChart(this.lineChartData);
+        })
+      },
+      /** 鎼滅储鎸夐挳鎿嶄綔 */
+      handleQuery() {
+        this.queryParams.pageNum = 1;
+        this.getList();
+        this.selectChange();
+      },
+      /** 閲嶇疆鎸夐挳鎿嶄綔 */
+      resetQuery() {
+        this.resetForm("queryForm");
+        this.handleQuery();
+      },
+      // 澶氶�夋閫変腑鏁版嵁
+      handleSelectionChange(selection) {
+        this.ids = selection.map(item => item.id)
+        this.single = selection.length!=1
+        this.multiple = !selection.length
+      },
+      getSummaries(param) {
+        const { columns, data } = param;
+        const sums = [];
+        columns.forEach((column, index) => {
+          if (index === 0) {
+            sums[index] = '';
+            return;
+          }
+          if (index === 1) {
+            sums[index] = '鍚堣';
+            return;
+          }
+          const values = data.map(item => Number(item[column.property]));
+          if (!values.every(value => isNaN(value))) {
+            sums[index] = values.reduce((prev, curr) => {
+              const value = Number(curr);
+              if (!isNaN(value)) {
+                return prev + curr;
+              } else {
+                return prev;
+              }
+            }, 0);
+            //sums[index];
+            sums[index]=this.numFilter(sums[index])
+          } else {
+            sums[index] = '0';
+          }
+        });
+        return sums;
+      },
+      numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+        let realVal = '' ;
+        if (!isNaN(value) && value !== '' && value !== null) {
+          realVal = parseFloat(value).toFixed(this.skinName)
+        } else {
+          realVal = '0'
+        }
+        return realVal
+      },
+      getTime(){
+        var date = new Date()
+        var year = date.getFullYear()
+        var month = date.getMonth() + 1
+        var date = date.getDate()
+        month = month < 10 ? '0' + month : month
+        date = date < 10 ? '0' + date : date
+        this.queryParams.dataTime = year + '-' + month + '-' + date
+      },
+      handleTime(date){
+        if(date=='MONTH'){
+          this.dateTypes= 'year',
+            this.valueFormat='yyyy'
+        }else if(date=='DAY'){
+          this.dateTypes= 'month',
+            this.valueFormat='yyyy-MM'
+        }else{
+          this.dateTypes= 'date',
+            this.valueFormat='yyyy-MM-dd'
+        }
+      },
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .el-table__body{
+    border: 1px solid #000000 !important;
+  }
+  .el-table th.is-leaf, .el-table td {
+    border-bottom: 1px solid #000000 !important;
+    border-right: 1px solid #000000 !important;
+  }
+  .tableList tr td{
+    text-align: center;
+  }
+  .dashboard-editor-container {
+    padding: 32px;
+    background-color: rgb(240, 242, 245);
+    position: relative;
+    .chart-wrapper {
+      background: #fff;
+      padding: 16px 16px 0;
+      margin-bottom: 32px;
+    }
+  }
+
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+  @keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+
+  @-webkit-keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/BarChart.vue b/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/BarChart.vue
new file mode 100644
index 0000000..cc9a0a7
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 30,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/LineChart.vue b/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/index.vue b/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/index.vue
new file mode 100644
index 0000000..3166a22
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/monthlyWorkingProcedure/index.vue
@@ -0,0 +1,366 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑳芥簮绫诲瀷">
+        <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+          <el-option
+            v-for="dict in indexCategoryOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷" >
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>-->
+      <el-form-item label="缁熻鏃堕棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="month"
+                        value-format="yyyy-MM"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <!--<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>-->
+      </el-form-item>
+    </el-form>
+    <div class="el-table el-table--fit el-table--scrollable-x el-table--enable-row-hover el-table--medium" >
+      <div class="el-table__body-wrapper is-scrolling-left">
+        <table class="el-table__body tableList" cellspacing="0" cellpadding="0" style="width: 2600px">
+          <tr v-for="item in tableHead">
+            <td style="background: rgb(240 242 245);width: 80px">鏇茬嚎閫夋嫨</td>
+            <td style="background: rgb(240 242 245);width: 240px">鑳芥簮鎸囨爣鍚嶇О</td>
+            <td style="background: rgb(240 242 245);">{{item.value1}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value2}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value3}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value4}}</td>
+            <td style="background: rgb(240 242 245)">{{item.value5}}</td>
+            <td style="background: rgb(240 242 245)">{{item.value6}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value7}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value8}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value9}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value10}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value11}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value12}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value13}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value14}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value15}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value16}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value17}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value18}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value19}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value20}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value21}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value22}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value23}}</td>
+            <td style="background: rgb(240 242 245)">{{item.value24}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value25}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value26}}</td>
+            <td style="background: rgb(240 242 245);">{{item.value27}}</td>
+            <td style="background: rgb(240 242 245);" v-if="item.value29 !=null">{{item.value28}}</td>
+            <td style="background: rgb(240 242 245);" v-if="item.value29 !=null">{{item.value29}}</td>
+            <td style="background: rgb(240 242 245);" v-if="item.value30 !=null">{{item.value30}}</td>
+            <td style="background: rgb(240 242 245);" v-if="item.value31 !=null">{{item.value31}}</td>
+          </tr>
+          <tr  v-for="data in tableData">
+            <td style="width: 80px"><el-button icon="el-icon-search" circle @click="selectChange(data.indexId)" style="font-size: 10px"></el-button></td>
+            <td style="width: 240px">{{data.indexName}}</td>
+            <td>{{numFilter(data.value1)}}</td>
+            <td>{{numFilter(data.value2)}}</td>
+            <td>{{numFilter(data.value3)}}</td>
+            <td>{{numFilter(data.value4)}}</td>
+            <td>{{numFilter(data.value5)}}</td>
+            <td>{{numFilter(data.value6)}}</td>
+            <td>{{numFilter(data.value7)}}</td>
+            <td>{{numFilter(data.value8)}}</td>
+            <td>{{numFilter(data.value9)}}</td>
+            <td>{{numFilter(data.value10)}}</td>
+            <td>{{numFilter(data.value11)}}</td>
+            <td>{{numFilter(data.value12)}}</td>
+            <td>{{numFilter(data.value13)}}</td>
+            <td>{{numFilter(data.value14)}}</td>
+            <td>{{numFilter(data.value15)}}</td>
+            <td>{{numFilter(data.value16)}}</td>
+            <td>{{numFilter(data.value17)}}</td>
+            <td>{{numFilter(data.value18)}}</td>
+            <td>{{numFilter(data.value19)}}</td>
+            <td>{{numFilter(data.value20)}}</td>
+            <td>{{numFilter(data.value21)}}</td>
+            <td>{{numFilter(data.value22)}}</td>
+            <td>{{numFilter(data.value23)}}</td>
+            <td>{{numFilter(data.value24)}}</td>
+            <td>{{numFilter(data.value25)}}</td>
+            <td>{{numFilter(data.value26)}}</td>
+            <td>{{numFilter(data.value27)}}</td>
+            <td v-if="data.count>=28">{{numFilter(data.value28)}}</td>
+            <td v-if="data.count>=29">{{numFilter(data.value29)}}</td>
+            <td v-if="data.count>=30">{{numFilter(data.value30)}}</td>
+            <td v-if="data.count==31">{{numFilter(data.value31)}}</td>
+          </tr>
+        </table>
+      </div>
+    </div>
+    <el-row :gutter="32" style="margin:30px 0">
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <line-chart ref="LineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <bar-chart ref="BarChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import {getDataList,exportList,getlistChart} from "@/api/comprehensiveStatistics/monthlyComprehensive/monthlyComprehensive";
+  import LineChart from './LineChart'
+  import BarChart from "./BarChart";
+  export default {
+    components: {
+      LineChart,
+      BarChart
+    },
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange:[],
+      dateTypeOptions:[],
+      energyList: [],
+      tableData: [],
+      tableHead:[],
+      indexCategoryOptions:[],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        dataTime:undefined,
+        timeType:"DAY",
+        indexType:undefined,
+        indexStorageId:undefined,
+      },
+      skinName:"",
+      lineChartData:{expectedData: [],actualData: []},
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      //this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName=response.msg;
+    });
+    this.getDicts("energy_type").then(response => {
+      this.indexCategoryOptions = response.data;
+      //this.queryParams.indexStorageId = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      getDataList(this.queryParams).then(response => {
+        this.tableData=response.data.tabledata;
+        this.tableHead=response.data.tablehead;
+      })
+    },
+    selectChange(data){
+      this.queryParams.indexId=data;
+      getlistChart(this.queryParams).then(response => {
+        let actualData=[];
+        let expectedData=[];
+        let title="";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(item.timeCode.slice(item.timeCode.length-2,item.timeCode.length)+"鏃�");
+          title=item.indexName+"("+item.unitId+")";
+        })
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.title=title
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      })
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭缁煎悎鑳借��?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportList(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '';
+      if (!isNaN(value) && value !== '' && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '0'
+      }
+      return realVal
+    },
+    getTime() {
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime=year + '-' + month
+      /*let startTime = year + '-' + month + '-' + date
+      let endTime = year + '-' + month + '-' + (date + 1)
+      this.dateRange = [startTime, endTime]*/
+    },
+
+    handleTime(date){
+      if(date=='MONTH'){
+        this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+      }else if(date=='DAY'){
+        this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+      }else{
+        this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+      }
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+.tableList th.is-leaf, .tableList td{
+  border-bottom: 1px solid #000000 !important;
+  border-right: 1px solid #000000 !important;
+  text-align: center;
+  width: 150px;
+}
+.tableList{
+  border: 1px solid #000000 !important;
+}
+.tableList tr > td:first-child {
+  position: sticky;
+  left: 0;
+  z-index: 1;
+  background: #fff;
+}
+.tableList tr > td:nth-child(2) {
+  position: sticky;
+  left: 80px;
+  z-index: 1;
+  background: #fff;
+}
+
+.dashboard-editor-container {
+ padding: 32px;
+ background-color: rgb(240, 242, 245);
+ position: relative;
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+  }
+
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+  @keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+
+  @-webkit-keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+</style>
diff --git a/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/BarChart.vue b/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/BarChart.vue
new file mode 100644
index 0000000..cc9a0a7
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/BarChart.vue
@@ -0,0 +1,112 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+  import echarts from 'echarts'
+  require('echarts/theme/macarons') // echarts theme
+  import resize from '../../dashboard/mixins/resize'
+
+  export default {
+    mixins: [resize],
+    props: {
+      className: {
+        type: String,
+        default: 'chart'
+      },
+      width: {
+        type: String,
+        default: '100%'
+      },
+      height: {
+        type: String,
+        default: '300px'
+      },
+      autoResize: {
+        type: Boolean,
+        default: true
+      },
+      chartData: {
+        type: Object,
+        required: true
+      }
+    },
+    data() {
+      return {
+        chart: null
+      }
+    },
+    watch: {
+      chartData: {
+        deep: true,
+        handler(val) {
+          this.setOptions(val)
+        }
+      }
+    },
+    mounted() {
+      this.$nextTick(() => {
+        this.initChart()
+      })
+    },
+    beforeDestroy() {
+      if (!this.chart) {
+        return
+      }
+      this.chart.dispose()
+      this.chart = null
+    },
+    methods: {
+      initChart() {
+        this.chart = echarts.init(this.$el, 'macarons')
+        this.setOptions(this.chartData)
+      },
+      setOptions({ expectedData, actualData,title } = {}) {
+        this.chart.setOption({
+          title: {
+            text: title,
+            left: 'left',
+            textStyle: {
+              color: '#606266',
+            }
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: { // 鍧愭爣杞存寚绀哄櫒锛屽潗鏍囪酱瑙﹀彂鏈夋晥
+              type: 'shadow' // 榛樿涓虹洿绾匡紝鍙�変负锛�'line' | 'shadow'
+            }
+          },
+          grid: {
+            top: 30,
+            left: '2%',
+            right: '2%',
+            bottom: '3%',
+            containLabel: true
+          },
+          xAxis: [{
+            type: 'category',
+            data: actualData,
+            axisTick: {
+              alignWithLabel: true
+            }
+          }],
+          yAxis: [{
+            type: 'value',
+            axisTick: {
+              show: false
+            }
+          }],
+          series: [{
+            name: title,
+            type: 'bar',
+            stack: 'vistors',
+            barWidth: '60%',
+            data: expectedData,
+            animationDuration: 2800,
+            animationEasing: 'cubicInOut'
+          }]
+        });
+      }
+    }
+  }
+</script>
diff --git a/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/LineChart.vue b/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/LineChart.vue
new file mode 100644
index 0000000..44964fd
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/LineChart.vue
@@ -0,0 +1,120 @@
+<template>
+  <div :class="className" :style="{height:height,width:width}" />
+</template>
+
+<script>
+import echarts from 'echarts'
+require('echarts/theme/macarons') // echarts theme
+import resize from '../../dashboard/mixins/resize'
+
+export default {
+  mixins: [resize],
+  props: {
+    className: {
+      type: String,
+      default: 'chart'
+    },
+    width: {
+      type: String,
+      default: '100%'
+    },
+    height: {
+      type: String,
+      default: '300px'
+    },
+    autoResize: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      chart: null
+    }
+  },
+  watch: {
+    chartData: {
+      deep: true,
+      handler(val) {
+        this.setOptions(val)
+      }
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart()
+    })
+  },
+  beforeDestroy() {
+    if (!this.chart) {
+      return
+    }
+    this.chart.dispose()
+    this.chart = null
+  },
+  methods: {
+    initChart() {
+      this.chart = echarts.init(this.$el, 'macarons')
+      this.setOptions(this.chartData)
+    },
+    setOptions({ expectedData, actualData,title } = {}) {
+      this.chart.setOption({
+        title: {
+          text: title,
+          left: 'left',
+          textStyle: {
+            color: '#606266',
+          }
+        },
+        xAxis: {
+          data: actualData,
+          type: 'category',
+        },
+        grid: {
+          left: 10,
+          right: 10,
+          bottom: 20,
+          top: 40,
+          containLabel: true
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'cross'
+          },
+          padding: [5, 10]
+        },
+        yAxis: {
+          axisTick: {
+            show: false
+          }
+        },
+        legend: {
+          data: []
+        },
+        series: [{
+          name: title,
+          itemStyle: {
+            normal: {
+              color: '#FF005A',
+              lineStyle: {
+                color: '#FF005A',
+                width: 2
+              }
+            }
+          },
+          smooth: true,
+          type: 'line',
+          data: expectedData,
+          animationDuration: 2800,
+          animationEasing: 'cubicInOut'
+        }]
+      })
+    }
+  }
+}
+</script>
diff --git a/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/index.vue b/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/index.vue
new file mode 100644
index 0000000..fa32be7
--- /dev/null
+++ b/energy_management_ui/src/views/workingProcedure/yearWorkingProcedure/index.vue
@@ -0,0 +1,330 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="鑳芥簮绫诲瀷">
+        <el-select v-model="queryParams.indexStorageId" placeholder="璇烽�夋嫨鑳芥簮鍝佺">
+          <el-option
+            v-for="dict in indexCategoryOptions"
+            :key="dict.dictValue"
+            :label="dict.dictLabel"
+            :value="dict.dictValue"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!--<el-form-item label="鎶ヨ〃绫诲瀷" >
+        <el-radio-group v-model="queryParams.timeType">
+          <el-radio v-for="dict in dateTypeOptions" :key="dict.dictValue" :label="dict.dictValue" @change="handleTime(dict.dictValue)">{{dict.dictLabel}}</el-radio>
+        </el-radio-group>
+      </el-form-item>-->
+      <el-form-item label="缁熻鏃堕棿">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.dataTime"
+                        type="year"
+                        value-format="yyyy"
+                        placeholder="閫夋嫨鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+        <!--<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport">瀵煎嚭</el-button>-->
+      </el-form-item>
+    </el-form>
+    <el-table :data="energyList" border style="width: 100%; margin-top: 20px" class="tableList" >
+      <el-table-column fixed label="鏇茬嚎閫夋嫨">
+        <template slot-scope="scope">
+          <el-button icon="el-icon-search" circle @click="selectChange(scope.row)" style="font-size: 10px"></el-button>
+        </template>
+      </el-table-column>
+      <el-table-column fixed prop="indexName" align="center" label="鑳芥簮鍚嶇О" min-width="240px"></el-table-column>
+      <el-table-column label="1鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value1)}}</template></el-table-column>
+      <el-table-column label="2鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value2)}}</template></el-table-column>
+      <el-table-column label="3鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value3)}}</template></el-table-column>
+      <el-table-column label="4鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value4)}}</template></el-table-column>
+      <el-table-column label="5鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value5)}}</template></el-table-column>
+      <el-table-column label="6鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value6)}}</template></el-table-column>
+      <el-table-column label="7鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value7)}}</template></el-table-column>
+      <el-table-column label="8鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value8)}}</template></el-table-column>
+      <el-table-column label="9鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value9)}}</template></el-table-column>
+      <el-table-column label="10鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value10)}}</template></el-table-column>
+      <el-table-column label="11鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value11)}}</template></el-table-column>
+      <el-table-column label="12鏈�" align="center" min-width="140px"> <template slot-scope="scope">{{numFilter(scope.row.value12)}}</template></el-table-column>
+    </el-table>
+    <el-row :gutter="32" style="margin:30px 0">
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <line-chart ref="LineChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+      <el-col :xs="24" :sm="24" :lg="12">
+        <div class="chart-wrapper">
+          <bar-chart ref="BarChart" :chart-data="lineChartData" />
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+  import {getDataList,exportList,getlistChart} from "@/api/comprehensiveStatistics/yearComprehensive/yearComprehensive";
+  import LineChart from './LineChart'
+  import BarChart from "./BarChart";
+  export default {
+    components: {
+      LineChart,
+      BarChart
+    },
+  data() {
+    return {
+      // 閬僵灞�
+      //loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      checked: false,
+      dateRange:[],
+      dateTypeOptions:[],
+      energyList: [],
+      tableData: [],
+      tableHead:[],
+      indexCategoryOptions:[],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        indexCode: undefined,
+        indexId: undefined,
+        dataTime:undefined,
+        timeType:"MONTH",
+        indexType:undefined,
+        indexStorageId:undefined,
+      },
+      skinName:"",
+      lineChartData:{expectedData: [],actualData: []},
+    };
+  },
+  created() {
+    this.getDicts("report_form").then(response => {
+      this.dateTypeOptions = response.data;
+      //this.queryParams.timeType = this.dateTypeOptions.find(f => f.isDefault === 'Y').dictValue;
+    });
+    this.getConfigKey("comprehensive").then(response => {
+      this.skinName=response.msg;
+    });
+    this.getDicts("energy_type").then(response => {
+      this.indexCategoryOptions = response.data;
+      //this.queryParams.indexStorageId = this.indexCategoryOptions.find(f => f.isDefault === 'Y');
+    });
+    this.getList();
+    this.getTime();
+  },
+  methods: {
+    getList() {
+      this.queryParams.indexCode = this.$route.query.modelCode;
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      if(this.queryParams.dataTime==undefined){
+        this.queryParams.dataTime=year + '-' + month
+      }
+      let times=this.queryParams.dataTime.slice(0,4);
+      this.queryParams.beginTime=times+"-01-01 00:00:00"
+      this.queryParams.endTime=times+"-12-31 00:00:00"
+      getDataList(this.queryParams).then(response => {
+        this.energyList = response.data;
+      })
+    },
+    selectChange(row){
+      this.queryParams.indexId=row.indexId;
+      getlistChart(this.queryParams).then(response => {
+        let actualData=[];
+        let expectedData=[];
+        let title="";
+        response.data.forEach(item => {
+          expectedData.push(this.numFilter(item.value));
+          actualData.push(item.timeCode.slice(item.timeCode.length-2,item.timeCode.length)+"鏈�");
+          title=item.indexName+"("+item.unitId+")";
+        })
+        this.lineChartData.actualData=actualData;
+        this.lineChartData.expectedData=expectedData;
+        this.lineChartData.title=title
+        this.$refs.LineChart.initChart(this.lineChartData);
+        this.$refs.BarChart.initChart(this.lineChartData);
+      })
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+      this.selectChange();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('鏄惁纭瀵煎嚭缁煎悎鑳借��?', "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning"
+      }).then(function () {
+        return exportList(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    },
+    getSummaries(param) {
+      const {columns, data} = param;
+      const sums = [];
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = '';
+          return;
+        }
+        if (index === 1) {
+          sums[index] = '鍚堣';
+          return;
+        }
+        const values = data.map(item => Number(item[column.property]));
+        if (!values.every(value => isNaN(value))) {
+          sums[index] = values.reduce((prev, curr) => {
+            const value = Number(curr);
+            if (!isNaN(value)) {
+              return prev + curr;
+            } else {
+              return prev;
+            }
+          }, 0);
+          //sums[index];
+          sums[index] = this.numFilter(sums[index])
+        } else {
+          sums[index] = '0';
+        }
+      });
+      return sums;
+    },
+    numFilter(value) {// 鎴彇褰撳墠鏁版嵁鍒板皬鏁扮偣鍚庣殑鍑犱綅
+      let realVal = '';
+      if (!isNaN(value) && value !== '' && value !== null) {
+        realVal = parseFloat(value).toFixed(this.skinName)
+      } else {
+        realVal = '0'
+      }
+      return realVal
+    },
+    getTime() {
+      var date = new Date()
+      var year = date.getFullYear()
+      var month = date.getMonth() + 1
+      var date = date.getDate()
+      month = month < 10 ? '0' + month : month
+      date = date < 10 ? '0' + date : date
+      this.queryParams.dataTime=year + '-' + month
+    },
+
+    handleTime(date){
+      if(date=='MONTH'){
+        this.dateTypes= 'year',
+          this.valueFormat='yyyy'
+      }else if(date=='DAY'){
+        this.dateTypes= 'month',
+          this.valueFormat='yyyy-MM'
+      }else{
+        this.dateTypes= 'date',
+          this.valueFormat='yyyy-MM-dd'
+      }
+    },
+  }
+};
+</script>
+<style lang="scss" scoped>
+  .tableList th.is-leaf, .tableList td{
+    border-bottom: 1px solid #000000 !important;
+    border-right: 1px solid #000000 !important;
+  }
+  .tableList{
+    border: 1px solid #000000 !important;
+  }
+.dashboard-editor-container {
+ padding: 32px;
+ background-color: rgb(240, 242, 245);
+ position: relative;
+  .chart-wrapper {
+    background: #fff;
+    padding: 16px 16px 0;
+    margin-bottom: 32px;
+  }
+  }
+
+  @media (max-width:1024px) {
+    .chart-wrapper {
+      padding: 8px;
+    }
+  }
+  .live{
+    position: fixed;
+    right: 0px;
+    top:70px;
+    display: flex;
+    flex-direction:column;
+    justify-content:center;
+    align-items:center;
+    width: 100px;
+    height: 60px;
+    background-color: red;
+    animation: fade 600ms infinite;
+    -webkit-animation: fade 600ms infinite;
+  }
+  .live_content{
+    font-size: 18px;
+    color: white;
+    font-weight: bold;
+  }
+  .live_number{
+    font-size: 32px;
+    color: white;
+    font-weight: bolder;
+  }
+  @keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+
+  @-webkit-keyframes fade {
+    from {
+      opacity: 1.0;
+    }
+    50% {
+      opacity: 0.4;
+    }
+    to {
+      opacity: 1.0;
+    }
+  }
+</style>
diff --git "a/energy_management_ui/upload/\346\224\277\347\255\226\346\263\225\350\247\204\350\241\214\346\224\277\351\231\204\344\273\266.doc" "b/energy_management_ui/upload/\346\224\277\347\255\226\346\263\225\350\247\204\350\241\214\346\224\277\351\231\204\344\273\266.doc"
new file mode 100644
index 0000000..3d91ac8
--- /dev/null
+++ "b/energy_management_ui/upload/\346\224\277\347\255\226\346\263\225\350\247\204\350\241\214\346\224\277\351\231\204\344\273\266.doc"
Binary files differ
diff --git a/energy_management_ui/vue.config.js b/energy_management_ui/vue.config.js
new file mode 100644
index 0000000..5ee348f
--- /dev/null
+++ b/energy_management_ui/vue.config.js
@@ -0,0 +1,142 @@
+"use strict";
+const path = require("path");
+const defaultSettings = require("./src/settings.js");
+
+function resolve(dir) {
+  return path.join(__dirname, dir);
+}
+
+const name = defaultSettings.title || "搴炲反杩兘婧愮鐞嗙郴缁�"; // 鏍囬
+
+const port = process.env.port || process.env.npm_config_port || 80; // 绔彛
+
+// vue.config.js 閰嶇疆璇存槑
+//瀹樻柟vue.config.js 鍙傝�冩枃妗� https://cli.vuejs.org/zh/config/#css-loaderoptions
+// 杩欓噷鍙垪涓�閮ㄥ垎锛屽叿浣撻厤缃弬鑰冩枃妗�
+module.exports = {
+  // 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�
+  // 榛樿鎯呭喌涓嬶紝Vue CLI 浼氬亣璁句綘鐨勫簲鐢ㄦ槸琚儴缃插湪涓�涓煙鍚嶇殑鏍硅矾寰勪笂
+  // 渚嬪 https://www.ruoyi.vip/銆傚鏋滃簲鐢ㄨ閮ㄧ讲鍦ㄤ竴涓瓙璺緞涓婏紝浣犲氨闇�瑕佺敤杩欎釜閫夐」鎸囧畾杩欎釜瀛愯矾寰勩�備緥濡傦紝濡傛灉浣犵殑搴旂敤琚儴缃插湪 https://www.ruoyi.vip/admin/锛屽垯璁剧疆 baseUrl 涓� /admin/銆�
+  publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
+  // 鍦╪pm run build 鎴� yarn build 鏃� 锛岀敓鎴愭枃浠剁殑鐩綍鍚嶇О锛堣鍜宐aseUrl鐨勭敓浜х幆澧冭矾寰勪竴鑷达級锛堥粯璁ist锛�
+  outputDir: "dist",
+  // 鐢ㄤ簬鏀剧疆鐢熸垚鐨勯潤鎬佽祫婧� (js銆乧ss銆乮mg銆乫onts) 鐨勶紱锛堥」鐩墦鍖呬箣鍚庯紝闈欐�佽祫婧愪細鏀惧湪杩欎釜鏂囦欢澶逛笅锛�
+  assetsDir: "static",
+  // 鏄惁寮�鍚痚slint淇濆瓨妫�娴嬶紝鏈夋晥鍊硷細ture | false | 'error'
+  lintOnSave: process.env.NODE_ENV === "development",
+  // 濡傛灉浣犱笉闇�瑕佺敓浜х幆澧冪殑 source map锛屽彲浠ュ皢鍏惰缃负 false 浠ュ姞閫熺敓浜х幆澧冩瀯寤恒��
+  productionSourceMap: false,
+  // webpack-dev-server 鐩稿叧閰嶇疆
+  devServer: {
+    host: "0.0.0.0",
+    port: port,
+    proxy: {
+      // detail: https://cli.vuejs.org/config/#devserver-proxy
+      [process.env.VUE_APP_BASE_API]: {
+        // target: 'http://47.110.84.144:8097',
+        target: "http://192.168.0.6:8097",
+        // target: "http://q7unm6.natappfree.cc",
+        changeOrigin: true,
+        pathRewrite: {
+          ["^" + process.env.VUE_APP_BASE_API]: ""
+        }
+      }
+    },
+    disableHostCheck: true
+  },
+  css: {
+    loaderOptions: {
+      css: {},
+      postcss: {
+        plugins: [
+          // require('postcss-px2rem')({
+          //   remUnit: 20
+          // })
+        ]
+      }
+    }
+  },
+  configureWebpack: {
+    name: name,
+    resolve: {
+      alias: {
+        "@": resolve("src")
+      }
+    }
+  },
+  chainWebpack(config) {
+    config.plugins.delete("preload"); // TODO: need test
+    config.plugins.delete("prefetch"); // TODO: need test
+
+    // set svg-sprite-loader
+    config.module
+      .rule("svg")
+      .exclude.add(resolve("src/assets/icons"))
+      .end();
+    config.module
+      .rule("icons")
+      .test(/\.svg$/)
+      .include.add(resolve("src/assets/icons"))
+      .end()
+      .use("svg-sprite-loader")
+      .loader("svg-sprite-loader")
+      .options({
+        symbolId: "icon-[name]"
+      })
+      .end();
+
+    // set preserveWhitespace
+    config.module
+      .rule("vue")
+      .use("vue-loader")
+      .loader("vue-loader")
+      .tap(options => {
+        options.compilerOptions.preserveWhitespace = true;
+        return options;
+      })
+      .end();
+
+    config
+      // https://webpack.js.org/configuration/devtool/#development
+      .when(process.env.NODE_ENV === "development", config =>
+        config.devtool("cheap-source-map")
+      );
+
+    config.when(process.env.NODE_ENV !== "development", config => {
+      config
+        .plugin("ScriptExtHtmlWebpackPlugin")
+        .after("html")
+        .use("script-ext-html-webpack-plugin", [
+          {
+            // `runtime` must same as runtimeChunk name. default is `runtime`
+            inline: /runtime\..*\.js$/
+          }
+        ])
+        .end();
+      config.optimization.splitChunks({
+        chunks: "all",
+        cacheGroups: {
+          libs: {
+            name: "chunk-libs",
+            test: /[\\/]node_modules[\\/]/,
+            priority: 10,
+            chunks: "initial" // only package third parties that are initially dependent
+          },
+          elementUI: {
+            name: "chunk-elementUI", // split elementUI into a single package
+            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
+            test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
+          },
+          commons: {
+            name: "chunk-commons",
+            test: resolve("src/components"), // can customize your rules
+            minChunks: 3, //  minimum common number
+            priority: 5,
+            reuseExistingChunk: true
+          }
+        }
+      });
+      config.optimization.runtimeChunk("single");
+    });
+  }
+};
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..48e341a
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,3 @@
+{
+  "lockfileVersion": 1
+}
diff --git a/parent/pom.xml b/parent/pom.xml
new file mode 100644
index 0000000..7e42f80
--- /dev/null
+++ b/parent/pom.xml
@@ -0,0 +1,285 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>energy-management</artifactId>
+    <groupId>com.dingzhuo</groupId>
+    <version>1.0.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>parent</artifactId>
+
+  <dependencies>
+
+    <!-- SpringBoot 鏍稿績鍖� -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+
+    <!-- SpringBoot 娴嬭瘯 -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <!-- SpringBoot 鎷︽埅鍣� -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-aop</artifactId>
+    </dependency>
+
+    <!-- SpringBoot Web瀹瑰櫒 -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-web</artifactId>
+      <!-- 鎺掗櫎Tomcat渚濊禆 -->
+      <exclusions>
+        <exclusion>
+          <groupId>org.springframework.boot</groupId>
+          <artifactId>spring-boot-starter-tomcat</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-undertow</artifactId>
+    </dependency>
+
+    <!-- spring-boot-devtools -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-devtools</artifactId>
+      <optional>true</optional> <!-- 琛ㄧず渚濊禆涓嶄細浼犻�� -->
+    </dependency>
+
+    <!-- spring security 瀹夊叏璁よ瘉 -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+    </dependency>
+
+    <!-- redis 缂撳瓨鎿嶄綔 -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-redis</artifactId>
+    </dependency>
+
+    <!-- pool 瀵硅薄姹� -->
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-pool2</artifactId>
+    </dependency>
+
+    <!-- PostgreSQL椹卞姩鍖� -->
+    <dependency>
+      <groupId>org.postgresql</groupId>
+      <artifactId>postgresql</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+
+    <!-- SpringBoot闆嗘垚mybatis妗嗘灦 -->
+    <dependency>
+      <groupId>org.mybatis.spring.boot</groupId>
+      <artifactId>mybatis-spring-boot-starter</artifactId>
+      <version>${mybatis.spring.boot.starter.version}</version>
+    </dependency>
+
+    <!-- pagehelper 鍒嗛〉鎻掍欢 -->
+    <dependency>
+      <groupId>com.github.pagehelper</groupId>
+      <artifactId>pagehelper-spring-boot-starter</artifactId>
+      <version>${pagehelper.spring.boot.starter.version}</version>
+    </dependency>
+
+    <!--闃块噷鏁版嵁搴撹繛鎺ユ睜 -->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>druid-spring-boot-starter</artifactId>
+      <version>${druid.version}</version>
+    </dependency>
+
+    <!--甯哥敤宸ュ叿绫� -->
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+
+    <!--io甯哥敤宸ュ叿绫� -->
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>${commons.io.version}</version>
+    </dependency>
+
+    <!--鏂囦欢涓婁紶宸ュ叿绫� -->
+    <dependency>
+      <groupId>commons-fileupload</groupId>
+      <artifactId>commons-fileupload</artifactId>
+      <version>${commons.fileupload.version}</version>
+    </dependency>
+
+    <!-- 瑙f瀽瀹㈡埛绔搷浣滅郴缁熴�佹祻瑙堝櫒绛� -->
+    <dependency>
+      <groupId>eu.bitwalker</groupId>
+      <artifactId>UserAgentUtils</artifactId>
+      <version>${bitwalker.version}</version>
+    </dependency>
+
+    <!-- 闃块噷JSON瑙f瀽鍣� -->
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>${fastjson.version}</version>
+    </dependency>
+
+    <!--Spring妗嗘灦鍩烘湰鐨勬牳蹇冨伐鍏�-->
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context-support</artifactId>
+    </dependency>
+
+    <!--Token鐢熸垚涓庤В鏋�-->
+    <dependency>
+      <groupId>io.jsonwebtoken</groupId>
+      <artifactId>jjwt</artifactId>
+      <version>${jwt.version}</version>
+    </dependency>
+
+    <!-- swagger2-->
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger2</artifactId>
+      <version>${swagger.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>io.swagger</groupId>
+          <artifactId>swagger-annotations</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>io.swagger</groupId>
+          <artifactId>swagger-models</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+
+    <!--闃叉杩涘叆swagger椤甸潰鎶ョ被鍨嬭浆鎹㈤敊璇紝鎺掗櫎2.9.2涓殑寮曠敤锛屾墜鍔ㄥ鍔�1.5.21鐗堟湰-->
+    <dependency>
+      <groupId>io.swagger</groupId>
+      <artifactId>swagger-annotations</artifactId>
+      <version>1.5.21</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.swagger</groupId>
+      <artifactId>swagger-models</artifactId>
+      <version>1.5.21</version>
+    </dependency>
+
+    <!-- swagger2-UI-->
+    <dependency>
+      <groupId>io.springfox</groupId>
+      <artifactId>springfox-swagger-ui</artifactId>
+      <version>${swagger.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.github.xiaoymin</groupId>
+      <artifactId>swagger-bootstrap-ui</artifactId>
+      <version>1.6</version>
+    </dependency>
+
+    <!-- 鑾峰彇绯荤粺淇℃伅 -->
+    <dependency>
+      <groupId>com.github.oshi</groupId>
+      <artifactId>oshi-core</artifactId>
+      <version>${oshi.version}</version>
+    </dependency>
+
+    <dependency>
+      <groupId>net.java.dev.jna</groupId>
+      <artifactId>jna</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>net.java.dev.jna</groupId>
+      <artifactId>jna-platform</artifactId>
+    </dependency>
+    <!-- xml瑙f瀽鍖� -->
+    <dependency>
+      <groupId>org.dom4j</groupId>
+      <artifactId>dom4j</artifactId>
+      <version>2.0.0</version>
+    </dependency>
+
+    <!-- excel宸ュ叿 -->
+    <dependency>
+      <groupId>org.apache.poi</groupId>
+      <artifactId>poi-ooxml</artifactId>
+      <version>${poi.version}</version>
+    </dependency>
+    <!--velocity浠g爜鐢熸垚浣跨敤妯℃澘 -->
+    <dependency>
+      <groupId>org.apache.velocity</groupId>
+      <artifactId>velocity</artifactId>
+      <version>${velocity.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>joda-time</groupId>
+      <artifactId>joda-time</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.influxdb</groupId>
+      <artifactId>influxdb-java</artifactId>
+      <exclusions>
+        <exclusion>
+          <artifactId>okhttp</artifactId>
+          <groupId>com.squareup.okhttp3</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>okio</artifactId>
+          <groupId>com.squareup.okio</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.squareup.okhttp3</groupId>
+      <artifactId>okhttp</artifactId>
+      <exclusions>
+        <exclusion>
+          <artifactId>kotlin-stdlib</artifactId>
+          <groupId>org.jetbrains.kotlin</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>28.0-jre</version>
+    </dependency>
+    <dependency>
+      <groupId>com.jsoniter</groupId>
+      <artifactId>jsoniter</artifactId>
+      <version>0.9.23</version>
+    </dependency>
+    <dependency>
+      <groupId>org.jetbrains.kotlin</groupId>
+      <artifactId>kotlin-stdlib</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.module</groupId>
+      <artifactId>jackson-module-kotlin</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eweb4j</groupId>
+      <artifactId>fel</artifactId>
+      <version>0.10</version>
+      <scope>system</scope>
+      <systemPath>${basedir}/lib/fel.jar</systemPath>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..ff96787
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.dingzhuo</groupId>
+  <artifactId>energy-management</artifactId>
+  <version>1.0.0</version>
+  <modules>
+    <module>data-service</module>
+    <module>data-model</module>
+    <module>parent</module>
+    <module>data-monitoring</module>
+    <module>energy_management_server</module>
+    <module>basic</module>
+    <module>basic-data</module>
+    <module>compute-engine</module>
+  </modules>
+  <packaging>pom</packaging>
+
+  <name>energyManagement</name>
+  <description>浼佷笟鑳芥簮绠$悊绯荤粺</description>
+
+  <parent>
+    <groupId>org.springframework.boot</groupId>
+    <artifactId>spring-boot-starter-parent</artifactId>
+    <version>2.2.5.RELEASE</version>
+    <relativePath/>
+  </parent>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+    <java.version>1.8</java.version>
+    <mybatis.spring.boot.starter.version>1.3.2</mybatis.spring.boot.starter.version>
+    <pagehelper.spring.boot.starter.version>1.2.5</pagehelper.spring.boot.starter.version>
+    <fastjson.version>1.2.47</fastjson.version>
+    <druid.version>1.1.14</druid.version>
+    <commons.io.version>2.5</commons.io.version>
+    <commons.fileupload.version>1.3.3</commons.fileupload.version>
+    <bitwalker.version>1.19</bitwalker.version>
+    <jwt.version>0.9.0</jwt.version>
+    <swagger.version>2.9.2</swagger.version>
+    <poi.version>3.17</poi.version>
+    <oshi.version>3.9.1</oshi.version>
+    <velocity.version>1.7</velocity.version>
+  </properties>
+
+  <repositories>
+    <repository>
+      <id>public</id>
+      <name>aliyun nexus</name>
+      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+    </repository>
+  </repositories>
+
+  <pluginRepositories>
+    <pluginRepository>
+      <id>public</id>
+      <name>aliyun nexus</name>
+      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
+      <releases>
+        <enabled>true</enabled>
+      </releases>
+      <snapshots>
+        <enabled>false</enabled>
+      </snapshots>
+    </pluginRepository>
+  </pluginRepositories>
+
+  <profiles>
+    <profile>
+      <id>dev</id>
+      <properties>
+        <!--褰撳墠鐜,鐢熶骇鐜涓虹┖-->
+        <profile.name>dev</profile.name>
+      </properties>
+    </profile>
+    <profile>
+      <id>prod</id>
+      <properties>
+        <!--褰撳墠鐜,鐢熶骇鐜涓虹┖-->
+        <profile.name>prod</profile.name>
+      </properties>
+    </profile>
+  </profiles>
+</project>

--
Gitblit v1.9.3