data_metaclass.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. from logger import logger
  2. from databases import DeviceConfig, PhotoRecord, SqlQuery
  3. from sqlalchemy.orm import sessionmaker, scoped_session
  4. import settings
  5. from .online_request.module_online_data import OnlineDataRequest, GetOnlineDataHLM
  6. import time
  7. from datetime import datetime, timedelta
  8. from sqlalchemy.sql import func
  9. from sqlalchemy.orm import aliased
  10. import copy
  11. import threading
  12. class DataBaseModel():
  13. # 基础数据基类
  14. # signal_data = Signal(dict)
  15. # add_data_to_online_sign = Signal(dict)
  16. def __init__(self, token):
  17. # super().__init__(parent=None)
  18. self.logger = logger
  19. self.token = token
  20. # 创建一个实例化的会话对象 session;该会话会自己处理上下文,线程结束时会自动关闭会话;适合多线程处理
  21. self.session = SqlQuery()
  22. if settings.PROJECT == "红蜻蜓":
  23. self.get_online_data = OnlineDataRequest(self.token)
  24. elif settings.PROJECT == "惠利玛":
  25. self.get_online_data = GetOnlineDataHLM(self.token)
  26. # self.add_data_to_online_sign.connect(self.send_record_to_online)
  27. # 新增数据的记录发送到云端
  28. def send_record_to_online(self, data):
  29. # _data = {"goods_art_no":goods_art_no,
  30. # "image_index": image_index,
  31. # "photo_create_time": photo_create_time,
  32. # "image_deal_mode": image_deal_mode,
  33. # "take_photo_created_at": date_time.strftime('%Y-%m-%d %H:%M:%S'),
  34. # }
  35. data["photo_create_time"] = "{}".format(data["photo_create_time"])
  36. data["take_photo_created_at"] = "{}".format(data["take_photo_created_at"])
  37. self.get_online_data.add_auto_photo_logs(data)
  38. pass
  39. def send_info(self, _type="", mode="", data=None):
  40. self.signal_data.emit({"_type": _type, "plugins_mode": mode, "data": data})
  41. def send_log(self, text, is_debug=False):
  42. if is_debug:
  43. self.logger.debug(text)
  44. else:
  45. self.logger.info(text)
  46. def insert_data_to_phone_record(self, data: dict):
  47. # 异步提交数据到后台
  48. photo_create_time = data["photo_create_time"]
  49. try:
  50. photo_create_time = time.strptime(photo_create_time, "%Y-%m-%d %H:%M:%S")
  51. except:
  52. photo_create_time = time.strptime(photo_create_time, "%Y:%m:%d %H:%M:%S")
  53. photo_create_time = time.mktime(photo_create_time)
  54. photo_create_time = datetime.fromtimestamp(photo_create_time)
  55. image_deal_mode = data["image_deal_mode"] if "image_deal_mode" in data else 0
  56. image_index = data["image_index"] if "image_index" in data else 0
  57. goods_art_no = data["goods_art_no"]
  58. d_1 = PhotoRecord(
  59. goods_art_no=goods_art_no,
  60. image_index=image_index,
  61. photo_create_time=photo_create_time,
  62. image_deal_mode=image_deal_mode,
  63. )
  64. self.session.add(d_1)
  65. self.session.commit()
  66. date_time = datetime.fromtimestamp(time.time())
  67. _data = {"goods_art_no": goods_art_no,
  68. "image_index": image_index,
  69. "photo_create_time": photo_create_time,
  70. "image_deal_mode": image_deal_mode,
  71. "take_photo_created_at": date_time.strftime('%Y-%m-%d %H:%M:%S'),
  72. }
  73. # self.add_data_to_online_sign.emit(_data)
  74. def get_goods_art_no(self, date_time_original):
  75. time_array = time.strptime(date_time_original, "%Y:%m:%d %H:%M:%S")
  76. time_array = time.mktime(time_array)
  77. datetime_obj = datetime.fromtimestamp(time_array)
  78. result = (
  79. self.session.query(PhotoRecord)
  80. .filter(PhotoRecord.photo_create_time == datetime_obj)
  81. .order_by(PhotoRecord.id.desc())
  82. .scalar()
  83. )
  84. if result:
  85. return result.goods_art_no, result.image_index, result.image_deal_mode
  86. else:
  87. return None
  88. def get_data_from_hqt_with_goods_art_no(self, goods_art_no_list):
  89. _goods_art_no_list = copy.deepcopy(goods_art_no_list)
  90. _list = []
  91. # 单次请求数少于20个
  92. goods_art_no_dict = {}
  93. while _goods_art_no_list:
  94. goods_art_no = _goods_art_no_list.pop()
  95. _list.append(goods_art_no)
  96. if len(_list) == 20 or len(_goods_art_no_list) == 0:
  97. online_goods_art_data = self.get_online_data.get_goods_art_no_info(
  98. goods_art_list=_list
  99. )
  100. if online_goods_art_data:
  101. for _goods_art_no in online_goods_art_data:
  102. goods_art_no_dict[_goods_art_no] = online_goods_art_data[
  103. _goods_art_no
  104. ]
  105. _list = []
  106. return goods_art_no_dict
  107. def get_data_from_hqt(self, goods_number_list):
  108. _goods_number_list = copy.deepcopy(goods_number_list)
  109. _list = []
  110. # 单次请求数少于20个
  111. goods_number_dict = {}
  112. while _goods_number_list:
  113. goods_art_no = _goods_number_list.pop()
  114. if "NUM" in goods_art_no:
  115. goods_art_no = goods_art_no.replace("NUM", "")
  116. _list.append(goods_art_no)
  117. if len(_list) == 20 or len(_goods_number_list) == 0:
  118. online_goods_art_data = self.get_online_data.get_goods_art_no_info(
  119. numbers_list=_list
  120. )
  121. if online_goods_art_data:
  122. for number in online_goods_art_data:
  123. goods_number_dict["NUM" + number] = online_goods_art_data[
  124. number
  125. ]
  126. _list = []
  127. return goods_number_dict
  128. ##=====设备配置处理=======
  129. def device_config_delete(self, config_id):
  130. d_c_1 = self.session.query(DeviceConfig).get(config_id)
  131. self.session.delete(d_c_1)
  132. self.session.commit()
  133. def device_config_delete_by_mode_type(self, mode_type: str):
  134. all_data = (
  135. self.session.query(DeviceConfig)
  136. .filter(DeviceConfig.mode_type == mode_type)
  137. .all()
  138. )
  139. [self.session.delete(u) for u in all_data]
  140. self.session.commit()
  141. def device_config_copy_by_id(self, config_id):
  142. d_c_1 = self.session.query(DeviceConfig).get(config_id)
  143. d_c_2 = DeviceConfig(
  144. mode_type=d_c_1.mode_type,
  145. execution_type=d_c_1.execution_type,
  146. action_name=d_c_1.action_name + "_复制",
  147. action_index=d_c_1.action_index + 1,
  148. picture_index=d_c_1.picture_index,
  149. camera_height=d_c_1.camera_height,
  150. camera_angle=d_c_1.camera_angle,
  151. number_focus=d_c_1.number_focus,
  152. take_picture=d_c_1.take_picture,
  153. turntable_position=d_c_1.turntable_position,
  154. turntable_angle=d_c_1.turntable_angle,
  155. shoe_upturn=d_c_1.shoe_upturn,
  156. pre_delay=d_c_1.pre_delay,
  157. after_delay=d_c_1.after_delay,
  158. led_switch=d_c_1.led_switch,
  159. is_wait=d_c_1.is_wait,
  160. )
  161. # 复制一个后,其他的数据的排序进行后移
  162. other_d_c = self.session.query(DeviceConfig).filter(
  163. DeviceConfig.mode_type == d_c_1.mode_type,
  164. DeviceConfig.action_index >= d_c_1.action_index + 1,
  165. DeviceConfig.delete_time.is_(None),
  166. )
  167. other_d_c.update(
  168. {
  169. DeviceConfig.action_index: DeviceConfig.action_index + 1,
  170. }
  171. )
  172. self.session.add(d_c_2)
  173. self.session.commit()
  174. def device_config_add(self, data: dict):
  175. f_data = (
  176. self.session.query(
  177. func.max(DeviceConfig.action_index).label("max_action_index")
  178. )
  179. .filter(
  180. DeviceConfig.mode_type == data["mode_type"],
  181. DeviceConfig.delete_time.is_(None),
  182. )
  183. .scalar()
  184. )
  185. if not f_data:
  186. data["action_index"] = 10
  187. else:
  188. data["action_index"] = f_data + 10
  189. d_c_1 = DeviceConfig(**data)
  190. self.session.add(d_c_1)
  191. self.session.commit()
  192. def device_config_change_action_index(self, up_config_id_1, down_config_id_2):
  193. d_c_1 = (
  194. self.session.query(DeviceConfig.action_index)
  195. .filter(DeviceConfig.id == up_config_id_1)
  196. .scalar()
  197. )
  198. d_c_2 = (
  199. self.session.query(DeviceConfig.action_index)
  200. .filter(DeviceConfig.id == down_config_id_2)
  201. .scalar()
  202. )
  203. if d_c_1 == d_c_2:
  204. d_c = self.session.query(DeviceConfig).get(up_config_id_1)
  205. d_c.update(
  206. {
  207. DeviceConfig.action_index: DeviceConfig.action_index - 1,
  208. }
  209. )
  210. else:
  211. d_c_update_1 = self.session.query(DeviceConfig).filter(
  212. DeviceConfig.id == up_config_id_1
  213. )
  214. d_c_update_2 = self.session.query(DeviceConfig).filter(
  215. DeviceConfig.id == down_config_id_2
  216. )
  217. d_c_update_1.update(
  218. {
  219. DeviceConfig.action_index: d_c_2,
  220. }
  221. )
  222. d_c_update_2.update(
  223. {
  224. DeviceConfig.action_index: d_c_1,
  225. }
  226. )
  227. self.session.commit()
  228. pass
  229. def device_config_update(self, data: dict):
  230. d_c = self.session.query(DeviceConfig).filter(DeviceConfig.id == data["id"])
  231. data.pop("id")
  232. d_c.update(data)
  233. self.session.commit()
  234. def device_config_config_list(self, mode_type, action_name=None):
  235. _q = self.session.query(DeviceConfig).filter(
  236. DeviceConfig.mode_type == mode_type, DeviceConfig.delete_time.is_(None)
  237. )
  238. if action_name:
  239. _q = _q.filter(DeviceConfig.action_name == action_name)
  240. results = _q.order_by(DeviceConfig.action_index.asc()).all()
  241. return [self.to_dict(row) for row in results]
  242. def to_dict(self, row):
  243. return {c.name: getattr(row, c.name, None) for c in row.__table__.columns}
  244. def device_config_detail(self, config_id):
  245. results = (
  246. self.session.query(DeviceConfig)
  247. .filter(DeviceConfig.id == config_id, DeviceConfig.delete_time.is_(None))
  248. .one()
  249. )
  250. return self.to_dict(results)
  251. def delete3MonthAgoRecord(self):
  252. """删除3个月以前得数据"""
  253. print("d_c_1")
  254. # 计算3个月前的日期
  255. three_months_ago = datetime.now() - timedelta(days=90)
  256. d_c_1 = (
  257. self.session.query(PhotoRecord)
  258. .filter(PhotoRecord.create_time < three_months_ago)
  259. .delete()
  260. )
  261. self.session.commit()