cloudpss 4.1.1b8__py3-none-any.whl → 4.5.0__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/__init__.py +8 -0
- cloudpss/asyncio/job/__init__.py +5 -0
- cloudpss/asyncio/job/job.py +116 -0
- cloudpss/asyncio/job/messageStreamReceiver.py +121 -0
- cloudpss/asyncio/job/messageStreamSender.py +45 -0
- cloudpss/asyncio/model/__init__.py +5 -0
- cloudpss/asyncio/model/model.py +257 -0
- cloudpss/asyncio/model/revision.py +41 -0
- cloudpss/asyncio/model/topology.py +34 -0
- cloudpss/asyncio/utils/__init__.py +6 -0
- cloudpss/{utils → asyncio/utils}/httpAsyncRequest.py +2 -2
- cloudpss/function/functionExecution.py +36 -3
- cloudpss/ieslab/DataManageModel.py +131 -9
- cloudpss/ieslab/EvaluationModel.py +80 -9
- cloudpss/ieslab/IESLabOpt.py +235 -0
- cloudpss/ieslab/IESLabPlan.py +82 -4
- cloudpss/ieslab/IESLabSimulation.py +59 -32
- cloudpss/ieslab/PlanModel.py +276 -33
- cloudpss/ieslab/__init__.py +2 -1
- cloudpss/job/job.py +136 -141
- cloudpss/job/jobReceiver.py +8 -2
- cloudpss/job/messageStreamReceiver.py +42 -99
- cloudpss/job/messageStreamSender.py +5 -42
- cloudpss/job/{view/EMTView.py → result/EMTResult.py} +11 -13
- cloudpss/job/result/IESLabSimulationResult.py +5 -0
- cloudpss/job/result/IESLabTypicalDayResult.py +136 -0
- 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} +37 -8
- cloudpss/model/implements/diagram.py +113 -0
- cloudpss/model/jobDefinitions.py +6 -6
- cloudpss/model/model.py +232 -209
- cloudpss/model/revision.py +30 -35
- cloudpss/model/topology.py +13 -15
- cloudpss/runner/IESLabEvaluationResult.py +14 -6
- cloudpss/runner/IESLabPlanResult.py +91 -35
- cloudpss/runner/IESLabTypicalDayResult.py +62 -50
- cloudpss/runner/MessageStreamReceiver.py +5 -100
- 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 +16 -8
- cloudpss/version.py +1 -1
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/METADATA +2 -2
- cloudpss-4.5.0.dist-info/RECORD +70 -0
- cloudpss/dslab/__init__.py +0 -2
- cloudpss/dslab/dataManageModel.py +0 -275
- cloudpss/dslab/dslab.py +0 -210
- 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/jobMachine.py +0 -11
- cloudpss/job/jobPolicy.py +0 -129
- cloudpss/job/jobQueue.py +0 -14
- cloudpss/job/jobTres.py +0 -6
- cloudpss/job/view/IESLabSimulationView.py +0 -5
- cloudpss/job/view/IESLabTypicalDayView.py +0 -27
- cloudpss/job/view/__init__.py +0 -42
- cloudpss/runner/DSLabResult.py +0 -92
- cloudpss-4.1.1b8.dist-info/RECORD +0 -71
- /cloudpss/{utils → asyncio/utils}/AsyncIterable.py +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/WHEEL +0 -0
- {cloudpss-4.1.1b8.dist-info → cloudpss-4.5.0.dist-info}/top_level.txt +0 -0
| @@ -99,6 +99,26 @@ class FunctionExecution(object): | |
| 99 99 | 
             
                    self._args = val
         | 
| 100 100 |  | 
| 101 101 | 
             
                @staticmethod
         | 
| 102 | 
            +
                def __listObj2Array(data):
         | 
| 103 | 
            +
                    arr=[]
         | 
| 104 | 
            +
                    for item in data:
         | 
| 105 | 
            +
                        if type(item) is list:
         | 
| 106 | 
            +
                            arr.append(FunctionExecution.__listObj2Array(item))
         | 
| 107 | 
            +
                        elif type(item) is dict and ('ɵid' in item or '?id' in item ):
         | 
| 108 | 
            +
                            a = list(range(len(item)-1))
         | 
| 109 | 
            +
                            for k, v in item.items():
         | 
| 110 | 
            +
                                if k == 'ɵid' or k == '?id':
         | 
| 111 | 
            +
                                    continue
         | 
| 112 | 
            +
                                k = int(k)
         | 
| 113 | 
            +
                                if type(v) is list:
         | 
| 114 | 
            +
                                    a[k] = FunctionExecution.__listObj2Array(v)
         | 
| 115 | 
            +
                                else:
         | 
| 116 | 
            +
                                    a[k] = v
         | 
| 117 | 
            +
                            arr.append(a)       
         | 
| 118 | 
            +
                        else:
         | 
| 119 | 
            +
                            arr.append(item)
         | 
| 120 | 
            +
                    return arr
         | 
| 121 | 
            +
                @staticmethod
         | 
| 102 122 | 
             
                def __loadArgs():
         | 
