PushCommand.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. # 导入pymysql
  2. import pymysql as psql
  3. from retry import retry
  4. import message_pb2 as message
  5. import google.protobuf.text_format as tf
  6. import threading
  7. import datetime
  8. import uuid
  9. class CommandInfo:
  10. def __init__(self,type,table):
  11. self.type=type
  12. self.table=table
  13. class DBCommand():
  14. def __init__(self,ip,port,database,user,password):
  15. self.ip=ip
  16. self.port=port
  17. self.database=database
  18. self.user=user
  19. self.password=password
  20. self.lock=threading.Lock()
  21. self.conn=psql.connect(host=ip,
  22. port=port,
  23. database=database,
  24. charset="utf8",
  25. user=user,
  26. passwd=password)
  27. def push_command(self,cmd_table):
  28. #判断指令类型
  29. if self.table_type(cmd_table)=="park":
  30. ret_table=self.enqueue_parkcmd(cmd_table)
  31. elif self.table_type(cmd_table)=="pick":
  32. ret_table=self.enqueue_pickcmd(cmd_table)
  33. else:
  34. print(" 入队指令格式错误")
  35. return None
  36. return ret_table
  37. def enqueue_parkcmd(self,table):
  38. with self.lock:
  39. cmd=message.park_table()
  40. tf.Parse(table,cmd)
  41. self.conn.ping()
  42. self.conn.begin()
  43. cursor = self.conn.cursor()
  44. #检查车辆是否在库内
  45. SQL="select * from vehicle where car_number='%s'"%(cmd.car_number)
  46. exist_vehicle=cursor.execute(SQL)
  47. SQL="select * from command_queue where car_number='%s'"%(cmd.car_number)
  48. exist_command=cursor.execute(SQL)
  49. if exist_command>0 or exist_vehicle>0:
  50. ts=message.table_statu()
  51. ts.execute_statu=message.eError
  52. ts.statu_description="车辆 :%s 已在库内!"%(cmd.car_number)
  53. cmd.statu.CopyFrom(ts)
  54. self.conn.commit()
  55. cursor.close()
  56. return tf.MessageToString(cmd,as_utf8=True)
  57. #检查车位是否够
  58. elif cmd.entrance_measure_info.height<1.55:
  59. #小轿车, 总车位数-队列等待数>0即可
  60. SQL="select * from space where car_number IS NULL and unit=%d and statu=0"%(cmd.unit_id)
  61. idle_space_count=cursor.execute(SQL)
  62. SQL="select * from command_queue where unit=%d and statu=0 and type=1"%(cmd.unit_id)
  63. wait_park_count=cursor.execute(SQL)
  64. if not idle_space_count-wait_park_count>0:
  65. ts=message.table_statu()
  66. ts.execute_statu=message.eError
  67. ts.statu_description="没有空余车位,车牌号:%s 高度:%.3fm!"%(cmd.car_number,cmd.entrance_measure_info.height)
  68. cmd.statu.CopyFrom(ts)
  69. self.conn.commit()
  70. cursor.close()
  71. return tf.MessageToString(cmd,as_utf8=True)
  72. elif cmd.entrance_measure_info.height<1.75:
  73. #suv ,空闲suv车位-队列suv 在(队列空闲轿车-空闲轿车位)>0时,需要减去这个
  74. SQL="select * from space where car_number IS NULL and unit=%d and height>1.55 and height<=1.75 and statu=0"%(cmd.unit_id)
  75. suv_idl_count=cursor.execute(SQL) #空闲suv车位数
  76. SQL="select * from space where car_number IS NULL and unit=%d and height<=1.55 and statu=0"%(cmd.unit_id)
  77. mini_idle_count=cursor.execute(SQL) #轿车位数
  78. SQL="select * from command_queue where unit=%d and statu=0 and type=1"%(cmd.unit_id)
  79. cursor.execute(SQL)
  80. queue_cmd=cursor.fetchall() #所有等待指令
  81. queue_car_count=0 #队列轿车指令计数
  82. for qc in queue_cmd:
  83. info=message.measure_info()
  84. tf.Parse(qc[7],info)
  85. if info.height<=1.55: #队列轿车停车指令
  86. queue_car_count=queue_car_count+1
  87. queue_suv_count=len(queue_cmd)-queue_car_count
  88. space_scarcity=0
  89. if mini_idle_count<queue_car_count:
  90. space_scarcity=queue_car_count-mini_idle_count
  91. if not (suv_idl_count-queue_suv_count-space_scarcity)>0:
  92. ts=message.table_statu()
  93. ts.execute_statu=message.eError
  94. ts.statu_description="没有SUV车位,车牌号:%s,高度:%.3fm!"%(cmd.car_number,cmd.entrance_measure_info.height)
  95. cmd.statu.CopyFrom(ts)
  96. self.conn.commit()
  97. cursor.close()
  98. return tf.MessageToString(cmd,as_utf8=True)
  99. elif cmd.entrance_measure_info.height<2.0:
  100. SQL = "select * from space where car_number IS NULL and unit=%d and height>1.75 and height<=2.0 and statu=0" % (cmd.unit_id)
  101. big_idl_count = cursor.execute(SQL) # 空闲 big 车位数
  102. SQL = "select * from space where car_number IS NULL and unit=%d and height>1.55 and height<=1.75 and statu=0" % (cmd.unit_id)
  103. suv_idle_count = cursor.execute(SQL) # suv位数
  104. SQL = "select * from space where car_number IS NULL and unit=%d and height<=1.55 and statu=0" % (cmd.unit_id)
  105. small_idle_count = cursor.execute(SQL) # 轿车位数
  106. if big_idl_count>=1:
  107. cmd_small_count=0
  108. cmd_suv_count=0
  109. cmd_big_count=0
  110. SQL = "select * from command_queue where unit=%d and statu=0 and type=1" % (cmd.unit_id)
  111. cursor.execute(SQL)
  112. queue_cmd = cursor.fetchall() # 所有等待指令
  113. for qc in queue_cmd:
  114. info = message.measure_info()
  115. tf.Parse(qc[7], info)
  116. if info.height <1.55: # 队列轿车停车指令
  117. cmd_small_count = cmd_small_count + 1
  118. elif info.height<1.75:
  119. cmd_suv_count=cmd_suv_count+1
  120. elif info.height<2.0:
  121. cmd_big_count=cmd_big_count+1
  122. else:
  123. pass
  124. suv_space_scarcity = 0
  125. if small_idle_count < cmd_small_count:
  126. suv_space_scarcity = cmd_small_count - small_idle_count
  127. suv_idle_count=suv_idle_count-suv_space_scarcity
  128. if cmd_suv_count-suv_idle_count>0:
  129. big_idl_count=big_idl_count-(cmd_suv_count-suv_idle_count)
  130. if big_idl_count<0:
  131. ts = message.table_statu()
  132. ts.execute_statu = message.eError
  133. ts.statu_description = "没有SUV车位,车牌号:%s,高度:%.3fm!" % (
  134. cmd.car_number, cmd.entrance_measure_info.height)
  135. cmd.statu.CopyFrom(ts)
  136. self.conn.commit()
  137. cursor.close()
  138. return tf.MessageToString(cmd, as_utf8=True)
  139. else:
  140. ts = message.table_statu()
  141. ts.execute_statu = message.eError
  142. ts.statu_description = "没有SUV车位,车牌号:%s,高度:%.3fm!" % (
  143. cmd.car_number, cmd.entrance_measure_info.height)
  144. cmd.statu.CopyFrom(ts)
  145. self.conn.commit()
  146. cursor.close()
  147. return tf.MessageToString(cmd, as_utf8=True)
  148. else:
  149. ts = message.table_statu()
  150. ts.execute_statu = message.eError
  151. ts.statu_description = "车辆超高,车牌号:%s,高度:%.3fm!" % (
  152. cmd.car_number, cmd.entrance_measure_info.height)
  153. cmd.statu.CopyFrom(ts)
  154. self.conn.commit()
  155. cursor.close()
  156. return tf.MessageToString(cmd, as_utf8=True)
  157. #指令允许入队,填写唯一码
  158. if not cmd.statu.execute_statu==message.eError:
  159. uid=str(uuid.uuid1())
  160. cmd.primary_key=uid
  161. #查询队列指令以及最后一次指令编号及时间
  162. cursor.execute("select * from command_queue,queue_number_data FOR UPDATE") #锁表
  163. SQL="select * from command_queue where unit=%d and statu=0"%(cmd.unit_id)
  164. cursor.execute(SQL)
  165. cmd_queue=cursor.fetchall()
  166. queue_id=0
  167. #计算当前指令编号
  168. if len(cmd_queue)>0:
  169. SQL="select * from queue_number_data where unit=%d"%cmd.unit_id
  170. cursor.execute(SQL)
  171. record=cursor.fetchall()
  172. last_num=0
  173. last_time=datetime.datetime.now()
  174. if len(record)==1:
  175. last_num=record[0][1]
  176. last_time=record[0][2]
  177. elif len(record)==0:
  178. SQL="insert into queue_number_data values(%d,0,NULL)"%(cmd.unit_id)
  179. cursor.execute(SQL)
  180. diff=datetime.datetime.now()-last_time
  181. time_mns=diff.total_seconds()/60
  182. queue_id=int(last_num+1+ time_mns*1)
  183. SQL="insert into command_queue values('%s','%s',%d,%d,1,0,NULL,'%s', %d , NULL)"%(
  184. cmd.car_number,cmd.primary_key,cmd.unit_id,queue_id
  185. ,tf.MessageToString(cmd.entrance_measure_info,as_utf8=True), cmd.terminal_id )
  186. cursor.execute(SQL)
  187. #更新指令时间表,
  188. dt=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  189. SQL="update queue_number_data set last_number=%d,input_time=str_to_date('%s','%%Y-%%m-%%d %%H:%%i:%%S') where unit=%d"%(queue_id,dt,cmd.unit_id)
  190. cursor.execute(SQL)
  191. self.conn.commit()
  192. cursor.close()
  193. return tf.MessageToString(cmd,as_utf8=True)
  194. def enqueue_pickcmd(self,table):
  195. with self.lock:
  196. cmd=message.pick_table()
  197. tf.Parse(table,cmd)
  198. #检查车辆是否在车位表,查找对应车位,找到即入队
  199. self.conn.ping()
  200. self.conn.begin()
  201. cursor = self.conn.cursor()
  202. SQL="select * from vehicle where primary_key='%s'"%(cmd.primary_key)
  203. cursor.execute(SQL)
  204. car_info=cursor.fetchall()
  205. if not len(car_info)>=1:
  206. ts=message.table_statu()
  207. ts.execute_statu=message.eError
  208. ts.statu_description="车辆信息不存在!"
  209. cmd.statu.CopyFrom(ts)
  210. else:
  211. SQL="select * from command_queue where primary_key='%s'"%(cmd.primary_key)
  212. num=cursor.execute(SQL)
  213. if num>0: #取车指令在对哦中,不能执行
  214. ts=message.table_statu()
  215. ts.execute_statu=message.eError
  216. ts.statu_description="指令正在执行中,请稍等!"
  217. cmd.statu.CopyFrom(ts)
  218. else:
  219. car_number=car_info[0][0]
  220. cmd.car_number=car_number
  221. #查询车位
  222. SQL="select * from space where car_number='%s'"%(car_number)
  223. cursor.execute(SQL)
  224. space=cursor.fetchall()
  225. #找不到,将指令表单状态修改为error
  226. if not len(space)==1:
  227. ts=message.table_statu()
  228. ts.execute_statu=message.eError
  229. ts.statu_description="没有找到车辆信息,请联系管理员!"
  230. cmd.statu.CopyFrom(ts)
  231. else:
  232. #查询到单元号,给指令表单单元号赋值
  233. unit_id=space[0][5]
  234. cmd.unit_id=unit_id
  235. #给指令表单车位信息赋值
  236. space_info=message.parkspace_info()
  237. space_info.id=space[0][0]
  238. space_info.unit_id=unit_id
  239. space_info.floor=space[0][1]
  240. space_info.room_id=space[0][2]
  241. cmd.actually_space_info.CopyFrom(space_info)
  242. #赋值真实测量信息
  243. measure_info=message.measure_info()
  244. tf.Parse(car_info[0][2],measure_info)
  245. cmd.actually_measure_info.CopyFrom(measure_info)
  246. #指令入库
  247. cursor.execute("select * from command_queue,queue_number_data FOR UPDATE") #锁表
  248. SQL="select * from command_queue where unit=%d and statu=0"%(unit_id)
  249. cursor.execute(SQL)
  250. cmd_queue=cursor.fetchall()
  251. queue_id=0
  252. if len(cmd_queue)>0:
  253. SQL="select * from queue_number_data where unit=%d"%unit_id
  254. cursor.execute(SQL)
  255. record=cursor.fetchall()
  256. last_num=0
  257. last_time=datetime.datetime.now()
  258. if len(record)==1:
  259. last_num=record[0][1]
  260. last_time=record[0][2]
  261. elif len(record)==0:
  262. SQL="insert into queue_number_data values(%d,0,NULL)"%(cmd.unit_id)
  263. cursor.execute(SQL)
  264. diff=datetime.datetime.now()-last_time
  265. time_mns=diff.total_seconds()/60
  266. queue_id=int(last_num+1+ time_mns*1)
  267. SQL="insert into command_queue values('%s','%s',%d,%d,2,0,'%s','%s',NULL, NULL)"%(
  268. cmd.car_number,cmd.primary_key,unit_id,queue_id,tf.MessageToString(cmd.actually_space_info,as_utf8=True)
  269. ,tf.MessageToString(cmd.actually_measure_info,as_utf8=True))
  270. cursor.execute(SQL)
  271. #更新指令时间表,
  272. dt=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  273. SQL="update queue_number_data set last_number=%d,input_time=str_to_date('%s','%%Y-%%m-%%d %%H:%%i:%%S') where unit=%d"%(queue_id,dt,unit_id)
  274. cursor.execute(SQL)
  275. self.conn.commit()
  276. cursor.close()
  277. return tf.MessageToString(cmd,as_utf8=True)
  278. @staticmethod
  279. def table_type(table):
  280. if table.find("entrance_measure_info")>=0:
  281. return "park"
  282. elif table.find("primary_key")>=0:
  283. return "pick"