device.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. from datetime import datetime
  2. import sys
  3. import csv
  4. from PyQt5.QtCore import Qt
  5. from PyQt5.QtWidgets import (
  6. QApplication,
  7. QMainWindow,
  8. QVBoxLayout,
  9. QFileDialog,
  10. QLineEdit,
  11. QWidget,
  12. QPushButton,
  13. QMessageBox,
  14. QHBoxLayout
  15. )
  16. import query_db
  17. import json
  18. class MainWindow(QMainWindow):
  19. def __init__(self):
  20. super().__init__()
  21. # 获取所有用户名称与UID
  22. self.setWindowTitle("导出设备信息")
  23. self.resize(500, 400)
  24. # 设置窗口布局
  25. layout = QVBoxLayout()
  26. center_layout01 = QHBoxLayout()
  27. # 添加输入框(QLineEdit),并设置宽度
  28. self.search_input01 = QLineEdit(self)
  29. self.search_input01.setPlaceholderText("请输入用户名")
  30. self.search_input01.setFixedWidth(300)
  31. self.search_input01.setFixedHeight(30)
  32. center_layout01.addWidget(self.search_input01)
  33. center_layout02 = QHBoxLayout()
  34. # 添加输入框(QLineEdit),并设置宽度
  35. self.search_input02 = QLineEdit(self)
  36. self.search_input02.setPlaceholderText("请输入任务单号")
  37. self.search_input02.setFixedWidth(300)
  38. self.search_input02.setFixedHeight(30)
  39. center_layout02.addWidget(self.search_input02)
  40. # 添加导出按钮
  41. center_layout03 = QHBoxLayout()
  42. self.export_button = QPushButton("导出数据", self)
  43. self.export_button.setFixedWidth(100) # 设置按钮宽度
  44. center_layout03.addWidget(self.export_button)
  45. # 绑定导出按钮点击事件
  46. self.export_button.clicked.connect(self.export_data)
  47. center_layout01.setAlignment(Qt.AlignCenter)
  48. center_layout02.setAlignment(Qt.AlignCenter)
  49. center_layout03.setAlignment(Qt.AlignCenter)
  50. layout.addLayout(center_layout01)
  51. layout.addLayout(center_layout02)
  52. layout.addLayout(center_layout03)
  53. # 设置布局
  54. container = QWidget()
  55. container.setLayout(layout)
  56. container.setFixedHeight(300)
  57. self.setCentralWidget(container)
  58. def export_data(self):
  59. client = query_db.bigata_mongo()
  60. sa_device_type = client.sa_device_type
  61. sa_device = client.sa_device
  62. sa_device_cbd_data = client.sa_device_cbd_data
  63. sa_device_bzy_data = client.sa_device_bzy_data
  64. sa_device_scd_data = client.sa_device_scd_data
  65. sa_device_xy_three_data = client.sa_device_xy_three_data
  66. sa_device_xct_data = client.sa_device_xct_data
  67. xct_haomi_data = client.xct_haomi_data
  68. sa_qxz_base_info = client.sa_qxz_base_info
  69. # 先判断是否有输入用户名,任务单号或设备号
  70. search_input01_text = self.search_input01.text()
  71. search_input02_text = self.search_input02.text()
  72. search = {}
  73. if (not search_input01_text) and (not search_input02_text):
  74. self.message("请输入用户名称或任务单号")
  75. return
  76. if search_input01_text:
  77. print(search_input01_text)
  78. rek = query_db.user_info(search_input01_text)
  79. if rek:
  80. search.update(rek)
  81. else:
  82. self.message("请确认用户为普通用户或经销商,或当前输入用户正确无误")
  83. return
  84. if search_input02_text:
  85. search.update({"salesman_task_number": search_input02_text})
  86. result = sa_device.find(
  87. search,
  88. {
  89. "device_id": 1,
  90. "device_name":1,
  91. "device_status": 1,
  92. "device_type_id": 1,
  93. "device_model": 1,
  94. "salesman_task_number": 1,
  95. "province": 1,
  96. "city": 1,
  97. "district": 1,
  98. "addtime": 1,
  99. "uptime": 1,
  100. "off_time": 1,
  101. "simid": 1,
  102. "id":1,
  103. "_id":0
  104. }
  105. )
  106. result = list(result)
  107. title = [
  108. "ID",
  109. "名称",
  110. "状态",
  111. "设备类型",
  112. "任务单号",
  113. "地址",
  114. "设备添加时间",
  115. "最近更新时间",
  116. "离线时间",
  117. "图片ICCID",
  118. "图片ICCD过期时间",
  119. "图片ICCD厂家",
  120. "设备ICCID",
  121. "设备ICCID过期时间",
  122. "设备ICCID厂家"
  123. ]
  124. if result:
  125. device_type_dict = sa_device_type.find({}, {"id": 1, "type_name": 1, "_id": 0})
  126. device_type_dict = {str(i.get("id")): i.get("type_name") for i in list(device_type_dict)}
  127. # 弹出文件保存对话框让用户选择保存路径
  128. file_dialog = QFileDialog(self)
  129. file_dialog.setAcceptMode(QFileDialog.AcceptSave)
  130. file_dialog.setFileMode(QFileDialog.AnyFile)
  131. file_dialog.setNameFilter("CSV文件 (*.csv)")
  132. file_dialog.selectFile("device.csv")
  133. if file_dialog.exec_():
  134. # 获取文件保存路径
  135. file_path = file_dialog.selectedFiles()[0]
  136. # 执行导出操作,将设备名称保存为CSV文件
  137. try:
  138. with open(file_path, mode='w', newline='', encoding='utf-8') as file:
  139. writer = csv.writer(file)
  140. writer.writerow(title)
  141. for row in result:
  142. d_id = row.get("id")
  143. img_iccid = row.get("simid")
  144. if img_iccid:
  145. iccid_info = query_db.sim_query_new(img_iccid)
  146. else:
  147. iccid_info = {}
  148. expire = iccid_info.get("expire", "")
  149. company = iccid_info.get("company", "")
  150. device_type_id = row.get("device_type_id")
  151. device_model = row.get("device_model")
  152. model = None
  153. if device_type_id == 3:
  154. if device_model == 11:
  155. device_type_name = "虫情信息采集设备"
  156. else:
  157. device_type_name = "虫情测报灯"
  158. model = sa_device_cbd_data
  159. elif device_type_id == 7:
  160. if device_model == 50:
  161. device_type_name = "孢子仪1.0"
  162. elif device_model == 52:
  163. device_type_name = "孢子仪2.0"
  164. else:
  165. device_type_name = "孢子仪"
  166. model = sa_device_bzy_data
  167. elif device_type_id == 2:
  168. if device_model == 101:
  169. device_type_name = "风吸式杀虫灯"
  170. else:
  171. device_type_name = "杀虫灯"
  172. model = sa_device_scd_data
  173. elif device_type_id == 8:
  174. device_type_name = device_type_dict.get(str(device_type_id))
  175. model = sa_device_xy_three_data
  176. elif device_type_id == 12:
  177. device_type_name = device_type_dict.get(str(device_type_id))
  178. model = sa_device_xct_data
  179. elif device_type_id == 28:
  180. device_type_name = device_type_dict.get(str(device_type_id))
  181. model = xct_haomi_data
  182. else:
  183. device_type_name = device_type_dict.get(str(device_type_id))
  184. device_status = row.get("device_status")
  185. status = "在线" if device_status == 1 else "离线"
  186. device_iccid, device_expire, device_company = "", "", ""
  187. if device_type_id == 5:
  188. qxz = sa_qxz_base_info.find({"device_id": row.get("device_id")}, {"iccid": 1, "_id": 0}).sort("uptime", -1).limit(1)
  189. qxz = list(qxz)
  190. if qxz:
  191. try:
  192. device_iccid = qxz[0].get("iccid")
  193. device_iccid_info = query_db.sim_query_new(device_iccid)
  194. except Exception as e:
  195. device_iccid_info = {}
  196. device_expire = device_iccid_info.get("expire", "")
  197. device_company = device_iccid_info.get("company", "")
  198. else:
  199. if model:
  200. device_data = model.find({"device_id": d_id}, {"device_data":1, "_id":0}).sort("addtime", -1).limit(1)
  201. d_data = list(device_data)
  202. if d_data:
  203. device_data_str = d_data[0].get("device_data")
  204. device_data_json = {}
  205. if device_data_str:
  206. try:
  207. device_data_json = eval(device_data_str)
  208. except Exception as e:
  209. device_data_json = json.loads(device_data_str)
  210. device_iccid = device_data_json.get("iccid")
  211. if device_iccid:
  212. device_iccid_info = query_db.sim_query_new(device_iccid)
  213. else:
  214. device_iccid_info = {}
  215. device_expire = device_iccid_info.get("expire", "")
  216. device_company = device_iccid_info.get("company", "")
  217. data = [
  218. row.get("device_id"),
  219. row.get("device_name"),
  220. status,
  221. device_type_name,
  222. row.get("salesman_task_number"),
  223. row.get("province") + row.get("city") + row.get("district"),
  224. datetime.fromtimestamp(row.get("addtime")).strftime("%Y-%m-%d %H:%M:%S") if row.get("off_time") != 0 else "",
  225. datetime.fromtimestamp(row.get("uptime")).strftime("%Y-%m-%d %H:%M:%S") if row.get("off_time") != 0 else "",
  226. datetime.fromtimestamp(row.get("off_time")).strftime("%Y-%m-%d %H:%M:%S") if row.get("off_time") != 0 else "",
  227. img_iccid,
  228. expire,
  229. company,
  230. device_iccid,
  231. device_expire,
  232. device_company
  233. ]
  234. writer.writerow(data)
  235. self.message(f"数据成功导出到 {file_path}")
  236. return
  237. except Exception as e:
  238. self.message(f"导出数据时发生错误: {e}")
  239. return
  240. else:
  241. self.message("未找到符合条件的数据")
  242. return
  243. def message(self, alert):
  244. msg = QMessageBox()
  245. msg.setIcon(QMessageBox.Warning)
  246. msg.setWindowTitle("请注意!")
  247. msg.setText(alert)
  248. msg.setStandardButtons(QMessageBox.Ok)
  249. msg.exec_()
  250. if __name__ == "__main__":
  251. app = QApplication(sys.argv)
  252. window = MainWindow()
  253. window.show()
  254. sys.exit(app.exec_())