contract.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. import traceback
  2. import json
  3. from algorithmContract.dataContractType import DataContractType
  4. from algorithmContract.customDataContract import DataContract
  5. from algorithmContract.dataSource import DataSource
  6. from algorithmContract.dataFilter import DataFilter
  7. from algorithmContract.customFilter import CustomFilter
  8. from algorithmContract.configAnalysis import ConfigAnalysis
  9. from algorithmContract.graphSet import GraphSet
  10. class Contract:
  11. def __init__(self, contractType: DataContractType, dataContract: DataContract):
  12. self.contractType = contractType
  13. self.dataContract = dataContract
  14. def to_dict(self):
  15. return {
  16. "dataContractType": self.contractType.to_dict(),
  17. "dataContract": self.dataContract.to_dict()
  18. }
  19. def LoadAnalysisInput(jsonString: str):
  20. # Load the JSON string into a Python dictionary
  21. try:
  22. jsonData = json.loads(jsonString)
  23. jsonDataType = jsonData["dataContractType"]
  24. contractType = DataContractType(
  25. jsonDataType["type"], jsonDataType["version"])
  26. jsonDataContract = jsonData["dataContract"]
  27. autoOrManual = jsonDataContract["autoOrManual"]
  28. # Initialize the entity classes using the JSON data
  29. # data_source = DataSource(jsonDataContract["dataSource"]["scada"])
  30. custom_filters = {}
  31. for key, value in jsonDataContract["dataFilter"]["customFilter"].items():
  32. custom_filter = CustomFilter(value.get("min"), value.get("max"))
  33. custom_filters[key] = custom_filter
  34. if (not jsonDataContract["dataFilter"]["turbines"] is None) and (not isinstance(jsonDataContract["dataFilter"]["turbines"],list)):
  35. raise Exception("输入参数中机组数据类型不合法.")
  36. data_filter = DataFilter(
  37. jsonDataContract["dataFilter"]["powerFarmID"],
  38. jsonDataContract["dataFilter"]["turbines"],
  39. jsonDataContract["dataFilter"]["dataBatchNum"],
  40. jsonDataContract["dataFilter"]["beginTime"],
  41. jsonDataContract["dataFilter"]["endTime"],
  42. jsonDataContract["dataFilter"]["excludingMonths"],
  43. custom_filters
  44. )
  45. config_analysis = []
  46. for item in jsonDataContract["configAnalysis"]:
  47. analysis = ConfigAnalysis(
  48. item["package"], item["className"], item["methodName"], item["scada"])
  49. config_analysis.append(analysis)
  50. graph_sets = {}
  51. for key, value in jsonDataContract["graphSets"].items():
  52. graph_set = GraphSet(value["step"], value["min"], value["max"])
  53. graph_sets[key] = graph_set
  54. data_contract = DataContract(autoOrManual,
  55. data_filter, config_analysis, graph_sets)
  56. contract = Contract(contractType, data_contract)
  57. except Exception as e:
  58. print("exception: {}".format(e))
  59. traceback.print_exc() # 打印异常的堆栈跟踪
  60. raise e
  61. return contract
  62. # JSON string representing the data contract
  63. jsonString = '''
  64. {
  65. "dataContractType": {
  66. "type": "analysisExecuteOrder",
  67. "version": "1.2.0"
  68. },
  69. "dataContract": {
  70. "autoOrManual":"automatic",
  71. "dataSource": {
  72. "scada": "second"
  73. },
  74. "dataFilter": {
  75. "powerFarmID": "010-00001",
  76. "turbines": [
  77. "010-00001-0001",
  78. "010-00001-0002"
  79. ],
  80. "dataBatchNum": "B2024042211-0",
  81. "beginTime": "2023-01-01 00:00:00",
  82. "endTime": "2023-12-31 23:59:59",
  83. "excludingMonths": [
  84. "2023-12",
  85. "2023-09"
  86. ],
  87. "customFilter": {
  88. "valueWindSpeed": {
  89. "min": 3.0,
  90. "max": 25.0
  91. },
  92. "valuePitchAngle": {
  93. "min": 2,
  94. "max": null
  95. },
  96. "valueActivePower": {
  97. "min": 10,
  98. "max": 2500
  99. },
  100. "valueGeneratorSpeed": {
  101. "min": 10,
  102. "max": 2500
  103. }
  104. }
  105. },
  106. "configAnalysis": [
  107. {
  108. "package": "algorithm.powerCurveAnalyst",
  109. "className": "PowerCurveAnalyst",
  110. "methodName": "executeAnalysis"
  111. },
  112. {
  113. "package": "algorithm.powerScatter2DAnalyst",
  114. "className": "PowerScatter2DAnayst",
  115. "methodName": "executeAnalysis"
  116. },
  117. {
  118. "package": "algorithm.powerScatterAnalyst",
  119. "className": "PowerScatterAnalyst",
  120. "methodName": "executeAnalysis"
  121. },
  122. {
  123. "package": "algorithm.windSpeedFrequencyAnalyst",
  124. "className": "WindSpeedFrequencyAnalyst",
  125. "methodName": "executeAnalysis"
  126. },
  127. {
  128. "package": "algorithm.generatorSpeedPowerAnalyst",
  129. "className": "GeneratorSpeedPowerAnalyst",
  130. "methodName": "executeAnalysis"
  131. }
  132. ],
  133. "graphSets": {
  134. "generatorSpeed": {
  135. "step": 200,
  136. "min": 1000,
  137. "max": 2000
  138. },
  139. "generatorTorque": {
  140. "step": 2000,
  141. "min": 0,
  142. "max": 12000
  143. },
  144. "cp": {
  145. "step": 0.5,
  146. "min": 0,
  147. "max": 2
  148. },
  149. "tsr": {
  150. "step": 5,
  151. "min": 0,
  152. "max": 30
  153. },
  154. "pitchAngle": {
  155. "step": 1,
  156. "min": -1,
  157. "max": 20
  158. },
  159. "activePower": {
  160. "step": 250,
  161. "min": 0,
  162. "max": 2000
  163. }
  164. }
  165. }
  166. }
  167. '''
  168. def load():
  169. return LoadAnalysisInput(jsonString)
  170. def Analysis(contract: Contract):
  171. jsonString = ""
  172. try:
  173. contractDict = contract.to_dict() # 先转换为字典
  174. jsonString = json.dumps(contractDict)
  175. except:
  176. traceback.print_exc()
  177. return jsonString