| 103 123 | 
             
                    """加载当前任务参数
         | 
| 104 124 |  | 
| @@ -110,9 +130,12 @@ class FunctionExecution(object): | |
| 110 130 | 
             
                        if k.startswith('CLOUDPSS_JOB_ARG-'):
         | 
| 111 131 | 
             
                            s = k.split('-')
         | 
| 112 132 | 
             
                            key = bytes.decode(bytes.fromhex(s[1]))
         | 
| 113 | 
            -
                             | 
| 114 | 
            -
             | 
| 115 | 
            -
                             | 
| 133 | 
            +
                            data = json.loads(v)
         | 
| 134 | 
            +
                            
         | 
| 135 | 
            +
                            if type(data) is list:
         | 
| 136 | 
            +
                                data = FunctionExecution.__listObj2Array(data)
         | 
| 137 | 
            +
                            
         | 
| 138 | 
            +
                            args[key] = data
         | 
| 116 139 | 
             
                    return args
         | 
| 117 140 |  | 
| 118 141 | 
             
                def feedDog(self):
         | 
| @@ -396,4 +419,14 @@ class FunctionExecution(object): | |
| 396 419 | 
             
                            'yAxis': layout.get('yaxis', {}),
         | 
| 397 420 | 
             
                        }
         | 
| 398 421 | 
             
                    }
         | 
| 422 | 
            +
                    self.print(result)
         | 
| 423 | 
            +
                    
         | 
| 424 | 
            +
                def custom(self, data, key=None,verb='replace'):
         | 
| 425 | 
            +
                    result = {
         | 
| 426 | 
            +
                        'key': key,
         | 
| 427 | 
            +
                        'version': 1,
         | 
| 428 | 
            +
                        'verb': verb,
         | 
| 429 | 
            +
                        'type': 'custom',
         | 
| 430 | 
            +
                        'data': data
         | 
| 431 | 
            +
                    }
         | 
| 399 432 | 
             
                    self.print(result)
         | 
| @@ -83,10 +83,9 @@ class DataManageModel(object): | |
| 83 83 |  | 
| 84 84 | 
             
                        :return: 无
         | 
| 85 85 | 
             
                    '''
         | 
| 86 | 
            -
                    list = ['thermalLoads', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold']
         | 
| 86 | 
            +
                    list = ['thermalLoads', 'heatingLoad', 'coolingLoad', 'electricLoads', 'fuels', 'typhoon', 'rainfall', 'earthquake', 'extremeCold', 'HydrogenLoad']
         | 
| 87 87 | 
             
                    for kind,value in self._kindUrlMap.items():
         | 
| 88 88 | 
             
                        try:
         | 
| 89 | 
            -
                        
         | 
| 90 89 | 
             
                            if kind in list:
         | 
| 91 90 | 
             
                                dataList = self._fetchItemData(self._kindUrlMap[kind], None)
         | 
| 92 91 | 
             
                            else:
         | 
| @@ -102,12 +101,13 @@ class DataManageModel(object): | |
| 102 101 |  | 
| 103 102 | 
             
                def GetDataItem(self, ID: str):
         | 
| 104 103 | 
             
                    '''
         | 
| 105 | 
            -
                        获取ID | 
| 104 | 
            +
                        获取ID对应的数据信息
         | 
| 106 105 |  | 
| 107 106 | 
             
                        :params: ID string类型,代表数据项的标识符,可以在所有类型的数据项中实现唯一标识
         | 
| 108 107 |  | 
| 109 108 | 
             
                        :return: dict类型,为源数据的引用,返回该数据项的信息
         | 
| 110 109 | 
             
                    '''
         | 
| 110 | 
            +
             | 
| 111 111 | 
             
                    data = self._itemDataMap.get(str(ID),None)
         | 
| 112 112 |  | 
| 113 113 | 
             
                    assert (data is not None), "找不到数据"
         | 
| @@ -151,7 +151,7 @@ class DataManageModel(object): | |
| 151 151 | 
             
                        self._kindIdMap[str(data['id'])]=kind
         | 
| 152 152 | 
             
                        self._itemDataMap[str(data['timeid'])]=data
         | 
| 153 153 | 
             
                        self._itemDataMap[str(data['id'])]=data
         | 
| 154 | 
            -
                        if kind in ['thermalLoads', 'electricLoads', 'fuels']:
         | 
| 154 | 
            +
                        if kind in ['thermalLoads', 'heatingLoad','coolingLoad', 'electricLoads', 'fuels']:
         | 
| 155 155 | 
             
                            dataList = self._fetchItemData(self._kindUrlMap[kind], None)
         | 
| 156 156 | 
             
                            self._kindItemDataMap[kind] = dataList
         | 
| 157 157 | 
             
                            return dataList[-1]['id']
         | 
| @@ -281,11 +281,35 @@ class DataManageModel(object): | |
| 281 281 | 
             
                                    })
         | 
| 282 282 | 
             
                        weatherData = json.loads(r.text)
         | 
| 283 283 | 
             
                        return weatherData['results']
         | 
| 284 | 
            +
                    
         | 
| 285 | 
            +
                def UpdateAtmosData(self, data):
         | 
| 286 | 
            +
                    '''
         | 
| 287 | 
            +
                        更新气象数据
         | 
| 288 | 
            +
                        :data:  list类型,表示数据内容,其数据结构应满足对应数据项的满足如下结构要求:
         | 
| 289 | 
            +
                                    "lat": string类型 坐标纬度
         | 
| 290 | 
            +
                                    "lng": string类型 坐标经度
         | 
| 291 | 
            +
                                    "time": string类型 表示时间 需满足格式YYYY-MM-DD hh:mm:ss 如"2016-01-01 00:00:00"
         | 
| 292 | 
            +
                                    "t10m": string类型 表示环境温度(℃)
         | 
| 293 | 
            +
                                    "lwgab_swgdn": string类型 表示太阳辐射强度(W/m2)
         | 
| 294 | 
            +
                                    "u10m": string类型 距地面10m处东向风速(m/s)
         | 
| 295 | 
            +
                                    "u50m": string类型 距地面50m处东向风速(m/s)
         | 
| 296 | 
            +
                                    "v10m": string类型 距地面10m处北向风速(m/s)
         | 
| 297 | 
            +
                                    "v50m": string类型 距地面50m处北向风速(m/s)
         | 
| 298 | 
            +
                                    "adj_sfc_sw_direct_all_1h": string类型 短波直射强度(W/m²)
         | 
| 299 | 
            +
                                    "adj_sfc_sw_diff_all_1h": string类型 短波散射强度(W/m²)
         | 
| 300 | 
            +
                                    "solar_zen_angle_1h": string类型 太阳天顶角°
         | 
| 301 | 
            +
                        :return: bool 类型,返回True 更新成功
         | 
| 302 | 
            +
                    '''
         | 
| 303 | 
            +
                    r = request('POST',
         | 
| 304 | 
            +
                                self._weatherUrl,
         | 
| 305 | 
            +
                                data=json.dumps({"sid":self.simulationId, "data":data}))
         | 
| 306 | 
            +
                    return r.ok
         | 
| 284 307 |  | 
| 285 308 |  | 
| 286 309 | 
             
            class IESSimulationDataManageModel(DataManageModel):
         | 
| 287 310 | 
             
                _baseUri = 'api/ieslab-simulation/'
         | 
| 288 311 | 
             
                _weatherUrl = 'api/ieslab-simulation/rest/weather_data/'
         | 
| 312 | 
            +
                _dataManageUrl = 'api/ieslab-simulation/editor/data_manage/'
         | 
| 289 313 | 
             
                _kindNameMap = {
         | 
| 290 314 | 
             
                    "光伏": "PhotovoltaicSys",
         | 
| 291 315 | 
             
                    "风机": "WindPowerGenerator",
         | 
| @@ -314,7 +338,7 @@ class IESSimulationDataManageModel(DataManageModel): | |
| 314 338 | 
             
                    "台风灾害": "typhoon",
         | 
| 315 339 | 
             
                    "降雨灾害": "rainfall",
         | 
| 316 340 | 
             
                    "地震灾害": "earthquake",
         | 
| 317 | 
            -
                    "极寒灾害": "extremeCold"
         | 
| 341 | 
            +
                    "极寒灾害": "extremeCold",
         | 
| 318 342 | 
             
                }
         | 
| 319 343 | 
             
                _kindUrlMap = {
         | 
| 320 344 | 
             
                    "PhotovoltaicSys": "api/ieslab-simulation/rest/dpcs/",
         | 
| @@ -344,7 +368,7 @@ class IESSimulationDataManageModel(DataManageModel): | |
| 344 368 | 
             
                    "typhoon":  "api/ieslab-simulation/rest/typhoon/",
         | 
| 345 369 | 
             
                    "rainfall": "api/ieslab-simulation/rest/rainfall/",
         | 
| 346 370 | 
             
                    "earthquake": "api/ieslab-simulation/rest/earthquake/",
         | 
| 347 | 
            -
                    "extremeCold": "api/ieslab-simulation/rest/extremeCold/"
         | 
| 371 | 
            +
                    "extremeCold": "api/ieslab-simulation/rest/extremeCold/",
         | 
| 348 372 | 
             
                }
         | 
| 349 373 | 
             
                pass
         | 
| 350 374 |  | 
| @@ -352,6 +376,7 @@ class IESSimulationDataManageModel(DataManageModel): | |
| 352 376 | 
             
            class IESPlanDataManageModel(DataManageModel):
         | 
| 353 377 | 
             
                _baseUri = 'api/ieslab-plan/'
         | 
| 354 378 | 
             
                _weatherUrl = 'api/ieslab-plan/rest/weather_data/'
         | 
| 379 | 
            +
                _dataManageUrl = 'api/ieslab-plan/editor/data_manage/'
         | 
| 355 380 | 
             
                _kindNameMap = {
         | 
| 356 381 | 
             
                    "光伏": "PhotovoltaicSys",
         | 
| 357 382 | 
             
                    "风机": "WindPowerGenerator",
         | 
| @@ -363,6 +388,7 @@ class IESPlanDataManageModel(DataManageModel): | |
| 363 388 | 
             
                    "吸收式制冷机": "AbsorptionChiller",
         | 
| 364 389 | 
             
                    "蓄电池": "Battery",
         | 
| 365 390 | 
             
                    "储水罐": "WaterTank",
         | 
| 391 | 
            +
                    "蓄冰空调": "IceStorageAC",
         | 
| 366 392 | 
             
                    "变压器": "Transformer",
         | 
| 367 393 | 
             
                    "传输线": "TransferLine",
         | 
| 368 394 | 
             
                    "模块化多电平变流器": "MMC",
         | 
| @@ -380,7 +406,8 @@ class IESPlanDataManageModel(DataManageModel): | |
| 380 406 | 
             
                    "台风灾害": "typhoon",
         | 
| 381 407 | 
             
                    "降雨灾害": "rainfall",
         | 
| 382 408 | 
             
                    "地震灾害": "earthquake",
         | 
| 383 | 
            -
                    "极寒灾害": "extremeCold"
         | 
| 409 | 
            +
                    "极寒灾害": "extremeCold",
         | 
| 410 | 
            +
                    "换热器": "HeatExchanger",
         | 
| 384 411 | 
             
                }
         | 
| 385 412 | 
             
                _kindUrlMap = {
         | 
| 386 413 | 
             
                    "PhotovoltaicSys": "api/ieslab-plan/rest/dpcs/",
         | 
| @@ -389,10 +416,11 @@ class IESPlanDataManageModel(DataManageModel): | |
| 389 416 | 
             
                    "HeatPump": "api/ieslab-plan/rest/dhscs/",
         | 
| 390 417 | 
             
                    "GasBoiler": "api/ieslab-plan/rest/dhscs/",
         | 
| 391 418 | 
             
                    "HPSolarCollector": "api/ieslab-plan/rest/dhscs/",
         | 
| 392 | 
            -
                    "CompRefrg": "api/ieslab- | 
| 419 | 
            +
                    "CompRefrg": "api/ieslab-simulation/rest/dhscs/",
         | 
| 393 420 | 
             
                    "AbsorptionChiller": "api/ieslab-plan/rest/dhscs/",
         | 
| 394 421 | 
             
                    "Battery": "api/ieslab-plan/rest/escs/",
         | 
| 395 422 | 
             
                    "WaterTank": "api/ieslab-plan/rest/escs/",
         | 
| 423 | 
            +
                    "IceStorageAC": "api/ieslab-plan/rest/escs/",
         | 
| 396 424 | 
             
                    "Transformer": "api/ieslab-plan/rest/dstcs/",
         | 
| 397 425 | 
             
                    "TransferLine": "api/ieslab-plan/rest/dstcs/",
         | 
| 398 426 | 
             
                    "MMC": "api/ieslab-plan/rest/dstcs/",
         | 
| @@ -410,6 +438,100 @@ class IESPlanDataManageModel(DataManageModel): | |
| 410 438 | 
             
                    "typhoon":  "api/ieslab-plan/rest/typhoon/",
         | 
| 411 439 | 
             
                    "rainfall": "api/ieslab-plan/rest/rainfall/",
         | 
| 412 440 | 
             
                    "earthquake": "api/ieslab-plan/rest/earthquake/",
         | 
| 413 | 
            -
                    "extremeCold": "api/ieslab-plan/rest/extremeCold/"
         | 
| 441 | 
            +
                    "extremeCold": "api/ieslab-plan/rest/extremeCold/",
         | 
| 442 | 
            +
                    "HeatExchanger": "api/ieslab-plan/rest/hstcs/",
         | 
| 443 | 
            +
                }
         | 
| 444 | 
            +
                pass
         | 
| 445 | 
            +
             | 
| 446 | 
            +
            class IESOptDataManageModel(DataManageModel):
         | 
| 447 | 
            +
                _baseUri = 'api/ieslab-opt/'
         | 
| 448 | 
            +
                _weatherUrl = 'api/ieslab-opt/rest/weather_data/'
         | 
| 449 | 
            +
                _kindNameMap = {
         | 
| 450 | 
            +
                    "光伏": "PhotovoltaicSys",
         | 
| 451 | 
            +
                    "风机": "WindPowerGenerator",
         | 
| 452 | 
            +
                    "燃料发电机组": "GasTurbine",
         | 
| 453 | 
            +
                    "空气源热泵": "HeatPump",
         | 
| 454 | 
            +
                    "燃气锅炉": "GasBoiler",
         | 
| 455 | 
            +
                    "太阳能集热器": "HPSolarCollector",
         | 
| 456 | 
            +
                    "单工况制冷机": "SingleConChiller",
         | 
| 457 | 
            +
                    "双工况制冷机": "DualConChiller",
         | 
| 458 | 
            +
                    "吸收式制冷机": "AbsorptionChiller",
         | 
| 459 | 
            +
                    "蓄电池": "Battery",
         | 
| 460 | 
            +
                    "蓄冰槽": "IceStorageAC",
         | 
| 461 | 
            +
                    "变压器": "Transformer",
         | 
| 462 | 
            +
                    "传输线": "TransferLine",
         | 
| 463 | 
            +
                    "模块化多电平变流器": "MMC",
         | 
| 464 | 
            +
                    "离心泵": "CentrifugalPump",
         | 
| 465 | 
            +
                    "管道": "Pipe",
         | 
| 466 | 
            +
                    "热负荷": "heatingLoad",
         | 
| 467 | 
            +
                    "冷负荷": "coolingLoad",
         | 
| 468 | 
            +
                    "电负荷": "electricLoads",
         | 
| 469 | 
            +
                    "燃料": "fuels",
         | 
| 470 | 
            +
                    "热": "HVACHeating",
         | 
| 471 | 
            +
                    "冷": "HVACCooling",
         | 
| 472 | 
            +
                    "常数电价": "常数电价",
         | 
| 473 | 
            +
                    "分时电价": "分时电价",
         | 
| 474 | 
            +
                    "阶梯电价": "阶梯电价",
         | 
| 475 | 
            +
                    "分时阶梯电价": "分时阶梯电价",
         | 
| 476 | 
            +
                    "台风灾害": "typhoon",
         | 
| 477 | 
            +
                    "降雨灾害": "rainfall",
         | 
| 478 | 
            +
                    "地震灾害": "earthquake",
         | 
| 479 | 
            +
                    "极寒灾害": "extremeCold",
         | 
| 480 | 
            +
                    "PEM燃料电池": "PEMF",
         | 
| 481 | 
            +
                    "SOFC": "SOFC",
         | 
| 482 | 
            +
                    "碱性电解槽": "ALK",
         | 
| 483 | 
            +
                    "PEM电解槽": "PEME",
         | 
| 484 | 
            +
                    "SOEC": "SOEC",
         | 
| 485 | 
            +
                    "储氢罐": "HydrogenTank",
         | 
| 486 | 
            +
                    "储热罐": "HeatStoTank",
         | 
| 487 | 
            +
                    "换热器": "HeatExchanger",
         | 
| 488 | 
            +
                    "氢气压缩设备": "HydrogenCompression",
         | 
| 489 | 
            +
                    "氢负荷": "HydrogenLoad",
         | 
| 490 | 
            +
                    "氢": "HydrogenProductionFuels",
         | 
| 491 | 
            +
                    "运氢槽车": "HydrogenTanker"
         | 
| 492 | 
            +
                }
         | 
| 493 | 
            +
                _kindUrlMap = {
         | 
| 494 | 
            +
                    "PhotovoltaicSys": "api/ieslab-opt/rest/dpcs/",
         | 
| 495 | 
            +
                    "WindPowerGenerator": "api/ieslab-opt/rest/dpcs/",
         | 
| 496 | 
            +
                    "GasTurbine": "api/ieslab-opt/rest/dpcs/",
         | 
| 497 | 
            +
                    "HeatPump": "api/ieslab-opt/rest/dhscs/",
         | 
| 498 | 
            +
                    "GasBoiler": "api/ieslab-opt/rest/dhscs/",
         | 
| 499 | 
            +
                    "HPSolarCollector": "api/ieslab-opt/rest/dhscs/",
         | 
| 500 | 
            +
                    "SingleConChiller": "api/ieslab-opt/rest/dhscs/",
         | 
| 501 | 
            +
                    "DualConChiller": "api/ieslab-opt/rest/dhscs/",
         | 
| 502 | 
            +
                    "AbsorptionChiller": "api/ieslab-opt/rest/dhscs/",
         | 
| 503 | 
            +
                    "Battery": "api/ieslab-opt/rest/escs/",
         | 
| 504 | 
            +
                    "IceStorageAC": "api/ieslab-opt/rest/escs/",
         | 
| 505 | 
            +
                    "Transformer": "api/ieslab-opt/rest/dstcs/",
         | 
| 506 | 
            +
                    "TransferLine": "api/ieslab-opt/rest/dstcs/",
         | 
| 507 | 
            +
                    "MMC": "api/ieslab-opt/rest/dstcs/",
         | 
| 508 | 
            +
                    "CentrifugalPump": "api/ieslab-opt/rest/hstcs/",
         | 
| 509 | 
            +
                    "Pipe": "api/ieslab-opt/rest/hstcs/",
         | 
| 510 | 
            +
                    "heatingLoad": "api/ieslab-opt/rest/heatingLoad/",
         | 
| 511 | 
            +
                    "coolingLoad": "api/ieslab-opt/rest/coolingLoad/",
         | 
| 512 | 
            +
                    "electricLoads": "api/ieslab-opt/rest/electricLoads/",
         | 
| 513 | 
            +
                    "fuels": "api/ieslab-opt/rest/fuels/",
         | 
| 514 | 
            +
                    "HVACHeating": "api/ieslab-opt/rest/hots/",
         | 
| 515 | 
            +
                    "HVACCooling": "api/ieslab-opt/rest/colds/",
         | 
| 516 | 
            +
                    "常数电价": "api/ieslab-opt/rest/elects/",
         | 
| 517 | 
            +
                    "分时电价": "api/ieslab-opt/rest/elects/",
         | 
| 518 | 
            +
                    "阶梯电价": "api/ieslab-opt/rest/elects/",
         | 
| 519 | 
            +
                    "分时阶梯电价": "api/ieslab-opt/rest/elects/",
         | 
| 520 | 
            +
                    "typhoon":  "api/ieslab-opt/rest/typhoon/",
         | 
| 521 | 
            +
                    "rainfall": "api/ieslab-opt/rest/rainfall/",
         | 
| 522 | 
            +
                    "earthquake": "api/ieslab-opt/rest/earthquake/",
         | 
| 523 | 
            +
                    "extremeCold": "api/ieslab-opt/rest/extremeCold/",
         | 
| 524 | 
            +
                    "HydrogenTank": "api/ieslab-opt/rest/escs/",
         | 
| 525 | 
            +
                    "HeatStoTank": "api/ieslab-opt/rest/escs/",
         | 
| 526 | 
            +
                    "HeatExchanger": "api/ieslab-opt/rest/hstcs/",
         | 
| 527 | 
            +
                    "HydrogenCompression": "api/ieslab-opt/rest/hsec/",
         | 
| 528 | 
            +
                    "HydrogenLoad": "api/ieslab-opt/rest/hydrogenLoad/",
         | 
| 529 | 
            +
                    "HydrogenProductionFuels": "api/ieslab-opt/rest/hydrogen/",
         | 
| 530 | 
            +
                    "HydrogenTanker": "api/ieslab-opt/rest/hydrogen/",
         | 
| 531 | 
            +
                    "PEMF": "api/ieslab-opt/rest/dhscs/",
         | 
| 532 | 
            +
                    "SOFC": "api/ieslab-opt/rest/dhscs/",
         | 
| 533 | 
            +
                    "ALK": "api/ieslab-opt/rest/hpc/",
         | 
| 534 | 
            +
                    "PEME": "api/ieslab-opt/rest/hpc/",
         | 
| 535 | 
            +
                    "SOEC": "api/ieslab-opt/rest/hpc/",
         | 
| 414 536 | 
             
                }
         | 
| 415 537 | 
             
                pass
         | 
| @@ -1,13 +1,14 @@ | |
| 1 1 | 
             
            import time
         | 
| 2 | 
            -
            from cloudpss.runner.runner import HttpRunner, Runner
         | 
| 3 | 
            -
            from cloudpss.runner.IESLabEvaluationResult import  | 
| 2 | 
            +
            from cloudpss.runner.runner import HttpRunner, Runner, HttpOPTRunner
         | 
| 3 | 
            +
            from cloudpss.runner.IESLabEvaluationResult import IESLabPlanEvaluationResult, IESLabOptEvaluationResult
         | 
| 4 4 | 
             
            from ..utils import request
         | 
| 5 5 | 
             
            import json
         | 
| 6 6 | 
             
            from enum import IntEnum, unique
         | 
| 7 7 |  | 
| 8 8 | 
             
            class IESLabEvaluationModel(object):
         | 
| 9 | 
            -
                _baseUri = ' | 
| 10 | 
            -
                _taskUri = ' | 
| 9 | 
            +
                _baseUri = ''
         | 
| 10 | 
            +
                _taskUri = ''
         | 
| 11 | 
            +
                _runUri = ''
         | 
| 11 12 | 
             
                _kindNameMap = {
         | 
| 12 13 | 
             
                    "投资组成": "investmentbanchandproportion",
         | 
| 13 14 | 
             
                    "资金来源": "capitalsource",
         | 
| @@ -123,16 +124,16 @@ class IESLabEvaluationModel(object): | |
| 123 124 | 
             
                            dict_result[v] = list['results']
         | 
| 124 125 | 
             
                    return dict_result
         | 
| 125 126 |  | 
| 126 | 
            -
                def run(self, planID, type=None) ->  | 
| 127 | 
            +
                def run(self, planID, type=None) -> HttpRunner[IESLabPlanEvaluationResult]:
         | 
| 127 128 | 
             
                    '''
         | 
| 128 129 | 
             
                        运行方案评估
         | 
| 129 130 |  | 
| 130 131 | 
             
                        :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
         | 
| 131 132 | 
             
                        :params type:  string类型,任务类型:环保评价/能效评价
         | 
| 132 133 |  | 
| 133 | 
            -
                        :return: Runner[ | 
| 134 | 
            +
                        :return: Runner[IESLabPlanEvaluationResult]
         | 
| 134 135 | 
             
                    '''
         | 
| 135 | 
            -
                    url = | 
| 136 | 
            +
                    url =  self._runUri
         | 
| 136 137 | 
             
                    CMD_TYPE = type if type is None else self._evaluationType[type]
         | 
| 137 138 | 
             
                    try:
         | 
| 138 139 | 
             
                        timeId = int(time.time() * 1000)
         | 
| @@ -172,7 +173,7 @@ class IESLabEvaluationModel(object): | |
| 172 173 | 
             
                    '''
         | 
| 173 174 | 
             
                    return self.run(planID, 'energyEvaluation')
         | 
| 174 175 |  | 
| 175 | 
            -
                def GetRunner(self, planID) -> Runner[ | 
| 176 | 
            +
                def GetRunner(self, planID) -> Runner[IESLabPlanEvaluationResult]:
         | 
| 176 177 | 
             
                    '''
         | 
| 177 178 | 
             
                        获得运行实例
         | 
| 178 179 |  | 
| @@ -186,4 +187,74 @@ class IESLabEvaluationModel(object): | |
| 186 187 | 
             
            @unique
         | 
| 187 188 | 
             
            class OptimizationMode(IntEnum):
         | 
| 188 189 | 
             
                经济性 = 0
         | 
| 189 | 
            -
                环保性 = 1
         | 
| 190 | 
            +
                环保性 = 1
         | 
| 191 | 
            +
             | 
| 192 | 
            +
             | 
| 193 | 
            +
            class IESLabPlanEvaluationModel(IESLabEvaluationModel):
         | 
| 194 | 
            +
                _baseUri = 'api/ieslab-plan/rest/'
         | 
| 195 | 
            +
                _taskUri = 'api/ieslab-plan/taskmanager/getSimuLastTasks'
         | 
| 196 | 
            +
                _runUri = 'api/ieslab-plan/taskmanager/saveDataToclickhouse'
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                def run(self, planID, type=None) -> HttpRunner[IESLabPlanEvaluationResult]:
         | 
| 199 | 
            +
                    '''
         | 
| 200 | 
            +
                        运行方案评估
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                        :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
         | 
| 203 | 
            +
                        :params type:  string类型,任务类型:环保评价/能效评价
         | 
| 204 | 
            +
             | 
| 205 | 
            +
                        :return: HttpRunner[IESLabEvaluationResult]
         | 
| 206 | 
            +
                    '''
         | 
| 207 | 
            +
                    url =  self._runUri
         | 
| 208 | 
            +
                    CMD_TYPE = type if type is None else self._evaluationType[type]
         | 
| 209 | 
            +
                    try:
         | 
| 210 | 
            +
                        timeId = int(time.time() * 1000)
         | 
| 211 | 
            +
                        r = request('GET',
         | 
| 212 | 
            +
                                    url,
         | 
| 213 | 
            +
                                    params={
         | 
| 214 | 
            +
                                        "simuid": self.simulationId,
         | 
| 215 | 
            +
                                        "planId": planID,
         | 
| 216 | 
            +
                                        "CMD_TYPE": CMD_TYPE
         | 
| 217 | 
            +
                                    })
         | 
| 218 | 
            +
                        data = json.loads(r.text)
         | 
| 219 | 
            +
                        return HttpRunner({'rid': 'function/ieslab/evaluation'},
         | 
| 220 | 
            +
                            self.simulationId,
         | 
| 221 | 
            +
                            timeId=timeId,
         | 
| 222 | 
            +
                            planId=planID,
         | 
| 223 | 
            +
                            cmdType=CMD_TYPE)
         | 
| 224 | 
            +
                    except:
         | 
| 225 | 
            +
                        raise Exception('方案评估开始计算失败')
         | 
| 226 | 
            +
             | 
| 227 | 
            +
             | 
| 228 | 
            +
            class IESLabOptEvaluationModel(IESLabEvaluationModel):
         | 
| 229 | 
            +
                _baseUri = 'api/ieslab-opt/rest/'
         | 
| 230 | 
            +
                _taskUri = 'api/ieslab-opt/taskmanager/getSimuLastTasks'
         | 
| 231 | 
            +
                _runUri = 'api/ieslab-opt/taskmanager/saveDataToclickhouse'
         | 
| 232 | 
            +
             | 
| 233 | 
            +
                def run(self, planID, type=None) -> HttpOPTRunner[IESLabOptEvaluationResult]:
         | 
| 234 | 
            +
                    '''
         | 
| 235 | 
            +
                        运行方案评估
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                        :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
         | 
| 238 | 
            +
                        :params type:  string类型,任务类型:环保评价/能效评价
         | 
| 239 | 
            +
             | 
| 240 | 
            +
                        :return: HttpRunner[IESLabEvaluationResult]
         | 
| 241 | 
            +
                    '''
         | 
| 242 | 
            +
                    url =  self._runUri
         | 
| 243 | 
            +
                    CMD_TYPE = type if type is None else self._evaluationType[type]
         | 
| 244 | 
            +
                    try:
         | 
| 245 | 
            +
                        timeId = int(time.time() * 1000)
         | 
| 246 | 
            +
                        r = request('GET',
         | 
| 247 | 
            +
                                    url,
         | 
| 248 | 
            +
                                    params={
         | 
| 249 | 
            +
                                        "simuid": self.simulationId,
         | 
| 250 | 
            +
                                        "planId": planID,
         | 
| 251 | 
            +
                                        "CMD_TYPE": CMD_TYPE
         | 
| 252 | 
            +
                                    })
         | 
| 253 | 
            +
                        data = json.loads(r.text)
         | 
| 254 | 
            +
                        return HttpOPTRunner({'rid': 'function/ieslab/evaluation'},
         | 
| 255 | 
            +
                            self.simulationId,
         | 
| 256 | 
            +
                            timeId=timeId,
         | 
| 257 | 
            +
                            planId=planID,
         | 
| 258 | 
            +
                            cmdType=CMD_TYPE)
         | 
| 259 | 
            +
                    except:
         | 
| 260 | 
            +
                        raise Exception('方案评估开始计算失败')
         | 
| @@ -0,0 +1,235 @@ | |
| 1 | 
            +
            import json
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            from cloudpss.ieslab.DataManageModel import IESOptDataManageModel
         | 
| 4 | 
            +
            from cloudpss.ieslab.EvaluationModel import IESLabOptEvaluationModel
         | 
| 5 | 
            +
            from cloudpss.ieslab.PlanModel import IESLabOptModel
         | 
| 6 | 
            +
            from cloudpss.runner.IESLabTypicalDayResult import IESLabTypicalDayResult
         | 
| 7 | 
            +
            from ..utils import request
         | 
| 8 | 
            +
            from ..model.model import Model
         | 
| 9 | 
            +
            from cloudpss.runner.runner import  Runner
         | 
| 10 | 
            +
            from cloudpss.runner.IESLabPlanResult import IESLabOptResult
         | 
| 11 | 
            +
            from cloudpss.runner.IESLabEvaluationResult import IESLabOptEvaluationResult
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            class IESLabOpt(object):
         | 
| 14 | 
            +
                def __init__(self, project={}):
         | 
| 15 | 
            +
                    '''
         | 
| 16 | 
            +
                        初始化
         | 
| 17 | 
            +
                    '''
         | 
| 18 | 
            +
                    self.id = project.get('id', None)
         | 
| 19 | 
            +
                    self.name = project.get('name', None)
         | 
| 20 | 
            +
                    self.__modelRid = project.get('model', None)
         | 
| 21 | 
            +
                    self.project_group = project.get('project_group', None)
         | 
| 22 | 
            +
                    self.start_date = project.get('start_date', None)
         | 
| 23 | 
            +
                    self.end_date = project.get('end_date', None)
         | 
| 24 | 
            +
                    if self.__modelRid is not None:
         | 
| 25 | 
            +
                        self.model = Model.fetch(self.__modelRid)
         | 
| 26 | 
            +
                    self.dataManageModel = IESOptDataManageModel(self.id)
         | 
| 27 | 
            +
                    self.planModel = IESLabOptModel(self.id, self.model.rid)
         | 
| 28 | 
            +
                    self.evaluationModel = IESLabOptEvaluationModel(self.id)
         | 
| 29 | 
            +
                    self.currentPlanResult = IESLabOptResult(self.id)
         | 
| 30 | 
            +
                    self.currentEvaluationResult = IESLabOptEvaluationResult(self.id)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                @staticmethod
         | 
| 33 | 
            +
                def fetch(simulationId):
         | 
| 34 | 
            +
                    '''
         | 
| 35 | 
            +
                        获取算例信息
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                        :params: simulationId string类型,代表数据项的算例id
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                        :return: IESLabOpt
         | 
| 40 | 
            +
                    '''
         | 
| 41 | 
            +
                    try:
         | 
| 42 | 
            +
                        r = request('GET',
         | 
| 43 | 
            +
                                    'api/ieslab-opt/rest/simu/{0}/'.format(simulationId))
         | 
| 44 | 
            +
                        project = json.loads(r.text)
         | 
| 45 | 
            +
                        return IESLabOpt(project)
         | 
| 46 | 
            +
                    except:
         | 
| 47 | 
            +
                        raise Exception('未查询到当前算例')
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def __run(self, job=None, name=None):
         | 
| 50 | 
            +
                    '''
         | 
| 51 | 
            +
                        调用仿真 
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                        :params job:  调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
         | 
| 54 | 
            +
                        :params name:  任务名称,为空时使用项目的参数方案名称和计算方案名称
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                        :return: 返回一个运行实例
         | 
| 57 | 
            +
                    '''
         | 
| 58 | 
            +
                    if job is None:
         | 
| 59 | 
            +
                        currentJob = self.model.context['currentJob']
         | 
| 60 | 
            +
                        job = self.model.jobs[currentJob]
         | 
| 61 | 
            +
                    job['args']['simulationId'] = self.id
         | 
| 62 | 
            +
                    return self.model.run(job, name=name)
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                def iesLabTypicalDayRun(self, job=None, name=None, **kwargs)->Runner[IESLabTypicalDayResult]:
         | 
| 65 | 
            +
                    '''
         | 
| 66 | 
            +
                        运行典型日计算 
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                        :params job:  调用仿真时使用的计算方案,不指定将使用算例保存时选中的计算方案
         | 
| 69 | 
            +
                        :params name:  任务名称,为空时使用项目的参数方案名称和计算方案名称
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                        :return: Runner[IESLabTypicalDayResult]
         | 
| 72 | 
            +
                    '''
         | 
| 73 | 
            +
                    if job is None:
         | 
| 74 | 
            +
                        currentJob = self.model.context['currentJob']
         | 
| 75 | 
            +
                        job = self.model.jobs[currentJob]
         | 
| 76 | 
            +
                        if job['rid'] != 'function/CloudPSS/ieslab-gmm-opt':
         | 
| 77 | 
            +
                            for j in self.model.jobs:
         | 
| 78 | 
            +
                                if j['rid'] == 'job-definition/ies/ies-gmm-opt' or j['rid'] == 'job-definition/cloudpss/ieslab-gmm-opt':
         | 
| 79 | 
            +
                                    j['rid'] = 'function/CloudPSS/ieslab-gmm-opt'
         | 
| 80 | 
            +
                                    job = j
         | 
| 81 | 
            +
                    if job is None:
         | 
| 82 | 
            +
                        raise Exception("找不到默认的综合能源系统规划典型日生成算法的计算方案")
         | 
| 83 | 
            +
                    if job['rid'] != 'function/CloudPSS/ieslab-gmm-opt':
         | 
| 84 | 
            +
                        raise Exception("不是综合能源系统规划典型日生成算法的计算方案")
         | 
| 85 | 
            +
                    return self.__run(job=job, name=name)
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                def iesLabEvaluationRun(self, planId, type=None):
         | 
| 88 | 
            +
                    '''
         | 
| 89 | 
            +
                        运行方案评估
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                        :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
         | 
| 92 | 
            +
                        :param type string类型,表示评估类型,可选值为:能效评价、环保评价
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                        :return: 方案评估运行实例
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    '''
         | 
| 97 | 
            +
                    return self.evaluationModel.run(planId, type)
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                def iesLabEnergyEvaluationRun(self, planId):
         | 
| 100 | 
            +
                    '''
         | 
| 101 | 
            +
                        运行能效评价
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                        :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                        :return: 能效评价运行实例
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    '''
         | 
| 108 | 
            +
                    return self.evaluationModel.EnergyEvaluationRun(planId)
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                def iesLabEnvironmentalEvaluationRun(self, planId):
         | 
| 111 | 
            +
                    '''
         | 
| 112 | 
            +
                        运行环保评价
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                        :param planID int类型,表示优化方案的ID,数值位于0~优化方案数量之间
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                        :return: 环保评价运行实例
         | 
| 117 | 
            +
                    '''
         | 
| 118 | 
            +
                    return self.evaluationModel.EnvironmentalEvaluationRun(planId)
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                def iesLabOptRun(self):
         | 
| 121 | 
            +
                    '''
         | 
| 122 | 
            +
                        生成方案优选算例
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                        :return: 方案优选运行实例
         | 
| 125 | 
            +
                    '''
         | 
| 126 | 
            +
                    return self.planModel.run()
         | 
| 127 | 
            +
                
         | 
| 128 | 
            +
                def iesLabOptKill(self):
         | 
| 129 | 
            +
                    '''
         | 
| 130 | 
            +
                        停止并删除方案优选算例
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                        :return: Boolean
         | 
| 133 | 
            +
                    '''
         | 
| 134 | 
            +
                    return self.planModel.kill()
         | 
| 135 | 
            +
                
         | 
| 136 | 
            +
                def createProjectGroup(self, name):
         | 
| 137 | 
            +
                    '''
         | 
| 138 | 
            +
                        创建项目组
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                        :params name: 项目组名称
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                        :return: 返回一个创建的项目组
         | 
| 143 | 
            +
                    '''
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                @staticmethod
         | 
| 146 | 
            +
                def createProjectGroup(group_name, desc=None, createById=None):
         | 
| 147 | 
            +
                    '''
         | 
| 148 | 
            +
                        创建项目组
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                        :params group_name: String 项目组名称 
         | 
| 151 | 
            +
                        :params desc: String 项目组描述 可选参数
         | 
| 152 | 
            +
                        :params createById Int 父项目组id  可选参数,如果是从已有项目组导入的项目组,必填此项
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                        :return: Int 返回创建的项目组id
         | 
| 155 | 
            +
                    '''
         | 
| 156 | 
            +
                    try:
         | 
| 157 | 
            +
                        if createById is None: 
         | 
| 158 | 
            +
                            isImport = 0
         | 
| 159 | 
            +
                        else:
         | 
| 160 | 
            +
                            isImport = 1
         | 
| 161 | 
            +
                        payload = {
         | 
| 162 | 
            +
                            'group_name': group_name,
         | 
| 163 | 
            +
                            'desc': desc,
         | 
| 164 | 
            +
                            'isImport': isImport,
         | 
| 165 | 
            +
                            'createById': createById,
         | 
| 166 | 
            +
                        }
         | 
| 167 | 
            +
                        r = request(
         | 
| 168 | 
            +
                            'POST', 'api/ieslab-opt/rest/projectgroup/', data=json.dumps(payload))
         | 
| 169 | 
            +
                        project = json.loads(r.text)
         | 
| 170 | 
            +
                        return project.get('id', None)
         | 
| 171 | 
            +
                    except Exception as e:
         | 
| 172 | 
            +
                        raise Exception('创建项目组失败')
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                @staticmethod  
         | 
| 175 | 
            +
                def createProject(name, project_group, start_date, end_date, construction_cycle, desc=None, createById=None):
         | 
| 176 | 
            +
                    '''
         | 
| 177 | 
            +
                        创建项目
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                        :params name: String 项目名称 
         | 
| 180 | 
            +
                        :params project_group: Int 父项目组id
         | 
| 181 | 
            +
                        :param start_date: Int 项目开始年限,范围在[1500,3000]之间
         | 
| 182 | 
            +
                        :param end_date: Int 项目结束年限,范围在项目开始时间之后且不超过五十年
         | 
| 183 | 
            +
                        :param construction_cycle: Int 项目建设周期(年), 必须小于等于 项目结束年限 - 项目开始年限
         | 
| 184 | 
            +
                        :params desc: String 项目描述, 可选参数
         | 
| 185 | 
            +
                        :params createById Int 父项目id, 可选参数, 如果是从已有项目导入的项目,必填此项
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                        :return: Int 返回创建的项目id
         | 
| 188 | 
            +
                    '''
         | 
| 189 | 
            +
                    try:
         | 
| 190 | 
            +
                        if start_date < 1500 or start_date > 3000:
         | 
| 191 | 
            +
                            raise Exception('项目开始年限错误,范围在[1500,3000]之间')
         | 
| 192 | 
            +
                        if end_date < start_date or end_date > start_date + 50:
         | 
| 193 | 
            +
                            raise Exception('项目结束年限错误,范围在项目开始时间之后且不超过五十年')
         | 
| 194 | 
            +
                        if construction_cycle > end_date - start_date:
         | 
| 195 | 
            +
                            raise Exception('项目建设周期错误,必须小于等于 项目结束年限 - 项目开始年限')
         | 
| 196 | 
            +
                        if createById is None: 
         | 
| 197 | 
            +
                            payload = {
         | 
| 198 | 
            +
                                'name': name,
         | 
| 199 | 
            +
                                'project_group': project_group,
         | 
| 200 | 
            +
                                'start_date': start_date,
         | 
| 201 | 
            +
                                'end_date': end_date,
         | 
| 202 | 
            +
                                'construction_cycle': construction_cycle,
         | 
| 203 | 
            +
                                'desc': desc
         | 
| 204 | 
            +
                            }
         | 
| 205 | 
            +
                        else:
         | 
| 206 | 
            +
                            payload = {
         | 
| 207 | 
            +
                                'name': name,
         | 
| 208 | 
            +
                                'project_group': project_group,
         | 
| 209 | 
            +
                                'start_date': start_date,
         | 
| 210 | 
            +
                                'end_date': end_date,
         | 
| 211 | 
            +
                                'construction_cycle': construction_cycle,
         | 
| 212 | 
            +
                                'desc': desc,
         | 
| 213 | 
            +
                                'createById': createById
         | 
| 214 | 
            +
                            }
         | 
| 215 | 
            +
                        r = request(
         | 
| 216 | 
            +
                            'POST', 'api/ieslab-opt/rest/simu/', data=json.dumps(payload))
         | 
| 217 | 
            +
                        project = json.loads(r.text)
         | 
| 218 | 
            +
                        return project.get('id', None)
         | 
| 219 | 
            +
                    except Exception as e:
         | 
| 220 | 
            +
                        raise Exception('创建项目失败')
         | 
| 221 | 
            +
             | 
| 222 | 
            +
             | 
| 223 | 
            +
                @staticmethod
         | 
| 224 | 
            +
                def getProjectList():
         | 
| 225 | 
            +
                    '''
         | 
| 226 | 
            +
                        获取项目组列表
         | 
| 227 | 
            +
             | 
| 228 | 
            +
                        :return: 返回项目组列表
         | 
| 229 | 
            +
                    '''
         | 
| 230 | 
            +
                    try:
         | 
| 231 | 
            +
                        r = request('GET', 'api/ieslab-opt/rest/projectgroup/?mode=simu')
         | 
| 232 | 
            +
                        project = json.loads(r.text)
         | 
| 233 | 
            +
                        return project
         | 
| 234 | 
            +
                    except Exception as e:
         | 
| 235 | 
            +
                        raise Exception('获取项目组列表失败')
         |