cloudpss 4.1.1b9__py3-none-any.whl → 4.5.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cloudpss/__init__.py +2 -3
- cloudpss/asyncio/job/job.py +2 -2
- cloudpss/function/functionExecution.py +26 -3
- cloudpss/ieslab/DataManageModel.py +119 -46
- cloudpss/ieslab/EvaluationModel.py +80 -9
- cloudpss/ieslab/IESLabOpt.py +235 -0
- cloudpss/ieslab/IESLabPlan.py +4 -4
- cloudpss/ieslab/PlanModel.py +271 -32
- cloudpss/ieslab/__init__.py +2 -1
- cloudpss/job/job.py +27 -19
- cloudpss/job/jobReceiver.py +2 -2
- cloudpss/job/{view/EMTView.py → result/EMTResult.py} +2 -2
- cloudpss/job/result/IESLabSimulationResult.py +5 -0
- cloudpss/job/{view/IESLabTypicalDayView.py → result/IESLabTypicalDayResult.py} +3 -3
- cloudpss/job/{view/IESView.py → result/IESResult.py} +2 -2
- cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
- cloudpss/job/result/__init__.py +39 -0
- cloudpss/job/{view/view.py → result/result.py} +1 -1
- cloudpss/model/model.py +82 -47
- cloudpss/model/revision.py +3 -3
- cloudpss/model/topology.py +2 -2
- cloudpss/runner/IESLabEvaluationResult.py +14 -6
- cloudpss/runner/IESLabPlanResult.py +91 -35
- cloudpss/runner/IESLabTypicalDayResult.py +62 -50
- cloudpss/runner/MessageStreamReceiver.py +5 -102
- cloudpss/runner/result.py +6 -1
- cloudpss/runner/runner.py +77 -48
- cloudpss/utils/IO.py +1 -1
- cloudpss/utils/graphqlUtil.py +3 -2
- cloudpss/utils/httprequests.py +11 -4
- cloudpss/version.py +1 -1
- {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/METADATA +2 -2
- cloudpss-4.5.1.dist-info/RECORD +70 -0
- cloudpss/dslab/__init__.py +0 -2
- cloudpss/dslab/dataManageModel.py +0 -275
- cloudpss/dslab/dslab.py +0 -304
- cloudpss/dslab/files/__init__.py +0 -2
- cloudpss/dslab/files/curveData.py +0 -140229
- cloudpss/dslab/files/files.py +0 -27
- cloudpss/dslab/financialAnalysisModel.py +0 -137
- cloudpss/job/view/IESLabSimulationView.py +0 -5
- cloudpss/job/view/__init__.py +0 -42
- cloudpss/runner/DSLabResult.py +0 -92
- cloudpss-4.1.1b9.dist-info/RECORD +0 -77
- {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/WHEEL +0 -0
- {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/top_level.txt +0 -0
cloudpss/model/model.py
CHANGED
@@ -2,8 +2,8 @@ import os
|
|
2
2
|
import re
|
3
3
|
from copy import deepcopy
|
4
4
|
from cloudpss.job.job import Job
|
5
|
-
from cloudpss.job.
|
6
|
-
from cloudpss.job.
|
5
|
+
from cloudpss.job.result import EMTResult, IESResult, PowerFlowResult
|
6
|
+
from cloudpss.job.result.result import Result
|
7
7
|
from cloudpss.utils.IO import IO
|
8
8
|
from cloudpss.utils import graphql_request
|
9
9
|
from .revision import ModelRevision
|
@@ -274,7 +274,8 @@ class Model(object):
|
|
274
274
|
"""
|
275
275
|
|
276
276
|
config = deepcopy(self.configs[0])
|
277
|
-
config[
|
277
|
+
config['name'] = name
|
278
|
+
self.__updateConfigDefault(config)
|
278
279
|
return config
|
279
280
|
|
280
281
|
def addConfig(self, config):
|
@@ -288,10 +289,11 @@ class Model(object):
|
|
288
289
|
"""
|
289
290
|
|
290
291
|
self.configs.append(config)
|
292
|
+
self.__updateConfigDefault(config)
|
291
293
|
return config
|
292
294
|
|
293
295
|
@staticmethod
|
294
|
-
def fetchMany(name=None, cursor=[],pageSize=10,owner=None):
|
296
|
+
def fetchMany(name=None, cursor=[], pageSize=10,owner=None):
|
295
297
|
"""
|
296
298
|
获取用户可以运行的项目列表
|
297
299
|
|
@@ -347,8 +349,29 @@ class Model(object):
|
|
347
349
|
raise Exception(data["errors"][0]["message"])
|
348
350
|
return Model(data["data"]["model"])
|
349
351
|
|
350
|
-
|
351
|
-
|
352
|
+
def run(self, job=None, config=None, name=None, **kwargs):
|
353
|
+
"""
|
354
|
+
|
355
|
+
调用仿真
|
356
|
+
|
357
|
+
:params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
|
358
|
+
:params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
|
359
|
+
:params name: 任务名称,为空时使用项目的参数方案名称和计算方案名称
|
360
|
+
|
361
|
+
:return: 返回一个运行实例
|
362
|
+
|
363
|
+
>>> runner=model.run(job,config,'')
|
364
|
+
runner
|
365
|
+
|
366
|
+
"""
|
367
|
+
if job is None:
|
368
|
+
currentJob = self.context['currentJob']
|
369
|
+
job = self.jobs[currentJob]
|
370
|
+
if config is None:
|
371
|
+
currentConfig = self.context['currentConfig']
|
372
|
+
config = self.configs[currentConfig]
|
373
|
+
self.__updateConfigDefault(config)
|
374
|
+
return self.revision.run(job, config, name, rid=self.rid, **kwargs)
|
352
375
|
|
353
376
|
|
354
377
|
def iesSimulationRun(self, job=None, config=None, name=None, **kwargs):
|
@@ -372,7 +395,7 @@ class Model(object):
|
|
372
395
|
if not os.path.exists(filePath):
|
373
396
|
raise FileNotFoundError("未找到文件")
|
374
397
|
data = IO.load(filePath, format)
|
375
|
-
return
|
398
|
+
return data
|
376
399
|
|
377
400
|
@staticmethod
|
378
401
|
def dump(model, file, format="yaml", compress="gzip"):
|
@@ -389,7 +412,7 @@ class Model(object):
|
|
389
412
|
>>> Model.dump(model,file)
|
390
413
|
"""
|
391
414
|
|
392
|
-
IO.dump(model, file, format, compress)
|
415
|
+
IO.dump(model.toJSON(), file, format, compress)
|
393
416
|
|
394
417
|
def save(self, key=None):
|
395
418
|
"""
|
@@ -512,31 +535,34 @@ class Model(object):
|
|
512
535
|
auth = (65539 if publicRead else 65537) if isPublic else 0
|
513
536
|
revision = ModelRevision.create(model.revision, model.revision.hash)
|
514
537
|
|
515
|
-
xVersion = int(float(os.environ.get(
|
516
|
-
tags
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
538
|
+
xVersion = int(float(os.environ.get('X_CLOUDPSS_VERSION', 4)))
|
539
|
+
tags= {
|
540
|
+
"replace":model.tags
|
541
|
+
}
|
542
|
+
if xVersion==3:
|
543
|
+
tags=model.tags
|
544
|
+
|
545
|
+
r= graphql_request(
|
546
|
+
Model.__update_model, {
|
547
|
+
'a': {
|
548
|
+
'rid': model.rid,
|
549
|
+
'revision': revision['hash'],
|
550
|
+
'context': model.context,
|
551
|
+
'configs': model.configs,
|
552
|
+
'jobs': model.jobs,
|
553
|
+
'name': model.name,
|
554
|
+
'description': model.description,
|
555
|
+
'tags': tags,
|
532
556
|
"permissions": {
|
533
557
|
"moderator": 1,
|
534
558
|
"member": 1,
|
535
559
|
"everyone": auth,
|
536
560
|
},
|
537
561
|
}
|
538
|
-
}
|
539
|
-
|
562
|
+
})
|
563
|
+
if "errors" in r:
|
564
|
+
raise Exception(r["errors"][0]["message"])
|
565
|
+
return r
|
540
566
|
|
541
567
|
|
542
568
|
|
@@ -545,6 +571,7 @@ class Model(object):
|
|
545
571
|
implementType=None,
|
546
572
|
config=None,
|
547
573
|
maximumDepth=None,
|
574
|
+
**kwargs
|
548
575
|
):
|
549
576
|
"""
|
550
577
|
通过项目信息,获取当前项目对应的拓扑数据
|
@@ -559,21 +586,29 @@ class Model(object):
|
|
559
586
|
topology=model.fetchTopology(implementType='powerFlow',config=config) # 获取潮流实现的拓扑数据
|
560
587
|
topology=model.fetchTopology(maximumDepth=2) # 获取仅展开 2 层的拓扑数据
|
561
588
|
"""
|
562
|
-
|
563
589
|
if self.revision is not None:
|
564
590
|
if implementType is None:
|
565
591
|
implementType = "emtp"
|
566
592
|
if config is None:
|
567
593
|
currentConfig = self.context["currentConfig"]
|
568
594
|
config = self.configs[currentConfig]
|
569
|
-
return self.revision.fetchTopology(implementType, config,
|
595
|
+
return self.revision.fetchTopology(implementType, config,
|
596
|
+
maximumDepth, **kwargs)
|
570
597
|
return None
|
571
598
|
|
572
|
-
def run(self, job=None, config=None, name=None, policy=None,stop_on_entry=None, **kwargs)-> Job[View]:
|
573
|
-
|
574
|
-
"""
|
575
599
|
|
576
|
-
|
600
|
+
def __updateConfigDefault(self, config):
|
601
|
+
paramters = self.revision.parameters
|
602
|
+
if paramters is None:
|
603
|
+
return
|
604
|
+
for param in paramters:
|
605
|
+
for val in param['items']:
|
606
|
+
if config['args'].get(val['key'],None) is None:
|
607
|
+
config['args'][val['key']] = val['value']
|
608
|
+
|
609
|
+
def runEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
|
610
|
+
"""
|
611
|
+
运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
577
612
|
|
578
613
|
:params job: 调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
|
579
614
|
:params config: 调用仿真时使用的参数方案,不指定将使用算例保存时选中的参数方案
|
@@ -604,7 +639,7 @@ class Model(object):
|
|
604
639
|
job = j
|
605
640
|
return job
|
606
641
|
|
607
|
-
def runEMT(self, job=None, config=None,**kwargs) -> Job[
|
642
|
+
def runEMT(self, job=None, config=None,**kwargs) -> Job[EMTResult]:
|
608
643
|
"""
|
609
644
|
运行 emtp 内核,如果当前 model 没有创建 Job 时报错,默认使用算例中选中的计算方案进行仿真,如果选中的计算方案不是 EMT 方案则选第一个EMT 计算方案,如果不存在计算方案则直接报错。
|
610
645
|
|
@@ -622,11 +657,12 @@ class Model(object):
|
|
622
657
|
if config is None:
|
623
658
|
currentConfig = self.context["currentConfig"]
|
624
659
|
config = self.configs[currentConfig]
|
660
|
+
|
625
661
|
return self.run(job=job, config=config,**kwargs)
|
626
662
|
|
627
|
-
def runSFEMT(self,
|
663
|
+
def runSFEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
|
628
664
|
"""
|
629
|
-
|
665
|
+
运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
630
666
|
|
631
667
|
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
632
668
|
:param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
|
@@ -642,16 +678,16 @@ class Model(object):
|
|
642
678
|
if config is None:
|
643
679
|
currentConfig = self.context["currentConfig"]
|
644
680
|
config = self.configs[currentConfig]
|
645
|
-
return self.run(job=job, config=config)
|
681
|
+
return self.run(job=job, config=config,**kwargs)
|
646
682
|
|
647
|
-
def runPowerFlow(self,
|
683
|
+
def runPowerFlow(self,job=None,config=None,**kwargs)->Runner[PowerFlowResult]:
|
648
684
|
"""
|
649
|
-
|
685
|
+
运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
650
686
|
|
651
|
-
|
652
|
-
|
687
|
+
:param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
|
688
|
+
:param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
|
653
689
|
|
654
|
-
|
690
|
+
:return: Job[EMTView]
|
655
691
|
"""
|
656
692
|
if job is None:
|
657
693
|
job = self.__findJob("function/CloudPSS/power-flow")
|
@@ -664,7 +700,7 @@ class Model(object):
|
|
664
700
|
config = self.configs[currentConfig]
|
665
701
|
return self.run(job=job, config=config,**kwargs)
|
666
702
|
|
667
|
-
def runThreePhasePowerFlow(self, job=None, config=None,**kwargs) -> Job[
|
703
|
+
def runThreePhasePowerFlow(self, job=None, config=None,**kwargs) -> Job[PowerFlowResult]:
|
668
704
|
"""
|
669
705
|
运行 三相不平衡潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
670
706
|
|
@@ -684,7 +720,7 @@ class Model(object):
|
|
684
720
|
config = self.configs[currentConfig]
|
685
721
|
return self.run(job=job, config=config,**kwargs)
|
686
722
|
|
687
|
-
def runIESLoadPrediction(self, job=None, config=None,**kwargs) -> Job[
|
723
|
+
def runIESLoadPrediction(self, job=None, config=None,**kwargs) -> Job[IESResult]:
|
688
724
|
"""
|
689
725
|
运行 负荷预测方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
690
726
|
|
@@ -704,7 +740,7 @@ class Model(object):
|
|
704
740
|
config = self.configs[currentConfig]
|
705
741
|
return self.run(job=job, config=config)
|
706
742
|
|
707
|
-
def runIESPowerFlow(self, job=None, config=None,**kwargs) -> Job[
|
743
|
+
def runIESPowerFlow(self, job=None, config=None,**kwargs) -> Job[IESResult]:
|
708
744
|
"""
|
709
745
|
运行 时序潮流方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
710
746
|
|
@@ -724,7 +760,7 @@ class Model(object):
|
|
724
760
|
config = self.configs[currentConfig]
|
725
761
|
return self.run(job=job, config=config,**kwargs)
|
726
762
|
|
727
|
-
def runIESEnergyStoragePlan(self, job=None, config=None,**kwargs) -> Job[
|
763
|
+
def runIESEnergyStoragePlan(self, job=None, config=None,**kwargs) -> Job[IESResult]:
|
728
764
|
"""
|
729
765
|
运行 储能规划方案 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
|
730
766
|
|
@@ -744,4 +780,3 @@ class Model(object):
|
|
744
780
|
config = self.configs[currentConfig]
|
745
781
|
return self.run(job=job, config=config,**kwargs)
|
746
782
|
|
747
|
-
|
cloudpss/model/revision.py
CHANGED
@@ -79,7 +79,7 @@ class ModelRevision(object):
|
|
79
79
|
if stop_on_entry is not None:
|
80
80
|
job['args']['stop_on_entry'] = stop_on_entry
|
81
81
|
return Job.create(
|
82
|
-
revision["hash"], job, config, name, rid, policy, **kwargs
|
82
|
+
revision["hash"], job, config, name=name, rid=rid, policy=policy, **kwargs
|
83
83
|
)
|
84
84
|
|
85
85
|
|
@@ -108,7 +108,7 @@ class ModelRevision(object):
|
|
108
108
|
|
109
109
|
|
110
110
|
|
111
|
-
def fetchTopology(self, implementType, config, maximumDepth):
|
111
|
+
def fetchTopology(self, implementType, config, maximumDepth, **kwargs):
|
112
112
|
"""
|
113
113
|
获取当前项目版本的拓扑数据
|
114
114
|
|
@@ -126,6 +126,6 @@ class ModelRevision(object):
|
|
126
126
|
|
127
127
|
if self.hash is not None:
|
128
128
|
return ModelTopology.fetch(self.hash, implementType, config,
|
129
|
-
maximumDepth)
|
129
|
+
maximumDepth, **kwargs)
|
130
130
|
return None
|
131
131
|
|
cloudpss/model/topology.py
CHANGED
@@ -53,7 +53,7 @@ class ModelTopology():
|
|
53
53
|
f.close()
|
54
54
|
|
55
55
|
@staticmethod
|
56
|
-
def fetch(hash, implementType, config, maximumDepth=None):
|
56
|
+
def fetch(hash, implementType, config, maximumDepth=None, **kwargs):
|
57
57
|
"""
|
58
58
|
获取拓扑
|
59
59
|
|
@@ -76,7 +76,7 @@ class ModelTopology():
|
|
76
76
|
'maximumDepth': maximumDepth
|
77
77
|
}
|
78
78
|
}
|
79
|
-
data = graphql_request(ModelTopology.__modelTopologyQuery, variables)
|
79
|
+
data = graphql_request(ModelTopology.__modelTopologyQuery, variables, **kwargs)
|
80
80
|
if 'errors' in data:
|
81
81
|
raise Exception(data['errors'][0]['message'])
|
82
82
|
|
@@ -3,7 +3,7 @@ from ..utils.httprequests import request
|
|
3
3
|
|
4
4
|
|
5
5
|
class IESLabEvaluationResult(object):
|
6
|
-
_baseUri = '
|
6
|
+
_baseUri = ''
|
7
7
|
_kindNameMap = {
|
8
8
|
"利润与利润分配": "getEconomyResult",
|
9
9
|
"财务计划现金": "getFinancialPlanCashFlowResult",
|
@@ -77,7 +77,7 @@ class IESLabEvaluationResult(object):
|
|
77
77
|
'''
|
78
78
|
assert (resultType in self._kindNameMap), "数据类型不存在"
|
79
79
|
kind = self._kindNameMap.get(resultType, resultType)
|
80
|
-
url = self._baseUri + kind
|
80
|
+
url = self._baseUri + '/' + kind
|
81
81
|
list = self._fetchItemData(url, planID)
|
82
82
|
dict_result = dict()
|
83
83
|
for val in list['results']:
|
@@ -93,7 +93,7 @@ class IESLabEvaluationResult(object):
|
|
93
93
|
:return: array类型,代表该方案对应的概览结果
|
94
94
|
'''
|
95
95
|
r = request('GET',
|
96
|
-
"
|
96
|
+
f"{self._baseUri}/getOverviewResult",
|
97
97
|
params={
|
98
98
|
"simu_id": self.simulationId,
|
99
99
|
"planId": planID,
|
@@ -112,7 +112,7 @@ class IESLabEvaluationResult(object):
|
|
112
112
|
:return: array类型,代表该方案对应的能效评价结果
|
113
113
|
'''
|
114
114
|
r = request('GET',
|
115
|
-
"
|
115
|
+
f"{self._baseUri}/getEnergyEvaluation",
|
116
116
|
params={
|
117
117
|
"simu_id": self.simulationId,
|
118
118
|
"planId": planID,
|
@@ -131,7 +131,7 @@ class IESLabEvaluationResult(object):
|
|
131
131
|
:return: array类型,代表该方案对应的环保评价结果
|
132
132
|
'''
|
133
133
|
r = request('GET',
|
134
|
-
"
|
134
|
+
f"{self._baseUri}/getEnvironmentalEvaluation",
|
135
135
|
params={
|
136
136
|
"simu_id": self.simulationId,
|
137
137
|
"planId": planID,
|
@@ -140,4 +140,12 @@ class IESLabEvaluationResult(object):
|
|
140
140
|
result = json.loads(r.text)
|
141
141
|
if len(result['results']) > 0 and len(result['results'][0]['data']) > 0:
|
142
142
|
return result['results'][0]['data']
|
143
|
-
return []
|
143
|
+
return []
|
144
|
+
|
145
|
+
|
146
|
+
class IESLabPlanEvaluationResult(IESLabEvaluationResult):
|
147
|
+
_baseUri = 'api/ieslab-plan/taskmanager'
|
148
|
+
|
149
|
+
|
150
|
+
class IESLabOptEvaluationResult(IESLabEvaluationResult):
|
151
|
+
_baseUri = 'api/ieslab-opt/taskmanager'
|
@@ -1,22 +1,24 @@
|
|
1
1
|
import json
|
2
2
|
from math import fabs
|
3
3
|
from ..utils.httprequests import request
|
4
|
+
# from .result import IESResult
|
4
5
|
|
5
6
|
|
6
|
-
class
|
7
|
+
class IESLabResult(object):
|
8
|
+
_baseUri = ''
|
7
9
|
taskId = None
|
8
10
|
|
9
|
-
def __init__(self, simulationId, taskId=None
|
11
|
+
def __init__(self, simulationId, taskId=None) -> None:
|
10
12
|
"""
|
11
13
|
初始化
|
12
14
|
获得taskId
|
13
15
|
"""
|
16
|
+
|
14
17
|
self.simulationId = simulationId
|
15
18
|
if taskId is not None:
|
16
19
|
self.taskId = taskId
|
17
20
|
else:
|
18
21
|
self.taskId = self.__getLastTask()
|
19
|
-
pass
|
20
22
|
|
21
23
|
def __getLastTask(self):
|
22
24
|
'''
|
@@ -25,7 +27,7 @@ class IESLabPlanResult(object):
|
|
25
27
|
:return: string 类型
|
26
28
|
'''
|
27
29
|
try:
|
28
|
-
r=request('GET','
|
30
|
+
r=request('GET',f'{self._baseUri}/getSimuLastTasks',params={
|
29
31
|
'simuid':self.simulationId
|
30
32
|
})
|
31
33
|
result= json.loads(r.text)
|
@@ -54,7 +56,7 @@ class IESLabPlanResult(object):
|
|
54
56
|
if self.taskId is None:
|
55
57
|
raise Exception('未开始运行')
|
56
58
|
r = request('GET',
|
57
|
-
'
|
59
|
+
f'{self._baseUri}/getOptimizationLog',
|
58
60
|
params={
|
59
61
|
'simuid': self.simulationId,
|
60
62
|
'taskid': self.taskId
|
@@ -64,14 +66,14 @@ class IESLabPlanResult(object):
|
|
64
66
|
|
65
67
|
def GetPlanNum(self):
|
66
68
|
'''
|
67
|
-
获取当前result实例对应的优化方案数量
|
69
|
+
获取当前 result 实例对应的优化方案数量
|
68
70
|
|
69
71
|
:return: int类型,代表优化方案的数量
|
70
72
|
'''
|
71
73
|
if self.taskId is None:
|
72
74
|
raise Exception('未开始运行')
|
73
75
|
r = request('GET',
|
74
|
-
'
|
76
|
+
f'{self._baseUri}/getOptimizationResult',
|
75
77
|
params={
|
76
78
|
'simuid': self.simulationId,
|
77
79
|
'taskid': self.taskId,
|
@@ -84,39 +86,46 @@ class IESLabPlanResult(object):
|
|
84
86
|
'''
|
85
87
|
获取planID对应的优化方案的基础信息
|
86
88
|
|
87
|
-
:param: planID int类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
|
89
|
+
:param: planID int 类型,表示优化方案的 ID,数值位于 0~优化方案数量 之间
|
88
90
|
|
89
|
-
:return: dict类型,代表该方案的基础信息,包括投资、运行成本、负荷总量等信息
|
91
|
+
:return: dict 类型,代表该方案的基础信息,包括投资、运行成本、负荷总量等信息
|
90
92
|
'''
|
91
93
|
if self.taskId is None:
|
92
94
|
raise Exception('未开始运行')
|
95
|
+
length = self.GetPlanNum()
|
96
|
+
if int(planID) > length:
|
97
|
+
raise Exception('计算方案id未产生')
|
93
98
|
r = request('GET',
|
94
|
-
'
|
99
|
+
f'{self._baseUri}/getOptimizationResult',
|
95
100
|
params={
|
96
101
|
'simuid': self.simulationId,
|
97
102
|
'taskid': self.taskId,
|
98
103
|
'resultType': 0
|
99
104
|
})
|
100
105
|
data = json.loads(r.text).get('data', [])
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
106
|
+
filtered_data = [item for item in data if item['id'] == planID]
|
107
|
+
if filtered_data:
|
108
|
+
result = filtered_data[0].get('data', {}).get('data', [])[0]
|
109
|
+
header = filtered_data[0].get('data', {}).get('headerDesc', [])
|
110
|
+
dict_result = {val.get('hearderName', ''): result.get(val.get('key', ''), '') for val in header}
|
111
|
+
return dict_result
|
112
|
+
else:
|
113
|
+
raise Exception('未查询到该方案id数据')
|
105
114
|
|
106
115
|
|
107
116
|
def GetPlanConfiguration(self, planID):
|
108
117
|
'''
|
109
118
|
获取planID对应的优化方案的配置信息
|
110
119
|
|
111
|
-
:param: planID int类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
|
120
|
+
:param: planID int 类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
|
112
121
|
|
113
|
-
:return: dict类型,代表该方案的配置信息,包括每种设备的选型配置、容量配置、成本等相关信息
|
122
|
+
:return: dict 类型,代表该方案的配置信息,包括每种设备的选型配置、容量配置、成本等相关信息
|
114
123
|
'''
|
115
|
-
|
116
|
-
if int(planID) >
|
124
|
+
length = self.GetPlanNum()
|
125
|
+
if int(planID) > length:
|
117
126
|
raise Exception('计算方案id未产生')
|
118
127
|
r = request('GET',
|
119
|
-
'
|
128
|
+
f'{self._baseUri}/getOptimizationResult',
|
120
129
|
params={
|
121
130
|
'simuid': self.simulationId,
|
122
131
|
'taskid': self.taskId,
|
@@ -124,10 +133,13 @@ class IESLabPlanResult(object):
|
|
124
133
|
'resultType': 1
|
125
134
|
})
|
126
135
|
d = json.loads(r.text)
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
136
|
+
if len(d['data']) == 0:
|
137
|
+
raise Exception('未查询到该方案id数据')
|
138
|
+
else:
|
139
|
+
result = {}
|
140
|
+
for val in d['data']:
|
141
|
+
result[val['u_name']] = val['data']['data']
|
142
|
+
return result
|
131
143
|
|
132
144
|
def GetComponentResult(self, planID, componentID, typicalDayName=''):
|
133
145
|
'''
|
@@ -139,11 +151,11 @@ class IESLabPlanResult(object):
|
|
139
151
|
|
140
152
|
:return: dict类型,代表该元件在不同典型日下的运行信息
|
141
153
|
'''
|
142
|
-
|
143
|
-
if int(planID) >
|
154
|
+
length = self.GetPlanNum()
|
155
|
+
if int(planID) > length:
|
144
156
|
raise Exception('计算方案id未产生')
|
145
157
|
r = request('GET',
|
146
|
-
'
|
158
|
+
f'{self._baseUri}/getOptimizationResult',
|
147
159
|
params={
|
148
160
|
'simuid': self.simulationId,
|
149
161
|
'taskid': self.taskId,
|
@@ -153,13 +165,45 @@ class IESLabPlanResult(object):
|
|
153
165
|
'u_name': componentID
|
154
166
|
})
|
155
167
|
d = json.loads(r.text)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
168
|
+
if len(d['data']) == 0:
|
169
|
+
raise Exception('未查询到该方案id对应的优化方案下componentID对应元件数据')
|
170
|
+
else:
|
171
|
+
dict_result = dict()
|
172
|
+
for val in d['data']:
|
173
|
+
for k, v in val.items():
|
174
|
+
dict_result[k] = v
|
175
|
+
return dict_result
|
176
|
+
|
177
|
+
def GetEnergyBalanceResult(self, planID, typicalDayName=''):
|
178
|
+
'''
|
179
|
+
获取planID对应的优化方案下能量平衡图数据
|
180
|
+
|
181
|
+
:param: planID int 类型,表示优化方案的ID,数值位于 0~优化方案数量 之间
|
182
|
+
:param typicalDayName str 类型,代表典型日的名称
|
183
|
+
|
184
|
+
:return: dict类型,代表该元件在不同典型日下的运行信息
|
185
|
+
|
186
|
+
'''
|
187
|
+
length = self.GetPlanNum()
|
188
|
+
if int(planID) > length:
|
189
|
+
raise Exception('计算方案id未产生')
|
190
|
+
try:
|
191
|
+
r = request('GET',
|
192
|
+
f'{self._baseUri}/getOptimizationResult',
|
193
|
+
params={
|
194
|
+
'simuid': self.simulationId,
|
195
|
+
'taskid': self.taskId,
|
196
|
+
'resultType': 4,
|
197
|
+
'typicalDay': typicalDayName,
|
198
|
+
"planId": planID,
|
199
|
+
"u_name": "systemData"
|
200
|
+
})
|
201
|
+
return json.loads(r.text)
|
202
|
+
except:
|
203
|
+
raise Exception('运行失败')
|
204
|
+
|
161
205
|
|
162
|
-
def GetComponentTypiDays(self,
|
206
|
+
def GetComponentTypiDays(self, planID, componentID):
|
163
207
|
'''
|
164
208
|
获取当前result实例对应的优化方案数量
|
165
209
|
|
@@ -170,12 +214,15 @@ class IESLabPlanResult(object):
|
|
170
214
|
'''
|
171
215
|
if self.taskId is None:
|
172
216
|
raise Exception('未开始运行')
|
217
|
+
length = self.GetPlanNum()
|
218
|
+
if int(planID) > length:
|
219
|
+
raise Exception('计算方案id未产生')
|
173
220
|
r = request('GET',
|
174
|
-
'
|
221
|
+
f'{self._baseUri}/getOptimizationResult',
|
175
222
|
params={
|
176
223
|
'simuid': self.simulationId,
|
177
224
|
'taskid': self.taskId,
|
178
|
-
"planId":
|
225
|
+
"planId": planID,
|
179
226
|
'u_name': componentID,
|
180
227
|
'resultType': 2
|
181
228
|
})
|
@@ -188,8 +235,17 @@ class IESLabPlanResult(object):
|
|
188
235
|
|
189
236
|
:return: dict 类型
|
190
237
|
'''
|
191
|
-
r=request('GET','
|
238
|
+
r=request('GET',f'{self._baseUri}/getSimuLastTasks',params={
|
192
239
|
'simuid':self.simulationId
|
193
240
|
})
|
194
241
|
result= json.loads(r.text)
|
195
242
|
return result
|
243
|
+
|
244
|
+
|
245
|
+
class IESLabPlanResult(IESLabResult):
|
246
|
+
_baseUri = 'api/ieslab-plan/taskmanager'
|
247
|
+
|
248
|
+
|
249
|
+
class IESLabOptResult(IESLabResult):
|
250
|
+
_baseUri = 'api/ieslab-opt/taskmanager'
|
251
|
+
|