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.
Files changed (46) hide show
  1. cloudpss/__init__.py +2 -3
  2. cloudpss/asyncio/job/job.py +2 -2
  3. cloudpss/function/functionExecution.py +26 -3
  4. cloudpss/ieslab/DataManageModel.py +119 -46
  5. cloudpss/ieslab/EvaluationModel.py +80 -9
  6. cloudpss/ieslab/IESLabOpt.py +235 -0
  7. cloudpss/ieslab/IESLabPlan.py +4 -4
  8. cloudpss/ieslab/PlanModel.py +271 -32
  9. cloudpss/ieslab/__init__.py +2 -1
  10. cloudpss/job/job.py +27 -19
  11. cloudpss/job/jobReceiver.py +2 -2
  12. cloudpss/job/{view/EMTView.py → result/EMTResult.py} +2 -2
  13. cloudpss/job/result/IESLabSimulationResult.py +5 -0
  14. cloudpss/job/{view/IESLabTypicalDayView.py → result/IESLabTypicalDayResult.py} +3 -3
  15. cloudpss/job/{view/IESView.py → result/IESResult.py} +2 -2
  16. cloudpss/job/{view/PowerFlowView.py → result/PowerFlowResult.py} +2 -2
  17. cloudpss/job/result/__init__.py +39 -0
  18. cloudpss/job/{view/view.py → result/result.py} +1 -1
  19. cloudpss/model/model.py +82 -47
  20. cloudpss/model/revision.py +3 -3
  21. cloudpss/model/topology.py +2 -2
  22. cloudpss/runner/IESLabEvaluationResult.py +14 -6
  23. cloudpss/runner/IESLabPlanResult.py +91 -35
  24. cloudpss/runner/IESLabTypicalDayResult.py +62 -50
  25. cloudpss/runner/MessageStreamReceiver.py +5 -102
  26. cloudpss/runner/result.py +6 -1
  27. cloudpss/runner/runner.py +77 -48
  28. cloudpss/utils/IO.py +1 -1
  29. cloudpss/utils/graphqlUtil.py +3 -2
  30. cloudpss/utils/httprequests.py +11 -4
  31. cloudpss/version.py +1 -1
  32. {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/METADATA +2 -2
  33. cloudpss-4.5.1.dist-info/RECORD +70 -0
  34. cloudpss/dslab/__init__.py +0 -2
  35. cloudpss/dslab/dataManageModel.py +0 -275
  36. cloudpss/dslab/dslab.py +0 -304
  37. cloudpss/dslab/files/__init__.py +0 -2
  38. cloudpss/dslab/files/curveData.py +0 -140229
  39. cloudpss/dslab/files/files.py +0 -27
  40. cloudpss/dslab/financialAnalysisModel.py +0 -137
  41. cloudpss/job/view/IESLabSimulationView.py +0 -5
  42. cloudpss/job/view/__init__.py +0 -42
  43. cloudpss/runner/DSLabResult.py +0 -92
  44. cloudpss-4.1.1b9.dist-info/RECORD +0 -77
  45. {cloudpss-4.1.1b9.dist-info → cloudpss-4.5.1.dist-info}/WHEEL +0 -0
  46. {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.view import EMTView, IESView, PowerFlowView
6
- from cloudpss.job.view.view import View
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["name"] = name
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 Model(data)
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("X_CLOUDPSS_VERSION", 4)))
516
- tags = {"replace": model.tags}
517
- if xVersion == 3:
518
- tags = model.tags
519
-
520
- return graphql_request(
521
- Model.__update_model,
522
- {
523
- "a": {
524
- "rid": model.rid,
525
- "revision": revision["hash"],
526
- "context": model.context,
527
- "configs": model.configs,
528
- "jobs": model.jobs,
529
- "name": model.name,
530
- "description": model.description,
531
- "tags": tags,
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, maximumDepth)
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[EMTView]:
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, job=None, config=None,**kwargs) -> Job[EMTView]:
663
+ def runSFEMT(self,job=None,config=None,**kwargs)->Runner[EMTResult]:
628
664
  """
629
- 运行 移频电磁暂态 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
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, job=None, config=None,**kwargs) -> Job[PowerFlowView]:
683
+ def runPowerFlow(self,job=None,config=None,**kwargs)->Runner[PowerFlowResult]:
648
684
  """
649
- 运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
685
+ 运行 潮流 内核,如果当前 model 没有创建 Job 时报错,默认使用第一个计算方案,进行仿真。
650
686
 
651
- :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
652
- :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
687
+ :param: job 计算方案名称,可选,字符串类型或者字典类型,默认使用第一个计算方案,如果同名使用最靠前一个
688
+ :param: config 参数方案,可选,字符串类型或者字典类型,默认使用保存时选中的参数方案
653
689
 
654
- :return: Job[EMTView]
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[PowerFlowView]:
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[IESView]:
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[IESView]:
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[IESView]:
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
-
@@ -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
 
@@ -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 = 'api/ieslab-plan/taskmanager/'
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
- "api/ieslab-plan/taskmanager/getOverviewResult",
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
- "api/ieslab-plan/taskmanager/getEnergyEvaluation",
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
- "api/ieslab-plan/taskmanager/getEnvironmentalEvaluation",
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 IESLabPlanResult(object):
7
+ class IESLabResult(object):
8
+ _baseUri = ''
7
9
  taskId = None
8
10
 
9
- def __init__(self, simulationId, taskId=None, **kwargs) -> 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','api/ieslab-plan/taskmanager/getSimuLastTasks',params={
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
- 'api/ieslab-plan/taskmanager/getOptimizationLog',
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
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
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
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
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
- result = data[planID].get('data', {}).get('data', [])[0]
102
- header = data[planID].get('data', {}).get('headerDesc', [])
103
- dict_result = {val.get('hearderName', ''): result.get(val.get('key', ''), '') for val in header}
104
- return dict_result
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
- len = self.GetPlanNum()
116
- if int(planID) > len:
124
+ length = self.GetPlanNum()
125
+ if int(planID) > length:
117
126
  raise Exception('计算方案id未产生')
118
127
  r = request('GET',
119
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
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
- result = {}
128
- for val in d['data']:
129
- result[val['u_name']] = val['data']['data']
130
- return result
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
- len = self.GetPlanNum()
143
- if int(planID) > len:
154
+ length = self.GetPlanNum()
155
+ if int(planID) > length:
144
156
  raise Exception('计算方案id未产生')
145
157
  r = request('GET',
146
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
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
- dict_result = dict()
157
- for val in d['data']:
158
- for k, v in val.items():
159
- dict_result[k] = v
160
- return dict_result
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, planId, componentID):
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
- 'api/ieslab-plan/taskmanager/getOptimizationResult',
221
+ f'{self._baseUri}/getOptimizationResult',
175
222
  params={
176
223
  'simuid': self.simulationId,
177
224
  'taskid': self.taskId,
178
- "planId": 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','api/ieslab-plan/taskmanager/getSimuLastTasks',params={
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
+