open_service_request_assigned.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. # раскомментировать, когда перейдем на разные пароли
  2. import hashlib
  3. import json
  4. import threading
  5. import time
  6. from datetime import datetime
  7. import config
  8. # test
  9. import jsonAndRequest as jsreq
  10. from BotClass import JabberBot
  11. global tasklist
  12. botname = "open_service_request_assigned"
  13. operating_status = '212'
  14. JID = botname + "@" + config.JSERVER
  15. PORT = config.PORT
  16. PASSWORD = hashlib.md5((botname + config.PASSWORD).encode('utf-8')).hexdigest()
  17. print(JID, PASSWORD)
  18. drivers = ["799999999998@ej.sharix-app.org"]
  19. # таким образом хранится список jid, от которых можно получать сообщения этому боту
  20. listen_to = ["open_service_request_booked@ej.sharix-app.org", "open_service_request_pending@ej.sharix-app.org"]
  21. # тут хранится список jid, кому бот может отправлять сообщения в результате обработки заявки
  22. proceed_to = [botname, "open_service_request_accepted@ej.sharix-app.org",
  23. "open_service_request_declined@ej.sharix-app.org", "open_service_request_forcemajeure@ej.sharix-app.org"]
  24. # максимальное значение попыток обработать заказ
  25. idle_value = 10
  26. def log_handler():
  27. while True:
  28. with open(f'{botname}.txt', 'a') as log_file:
  29. log_file.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - {botname} is still running...\n")
  30. time.sleep(3600)
  31. # обработчик входящих сообщений
  32. def message_handler(conn, mess):
  33. text = mess.getBody() # текст сообщения боту
  34. user = mess.getFrom() # отправитель сообщения
  35. if (str(user).split("/")[0]) in listen_to:
  36. print('order_handler')
  37. if text is not None:
  38. orderObj = jsreq.jsonToOrder(text)
  39. tasklist.append(orderObj)
  40. bot.bot_log(str(datetime.now()) + " Поступивший заказ успешно добавлен в очередь обработки\n")
  41. def open_service_request_assigned_wait(period, localtask):
  42. bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ ожидает\n")
  43. time.sleep(period)
  44. # ВАЖНО! Надо скорее всего через API редактировать заказ, иначе возможна потеря данных
  45. localtask.title = localtask.title + "1"
  46. # обязательно данный обработчик должен заканчиваться передачей заказа куда-то на обработку дальше - обратно или другому, иначе оно потеряется
  47. bot.proceed_status(proceed_to[0], localtask)
  48. bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ подождал и отправлен в очередь\n")
  49. def wait_for_answer(localtask):
  50. order = localtask
  51. driver = drivers[0]
  52. send_message(order, driver)
  53. # Здесь можно реализовать логику выбора водителя
  54. while True:
  55. start_time = time.time()
  56. if time.time() + 400 - start_time > 300: ##Логика временная
  57. if len(answers) > 0:
  58. answer = answers.pop(0)
  59. if answer.answer == 'ACCEPT':
  60. localtask.status = '221'
  61. jsreq.change_to_task(localtask, token)
  62. bot.proceed_status(proceed_to[1], localtask)
  63. bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[1]}\n")
  64. elif answer.answer == 'DECLINE':
  65. localtask.status = '229'
  66. localtask.provider = None
  67. jsreq.change_to_task(localtask, token)
  68. bot.proceed_status(proceed_to[2], localtask)
  69. bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[2]}\n")
  70. else:
  71. bot.bot_log(botname + " " + str(datetime.now()) + f"Ошибка ответа\n")
  72. break
  73. else:
  74. print("Ожидание ответа...")
  75. time.sleep(3)
  76. else:
  77. localtask.status = '229'
  78. localtask.provider = None
  79. jsreq.change_to_task(localtask, token)
  80. bot.proceed_status(proceed_to[2], localtask)
  81. bot.bot_log(botname + " " + str(datetime.now()) + f" Заказ отправлен на {proceed_to[2]}\n")
  82. break
  83. def open_service_request_assigned_process(localtask):
  84. bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ в обработчике\n")
  85. order = localtask
  86. if order.provider != None:
  87. wait_thread = threading.Thread(target=wait_for_answer, args=(localtask,))
  88. wait_thread.start()
  89. def message_answer(conn, mess):
  90. text = mess.getBody() # текст сообщения боту
  91. user = mess.getFrom() # отправитель сообщения
  92. if (str(user).split("/")[0]) in drivers:
  93. print('answer_handler')
  94. if text is not None:
  95. answerObj = jsreq.to_answer(text)
  96. answers.append(answerObj)
  97. bot.bot_log(str(datetime.now()) + " Поступивший ответ успешно добавлен в очередь обработки\n")
  98. def send_message(order, driver):
  99. order = json.dumps(order.__dict__)
  100. bot.send_notification(driver, order)
  101. def open_service_request_assigned():
  102. log_thread = threading.Thread(target=log_handler)
  103. log_thread.daemon = True
  104. log_thread.start()
  105. while (len(tasklist)):
  106. localtask = tasklist.pop(0)
  107. if (localtask.status != operating_status):
  108. localtask.status = '239'
  109. jsreq.change_to_task(localtask, token)
  110. bot.proceed_status(proceed_to[-1], localtask)
  111. bot.bot_log(botname + " " + str(datetime.now()) + " " + "Заказ не по адресу, перенаправляем на форсмажор\n")
  112. continue
  113. else:
  114. bot.bot_log(botname + " " + datetime.now().strftime('%Y-%m-%d') + " " + "Заказ в очереди на обработке\n")
  115. t1 = threading.Thread(target=open_service_request_assigned_process, args=([localtask]))
  116. t1.start()
  117. # if (localtask.title!="10"):
  118. # t1=threading.Thread(target=open_service_request_booked_wait, args=(5,localtask))
  119. # t1.start()
  120. # if (localtask.title=="101"):
  121. # t1=threading.Thread(target=open_service_request_booked_process, args=(10,localtask))
  122. # t1.start()
  123. # t1=threading.Thread(target=open_service_request_assigned_process, args=(localtask))
  124. # t1.start()
  125. # если никакие обработчики не подошли - отправляем обратно в очередь
  126. # bot.proceed_status(proceed_to[0],localtask)
  127. # print("Заказ возвращен в очередь\n")
  128. # print(tasklist)
  129. # Авторизация и запуск бота
  130. answers = []
  131. # пустой список заказов
  132. tasklist = []
  133. # надо инициализировать tasklist при запуске из API
  134. token = jsreq.requestGetToken(botname, PASSWORD, config.API_URL + "my/api/v1/auth/token/login/")
  135. # ВАЖНО! Надо еще фильтровать список по статусу обработки заявки
  136. tasklist_dbsynce = jsreq.requestGetList(token, config.API_URL + "/dbsynce/api/orders/")
  137. bot = JabberBot(JID, PASSWORD, PORT)
  138. bot.register_handler('message', message_handler)
  139. bot.register_handler('message', message_answer)
  140. bot.start(open_service_request_assigned)
  141. # Добавить функцию поток для ожидания получения заказа.